From 28c98e6c09c01ae867d07dd54ec22673b2b03003 Mon Sep 17 00:00:00 2001 From: "hukekuan@163.com" Date: Wed, 28 Mar 2018 21:13:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../gis3c/spatial/common/CRSUtilities.java | 46 +++++++++++++- .../spatial/common/FeatureUtilities.java | 2 +- .../spatial/common/GeometryUtilities.java | 63 +++++++++++++++++-- .../com/gis3c/spatial/entity/BaseFeature.java | 3 - src/test/java/com/gis3c/spatial/App.java | 40 ++++-------- 6 files changed, 119 insertions(+), 37 deletions(-) diff --git a/pom.xml b/pom.xml index 42723e4..297540b 100644 --- a/pom.xml +++ b/pom.xml @@ -250,7 +250,7 @@ org.geotools - gt-swing + gt-epsg-hsql ${geotools.version} diff --git a/src/main/java/com/gis3c/spatial/common/CRSUtilities.java b/src/main/java/com/gis3c/spatial/common/CRSUtilities.java index b9127ea..f2dfca8 100644 --- a/src/main/java/com/gis3c/spatial/common/CRSUtilities.java +++ b/src/main/java/com/gis3c/spatial/common/CRSUtilities.java @@ -2,13 +2,20 @@ package com.gis3c.spatial.common;/** * Created by hukekuan on 17-7-10. */ +import com.vividsolutions.jts.geom.Geometry; +import org.geotools.data.DefaultTransaction; +import org.geotools.data.Transaction; import org.geotools.factory.CommonFactoryFinder; +import org.geotools.geometry.jts.JTS; import org.geotools.referencing.CRS; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.opengis.filter.FilterFactory2; import org.opengis.referencing.FactoryException; import org.opengis.referencing.NoSuchAuthorityCodeException; import org.opengis.referencing.crs.CoordinateReferenceSystem; +import org.opengis.referencing.operation.MathTransform; + +import java.io.IOException; /** * @author hukekuan @@ -24,8 +31,45 @@ public class CRSUtilities { if(sridNumber == null || "".equals(sridNumber)){ return DefaultGeographicCRS.WGS84; } - crs = CRS.decode("EPSG:" + sridNumber); + crs = CRS.decode("epsg:" + sridNumber); return crs; } + + /** + * 生成坐标系转变对象 + * @param rawSridNumber, 如 "4326" + * @param goalSridNumber, 如 "4326" + * @return + * @throws FactoryException + */ + public static MathTransform MathTransform(String rawSridNumber, String goalSridNumber) + throws FactoryException{ + CoordinateReferenceSystem rawCRS = null; + CoordinateReferenceSystem goalCRS = null; + if(rawSridNumber == null || "".equals(rawSridNumber) + || goalSridNumber == null || "".equals(goalSridNumber)){ + throw new IllegalArgumentException("参数输入有误"); + } + rawCRS = GetCRSFromSRID(rawSridNumber); + goalCRS = GetCRSFromSRID(goalSridNumber); + + return CRS.findMathTransform(rawCRS, goalCRS, true); + } + + public static Geometry CRSTransform(Geometry geometry, MathTransform transform) + throws IOException { + Geometry resultGeometry = null; + Transaction transaction = new DefaultTransaction("Project"); + try { + resultGeometry = JTS.transform(geometry, transform); + transaction.commit(); + } catch (Exception e) { + e.printStackTrace(); + transaction.rollback(); + }finally{ + transaction.close(); + } + return resultGeometry; + } } diff --git a/src/main/java/com/gis3c/spatial/common/FeatureUtilities.java b/src/main/java/com/gis3c/spatial/common/FeatureUtilities.java index 12e1551..b0b1a79 100644 --- a/src/main/java/com/gis3c/spatial/common/FeatureUtilities.java +++ b/src/main/java/com/gis3c/spatial/common/FeatureUtilities.java @@ -120,7 +120,7 @@ public class FeatureUtilities { fjson.writeFeatureCollection(simpleFeatureCollection, writer); result = writer.toString(); }else { - result="{'type': 'FeatureCollection', 'features': []}"; + result="{\"type\": \"FeatureCollection\", \"features\": []}"; } return result; diff --git a/src/main/java/com/gis3c/spatial/common/GeometryUtilities.java b/src/main/java/com/gis3c/spatial/common/GeometryUtilities.java index c2fe4d5..071973d 100644 --- a/src/main/java/com/gis3c/spatial/common/GeometryUtilities.java +++ b/src/main/java/com/gis3c/spatial/common/GeometryUtilities.java @@ -4,12 +4,17 @@ import com.vividsolutions.jts.geom.*; import com.vividsolutions.jts.io.ParseException; import com.vividsolutions.jts.io.WKTReader; import com.vividsolutions.jts.io.WKTWriter; +import org.geotools.geometry.jts.JTS; import org.geotools.geometry.jts.JTSFactoryFinder; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.referencing.crs.DefaultGeographicCRS; +import org.opengis.referencing.FactoryException; +import org.opengis.referencing.operation.MathTransform; +import org.opengis.referencing.operation.TransformException; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -34,12 +39,12 @@ public class GeometryUtilities { /** * 根据经纬度生成Point - * @param x - * @param y + * @param lon 经度 + * @param lat 维度 * @return */ - public static Point CreatePoint(double x,double y){ - return geomFactory.createPoint(new Coordinate(x,y)); + public static Point CreatePoint(double lon, double lat){ + return geomFactory.createPoint(new Coordinate(lat, lon)); } /** @@ -312,4 +317,54 @@ public class GeometryUtilities { GeometryCollection gc = GeometryCollection(geometryList); return gc.getEnvelope(); } + + /** + * 生成Buffer + * @param geometry + * @param distance + * @return + */ + public Polygon CreateBuffer(Geometry geometry,Double distance){ + Polygon bufferResult = null; + if(geometry == null || distance == null){ + throw new IllegalArgumentException("参数输入有误"); + } + bufferResult = (Polygon) geometry.buffer(distance, 100); + + return bufferResult; + } + + public Polygon CreateBufferByPoint(Double lon,Double lat,Double distance){ + Point point = CreatePoint(lon,lat); + return CreateBuffer(point,distance); + } + + /** + * 计算两个点之间的距离 + * @param startPoint + * @param endPoint + * @return + * @throws FactoryException + * @throws IOException + */ + public static Double PointDistance(Point startPoint,Point endPoint) + throws TransformException, FactoryException { + int sridValue; + if(startPoint == null || endPoint == null){ + throw new IllegalArgumentException("参数输入有误"); + } + sridValue = startPoint.getSRID(); + if(sridValue != endPoint.getSRID()){ + throw new IllegalArgumentException("坐标系不一致"); + } + if(sridValue == 0){ + sridValue = 4326; + } + + return JTS.orthodromicDistance( + startPoint.getCoordinate(), + endPoint.getCoordinate(), + CRSUtilities.GetCRSFromSRID(String.valueOf(sridValue)) + ); + } } diff --git a/src/main/java/com/gis3c/spatial/entity/BaseFeature.java b/src/main/java/com/gis3c/spatial/entity/BaseFeature.java index 12cf264..27d2f9b 100644 --- a/src/main/java/com/gis3c/spatial/entity/BaseFeature.java +++ b/src/main/java/com/gis3c/spatial/entity/BaseFeature.java @@ -102,9 +102,6 @@ public class BaseFeature { return featureBuilder.buildFeature(featureIndex, objList.toArray()); } - - - /***************************************************************************************************/ /** diff --git a/src/test/java/com/gis3c/spatial/App.java b/src/test/java/com/gis3c/spatial/App.java index 26c8a7d..28b9586 100644 --- a/src/test/java/com/gis3c/spatial/App.java +++ b/src/test/java/com/gis3c/spatial/App.java @@ -7,11 +7,16 @@ import com.gis3c.ol.service.LayerService; import com.gis3c.ol.service.MapService; import com.gis3c.ol.service.SourceService; import com.gis3c.spatial.common.FeatureUtilities; +import com.gis3c.spatial.common.GeometryUtilities; import com.gis3c.spatial.entity.Region; import com.gis3c.spatial.entity.RegionType; import com.gis3c.spatial.service.RegionService; import com.gis3c.spatial.service.TestService; +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Point; import org.opengis.feature.simple.SimpleFeature; +import org.opengis.referencing.FactoryException; +import org.opengis.referencing.operation.TransformException; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; @@ -20,6 +25,7 @@ import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; + /** * Created by hukekuan on 2017/12/14. */ @@ -30,34 +36,14 @@ public class App { public static void main(String[] args) throws IllegalAccessException, IOException { ApplicationContext context = ApplicationInit(); -// SourceService sourceService = context.getBean(SourceService.class); -// LayerService layerService = context.getBean(LayerService.class); -// MapService mapService = context.getBean(MapService.class); -// TestService testService = context.getBean(TestService.class); - RegionService regionService = context.getBean(RegionService.class); - - - System.out.println(3 & 2); - -// System.out.println(a.compareTo(b)); - - - - - - - - - - - - - - - - - + Point start = GeometryUtilities.CreatePoint(118.024444,36.802778); + Point end = GeometryUtilities.CreatePoint(118.027777,36.759166); + try { + System.out.println(GeometryUtilities.PointDistance(start,end)); + } catch (TransformException | FactoryException e) { + e.printStackTrace(); + } // List regionList = regionService.findRegionsByParentCode("370000");