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);
    }
}
GeoToolsCase.java

 

 

posted @ 2026-10-18 20:56  且行且码  阅读(11)  评论(0)    收藏  举报