找到最近点(几何点)
find nearest point (geometry point)
当我有几何图形时,我想计算离起点(参考)最近的点 point
。
出于这个原因,我正在使用 ports.shp 文件。
该代码在 time.But 的大部分时间都有效,有时 returns 无效 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;
}
对于每一个寻找最小值的算法,您都应该始终将初始值设置为集合中的第一个值或可实现的最大值。
在您的情况下,由于您使用的是双精度值,因此可以使用 Double.POSITIVE_INFINITY
作为初始值,这将使您至少可以确保 if
条件第一次为真.
评论中给出了计算机科学答案,Double.PositiveInfinity比任何数字都大。
地理空间答案是在一个球体上没有两点相距超过 pi*r。对于地球来说,一个好的上限是 3.14*6400 公里。
使用正无穷大。
当我有几何图形时,我想计算离起点(参考)最近的点 point
。
出于这个原因,我正在使用 ports.shp 文件。
该代码在 time.But 的大部分时间都有效,有时 returns 无效 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;
}
对于每一个寻找最小值的算法,您都应该始终将初始值设置为集合中的第一个值或可实现的最大值。
在您的情况下,由于您使用的是双精度值,因此可以使用 Double.POSITIVE_INFINITY
作为初始值,这将使您至少可以确保 if
条件第一次为真.
评论中给出了计算机科学答案,Double.PositiveInfinity比任何数字都大。 地理空间答案是在一个球体上没有两点相距超过 pi*r。对于地球来说,一个好的上限是 3.14*6400 公里。 使用正无穷大。