java 空间几何计算

2023-12-23 19:54:16

GeoTools工具类

参考

Geotools(空间分析,栅格,坐标系,查询,简易地图,GP工具)-CSDN博客

geotools使用_org.geotools-CSDN博客

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));
}

文章来源:https://blog.csdn.net/csdnzhang365/article/details/135138971
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。