Как рассчитать расстояние в метрах между географической точкой и заданным многоугольником?

Во-первых, я новичок в ГИС, так что прошу прощения за любые ошибки. Мне нужно определить расстояние между точкой широты и долготы и многоугольником широты / долготы (регулярным или нет). Точнее, мне нужно определить минимальное расстояние от заданной точки до точки на границе многоугольника, как показано ниже. В этом примере более близкое расстояние от точки 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);

    }
}

person Marcos Roriz Junior    schedule 15.07.2016    source источник
comment
Вы работаете с правильным многоугольником?   -  person 11thdimension    schedule 15.07.2016
comment
Вы должны пояснить, что вы подразумеваете под расстоянием между точкой и многоугольником. Вы имеете в виду от центроида многоугольника или от ближайшей точки на границе?   -  person aengus    schedule 15.07.2016
comment
Любой многоугольник. Это одна из точек многоугольника. Я попытался уточнить в вопросе.   -  person Marcos Roriz Junior    schedule 15.07.2016
comment
Вы имеете в виду, что вам нужно найти минимум расстояний между точкой и 5 точками? Разве это не значит, что вам просто нужно знать, как найти расстояние между двумя точками широты и долготы?   -  person 11thdimension    schedule 15.07.2016
comment
@ 11-е измерение Фактически это любая точка на границе многоугольника. Я постараюсь добавить изображение, объясняющее это.   -  person Marcos Roriz Junior    schedule 15.07.2016


Ответы (1)


Итак, то, что вы делаете, правильно, но он вернет расстояние в геодезических единицах (градусах дуги), а не в метрах. У вас есть два варианта:

  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();
person aengus    schedule 15.07.2016
comment
major key ???? ???? до сих пор не могу понять, почему у этого ответа только 9 голосов и 7k просмотров. Спасибо! - person jsan; 03.05.2020