You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ArcGIS查询仅OBJECTID非空,其余属性返回null问题求助

ArcGIS Android API查询要素仅返回OBJECTID,其他属性为null的解决思路

问题背景

在Android Studio中基于ArcGIS API开发App时,执行空间查询获取用户周边1000米范围内的要素,能正常返回3个Obstacle对象,但返回的要素除OBJECTID外所有属性均为null,且未返回全部属性。

解决思路及代码调整

1. 显式指定查询返回的字段

ArcGIS查询默认不会返回所有属性字段,需通过QueryParameters.setOutFields()主动指定要获取的字段。传入"*"表示返回所有字段,也可指定具体字段名列表。

修改后的查询参数设置代码:

QueryParameters queryParameters = new QueryParameters();
queryParameters.setGeometry(bufferGeometry);
queryParameters.setSpatialRelationship(QueryParameters.SpatialRelationship.INTERSECTS);
// 指定返回所有属性字段
queryParameters.setOutFields(Collections.singletonList("*"));

2. 确保ServiceFeatureTable已完全加载

如果mServiceFeatureTable未完成加载,字段元数据未初始化,会导致属性无法正确解析。可在查询前确保表已加载:

if (!mServiceFeatureTable.isLoaded()) {
    mServiceFeatureTable.loadAsync();
    mServiceFeatureTable.addDoneLoadingListener(() -> {
        if (mServiceFeatureTable.getLoadStatus() == LoadStatus.LOADED) {
            // 加载完成后执行查询逻辑
            executeQuery(location, radius);
        } else {
            Log.e("FeatureTableLoad", "要素表加载失败: " + mServiceFeatureTable.getLoadError().getMessage());
        }
    });
} else {
    // 已加载,直接执行查询
    executeQuery(location, radius);
}

(注:将原queryFeatures方法内的查询逻辑抽离为executeQuery方法,方便复用)

3. 通过OBJECTID单独获取完整要素

若批量查询仍有问题,可通过每个要素的OBJECTID单独查询完整要素:

// 遍历查询结果时,通过OBJECTID获取完整属性
for (Feature feature : result){
    if (Obstacle.doesObstacleExist((ArcGISFeature) feature)) {
        ArcGISFeature arcGISFeature = (ArcGISFeature) feature;
        long objectId = (long) arcGISFeature.getAttributes().get("OBJECTID");
        
        ListenableFuture<ArcGISFeature> singleFeatureFuture = mServiceFeatureTable.queryFeatureAsync(objectId);
        singleFeatureFuture.addDoneListener(() -> {
            try {
                ArcGISFeature fullFeature = singleFeatureFuture.get();
                Map<String, Object> fullAttr = fullFeature.getAttributes();
                locationManager.addObserver(new Obstacle(fullFeature));
            } catch (Exception e) {
                Log.e("SingleFeatureQuery", "获取单个要素失败", e);
            }
        });
    }
}

完整修改后的queryFeatures方法

public void queryFeatures(Location location, int radius){
    if (!mServiceFeatureTable.isLoaded()) {
        mServiceFeatureTable.loadAsync();
        mServiceFeatureTable.addDoneLoadingListener(() -> {
            if (mServiceFeatureTable.getLoadStatus() == LoadStatus.LOADED) {
                executeQuery(location, radius);
            } else {
                Log.e("FeatureTableLoad", "要素表加载失败: " + mServiceFeatureTable.getLoadError().getMessage());
            }
        });
        return;
    }
    executeQuery(location, radius);
}

private void executeQuery(Location location, int radius) {
    double userLat = location.getLatitude();
    double userLon = location.getLongitude();
    com.esri.arcgisruntime.geometry.Point userLocation = new com.esri.arcgisruntime.geometry.Point(userLon, userLat, SpatialReferences.getWgs84());
    LinearUnit unit = new LinearUnit(LinearUnitId.METERS);
    Geometry bufferGeometry = GeometryEngine.bufferGeodetic(userLocation, radius, unit, Double.NaN, GeodeticCurveType.GEODESIC);

    QueryParameters queryParameters = new QueryParameters();
    queryParameters.setGeometry(bufferGeometry);
    queryParameters.setSpatialRelationship(QueryParameters.SpatialRelationship.INTERSECTS);
    queryParameters.setOutFields(Collections.singletonList("*"));

    final ListenableFuture<FeatureQueryResult> queryResult = mServiceFeatureTable.queryFeaturesAsync(queryParameters);
    queryResult.addDoneListener(() -> {
        try {
            FeatureQueryResult result = queryResult.get();
            for (Feature feature : result){
                if (Obstacle.doesObstacleExist((ArcGISFeature) feature)) {
                    ArcGISFeature arcGISFeature = (ArcGISFeature) feature;
                    Map<String, Object> attr = arcGISFeature.getAttributes();
                    Log.d("FeatureAttr", "要素属性: " + attr.toString());
                    locationManager.addObserver(new Obstacle(arcGISFeature));
                }
            }
        } catch (Exception e) {
            Log.e("featurequery", "查询出错", e);
        }
    });
}

内容的提问来源于stack exchange,提问作者Luksa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 11:42:16