计算接触(多边形)特征的缓冲区数
Count number of buffers that touch a (polygon) feature
我在 ArcGIS 中面临以下任务 - 我正在使用 ArcMap 10.2
我有一个多边形 shapefile,其中包含(比如说)美国某个州的县。从这个 shapefile 中,我创建了一个图层,它标记了至少有 1 个居民超过 50000 的城市的所有县(我认为这是处理条件)。然后,我在我的县层与那些大城市的多边形周围创建缓冲区,即我在每个县周围绘制一个 100 公里的缓冲区,至少有一个城市的居民超过 50000。
到目前为止一切顺利!
本练习的最后一步应该是为每个多边形创建一个计数,其中包含接触该多边形的缓冲区数。例如,B、C、D 县周围的缓冲区都与 A 县相连。但是 A 县没有超过 50000 居民的城市。因此,我希望城市 A 的计数为 3(它被 B、C 和 D 触及)。我创建了所有缓冲区的联合,但我就是找不到为每个多边形创建此计数的正确方法。
我进行了广泛的 Google 搜索,如果我忽略了明显的解决方案,我深表歉意。
感谢任何帮助!
迈克尔·凯撒
[加州大学圣地亚哥分校研究助理]
如果我正确理解了您的需求,那么创建缓冲区的联合对您没有帮助 - 因为它只剩下一个对象,您需要计算与原始 [ 中的每个对象相交的所有缓冲对象的数量=36=].
在 SQL 中,我将使用 STIntersects()
方法将原始(所有县)图层加入到新的(过滤、缓冲)图层中。类似于以下内容:
DECLARE @original TABLE
(
[Original_Id] INT NOT NULL,
[Original_Geom] GEOGRAPHY NOT NULL
);
DECLARE @filtered TABLE
(
[Buffered_Id] INT NOT NULL,
[Buffered_Geom] GEOGRAPHY NOT NULL
);
-- We'll pretend the above tables are filled with data
SELECT
ORIGINAL.[Original_Id],
COUNT(FILTERED.[Filtered_Id]) AS [NumberOfIntersections]
FROM
@original AS ORIGINAL
JOIN
@filtered AS FILTERED ON (ORIGINAL.[Original_Geom].STIntersects(FILTERED.[Filtered_Geom] = 1)
GROUP BY
ORIGINAL.[Original_Id]
解释:
在此示例中,@original table 将包含您给定州的所有县 - 就像您缓冲它们之前一样。 [Original_Id] 将包含您可以关联或用于关联回您的数据的内容,[Original_Geometry] 将包含县的边界。
@filtered table 将包含 @original 的子集 - 在您的情况下,仅包含至少 1 个拥有 50,000 居民的城市。 [Buffered_Id] 将匹配 [Original_Id] 中的记录(例如奥兰治县的 ID 可能为 32),而 [Buffered_Geometry] 将包含该县的边界,由(如您的例子) 100km.
完全使用我的例子,你需要从你的 tables 中获取所需的数据并输入我的,但你应该能够使用你的 tables 并根据需要进行调整参考他们。
注意:如果您不希望 "Orange County" 在上述查询中计算 "Orange County (Buffered)",则需要添加一个 WHERE 子句来过滤掉它们。
我没有手头的数据来测试这个,但它应该大部分都在那里。希望对你有帮助。
我在 ArcGIS 中面临以下任务 - 我正在使用 ArcMap 10.2 我有一个多边形 shapefile,其中包含(比如说)美国某个州的县。从这个 shapefile 中,我创建了一个图层,它标记了至少有 1 个居民超过 50000 的城市的所有县(我认为这是处理条件)。然后,我在我的县层与那些大城市的多边形周围创建缓冲区,即我在每个县周围绘制一个 100 公里的缓冲区,至少有一个城市的居民超过 50000。 到目前为止一切顺利!
本练习的最后一步应该是为每个多边形创建一个计数,其中包含接触该多边形的缓冲区数。例如,B、C、D 县周围的缓冲区都与 A 县相连。但是 A 县没有超过 50000 居民的城市。因此,我希望城市 A 的计数为 3(它被 B、C 和 D 触及)。我创建了所有缓冲区的联合,但我就是找不到为每个多边形创建此计数的正确方法。 我进行了广泛的 Google 搜索,如果我忽略了明显的解决方案,我深表歉意。
感谢任何帮助!
迈克尔·凯撒 [加州大学圣地亚哥分校研究助理]
如果我正确理解了您的需求,那么创建缓冲区的联合对您没有帮助 - 因为它只剩下一个对象,您需要计算与原始 [ 中的每个对象相交的所有缓冲对象的数量=36=].
在 SQL 中,我将使用 STIntersects()
方法将原始(所有县)图层加入到新的(过滤、缓冲)图层中。类似于以下内容:
DECLARE @original TABLE
(
[Original_Id] INT NOT NULL,
[Original_Geom] GEOGRAPHY NOT NULL
);
DECLARE @filtered TABLE
(
[Buffered_Id] INT NOT NULL,
[Buffered_Geom] GEOGRAPHY NOT NULL
);
-- We'll pretend the above tables are filled with data
SELECT
ORIGINAL.[Original_Id],
COUNT(FILTERED.[Filtered_Id]) AS [NumberOfIntersections]
FROM
@original AS ORIGINAL
JOIN
@filtered AS FILTERED ON (ORIGINAL.[Original_Geom].STIntersects(FILTERED.[Filtered_Geom] = 1)
GROUP BY
ORIGINAL.[Original_Id]
解释:
在此示例中,@original table 将包含您给定州的所有县 - 就像您缓冲它们之前一样。 [Original_Id] 将包含您可以关联或用于关联回您的数据的内容,[Original_Geometry] 将包含县的边界。
@filtered table 将包含 @original 的子集 - 在您的情况下,仅包含至少 1 个拥有 50,000 居民的城市。 [Buffered_Id] 将匹配 [Original_Id] 中的记录(例如奥兰治县的 ID 可能为 32),而 [Buffered_Geometry] 将包含该县的边界,由(如您的例子) 100km.
完全使用我的例子,你需要从你的 tables 中获取所需的数据并输入我的,但你应该能够使用你的 tables 并根据需要进行调整参考他们。
注意:如果您不希望 "Orange County" 在上述查询中计算 "Orange County (Buffered)",则需要添加一个 WHERE 子句来过滤掉它们。
我没有手头的数据来测试这个,但它应该大部分都在那里。希望对你有帮助。