diff --git a/ruoyi/pom.xml b/ruoyi/pom.xml
index ba121a28c..df2e45009 100644
--- a/ruoyi/pom.xml
+++ b/ruoyi/pom.xml
@@ -99,13 +99,21 @@
mysql-connector-java
+
+
+
+
+
+
+
+
com.microsoft.sqlserver
mssql-jdbc
-
- 7.4.0.jre8
+ 8.2.2.jre8
+
org.mybatis.spring.boot
diff --git a/ruoyi/src/main/java/com/ruoyi/project/data/basis/domain/BaiDuMapResponse.java b/ruoyi/src/main/java/com/ruoyi/project/data/basis/domain/BaiDuMapResponse.java
new file mode 100644
index 000000000..ea03935a1
--- /dev/null
+++ b/ruoyi/src/main/java/com/ruoyi/project/data/basis/domain/BaiDuMapResponse.java
@@ -0,0 +1,30 @@
+package com.ruoyi.project.data.basis.domain;
+
+import java.util.List;
+
+/**
+ * 百度地图apiResponse
+ *
+ * @author lihe
+ */
+public class BaiDuMapResponse {
+
+ private Integer status;
+ private List result;
+
+ public Integer getStatus() {
+ return status;
+ }
+
+ public void setStatus(Integer status) {
+ this.status = status;
+ }
+
+ public List getResult() {
+ return result;
+ }
+
+ public void setResult(List result) {
+ this.result = result;
+ }
+}
diff --git a/ruoyi/src/main/java/com/ruoyi/project/data/basis/domain/BaiDuPoint.java b/ruoyi/src/main/java/com/ruoyi/project/data/basis/domain/BaiDuPoint.java
new file mode 100644
index 000000000..2ded279c9
--- /dev/null
+++ b/ruoyi/src/main/java/com/ruoyi/project/data/basis/domain/BaiDuPoint.java
@@ -0,0 +1,33 @@
+package com.ruoyi.project.data.basis.domain;
+
+/**
+ * 百度地图点
+ *
+ * @author lihe
+ */
+public class BaiDuPoint {
+
+ private Double x;
+ private Double y;
+
+ public Double getX() {
+ return x;
+ }
+
+ public void setX(Double x) {
+ this.x = x;
+ }
+
+ public Double getY() {
+ return y;
+ }
+
+ public void setY(Double y) {
+ this.y = y;
+ }
+
+ @Override
+ public String toString() {
+ return x + " " + y;
+ }
+}
diff --git a/ruoyi/src/main/java/com/ruoyi/project/data/basis/domain/UvGeo.java b/ruoyi/src/main/java/com/ruoyi/project/data/basis/domain/UvGeo.java
new file mode 100644
index 000000000..46351a884
--- /dev/null
+++ b/ruoyi/src/main/java/com/ruoyi/project/data/basis/domain/UvGeo.java
@@ -0,0 +1,41 @@
+package com.ruoyi.project.data.basis.domain;
+
+/**
+ * Geo对象
+ *
+ * @author lihe
+ */
+public class UvGeo {
+ private Integer id;
+ private String geoText;
+ /**
+ * 1 百度
+ * 2 高德
+ * 3 84
+ */
+ private Integer coordinateType;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getGeoText() {
+ return geoText;
+ }
+
+ public void setGeoText(String geoText) {
+ this.geoText = geoText;
+ }
+
+ public Integer getCoordinateType() {
+ return coordinateType;
+ }
+
+ public void setCoordinateType(Integer coordinateType) {
+ this.coordinateType = coordinateType;
+ }
+}
diff --git a/ruoyi/src/main/java/com/ruoyi/project/data/basis/mapper/UvCommunityGeoMapper.java b/ruoyi/src/main/java/com/ruoyi/project/data/basis/mapper/UvCommunityGeoMapper.java
index faa8cd0c9..d68d5de53 100644
--- a/ruoyi/src/main/java/com/ruoyi/project/data/basis/mapper/UvCommunityGeoMapper.java
+++ b/ruoyi/src/main/java/com/ruoyi/project/data/basis/mapper/UvCommunityGeoMapper.java
@@ -4,6 +4,8 @@ import com.baomidou.dynamic.datasource.annotation.DS;
import com.ruoyi.project.data.basis.domain.UVBasePrice;
import com.ruoyi.project.data.basis.domain.UVBasePriceQueryModel;
import com.ruoyi.project.data.basis.domain.UvCommunityGeo;
+import com.ruoyi.project.data.basis.domain.UvGeo;
+import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -30,4 +32,21 @@ public interface UvCommunityGeoMapper {
*/
int updateGaoDeCoordinate(UvCommunityGeo uvCommunityGeo);
+ /**
+ * 获取指定表的geo数据
+ *
+ * @param tableName
+ * @return
+ */
+ List getSomeGeo(@Param("tableName") String tableName);
+
+ /**
+ * 更新geo
+ * @param tableName
+ * @param id
+ * @param geo
+ * @return
+ */
+ int updateSomeGeo(@Param("tableName") String tableName, @Param("geo") String geo, @Param("id") Integer id);
+
}
diff --git a/ruoyi/src/main/resources/mybatis/data/UvCommunityGeoMapper.xml b/ruoyi/src/main/resources/mybatis/data/UvCommunityGeoMapper.xml
index 62e83435a..4c57cd5d9 100644
--- a/ruoyi/src/main/resources/mybatis/data/UvCommunityGeoMapper.xml
+++ b/ruoyi/src/main/resources/mybatis/data/UvCommunityGeoMapper.xml
@@ -11,4 +11,12 @@
update gis_community set gaode_lng=#{gaodeLng},gaode_lat=#{gaodeLat},update_time=getdate() where
community_id=#{communityId}
+
+
+ update ${tableName} set BD_Shape=#{geo} where OBJECTID=#{id};
+
\ No newline at end of file
diff --git a/ruoyi/src/test/java/com/ruoyi/routine/GeoTests.java b/ruoyi/src/test/java/com/ruoyi/routine/GeoTests.java
index 8d852fa6b..2bbc93f12 100644
--- a/ruoyi/src/test/java/com/ruoyi/routine/GeoTests.java
+++ b/ruoyi/src/test/java/com/ruoyi/routine/GeoTests.java
@@ -2,10 +2,15 @@ package com.ruoyi.routine;
import com.alibaba.fastjson.JSON;
import com.baomidou.dynamic.datasource.annotation.DS;
+import com.microsoft.sqlserver.jdbc.Geometry;
+import com.microsoft.sqlserver.jdbc.SQLServerException;
+import com.microsoft.sqlserver.jdbc.spatialdatatypes.Figure;
+import com.microsoft.sqlserver.jdbc.spatialdatatypes.Point;
import com.ruoyi.RuoYiApplication;
-import com.ruoyi.project.data.basis.domain.GDConvertCordinateResult;
-import com.ruoyi.project.data.basis.domain.UvCommunityGeo;
+import com.ruoyi.project.data.basis.domain.*;
import com.ruoyi.project.data.basis.mapper.UvCommunityGeoMapper;
+import com.sun.org.apache.regexp.internal.RE;
+import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
@@ -24,8 +29,10 @@ import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
+import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
+import java.util.stream.Collectors;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = RuoYiApplication.class)
@@ -80,4 +87,137 @@ public class GeoTests {
});
}
+ private String convertGaoDe2BaiDu(List figureList, List pointList) {
+
+ OkHttpClient client = new OkHttpClient();
+ String baseUrl = "http://api.map.baidu.com/geoconv/v1/?ak=GNPGIGijImWZHguFphH6GcsPmAYrEfMX&from=3&to" +
+ "=5&coords=";
+ StringBuilder baiDuGeoSb = new StringBuilder("POLYGON (");
+ List polygonPointList = new LinkedList<>();
+ for (int i = 0; i < figureList.size(); i++) {
+ List partialPointList = null;
+ List allBaiDuPointList = new LinkedList<>();
+ if (i == figureList.size() - 1) {
+ partialPointList = pointList.stream()
+ .skip(figureList.get(i).getPointOffset())
+ .collect(Collectors.toList());
+ } else {
+ partialPointList = pointList.stream()
+ .skip(figureList.get(i).getPointOffset())
+ .limit(figureList.get(i + 1).getPointOffset() - figureList.get(i).getPointOffset())
+ .collect(Collectors.toList());
+ }
+
+ int groupCount = partialPointList.size() / 100;
+ if (0 != partialPointList.size() % 100) {
+ groupCount += 1;
+ }
+
+ for (int j = 0; j < groupCount; j++) {
+ StringBuilder sb = new StringBuilder(baseUrl);
+ sb.append(String.join(";",
+ partialPointList.stream().skip(j * 100).limit(100).map(p -> p.getX() + "," + p.getY()).collect(Collectors.toList())));
+ Request request = new Request.Builder()
+ .url(sb.toString())
+ .build();
+ System.out.println(request.url().toString());
+ try (Response response = client.newCall(request).execute()) {
+ String content = response.body().string();
+ BaiDuMapResponse priceApiResult = JSON.parseObject(content,
+ BaiDuMapResponse.class);
+ if (Objects.equals(0, priceApiResult.getStatus())) {
+ List baiDuPointList = priceApiResult.getResult();
+ allBaiDuPointList.addAll(baiDuPointList);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ String partialWKT = String.join(", ",
+ allBaiDuPointList.stream().map(BaiDuPoint::toString).collect(Collectors.toList()));
+ System.out.println(partialWKT);
+ polygonPointList.add(partialWKT);
+ }
+
+ baiDuGeoSb.append(String.join(", ",
+ polygonPointList.stream().map(s -> "(" + s + ")").collect(Collectors.toList())));
+ baiDuGeoSb.append(")");
+
+ return baiDuGeoSb.toString();
+ }
+
+
+ /**
+ * 高德坐标转百度
+ */
+ @Test
+ @DS("teemlink")
+ public void convertGeoGD2Baidu() {
+ String tableName = "上海基准地价2010办公";
+ List uvGeoList = uvCommunityGeoMapper.getSomeGeo(tableName);
+
+ //
+ uvGeoList.parallelStream().forEach(gaoDeGeo -> {
+ try {
+ Geometry geometry = Geometry.parse(gaoDeGeo.getGeoText());
+ List figureList = geometry.getFigureList();
+ List pointList = geometry.getPointList();
+
+ String baiDuGeoWKT = convertGaoDe2BaiDu(figureList, pointList);
+ uvCommunityGeoMapper.updateSomeGeo(tableName, baiDuGeoWKT, gaoDeGeo.getId());
+ } catch (SQLServerException e) {
+ e.printStackTrace();
+ }
+
+// StringBuilder baiDuGeoText = new StringBuilder("POLYGON ((");
+// String geoText = gaoDeGeo.getGeoText().replace("POLYGON ((", "").replace("))", "");
+// String[] segmentList = geoText.split(",");
+//
+//
+// List polygonPointList = new LinkedList<>();
+// for (String item : segmentList) {
+// String[] point = item.trim().split(" ");
+// polygonPointList.add(String.format("%s,%s", point[0], point[1]));
+// }
+//
+// // 每100个点一组
+// int groupCount = polygonPointList.size() / 100;
+// if (0 != polygonPointList.size() % 100) {
+// groupCount += 1;
+// }
+// for (int i = 0; i < groupCount; i++) {
+// StringBuilder sb = new StringBuilder(baseUrl);
+// sb.append(String.join(";",
+// polygonPointList.stream().skip(i * 100).limit(100).collect(Collectors.toList())));
+// Request request = new Request.Builder()
+// .url(sb.toString())
+// .build();
+// try (Response response = client.newCall(request).execute()) {
+// String content = response.body().string();
+// BaiDuMapResponse priceApiResult = JSON.parseObject(content,
+// BaiDuMapResponse.class);
+// if (Objects.equals(0, priceApiResult.getStatus())) {
+// List baiDuPointList = priceApiResult.getResult();
+// allBaiDuPointList.addAll(baiDuPointList);
+// }
+// } catch (IOException e) {
+// e.printStackTrace();
+// }
+// }
+//
+// try {
+// String rawBaiDuPointText = String.join(",",
+// allBaiDuPointList.stream().map(BaiDuPoint::toString).collect(Collectors.toList()));
+//
+// baiDuGeoText.append(rawBaiDuPointText);
+// baiDuGeoText.append("))");
+// uvCommunityGeoMapper.updateSomeGeo(tableName, baiDuGeoText.toString(), gaoDeGeo.getId());
+// } catch (Exception e) {
+// e.printStackTrace();
+// }
+
+ });
+ }
+
}