Java网络调用ArcGIS REST API
一、说明
- ArcGIS REST API(图层要素查询、叠加分析)
- Java 网络请求调用(HttpClient)
ArcGIS REST API 文档: https://developers.arcgis.com/rest/services-reference/get-started-with-the-services-directory.htm
HttpClient 官网: http://hc.apache.org/httpcomponents-client-ga/
引用参考
https://developers.arcgis.com/rest/services-reference/query-map-service-layer-.htm
https://developers.arcgis.com/rest/services-reference/cut.htm
https://developers.arcgis.com/rest/services-reference/project.htm
https://developers.arcgis.com/rest/services-reference/lengths.htm
https://developers.arcgis.com/rest/services-reference/buffer.htm
https://developers.arcgis.com/rest/services-reference/union.htm
二、记录
1. 添加 httpclient 依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/fluent-hc -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>fluent-hc</artifactId>
<version>4.5.10</version>
</dependency>
2.网络请求工具类
package com.demo.utils;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.fluent.Request;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.URISyntaxException;
import java.util.List;
/**
* 网络请求工具类
* */
public class RequestUtils {
/**
* 通过 url,Post 请求数据
* @param url
* @return result
* */
public static String fPost(String url) throws IOException {
// System.out.println("======= use fPost =======");
return fPost(url, null);
}
/**
* 通过 url,Post 请求数据
* @param url
* @return result
* */
public static String fPost(String url, List<NameValuePair> nvps) throws IOException {
// System.out.println("======= use fPost-nvps =======");
Request request = Request.Post(url);
if(nvps != null && nvps.size() > 0){
request = request.bodyForm(nvps);
}
return request.execute().returnContent().asString();
}
/**
* 通过 url,Get 请求数据
* @param url
* @return result
* */
public static String fGet(String url) throws IOException {
// System.out.println("======= use fGet =======");
return fGet(url, null);
}
/**
* 通过 url,Get 请求数据
* @param url
* @return result
* */
public static String fGet(String url, List<NameValuePair> nvps) throws IOException {
// System.out.println("======= use fGet-nvps =======");
Request request = Request.Get(url);
if(nvps != null && nvps.size() > 0){
request = request.bodyForm(nvps);
}
return request.execute().returnContent().asString();
}
/**
* 通过 url,Post 请求数据
* @param url
* @param nvps
* @return result
* */
public static String hPost(String url, List<NameValuePair> nvps) throws IOException {
// System.out.println("======= use hPost =======");
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
if(nvps != null && nvps.size() > 0){
httpPost.setEntity(new UrlEncodedFormEntity(nvps));
}
CloseableHttpResponse response = httpClient.execute(httpPost);
HttpEntity httpEntity = response.getEntity();
return EntityUtils.toString(httpEntity);
}
/**
* 通过 url,Get 请求数据
* @param url
* @param nvps
* @return result
* */
public static String hGet(String url, List<NameValuePair> nvps) throws IOException, URISyntaxException {
// System.out.println("======= use hGet =======");
CloseableHttpClient httpClient = HttpClients.createDefault();
URIBuilder uriBuilder = new URIBuilder(url);
if(nvps != null && nvps.size() > 0){
uriBuilder.setParameters(nvps);
}
HttpGet httpGet = new HttpGet(uriBuilder.build());
CloseableHttpResponse response = httpClient.execute(httpGet);
HttpEntity httpEntity = response.getEntity();
return EntityUtils.toString(httpEntity);
}
/**
* 将内容输入出到指定txt
* @param filePath txt文件路径
* @param content 文本内容
* */
public static void outText(String filePath, Object content) throws IOException {
// System.out.println("======= use outText =======");
File file = new File(filePath);
// 判断文件是否存在
if(file.exists()){
file.createNewFile();
}
// 内容输出到文件
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(file));
outputStreamWriter.write(content.toString());
outputStreamWriter.close();
}
}
3.ArcGIS REST API 调用工具类
Query (Map Service/Layer) - query
Geometry Service - buffer、cut、lengths、union、project
package com.demo.utils;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* ArcGIS REST API 调用工具类
* */
public class GeomSerUtils {
// GeometryServer 服务地址==http://127.0.0.1:6080/arcgis/manager/service.html?name=Geometry.GeometryServer&folder=Utilities
private final static String geometryServerUrl = "http://127.0.0.1:6080/arcgis/rest/services/Utilities/Geometry/GeometryServer";
/**
* 缓冲区(单位:米)
* @param inSr 坐标系wkid e.g. 32650
* @param x 经度
* @param y 纬度
* @param distances 半径
* @return result
* */
public static String reqBuffer(String inSr, String x, String y, String distances) throws IOException {
String url = geometryServerUrl + "/buffer";
List<NameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("f", "json"));
params.add(new BasicNameValuePair("inSr", inSr));
params.add(new BasicNameValuePair("unit", "9001")); // 单位:米
params.add(new BasicNameValuePair("distances", distances));
params.add(new BasicNameValuePair("geometries"
, "{'geometryType':'esriGeometryPoint','geometries': [{'x':"+x+",'y':"+y+"}]}"));
return RequestUtils.fPost(url, params);
}
/**
* 根据缓冲区,进行查询
* @param queryUrl MapServer URL e.g. ( http://127.0.0.1:6080/arcgis/rest/services/test001/MapServer/0 )
* @param geometry 缓冲区
* @param where 查询条件,null = "1=1"
* @param outFields 输出字段,null = "*"
* @return result
* */
public static String reqQueryByBuffer(String queryUrl, String geometry, String where, String outFields) throws IOException {
String url = queryUrl+"/query";
List<NameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("where", where == null ? "1=1" : where));
params.add(new BasicNameValuePair("f", "json"));
params.add(new BasicNameValuePair("geometryType", "esriGeometryPolygon"));
params.add(new BasicNameValuePair("spatialRel", "esriSpatialRelIntersects"));
params.add(new BasicNameValuePair("returnGeometry", "true"));
params.add(new BasicNameValuePair("outFields", outFields == null ? "*" : outFields));
params.add(new BasicNameValuePair("geometry", geometry));
return RequestUtils.fPost(url, params);
}
/**
* 剪切
* @param sr 坐标系wkid e.g. 32650
* @param cutter 剪切线 e.g. {"paths":[[[123.22,12.22],[123.22,12.22],[123.22,12.22]]]}
* @param target 目标几何图形 e.g. {"geometries":[{"paths":[[[123.22,12.22],[123.22,12.22]]]},{"paths":[[[123.22,12.22],[123.22,12.22]]]},{"paths":[[[123.22,12.22],[123.22,12.22],[123.22,12.22]]]}],"geometryType":"esriGeometryPolyline"}
* @return result
* */
public static String reqCut(String sr, String cutter, String target) throws IOException {
String url = geometryServerUrl+"/cut";
List<NameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("f", "json"));
params.add(new BasicNameValuePair("sr", sr));
params.add(new BasicNameValuePair("cutter", cutter));
params.add(new BasicNameValuePair("target", target));
return RequestUtils.fPost(url, params);
}
/**
* 计算长度(单位:米)
* @param sr 坐标系wkid e.g. 32650
* @param polylines 线几何图形 e.g. [{"paths":[[[123.22,12.22],[123.22,12.22]]]},{"paths":[[[123.22,12.22],[123.22,12.22]]]},{"paths":[[[123.22,12.22],[123.22,12.22],[123.22,12.22]]]}]
* @return result
* */
public static String reqLenths(String sr, String polylines) throws IOException {
String url = geometryServerUrl+"/lengths";
List<NameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("f", "json"));
params.add(new BasicNameValuePair("sr", sr));
params.add(new BasicNameValuePair("lengthUnit", "9001")); // 单位:米
params.add(new BasicNameValuePair("calculationType", "preserveShape"));
params.add(new BasicNameValuePair("polylines", polylines));
return RequestUtils.fPost(url, params);
}
/**
* 合并
* @param sr 坐标系wkid e.g. 32650
* @param geometries 几何图形 e.g. {"geometries":[{"paths":[[[123.22,12.22],[123.22,12.22]]]},{"paths":[[[123.22,12.22],[123.22,12.22],[123.22,12.22]]]},{"paths":[[[123.22,12.22],[123.22,12.22],[123.22,12.22]]]}],"geometryType":"esriGeometryPolyline"}
* @return result
* */
public static String reqUnion(String sr, String geometries) throws IOException {
String url = geometryServerUrl + "/union";
List<NameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("f", "json"));
params.add(new BasicNameValuePair("sr", sr));
params.add(new BasicNameValuePair("geometries", geometries));
return RequestUtils.fPost(url, params);
}
/**
* 坐标系转换
* @param inSR 原wkid,e.g. 4326
* @param outSR 目标wkid,e.g. 32650
* @param geometries 原几何图形,e.g. {"geometries":[{"x":123.22,"y":12.22}],"geometryType":"esriGeometryPoint"}
* @return result
* */
public static String reqProject(String inSR, String outSR, String geometries) throws IOException {
String url = geometryServerUrl+"/project";
List<NameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("f", "json"));
params.add(new BasicNameValuePair("inSR", inSR));
params.add(new BasicNameValuePair("outSR", outSR));
params.add(new BasicNameValuePair("geometries", geometries));
return RequestUtils.fPost(url, params);
}
}