我想根据自然地球数据计算一个点到一个shp文件(ports.shp)的最近距离。
例如,我正在加载文件的功能:
...
String filename = "10m_cultural/ne_10m_ports.shp";
...
public static void Calcs(String filename)
throws IOException, NoSuchAuthorityCodeException, FactoryException, TransformException {
HashMap<String, Object> params = new HashMap<>();
params.put("url", DataUtilities.fileToURL(new File(filename)));
DataStore ds = DataStoreFinder.getDataStore(params);
String name = ds.getTypeNames()[0];
SimpleFeatureSource source = ds.getFeatureSource(name);
SimpleFeatureCollection features = source.getFeatures();
}
现在,例如要计算距离的一点是:
GeometryFactory gf = JTSFactoryFinder.getGeometryFactory();
Point p = gf.createPoint(new Coordinate(43, 18));
我知道要计算距离,我会这样做:
CoordinateReferenceSystem crs = CRS.decode("EPSG:4326");
Point start = gf.createPoint(new Coordinate(43, 18));
Point dest = gf.createPoint(new Coordinate(?????));
GeodeticCalculator gc = new GeodeticCalculator(crs);
gc.setStartingPosition(JTS.toDirectPosition(start.getCoordinate(), crs));
gc.setDestinationPosition(JTS.toDirectPosition(dest.getCoordinate(), crs));
double distance = gc.getOrthodromicDistance();
但是我不知道如何找到目的地的坐标(ports.shp文件):
Point dest = gf.createPoint(new Coordinate(?????));
我有features
从加载文件,但它没有任何getCoordinates()
方法。
而且,正如我所见,它ports.shp
由许多POINT
几何组成。我是否必须以某种方式计算参考点的每个点,然后选择最接近的点?
功能部件具有一种getDefaultGeometry
可以为您提供所需要点的方法。然后,您可以从该点获取坐标。
编辑
您的问题是单位不匹配,您MinDist
将边界框的宽度设置为度(以度为单位,大约为360),但将其与以米为单位的距离(大约为7800000)进行比较,因此您找不到一个足以保存的点。
我开始通过限制初始搜索范围来提高搜索效率,但是即使使用了我无法确定是否有效的填充位置数据集,它也足够快。
final double MAX_SEARCH_DISTANCE = Math.max(index.getBounds().getWidth(), index.getBounds().getHeight());
double searchDist = 0.01;
while (searchDist < MAX_SEARCH_DISTANCE) {
// start point (user input)
Coordinate coordinate = p.getCoordinate();
ReferencedEnvelope search = new ReferencedEnvelope(new Envelope(coordinate),
index.getSchema().getCoordinateReferenceSystem());
search.expandBy(searchDist);
BBOX bbox = ff.bbox(ff.property(index.getSchema().getGeometryDescriptor().getName()), (BoundingBox) search);
SimpleFeatureCollection candidates = index.subCollection(bbox);
double minDist = Double.POSITIVE_INFINITY; // can't use
// MAX_Search_dist here
// as it is degrees and
// dists are meters
Coordinate minDistPoint = null;
double dist = 0;
Point dest = null;
SimpleFeatureIterator itr = candidates.features();
CoordinateReferenceSystem crs = DefaultGeographicCRS.WGS84;
try {
SimpleFeature feature = null;
while (itr.hasNext()) {
feature = itr.next();
// destination point
dest = (Point) feature.getDefaultGeometry();
GeodeticCalculator gc = new GeodeticCalculator(crs);
gc.setStartingPosition(JTS.toDirectPosition(p.getCoordinate(), crs));
gc.setDestinationPosition(JTS.toDirectPosition(dest.getCoordinate(), crs));
// Calculate distance between points
dist = gc.getOrthodromicDistance();
// System.out.println(feature.getID()+": "+dist);
if (dist < minDist) {
minDist = dist;
minDistPoint = dest.getCoordinate();
lastMatched = feature;
}
}
} finally {
itr.close();
}
Point ret = null;
if (minDistPoint == null) {
searchDist *= 2.0;
System.out.println("repeat search");
} else {
ret = gf.createPoint(minDistPoint);
return ret;
}
}
return gf.createPoint(new Coordinate());
}
问题内容: 我有一个文本文件,如下所示 我想计算两个α碳原子之间的距离,即计算第一个和第二个原子之间的距离,然后计算第二个和第三个原子之间的距离,依此类推.....两个原子之间的距离可以表示为: 7,8和9列分别代表x,y和z坐标。我需要打印距离和对应的残基对(第4列),如下所示(距离的值不是实数) 如何使用Perl或python进行此计算? 问题答案: 如果您的数据用空格隔开,那么简单就可以完成
本文向大家介绍php两点地理坐标距离的计算方法,包括了php两点地理坐标距离的计算方法的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了php计算两点地理坐标距离的具体代码,供大家参考,具体内容如下 功能:根据圆周率和地球半径系数与两点坐标的经纬度,计算两点之间的球面距离。 获取两点坐标距离: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
本文向大家介绍php如何计算两坐标点之间的距离,包括了php如何计算两坐标点之间的距离的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了php计算两坐标点之间距离的实现代码,供大家参考,具体内容如下 地球上两个点之间,可近可远。 当比较近的时候,可以忽略球面因素,当做是一个平面,这样就有了两种计算方法。 小编再为大家分享一段php坐标之间距离的求解代码: 以上就是本文的全部内容,希望对
本文向大家介绍java实现计算地理坐标之间的距离,包括了java实现计算地理坐标之间的距离的使用技巧和注意事项,需要的朋友参考一下 java实现计算两经纬度点之间的距离,直接上代码,具体解释请参考注释 以上就是本文的全部内容了,希望大家能够喜欢。
我一直在寻找一种解决方案来转换笛卡尔坐标(lat, long),我必须极坐标以促进我想要运行的模拟,但我在这里没有找到任何问题或答案。有很多选项,包括Matlab中的内置函数cart2pol,但我所有的数据都在R中,我想继续在这个框架中舒适地工作。 问题: 我有来自标记数据的lat/long坐标,我想将这些转换为极坐标(意味着跳跃大小和角度:http://en.wikipedia.org/wiki
档案员。txt包含两类员工的详细信息,即月薪和小时津贴。如果是月薪员工,则该文件包含名字、姓氏、性别、职级、类型和基本工资,如果是小时薪员工,则包含小时工资和工作小时数。该文件的示例如下所示: 约翰·史密斯M经理每月45000.00 Sunil Bates M高级每小时700.00 45 梁爱娃F警官每月30500.00 我要写一个程序,会看每个员工,计算奖金占基本工资的百分比,对于一个按小时计酬