如何在Java中调用ArcGIS要素查询服务并返回ArcGIS Java类对象?
嘿,这个问题我之前也碰到过!其实不用手动折腾RestTemplate和JSON解析,ArcGIS Runtime for Java本身就提供了更顺手的方案,当然如果一定要用RestTemplate的话也有办法解决,我给你捋捋两种思路:
优先推荐:用ArcGIS Runtime原生API查询要素服务
这才是官方推荐的正确姿势,框架已经帮你封装好了所有HTTP请求、参数处理和结果解析的细节,直接就能拿到ArcGIS标准的Feature对象,完全不用自己写RestTemplate代码。
示例代码如下:
// 初始化要素服务表,传入你的要素服务URL ServiceFeatureTable featureTable = new ServiceFeatureTable(this.SERVICE_FEATURE_URL); // 构建查询参数,和你用RestTemplate传的参数对应 QueryParameters queryParams = new QueryParameters(); queryParams.setWhereClause("1 = 1"); // 查询所有要素的条件 queryParams.setOutFields("*"); // 返回全部字段 // 异步执行查询(也可以用同步方法,不过异步更适合UI场景) ListenableFuture<FeatureQueryResult> queryFuture = featureTable.queryFeaturesAsync(queryParams); queryFuture.addDoneListener(() -> { try { FeatureQueryResult queryResult = queryFuture.get(); // 遍历结果,每个元素都是现成的Feature对象 for (Feature feature : queryResult) { // 直接获取要素属性,比如feature.getAttribute("your_field_name") System.out.println("要素ID: " + feature.getFeatureId()); } } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } });
这种方式不仅代码更简洁,还能自动处理权限、分页、几何对象解析这些容易踩坑的点,比手动写HTTP请求靠谱多了。
如果必须用RestTemplate:将JSON结果转为ArcGIS类对象
要是因为项目限制必须用RestTemplate发送请求,也有两种方式把返回的JSON字符串转成ArcGIS的实体类:
方法1:用ArcGIS Runtime自带的序列化工具
ArcGIS Runtime内部提供了JsonSerialization工具类,可以直接把JSON字符串解析成FeatureQueryResult对象:
import com.esri.arcgisruntime.internal.util.JsonSerialization; // 假设queryData是你用RestTemplate拿到的JSON字符串 FeatureQueryResult queryResult = JsonSerialization.fromJson(queryData, FeatureQueryResult.class); // 接下来就和原生API的处理方式一样了 for (Feature feature : queryResult) { // 处理你的要素数据 }
⚠️ 注意:这个类是内部工具类,虽然能用,但官方没对外公开API,后续版本可能会有变动,所以还是优先推荐原生查询方法。
方法2:用第三方JSON库(Gson/Jackson)解析
如果你习惯用Gson或者Jackson,也可以手动解析JSON到Feature对象,不过需要注意ArcGIS JSON响应的结构(比如要素的属性在attributes字段,几何在geometry字段)。
比如用Gson的示例:
import com.google.gson.Gson; import java.util.List; import java.util.Map; Gson gson = new Gson(); // 先把JSON转成Map,拿到features数组 Map<String, Object> responseMap = gson.fromJson(queryData, Map.class); List<Map<String, Object>> featuresJson = (List<Map<String, Object>>) responseMap.get("features"); // 逐个解析成Feature对象 for (Map<String, Object> featureJson : featuresJson) { Feature feature = gson.fromJson(gson.toJson(featureJson), Feature.class); // 处理要素 }
这种方法需要自己处理更多细节,比如几何对象的类型转换,不如原生API省心,所以只推荐在特殊场景下使用。
最后提一句,你引入的Maven依赖是正确的,不过建议尽量使用100.x系列的最新版本,旧版本可能存在一些已知的bug和性能问题。
内容的提问来源于stack exchange,提问作者Naveen Kumar H S




