关于Java应用JTS计算缓冲区

关于Java应用JTS核算缓冲区

功能介绍

  • JTS(Java Topology Suite)是一套用于创建、操作和分析二维几何对象的Java库。JTS提供了丰富的几何操作和分析功能,是GIS(地理信息系统)应用中的重要工具。
  • 本文章是根据一条不规则的线所画出一个多边形缓冲区,根据特定的范围,来核算点位是否存在于缓冲区内
  • 更新1:返回点到线的最短距离

代码操作

起始操作代码,传入一条线上的经纬度和公里范围,需转换为度

 		String rs = "[[106.58088,29.552085], [106.593744,29.555824],[106.597697,29.568359],[106.595038,29.577186],[106.590726,29.574076]]";
        JSONArray jsonArray = JSON.parseArray(rs);
        //线对象
        Geometry lineString = calculatedCache(jsonArray, degree);
        //多边形对象
        Geometry gf= calculatedCachePolygon(lineString ,1000);
        //返回是否包含结果集、距离
        List<Map<String,Object>> list = polygonsContain(lineString,bg,list)

此方法返回线对象结果集

	/**
     * 计算线对象
     * @param coordinatesList 初始河流点位数据集 线对象
     * @return
     */
    public static Geometry calculatedCache(List<Object> coordinatesList) {
        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);
        return gfLineString ;
    }

此方法根据传入的经纬度,计算出一个缓冲区多边形

/**
     * 计算缓冲区多边形,返回数据结果让下一个方法调用
     * @param coordinatesList 初始河流点位数据集
     * @param meter  缓冲区范围值  米
     *        double degree = 100米 / (2 * Math.PI * 6371004) * 360; // 按米转化为度单位
     * @return
     */
    public static Geometry calculatedCachePolygon(Geometry gfLineString, double meter) {
   		 double degree = meter / (2 * Math.PI * 6371004) * 360;
        // 缓冲区建立
        BufferOp bufOp = new BufferOp(gfLineString);
        // 结束端点样式
        bufOp.setEndCapStyle(BufferParameters.CAP_ROUND);
        // 设置线段:象线段-闭合处线段数量,越大越想圆,但数据会越多,建议5-8
        bufOp.setQuadrantSegments(5);
        Geometry bg = bufOp.getResultGeometry(degree);
       // bg.getArea();  多边形面积
        return bg;
    }

此方法是返回多边形的经纬度点,用于在地图上画出多边形

   /**
     * 此方法用于返回多边形集合
     * @param bg 多边形数据
     * @return
     */
    public static List<Map<String,Object>> polygonList(Geometry bg) {
        Coordinate[] coordinates = bg.getCoordinates();
        //返回的xy值集合
        List<Map<String,Object>> listxy = new ArrayList();
        for (Coordinate coordinate:coordinates) {
            Map<String,Object> map = new HashMap<>();
            map.put("x",coordinate.x);
            map.put("y",coordinate.y);
            listxy.add(map);
        }
        return listxy;
    }

此方法用于判断传入点位是否在多边形里面,是否包含,如果包含则加入集合返回

    /**
     * 此方法用于返回多边形是否包含点位
     * @param lineString 线对象
     * @param bg 多边形数据
     * @param list  要判断的点位数据
     * @return
     */
    public static List<Map<String,Object>> polygonsContain(Geometry lineString,Geometry bg,List<Map<String,Object>> list) {
        //返回被包含的点位数据
        List<Map<String,Object>> containList = new ArrayList<>();
        //循环判断点位是否被包含
        for (Map<String,Object> map:list) {
            // 判断点是否在多边形内
            Coordinate point = new Coordinate((Double) map.get("x"),(Double) map.get("y"));
            PointLocator a = new PointLocator();
            if(a.intersects(point, bg)){
            	//计算点到线的距离
            	PointPairDistance ppd = new PointPairDistance();
            	DistanceToPoint.computeDistance(lineString,point,ppd);
            	//结果度
            	double du = ppd.getDistance();
            	//转换米
            	double m = du/360* (2 * Math.PI * 6371004);
            	map.put("m",m);
                containList.add(map);
            }
        }
        return containList;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值