You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动