2017-07-25 7 views
4

Ich möchte den nächsten Punkt von einem Startpunkt (Referenz) berechnen, wenn ich Geometrie point habe.Finde den nächsten Punkt (Geometriepunkt)

Ich verwende die ports.shp-Datei aus diesem Grund.

Der Code funktioniert die meiste Zeit. Aber manchmal gibt es Null minDistPoint is null zurück. Ich bin mir nicht sicher, mit welchem ​​Wert minDist initialisiert werden soll.

public Point findNearestPoint(Point p, SimpleFeatureCollection features) throws FactoryException, TransformException { 
    Point destination = null; 
    double minDist = 10.0e+6; 
    double distance = 0; 
    Point minDistPoint = null; 
    try(SimpleFeatureIterator itr = features.features()) { 
     while(itr.hasNext()) { 
     SimpleFeature feature = itr.next(); 
     final String EPSG4326 = 
      "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\","+ 
      "SPHEROID[\"WGS 84\",6378137,298.257223563,"+ 
      "AUTHORITY[\"EPSG\",\"7030\"]],"+ 
      "AUTHORITY[\"EPSG\",\"6326\"]]," + 
      "PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],"+ 
      "UNIT[\"degree\", " +"0.01745329251994328,"+ 
      "AUTHORITY[\"EPSG\",\"9122\"]],"+ 
      "AUTHORITY[\"EPSG\",\"4326\"]]"; 
     CoordinateReferenceSystem crs = CRS.parseWKT(EPSG4326);  
     destination = (Point) feature.getDefaultGeometry(); 
     GeodeticCalculator gc = new GeodeticCalculator(crs); 
     gc.setStartingPosition(
      JTS.toDirectPosition(p.getCoordinate(), crs)); 
     gc.setDestinationPosition(
      JTS.toDirectPosition(dest.getCoordinate(), crs)); 
     distance = gc.getOrthodromicDistance(); 
     if(distance < minDist) { 
      minDist = distance; 
      minDistPoint = destination; 
      lastMatched = feature; 
     } 
     } 
    } 
    int totalmeters = (int) minDist; 
    int km = totalmeters/1000; 
    int meters = totalmeters - (km * 1000); 
    float remaining_cm = (float) (minDist - totalmeters) * 10000; 
    remaining_cm = Math.round(remaining_cm); 
    float cm = remaining_cm/100; 
    System.out.println(
     "Distance = " + km + "km " + meters + "m " + cm + "cm"); 
    if(minDistPoint == null) { 
     return null; 
    } 
    return minDistPoint; 
} 
+1

können Sie versuchen, mit 'Double.POSITIVE_INFINITY', mit dem Sie sicherstellen können, dass mindestens das erste Mal die' if' Bedingung erfüllt wird. – bracco23

+0

@ bracco23: Es scheint gut zu funktionieren, danke! Machen Sie bitte eine Antwort. – George

Antwort

1

Mit jedem Algorithmus das Minimum zu finden, sollten Sie den Anfangswert immer auf entweder die erste eine des Satzes oder der Maximalwert erreicht werden.

In Ihrem Fall, da Sie eine doppelte verwenden, können Sie Double.POSITIVE_INFINITY als Anfangswert verwenden, damit Sie sicherstellen können, dass mindestens die erste if Bedingung erfüllt wird.

+0

Danke! (Upvoted) – George

0

Die Antwort der Informatik wurde in einem Kommentar gegeben, Double.PositiveInfinity ist größer als jede Zahl. Die georäumliche Antwort ist, dass auf einer Kugel keine zwei Punkte mehr als nur auseinander liegen. Für den Planeten Erde wäre eine obere Grenze von 3,14 * 6400 km. Verwenden Sie positive Unendlichkeit.

+0

Ok, danke, sollte es nicht '2 * pi * R' sein? – George

+0

2 * pi * R ist der Umfang, der maximale Abstand zwischen zwei Punkten ist die Hälfte davon. Sie müssen niemals mehr als die halbe Welt bereisen. –

+0

Ja, Sie haben Recht. Ich habe einen Punkt gedacht! (Anfang und Ende) – George

Verwandte Themen