Как рассчитать расстояние между географической точки и многоугольник?
во-первых, я новичок в ГИС, так что простите любые ошибки. Мне нужно найти расстояние между точкой широты и долготы и многоугольником широты/долготы (регулярным или нет). Точно, мне нужно найти минимальное расстояние от заданной точки до точки На границе многоугольника, как показано ниже. В Примере, чем ближе расстояние от точки p
на полигон d
. Примечание: мне не нужен пункт, как раз минимум расстояние.
после некоторого чтения я придумал следующий минимальный рабочий пример с использованием API GeoTools. Тем не менее, я думаю, что я испортил выход. Может кто-нибудь просветить меня о том, как получить минимальное расстояние между точкой и полигона в метрах?
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 ответов
Итак, то, что вы делаете, правильно, но это вернет расстояние в геодезических единицах (градусах дуги), а не метрах. У вас есть два варианта:
- преобразуйте геометрию точки и многоугольника в плоскую систему отсчета http://docs.geotools.org/latest/tutorials/geometry/geometrycrs.html
- используйте 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();