计算JTS缓冲区面积(Java)

根据两个点坐标,加上点幅宽计算点的路径面积,此为计算多边形面积,主动去掉重复面积。

引入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);

    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值