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

15

首先,我是GIS的新手,请见谅我的错误。我需要查找两个经纬度点之间的距离,一个为点,另一个为多边形(不规则或规则)。准确地说,我需要发现给定点到多边形边界上某个点的最小距离,如下所示。在这个例子中,点p到多边形的最近距离是d。注意:我只需要距离,不需要点。

Problem Illustration

阅读一些文献后,我使用GeoTools API编写了以下最小工作示例。然而,我认为输出方面有些问题。是否有人可以告诉我如何获取以米为单位的点到多边形之间的最小距离?

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

    }
}

1
你正在使用正多边形吗? - 11thdimension
1
你应该澄清一下你所说的点和多边形之间的距离是什么意思。你是指从多边形重心还是从边界上最近的点开始算起? - aengus
任何多边形。它是多边形的一个顶点。 我在问题中试图澄清。 - Marcos Roriz Junior
1
你的意思是需要找到一个点和另外五个点之间距离的最小值吗?这难道不意味着你只需要知道如何计算两个经纬度点之间的距离吗? - 11thdimension
@11thdimension 实际上是多边形边界上的任意一点。我会尝试添加一张解释这个问题的图片。 - Marcos Roriz Junior
1个回答

17

你所做的是正确的,但它将返回大地测量单位(弧度)而不是米。你有两个选择:

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

主要关键是,我仍然不明白这个答案为什么只有9个赞和7k的浏览量。谢谢! - jsan
1
不必创建GeodeticCalculator并设置位置,您可以使用JTS.orthodromicDistance(),它几乎相同但可以节省一些空间。 - absence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接