确定地理点是不是在州边界的 X 米内(使用 shapefile 获取边界数据)

Posted

技术标签:

【中文标题】确定地理点是不是在州边界的 X 米内(使用 shapefile 获取边界数据)【英文标题】:Determining whether geographic point is within X meters of a state border (using shapefile for border data)确定地理点是否在州边界的 X 米内(使用 shapefile 获取边界数据) 【发布时间】:2009-05-27 19:08:42 【问题描述】:

所以我正在编写一个 Java 应用程序,并且我有一个 ESRI Shapefile,其中包含美国所有州的边界。我需要的是能够确定任何给定的纬度/经度点是否在距任何州边界线的指定距离内 - 即,我将指定特定的边界线,只需要查看该点是否靠近其中的任何个。

解决方案根本不必非常精确;例如我不需要处理垂直于边界的测量,或者其他什么。只需检查向北、向南、向东或向西走 X 米是否会导致跨越边界就足够了。解决方案必须具有计算效率,因为我将执行大量此类计算。

我计划将 GeoTools 库与 Shapefile 插件一起使用(尽管如果有更简单的选项,我完全赞成)。我不太明白的是:一旦我将 shapefile 加载到内存中,如何检查我是否靠近边界?

谢谢! -丹

【问题讨论】:

鉴于“不必非常精确”,我认为它不必考虑地球的曲线?这听起来像是一个非常难以解决的问题,无需暴力破解(检查每一行)......祝你好运 正确。不必考虑地球的曲率,至少没有任何意义。 【参考方案1】:

假设 JTS 是 GeoTools 中包含的 Geometry:

public boolean pointIsClose( File file, Point targetPoint,double distance) 


  boolean ret = false;
  Map connect = new HashMap();
  connect.put("url", file.toURL());
  DataStore dataStore = DataStoreFinder.getDataStore(connect);


  FeatureSource featureSource = dataStore.getFeatureSource(typeName);
  FeatureCollection collection = featureSource.getFeatures();
  FeatureIterator iterator = collection.features();



  try 
    while (iterator.hasNext()) 
      Feature feature = iterator.next();
      Geometry sourceGeometry = feature.getDefaultGeometry();
      ret= sourceGeometry.isWithinDistance(targetPoint, distance );
    
   finally 
    iterator.close();
  
  return ret;

双精度数必须来自CRS,它将定义执行计算的单位。

这些是地理工具导入:

import org.geotools.data.DataStore;
import org.geotools.data.DataStoreFinder;
import org.geotools.data.FeatureSource;
import org.geotools.feature.Feature;
import org.geotools.feature.FeatureCollection;
import org.geotools.feature.FeatureIterator;
import org.geotools.geometry.jts.JTS;
import org.geotools.referencing.CRS;
import org.opengis.referencing.crs.CoordinateReferenceSystem;

【讨论】:

这可以通过仅考虑该点所在的状态来改进,方法是使用包含查询带回一个状态。【参考方案2】:

如果您只想知道 A 点是否在州边界的 X 米范围内,并且 X 是恒定的并且您不关心它是哪个边界,则可以将负空间预先计算为一系列框。然后,您所要做的就是针对该点对每个框进行包含检查。如果它们都不匹配,则您不在负空间中。

【讨论】:

【参考方案3】:

如果您能以某种方式从 shapefile 中提取每个状态的形状,请创建一个边长为 x 米的信封(您的点位于确切的中心)并查看这两个形状是否相交,您将能够回答问题。

如果我使用的是 ESRI 的 ArcGIS 引擎,我会使用 ISpatialFilter 和几何中定义的点(可能带有缓冲区),并根据州 shapefile 查询该点。返回的任何结果都将表明该点接近某个状态。我不熟悉 GeoTools,在浏览他们的文档时,我没有遇到任何看起来像那种功能的东西,但他们必须拥有它。您可能想查找有关如何使用 GeoTools 对 shapefile 执行空间查询的示例。

【讨论】:

以上是关于确定地理点是不是在州边界的 X 米内(使用 shapefile 获取边界数据)的主要内容,如果未能解决你的问题,请参考以下文章

通过距离和方位从已知位置查找点坐标的地理算法

地理点超出预期边界

计算将地理边界框扩展x英里

SQL Server:检查两个地理/几何的边界是不是相互交汇

获取半径内的附近街道地址

将地理边界框扩展 x 英里的计算