2016-07-15 114 views
6

Prima di tutto, sono nuovo di GIS, quindi scusate qualsiasi errore. Devo scoprire la distanza tra un punto di latitudine e longitudine e un poligono di latitudine/longitudine (normale o meno). Precisamente, ho bisogno di scoprire la distanza minima da un dato punto a un punto nel confine del poligono, come illustrato di seguito. Nell'esempio, la distanza più ravvicinata dal punto p al poligono è d. Nota: non ho bisogno del punto, solo della distanza minima.Come calcolare la distanza in metri tra un punto geografico e un dato poligono?

Problem Illustration

Dopo qualche lettura, mi è venuta in mente il seguente esempio di lavoro minima utilizzando l'API GeoTools. Tuttavia, penso che sto rovinando l'output. Qualcuno mi può illuminare su come ottenere la distanza minima tra un punto e un poligono in 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); 

    } 
} 
+1

Stai lavorando con un poligono regolare? – 11thdimension

+1

Dovresti chiarire cosa intendi per distanza tra punto e poligono. Intendi dal centroide del poligono o dal punto più vicino sul confine? – aengus

+0

Qualsiasi poligono. È per uno dei punti poligoni. Ho provato a chiarire nella domanda. –

risposta

3

Allora, cosa si sta facendo è corretto, ma tornerà distanza in unità geodetiche (gradi d'arco) piuttosto che metri. Sono disponibili due opzioni:

  1. trasformare il punto e le geometrie poligonali ad un sistema di riferimento piano http://docs.geotools.org/latest/tutorials/geometry/geometrycrs.html
  2. Utilizzare il GeodeticCalculator http://docs.geotools.org/stable/userguide/library/referencing/calculator.html

Per utilizzare il GeodeticCalculator è necessario determinare il punto più vicino il limite del poligono al tuo punto. per esempio. 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();