根据两个点坐标,加上点幅宽计算点的路径面积,此为计算多边形面积,主动去掉重复面积。
引入pom文件:
<dependency>
<groupId>com.vividsolutions</groupId>
<artifactId>jts</artifactId>
<version>1.13</version>
</dependency>
处理demo:
package com.demo.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.operation.buffer.BufferOp;
import com.vividsolutions.jts.operation.buffer.BufferParameters;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.util.List;
/**
* 计算JTS缓冲区面积
*
* @author elinx
*/
public class GeoAreaTest {
/**
* TODO
*
* @return
* @throws IOException
*/
private static String testReadFile(String filename) throws IOException {
Resource resource = new ClassPathResource(filename);
InputStream is = resource.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String data = br.readLine();
br.close();
isr.close();
is.close();
return data;
}
/**
* 计算JTS缓冲区面积
*
* @param coordinatesList List
* @param degree degree
* @return double
*/
public static double calculatedCacheArea(List<Object> coordinatesList, double degree) {
Coordinate[] coordinates4 = new Coordinate[coordinatesList.size()];
for (int i = 0; i < coordinatesList.size(); i++) {
Object positionList = coordinatesList.get(i);
List<BigDecimal> positionArr = (List<BigDecimal>) positionList;
double x = (new BigDecimal(String.valueOf(positionArr.get(0)))).doubleValue();
double y = (new BigDecimal(String.valueOf(positionArr.get(1)))).doubleValue();
coordinates4[i] = new Coordinate(x, y);
}
GeometryFactory gf = new GeometryFactory();
Geometry gfLineString = gf.createLineString(coordinates4);
//double degree = 100米 / (2 * Math.PI * 6371004) * 360; // 按米转化为度单位
//double degree = 1.25;
// 缓冲区建立
BufferOp bufOp = new BufferOp(gfLineString);
// 结束端点样式
bufOp.setEndCapStyle(BufferParameters.CAP_FLAT);
// 设置线段:象线段
bufOp.setQuadrantSegments(5);
Geometry bg = bufOp.getResultGeometry(degree);
// 判断点是否在多边形内
// Coordinate point = new Coordinate(116.663609, 40.387187);
// PointLocator a = new PointLocator();
// boolean p1 = a.intersects(point, bg);
return bg.getArea();
}
public static void main(String[] args) throws IOException {
// 点集合:[[x,y], [x,y] ... ]
String rs = testReadFile("/data/xxx.json");
JSONArray jsonArray = JSON.parseArray(rs);
Long start = System.currentTimeMillis();
System.out.println(start);
double area = calculatedCacheArea(jsonArray, 1.25);
System.out.println("=====多边形面积: " + area);
System.out.println(System.currentTimeMillis() - start);
}
}