如何计算地理点和给定多边形之间的距离(以米为单位)?

Mar*_*ior 10 java gis geospatial geotools

首先,我是GIS的新手,所以请原谅任何错误.我需要发现纬度和经度点与纬度/经度多边形(常规或非常规)之间的距离.确切地说,我需要发现从给定点到多边形边界中的点的最小距离,如下所示.在该示例中,从点p到多边形的距离越近d.注意:我不需要点,只需要最小距离.

问题图

经过一些阅读,我使用GeoTools API提出了以下最低工作示例.但是,我认为我搞砸了输出.谁能让我知道如何在mteres中获得点和多边形之间的最小距离?

MWE.java:

import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Point;

public class MWE {

    public static void main(String[] args) throws Exception {
        GeometryFactory gf = JTSFactoryFinder.getGeometryFactory();

        Coordinate[] c = new Coordinate[5];
        c[0] = new Coordinate(-49.242986, -16.662430);
        c[1] = new Coordinate(-49.241999, -16.664465);
        c[2] = new Coordinate(-49.239146, -16.663828);
        c[3] = new Coordinate(-49.239832, -16.661443);
        c[4] = new Coordinate(-49.242986, -16.662430);

        Geometry geo = gf.createPolygon(c);

        Point p = gf.createPoint(new Coordinate(-49.246870, -16.665493));

        double distance = geo.distance(p);

        System.out.println("Distance: " + distance);

    }
}
Run Code Online (Sandbox Code Playgroud)

小智 7

所以你正在做的是正确的,但它将返回大地测量单位(弧度)而不是米的距离.您有两种选择:

  1. 将点和多边形几何转换为平面参考系统http://docs.geotools.org/latest/tutorials/geometry/geometrycrs.html
  2. 使用GeodeticCalculator http://docs.geotools.org/stable/userguide/library/referencing/calculator.html

要使用GeodeticCalculator,您需要确定多边形边界上与点的最近点.例如DistanceOp.closestPoints(geo, p)[0]

// adapted from http://docs.geotools.org/stable/userguide/library/referencing/calculator.html
CoordinateReferenceSystem crs = CRS.decode("EPSG:4326");
GeodeticCalculator gc = new GeodeticCalculator(crs);
gc.setStartingPosition( JTS.toDirectPosition(  DistanceOp.closestPoints(geo, p)[0], crs ) );
gc.setDestinationPosition( JTS.toDirectPosition( p, crs ) );

double distance = gc.getOrthodromicDistance();
Run Code Online (Sandbox Code Playgroud)