【问题标题】:How to calculate the distance in meters between a geographic point and a given polygon?如何计算地理点和给定多边形之间的距离(以米为单位)?
【发布时间】:2016-07-15 19:50:58
【问题描述】:

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

经过阅读,我提出了以下使用 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);

    }
}

【问题讨论】:

  • 您使用的是正多边形吗?
  • 您应该澄清点和多边形之间的距离是什么意思。你的意思是从多边形质心还是从边界上最近的点开始?
  • 任何多边形。它是多边形点之一。我试图在问题中澄清。
  • 你的意思是你需要找到一个点和5个点之间的最小距离吗?这是否意味着您只需要知道如何找到两个纬度/经度点之间的距离?
  • @11thdimension 实际上是多边形边界中的任意点。我会尝试添加一张图片来解释这一点。

标签: java gis geospatial geotools


【解决方案1】:

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

  1. 将点和多边形几何转换为平面参考系统http://docs.geotools.org/latest/tutorials/geometry/geometrycrs.html
  2. 使用大地测量计算器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 视图。谢谢!
猜你喜欢
  • 2021-12-19
  • 1970-01-01
  • 2018-05-03
  • 2017-08-22
  • 2017-02-21
  • 2021-10-25
  • 2023-03-25
  • 1970-01-01
  • 2015-02-26
相关资源
最近更新 更多