2017-07-25 131 views
4

我想从几何起点(参考)计算最近点,当我有几何图形point找到最近点(几何点)

由于这个原因,我正在使用ports.shp文件。

该代码大部分时间都有效,但有时会返回空值minDistPoint is null。我不确定用什么值初始化minDist

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

您可以尝试'Double.POSITIVE_INFINITY',这将允许您至少第一次确保'if'条件为真。 – bracco23

+0

@ bracco23:它似乎工作正常,谢谢!让它成为一个答案,请。 – George

回答

1

使用每种找到最小值的算法,您应该始终将初始值设置为第一个值或可达到的最大值。

对于您的情况,由于您使用的是双精度型,因此您可以使用Double.POSITIVE_INFINITY作为初始值,这将允许您至少在第一次确定if条件为真时。

+0

谢谢!(upvoted) – George

0

计算机科学的答案在评论中给出,Double.PositiveInfinity比任何数字都大。 地理空间的答案是,在球体上没有两个点的距离超过pi * r。对于地球而言,上限将是3.14 * 6400公里。 使用正无限。

+0

好的,谢谢!不应该是'2 * pi * R'吗? – George

+0

2 * pi * R是圆周,两点之间的最大距离是其一半。你永远不需要走遍世界的一半以上。 –

+0

是的,你是对的。我在想一点! (开始和结束) – George