GeoTools 介绍
GeoTools 是一个为地理空间数据提供工具的开源 Java 库;本文主要介绍其基本功能,文中所使用到的软件版本:java 17.0.5、geotools 33.2。
1、简介
GeoTools 主要用于处理和分析地理空间数据。它提供了一系列用于读取、写入、处理和可视化地理空间数据的工具和 API。以下是与 GeoTools 相关的一些重要概念:
- 地理空间数据(Geospatial Data): GeoTools 主要用于处理地理空间数据,这包括地图、地形、卫星影像、矢量数据等地理信息。这些数据通常具有地理坐标信息和地理属性信息。
- 地理坐标系统(Geographic Coordinate System,GCS): 地理坐标系统是用于在地球上定位点的一种方法。GeoTools 支持多种地理坐标系统,包括经纬度坐标系统等。
- 投影坐标系统(Projected Coordinate System,PCS): 投影坐标系统是将地球表面的地理坐标投影到平面上的一种方法。GeoTools 提供了许多常用的投影方法和投影坐标系统的支持。
- 数据格式(Data Formats): GeoTools 支持多种地理空间数据格式,如 Shapefile、GeoJSON、KML、GML 等,可以方便地读取和写入这些数据格式。
- 空间分析(Spatial Analysis): GeoTools 提供了丰富的空间分析功能,包括缓冲区分析、空间查询、空间叠加分析等,可以帮助用户进行地理空间数据的处理和分析。
2、简单使用
2.1、引入依赖
<dependencies> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-main</artifactId> <version>33.2</version> </dependency> ... </dependencies> <repositories> <repository> <id>osgeo</id> <name>OSGeo Release Repository</name> <url>https://repo.osgeo.org/repository/release/</url> <snapshots> <enabled>false</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </repository> <repository> <id>osgeo-snapshot</id> <name>OSGeo Snapshot Repository</name> <url>https://repo.osgeo.org/repository/snapshot/</url> <snapshots> <enabled>true</enabled> </snapshots> <releases> <enabled>false</enabled> </releases> </repository> </repositories>
2.2、计算地图上两点之间的距离
@Test public void distance() { GeodeticCalculator geodeticCalculator = new GeodeticCalculator(DefaultGeographicCRS.WGS84); geodeticCalculator.setStartingGeographicPoint(118.784169,32.041747); geodeticCalculator.setDestinationGeographicPoint(118.813340,32.041747); double distance = geodeticCalculator.getOrthodromicDistance(); log.info("distance={}米", distance); }
2.3、计算地图上多边形的面积
@Test public void area() throws Exception { CoordinateReferenceSystem crsWgs84 = DefaultGeographicCRS.WGS84; GeometryFactory geometryFactory = new GeometryFactory(); WKTReader wktReader = new WKTReader(geometryFactory); Polygon polygon = (Polygon)wktReader.read("POLYGON ((118.784245 32.041544, 118.794579 32.041699, 118.792134 32.033366, 118.784127 32.030915, 118.784245 32.041544))"); //定义目标投影:使用 AUTO 投影,自动选择一个局部等面积投影 //AUTO:42001,lon,lat 会自动选择一个以该中心点为基准的本地UTM投影或其他等面积投影 Point centroid = polygon.getCentroid(); String autoCode = "AUTO:42001," + centroid.getX() + "," + centroid.getY(); CoordinateReferenceSystem crsAuto = CRS.decode(autoCode); //创建坐标转换器 MathTransform transform = CRS.findMathTransform(crsWgs84, crsAuto, true); //执行几何体转换 Geometry polygon2 = JTS.transform(polygon, transform); log.info("area={}平方米", polygon2.getArea()); }
2.4、以地图上一个点为中心,一定距离为半径画圆
@Test public void circle() throws Exception { WKTReader wktReader = new WKTReader(new GeometryFactory()); Point center = (Point) wktReader.read("POINT (118.784169 32.041747)"); CoordinateReferenceSystem crsWgs84 = DefaultGeographicCRS.WGS84; //确定本地等面积投影 (AUTO CRS) //使用 AUTO:42001,lon,lat 自动选择一个以该点为中心的本地投影 CRS,单位是米。 String autoCode = "AUTO:42001," + center.getX() + "," + center.getY(); CoordinateReferenceSystem crsAuto = CRS.decode(autoCode); //创建坐标转换器 MathTransform transformToAuto = CRS.findMathTransform(crsWgs84, crsAuto); MathTransform transformToWgs84 = CRS.findMathTransform(crsAuto, crsWgs84); //转换:WGS84 -> 本地投影 Point centerPlane = (Point) JTS.transform(center, transformToAuto); //创建缓冲区(圆形),半径单位为:米 Polygon circlePlane = (Polygon) centerPlane.buffer(3000, 64); //反转换:本地投影 -> WGS84 Polygon circle = (Polygon) JTS.transform(circlePlane, transformToWgs84); log.info("circle={}", circle); }
2.5、完整代码
package com.abc.geotools; import lombok.extern.slf4j.Slf4j; import org.geotools.api.referencing.crs.CoordinateReferenceSystem; import org.geotools.api.referencing.operation.MathTransform; import org.geotools.geometry.jts.JTS; import org.geotools.referencing.CRS; import org.geotools.referencing.GeodeticCalculator; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.junit.Test; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.Point; import org.locationtech.jts.geom.Polygon; import org.locationtech.jts.io.WKTReader; @Slf4j public class GeoToolsCase { @Test public void distance() { GeodeticCalculator geodeticCalculator = new GeodeticCalculator(DefaultGeographicCRS.WGS84); geodeticCalculator.setStartingGeographicPoint(118.784169,32.041747); geodeticCalculator.setDestinationGeographicPoint(118.813340,32.041747); double distance = geodeticCalculator.getOrthodromicDistance(); log.info("distance={}米", distance); } @Test public void area() throws Exception { CoordinateReferenceSystem crsWgs84 = DefaultGeographicCRS.WGS84; GeometryFactory geometryFactory = new GeometryFactory(); WKTReader wktReader = new WKTReader(geometryFactory); Polygon polygon = (Polygon)wktReader.read("POLYGON ((118.784245 32.041544, 118.794579 32.041699, 118.792134 32.033366, 118.784127 32.030915, 118.784245 32.041544))"); //定义目标投影:使用 AUTO 投影,自动选择一个局部等面积投影 //AUTO:42001,lon,lat 会自动选择一个以该中心点为基准的本地UTM投影或其他等面积投影 Point centroid = polygon.getCentroid(); String autoCode = "AUTO:42001," + centroid.getX() + "," + centroid.getY(); CoordinateReferenceSystem crsAuto = CRS.decode(autoCode); //创建坐标转换器 MathTransform transform = CRS.findMathTransform(crsWgs84, crsAuto, true); //执行几何体转换 Geometry polygon2 = JTS.transform(polygon, transform); log.info("area={}平方米", polygon2.getArea()); } @Test public void circle() throws Exception { WKTReader wktReader = new WKTReader(new GeometryFactory()); Point center = (Point) wktReader.read("POINT (118.784169 32.041747)"); CoordinateReferenceSystem crsWgs84 = DefaultGeographicCRS.WGS84; //确定本地等面积投影 (AUTO CRS) //使用 AUTO:42001,lon,lat 自动选择一个以该点为中心的本地投影 CRS,单位是米。 String autoCode = "AUTO:42001," + center.getX() + "," + center.getY(); CoordinateReferenceSystem crsAuto = CRS.decode(autoCode); //创建坐标转换器 MathTransform transformToAuto = CRS.findMathTransform(crsWgs84, crsAuto); MathTransform transformToWgs84 = CRS.findMathTransform(crsAuto, crsWgs84); //转换:WGS84 -> 本地投影 Point centerPlane = (Point) JTS.transform(center, transformToAuto); //创建缓冲区(圆形),半径单位为:米 Polygon circlePlane = (Polygon) centerPlane.buffer(3000, 64); //反转换:本地投影 -> WGS84 Polygon circle = (Polygon) JTS.transform(circlePlane, transformToWgs84); log.info("circle={}", circle); } }
浙公网安备 33010602011771号