package com.yb.service;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONObject;
|
import com.yb.config.XzConfig;
|
import com.yb.helper.RsaHelper;
|
import com.yb.util.EntityHttpUtil;
|
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.locationtech.jts.geom.*;
|
import org.locationtech.jts.operation.buffer.BufferOp;
|
import org.geotools.geometry.jts.JTS;
|
import org.geotools.referencing.CRS;
|
import org.locationtech.jts.geom.Coordinate;
|
import org.locationtech.jts.geom.GeometryFactory;
|
import org.locationtech.jts.geom.Point;
|
//import org.opengis.referencing.FactoryException;
|
//import org.opengis.referencing.crs.CoordinateReferenceSystem;
|
//import org.opengis.referencing.operation.MathTransform;
|
import org.locationtech.proj4j.CRSFactory;
|
import org.locationtech.proj4j.CoordinateReferenceSystem;
|
import org.locationtech.proj4j.CoordinateTransform;
|
import org.locationtech.proj4j.CoordinateTransformFactory;
|
import org.locationtech.proj4j.ProjCoordinate;
|
|
import java.util.HashMap;
|
|
@Service
|
public class XzService {
|
@Autowired
|
private XzConfig xzConfig;
|
@Autowired
|
private EntityHttpUtil entityHttpUtil;
|
@Autowired
|
private AgentService agentService;
|
int num = 40;
|
|
// 关键字查询
|
public String getQueryFiled(String place, String filed, String layerId, String dbId, String queryEntity) throws Exception {
|
String querySQL = "";
|
String valSql = " like '%" + place + "%'";
|
String key = getPublickey();
|
String query = getQuerySql(valSql, filed);
|
// int num = 40;
|
if (query.length() > num) {
|
String[] sbuString = getSqlSubStr(query, num);
|
for (int w = 0; w < sbuString.length; w++) {
|
if (w > 0) {
|
querySQL += ",";
|
}
|
querySQL += RsaHelper.encrypt(key, sbuString[w]);
|
}
|
} else {
|
querySQL += RsaHelper.encrypt(key, query);
|
}
|
System.out.println("rec getQueryFiled:" + querySQL);
|
HashMap formData = getHashMap(layerId, dbId, "1", "0", querySQL, null);
|
String jsonString = entityHttpUtil.getPostMessage(queryEntity, formData);
|
System.out.println("rec getQueryFiled:" + jsonString);
|
JSONObject jsonObject = JSON.parseObject(jsonString);
|
JSONObject dataObjject = jsonObject.getJSONObject("data");
|
JSONArray dataArray = dataObjject.getJSONArray("items");
|
if (dataArray.size() > 0) {
|
return dataArray.getJSONObject(0).toString();
|
}
|
return "";
|
}
|
|
public String[] getSqlSubStr(String str, int chunkSize) {
|
int numChunks = (str.length() + chunkSize - 1) / chunkSize;
|
String[] chunks = new String[numChunks];
|
for (int i = 0; i < numChunks; i++) {
|
int start = i * chunkSize;
|
int end = Math.min(start + chunkSize, str.length());
|
chunks[i] = str.substring(start, end);
|
}
|
return chunks;
|
}
|
|
public String getQuerySql(String valSql, String filed) {
|
String query = "";
|
if (filed.indexOf(",") > -1) {
|
String[] fileds = filed.split(",");
|
for (int i = 0; i < fileds.length; i++) {
|
String name = fileds[i];
|
if (i > 0) {
|
query += " or ";
|
}
|
query += name + valSql;
|
}
|
query += "";
|
} else {
|
query = filed + valSql + "";
|
}
|
return query;
|
}
|
|
// 关键字查询
|
public String getQueryEntity(String place, String filed, String layerId, String dbId, String queryEntity) throws Exception {
|
String valSql = " like '%" + place + "%'";
|
String key = getPublickey();
|
String query = getQuerySql(valSql, filed);
|
String querySQL = "";
|
// int num = 40;
|
if (query.length() > num) {
|
String[] sbuString = getSqlSubStr(query, num);
|
for (int w = 0; w < sbuString.length; w++) {
|
if (w > 0) {
|
querySQL += ",";
|
}
|
querySQL += RsaHelper.encrypt(key, sbuString[w]);
|
}
|
} else {
|
querySQL += RsaHelper.encrypt(key, query);
|
}
|
HashMap formData = getHashMap(layerId, dbId, "1", "100", querySQL, null);
|
formData.put("querytype", "entity");
|
String jsonString1 = entityHttpUtil.getPostMessage(queryEntity, formData);
|
System.out.println("rec getQueryFiled:" + jsonString1);
|
JSONObject jsonObject = JSON.parseObject(jsonString1);
|
JSONObject dataObjject = jsonObject.getJSONObject("data");
|
JSONArray dataArray = dataObjject.getJSONArray("items");
|
if (dataArray.size() <= 0) {
|
return null;
|
}
|
return dataArray.getJSONObject(0).toString();
|
|
|
}
|
|
// 范围查询
|
public String getQueryAround(String type, String wkt, String filed, String layerId, String dbid, String entity) throws Exception {
|
String query = filed + " like '%" + type + "%'" + "";
|
if (type.contains("全部目标")) {
|
query = filed + " like '%目标%'" + "";
|
}
|
String encrypt = RsaHelper.encrypt(getPublickey(), query);
|
HashMap formData = getHashMap(layerId, dbid, "1", "0", encrypt, wkt);
|
formData.put("querytype", "entity");
|
String jsonString = entityHttpUtil.getPostMessage(entity, formData);
|
JSONObject jsonObject = JSON.parseObject(jsonString);
|
JSONObject dataObj = jsonObject.getJSONObject("data");
|
JSONArray dataArray = dataObj.getJSONArray("items");
|
return dataArray.toString();
|
|
}
|
|
//元信息查询
|
public String getQueryMeta(String layerId, String dbid, String filed, String entity) {
|
HashMap<String, Object> staticField = new HashMap<>();
|
JSONArray jsonArray = new JSONArray();
|
staticField.put("type", "count");
|
staticField.put("field", filed);
|
staticField.put("outfield", "count_" + filed);
|
jsonArray.add(staticField);
|
HashMap<String, String> formData = getHashMap(layerId, dbid, null, null, null, null);
|
formData.put("statistics", jsonArray.toString());
|
formData.put("groupby", filed);
|
String meta = entityHttpUtil.getPostMessage(entity, formData);
|
return meta;
|
}
|
|
// 获取返回信息Map
|
public HashMap<String, Object> getFuncMap(String func, String mid) {
|
HashMap<String, Object> hash = new HashMap<String, Object>();
|
hash.put("func", func);
|
hash.put("mid", mid);
|
return hash;
|
}
|
|
//获取秘钥接口
|
public String getPublickey() {
|
HashMap<String, String> map = new HashMap<>();
|
map.put("token", xzConfig.token);
|
String jsonString = entityHttpUtil.getPostMessage(xzConfig.publickey, map);
|
JSONObject jsonObject = JSON.parseObject(jsonString);
|
return jsonObject.getString("data");
|
}
|
|
// 传参
|
public HashMap<String, String> getHashMap(String layerId, String dbid, String start, String count, String where, String box) {
|
HashMap<String, String> hashMap = new HashMap<>();
|
hashMap.put("token", xzConfig.token);
|
hashMap.put("containCount", "true");
|
hashMap.put("layerid", layerId);
|
hashMap.put("dbid", dbid);
|
if (start != null && start != "") {
|
hashMap.put("start", start);
|
}
|
if (count != null && count != "") {
|
hashMap.put("count", count);
|
}
|
if (where != null && where != "") {
|
hashMap.put("where", where);
|
}
|
if (box != null && box != "") {
|
hashMap.put("bbox", box);
|
}
|
|
return hashMap;
|
}
|
|
|
//生成WKT
|
public String getWKt(double lon, double lat, int radius) throws Exception {
|
// 创建一个坐标点
|
Coordinate coord = new Coordinate(lon, lat);
|
// 创建GeometryFactory实例,并指定坐标参考系统为WGS84
|
GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(), 4326);
|
// 使用坐标创建一个点
|
Point point = geometryFactory.createPoint(coord);
|
// 创建BufferOp实例,用于生成缓冲区
|
BufferOp bufferOp = new BufferOp(point);
|
int dis = 500;
|
if (radius != 0) {
|
dis = radius;
|
}
|
// 设置缓冲区距离为500米
|
Geometry bufferedGeometry = bufferOp.getResultGeometry(dis / 111319.9);
|
// 创建WKTWriter实例,用于将Geometry转换为WKT格式
|
// WKTWriter wktWriter = new WKTWriter();
|
|
// 将缓冲区Geometry转换为WKT格式
|
// String wkt = wktWriter.write(bufferedGeometry);
|
// 输出WKT
|
// System.out.println("WKT: " + wkt);
|
Envelope envelope = bufferedGeometry.getEnvelopeInternal();
|
|
// double[] wkt = new double[4];
|
// wkt[0] = ;
|
// wkt[1] =;
|
// wkt[2] = envelope.getMaxX();
|
// wkt[3] = envelope.getMaxY();
|
//
|
// wkt += envelope.getMinX();
|
// wkt += ","+envelope.getMinY();
|
// wkt += ","+envelope.getMaxX();
|
// wkt += ","+envelope.getMaxY();
|
// System.out.println("WKT: " + wkt);
|
// String arrayAsString = Arrays.toString(wkt);
|
// System.out.println("wkt: " + wkt);
|
|
CoordinateTransformFactory ctFactory = new CoordinateTransformFactory();
|
|
// 定义源坐标系(WGS 84)
|
String srcCRS = "EPSG:4326";
|
// 定义目标坐标系(中国大地坐标系)
|
String destCRS = "EPSG:4550";
|
|
// 创建坐标参考系统
|
CRSFactory crsFactory = new CRSFactory();
|
CoordinateReferenceSystem src = crsFactory.createFromName(srcCRS);
|
CoordinateReferenceSystem dest = crsFactory.createFromName(destCRS);
|
|
// 创建坐标转换器
|
CoordinateTransform transform = ctFactory.createTransform(src, dest);
|
|
// 定义一个源坐标点(经度,纬度)
|
ProjCoordinate srcgetMin = new ProjCoordinate(envelope.getMinX(), envelope.getMinY(), 0); // 例如:北京的经纬度
|
ProjCoordinate srcgetMax = new ProjCoordinate(envelope.getMaxX(), envelope.getMaxY(), 0); // 例如:北京的经纬度
|
// 执行转换
|
ProjCoordinate destgetMin = new ProjCoordinate();
|
ProjCoordinate destgetMax = new ProjCoordinate();
|
System.out.println("转换后的坐标:X = " + srcgetMin);
|
transform.transform(srcgetMin, destgetMin);
|
transform.transform(srcgetMax, destgetMax);
|
String wkt = destgetMin.x + "," + destgetMin.y + "," + destgetMax.x + "," + destgetMax.y;
|
System.out.println("转换后的坐标:X = " + wkt);
|
return wkt;
|
|
}
|
|
|
}
|