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
相关产品推荐
相关产品推荐

