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 staticField = new HashMap<>(); JSONArray jsonArray = new JSONArray(); staticField.put("type", "count"); staticField.put("field", filed); staticField.put("outfield", "count_" + filed); jsonArray.add(staticField); HashMap formData = getHashMap(layerId, dbid, null, null, null, null); formData.put("statistics", jsonArray.toString()); formData.put("groupby", filed); return entityHttpUtil.getPostMessage(entity, formData); } // 获取返回信息Map public HashMap getFuncMap(String func, String mid) { HashMap hash = new HashMap(); hash.put("func", func); hash.put("mid", mid); return hash; } //获取秘钥接口 public String getPublickey() { HashMap 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 getHashMap(String layerId, String dbid, String start, String count, String where, String box) { HashMap 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; } }