计算从单点到多个多边形的所有距离[关闭]


9

我有两层:定义属性的点层(95个对象)和定义与属性相关的土地图的多边形层(211个对象)。每个点都涉及一个或多个多边形。我要生成的是一张表,列出每个点到与该点关联的所有多边形的距离(最近的边或多边形的质心-两者都会做)。在QGIS和ArcGIS中,计算最近距离相对容易,但是这些计算至少在我采用的方法中都忽略了所有遥远的多边形。理想情况下,我希望输出

Point_ID | distance to polygon 1 | distance to polygon 2 | distance to polygon 3 | etc.

ArcGIS 10或QGIS 2.2+中的任何指针将最有帮助。


这可以在ArcGIS中进行近距离分析来完成,但是要在每个点上都需要一点点自动化。您熟悉python脚本编制吗?
Emil Brundage 2014年

Emil-不,我对Python不熟悉,但也许我应该学习。
NickN 2014年

Answers:


1

您可以使用QGIS中的距离矩阵来实现。您首先需要通过矢量 > 几何工具 > 多边形质心或通过SAGA版本的多边形质心将多边形转换为质心点。原因是距离矩阵功能只能在2个点层之间进行分析。同样,输出将如下所示:

Point_1 | PolygonCentroid_1 | Distance
Point_1 | PolygonCentroid_2 | Distance
Point_1 | PolygonCentroid_3 | Distance
Point_2 | PolygonCentroid_1 | Distance
Point_2 | PolygonCentroid_2 | Distance

输出将是.csv文件,因此您可以使用其他软件(例如Microsoft Excel)手动编辑布局。


谢谢约瑟夫(Joseph)-对于像我这样的GIS新手来说,这是获得所需答案的最简单方法。
NickN

最欢迎的队友!此过程(及其结果)是基本的,但是当您对GIS软件更加熟悉时,可以尝试使用其他答案中介绍的更高级的过程。
2015年

1
@nickN对此方法的一个非常小的注意,质心并不总是取决于多边形的形状而落入多边形内。这是可能的,你可以得到一些不正确的距离/排名,但它取决于你的数据,并要求它是否将是一个问题。否则,这实际上是ArcGIS GNT的QGIS版本,除了后者可以处理多个点之外,而且我不确定QGIS如何处理结果中的名称/ ID。
克里斯·W

5

使用QGIS(我认为任何版本都可以)和在DB Manager中使用非常简单的SQL语句来实现,这相当简单。但是为此,您必须将其存储在某种空间数据库中(Postgis或spacespaceite)。由于大多数人都更容易使用,因此我假设使用spacespaceite,但是Postgis的SQL语句相同。

  1. 创建一个新的Spatialite数据库;
  2. 将点和面图层导入到新数据库中;
  3. 打开数据库管理器插件,选择数据库并运行以下SQL语句之一:

所有点到所有多边形边界的距离

SELECT 
  f.point_id,
  g.polygon_id,
  st_distance(g.geom, f.geom) AS distance
FROM
  points_table AS f, 
  polygons_table AS g

到相关多边形边界的所有点的距离(假设存在一个公共字段)

SELECT 
  f.point_id,
  g.polygon_id,
  st_distance(g.geom, f.geom) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

到相关多边形质心的所有点的距离

SELECT 
  f.point_id,
  g.polygon_id,
  st_distance(f.geom, st_centroid(g.geom)) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

注意,您可以将图层中的任何字段添加到结果中:

SELECT 
  f.point_id,
  f.point_number,
  g.polygon_id,
  g.parcel_name,
  st_distance(f.geom, st_centroid(g.geom)) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

甚至所有领域:

SELECT 
  f.*,
  g.*,
  st_distance(f.geom, st_centroid(g.geom)) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

如果您需要有关如何创建spatialite数据库和导入图层的更多信息,请告诉我,我将编辑答案。
亚历山大·内托

嗨,亚历山大,为什么要加入而不是简单的WHERE?
路易吉·皮雷利

好吧,这是我从Paul Ramsey的一次演讲中发现的。不记得他提倡显式使用Join的原因,但是如果他这样说::-PI将尝试对两个查询运行EXPLAIN,以查看是否存在任何区别。
Alexandre Neto 2014年

我是SpatialLite的新手-这个答案似乎解决了我正在研究的问题。我的桌子是空白的。也许我不明白这一点。我有一个称为“ Pothole VRI”的多边形层,另一个名为“ Grid Pothole Center”的点层。我按照上面的说明添加以下代码:SELECT f.id,g.id,st_distance(f.geom,st_centroid(g.geom))与“网格坑中心” AS f,“坑孔VRI” AS g的距离__我得到一个带有以下标题的空表x:id,id:1,距离我在这里做错了什么?使用QGIS 3.6
Mark Thompson

4

ArcGIS中的“ 生成附近表格”工具将完成您想要的操作,但是它需要高级许可证,并且将对所有点/多边形(不仅是彼此关联的点/多边形)执行此操作。这意味着对于您的95个对象中的每一个,您将获得所有211个属性的排名距离,因此表中有20,045行。您要么必须过滤结果表,要么正如Emil建议的那样,根据关联来自动执行任务以创建选择并仅在这些组上运行它。

就过滤而言,是的,您仅需要一个联接(后跟定义查询或选择)。工具结果为您提供IN_FID和NEAR_FID。根据您运行工具的方式(点附近的属性或点附近的属性)确定哪个FID。然后,您将根据适当的FID将点表和属性表(两者)都加入到工具结果中。

这假定您的211个属性记录中的每个记录都有一个属性,该属性说明它们属于95个点中的哪一个,因为下一步是选择(或定义查询)联接表中的所有记录,其中一条记录的两个字段应在其中匹配-点名称字段=属性关联的点名称字段。它们不匹配的情况是与该点不相关的多边形,因此您不必在意它们与该点的距离。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.