GeoTools工具类
参考
org.geotools是一个Java编写的开源地理空间类库,提供了一套功能强大的工具和API,用于处理地理空间数据。
引用
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-main</artifactId>
<version>28.2</version>
</dependency>
依赖下载不下来,是仓库里没有,需要换个仓库下载,在repositories标签里
<repositories>
<repository>
<id>osgeo</id>
<name>Open Source Geospatial Foundation Repository</name>
<url>https://repo.osgeo.org/repository/release/</url>
</repository>
</repositories>
GeoTools与JTS的关系
JTS提供了一套空间数据操作的核心算法,为在兼容OGC标准的空间对象模型中进行基础的几何操作提供2D空间谓词API。JTS解决了空间对象之间拓扑关系的判定和计算,并提供很多有用的算法来解决对象的面积,长度等等的问题,是处理空间数据图形关系非常好的解决方案。
JTS就相当于GeoTools中的一个“子模块”。但因为这个模块本身不是GeoTools工程的,所以在javadoc中找不到JTS的API,需要到JTS官网上面另外下载。
在具体使用上:
<dependency>
<groupId>org.locationtech.jts</groupId>
<artifactId>jts-core</artifactId>
<version>1.19.0</version>
</dependency>
GeoTools会自动的附带JTS的包,不需要自己手动引入。
计算面积
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
// 使用jts
// GeometryFactory geometryFactory = new GeometryFactory();
CoordinateList coords=new CoordinateList();
coords.add(new Coordinate(-51.009, 87.937));
coords.add(new Coordinate(-47.710, 87.937));
coords.add(new Coordinate(-47.710, 81.675));
coords.add(new Coordinate(-51.009, 81.675));
//闭合
coords.closeRing();
Polygon polygon = geometryFactory.createPolygon(coords.toCoordinateArray());
//输出中心点
System.out.println( polygon.getCentroid());
//输出多边形面积
System.out.println( polygon.getArea());
套用数学的计算公式
计算多边形面积
计算方法:计算多边形的面积可以使用叉积法或者矩阵法。
叉积法:是通过计算多边形的顶点坐标的叉积来求得多边形的面积。具体步骤如下:
1.将多边形的顶点按照顺时针或逆时针的方式排列。
2.依次计算多边形相邻顶点的叉积。
3.将所有叉积的绝对值相加,并除以2,得到多边形的面积。
流程图:A(开始)-->B(排列顶点)-->C(计算叉积)-->D(叉积求和)-->E(除以2)-->F(输出结果)
第一种:
public static void main(String[] args) {
double[] x = {10, 40, 40, 10};
double[] y = {10, 10, 40, 40};
double area = calculateArea(x, y);
System.out.println("多边形的面积为:" + area);
}
public static double calculateArea(double[] x, double[] y) {
int numPoints = x.length;
double area = 0.0;
for (int i = 0; i < numPoints; i++) {
int j = (i + 1) % numPoints;
area += x[i] * y[j];
area -= x[j] * y[i];
}
area = Math.abs(area) / 2.0;
return area;
}
第二种:
public static void main(String[] args) {
//多边形面积
double sum = 0;
//临时变量
double xTmp = 0;
double yTmp = 0;
//无论从哪开始第一个坐标的x,y必须是0,0 如果不从0,0 那么会出现误差
double xFirst = 0.0;
double yFirst = 0.0;
// 坐标必须封闭 从哪开始 到哪结束
String[] arrs = {"10,10", "40,10", "40,40", "10,40", "10,10"};
for (String s : arrs) {
// 读取当前坐标的x和y
String[] arr = s.split(",");
double xCurrent = Double.parseDouble(arr[0]) / 1000;
double yCurrent = Double.parseDouble(arr[1]) / 1000;
/**
* 计算面积:
* (xTmp,yTmp)代表上一行的坐标值
* (xCurrent,yCurrent)代表当前这一行的坐标值
*/
// 公式 sum += ((xTmp - xCurrent) * (yTmp + yCurrent)) * 0.5;
BigDecimal sub = new BigDecimal(xTmp).subtract(new BigDecimal(xCurrent));
BigDecimal add = new BigDecimal(yTmp).add(new BigDecimal(yCurrent));
BigDecimal mul = sub.multiply(add).multiply(new BigDecimal("0.5"));
sum = mul.add(new BigDecimal(sum)).doubleValue();
//计算完面积后,进入下一次循环前需要将“当前坐标”交换为“上一行的坐标”
xTmp = xCurrent;
yTmp = yCurrent;
}
//用最后读取的坐标与第一次读取的坐标进行一次面积运算
BigDecimal sub = new BigDecimal(xTmp).subtract(new BigDecimal(xFirst));
BigDecimal add = new BigDecimal(yTmp).add(new BigDecimal(yFirst));
BigDecimal mul = sub.multiply(add).multiply(new BigDecimal("0.5"));
sum = mul.add(new BigDecimal(sum)).doubleValue();
System.out.println(Math.abs(sum));
}