【发布时间】:2018-04-16 17:36:34
【问题描述】:
我正在尝试查找 30 英里半径范围内每个地点的地点数。例如,对于伊利诺伊州斯普林菲尔德,半径 30 英里范围内有多少个城镇?
对于每个地方,我都有名称、纬度和经度,并且 n = 30k。
如果数据集更小,这个问题会相对简单:
PROC SQL;
CREATE TABLE Distance_Table_1 AS
SELECT
MASTER.PlaceID AS PlaceID
,Master.INTPTLAT AS LAT1
,Master.INTPTLONG AS LONG1
,Match.INTPTLAT AS LAT2
,Match.INTPTLONG AS LONG2
,GEODIST(Master.INTPTLAT, Master.INTPTLONG, Match.INTPTLAT,Match.INTPTLONG,'M') AS DISTANCE
FROM MASTER_TABLE_CLEANED_ MASTER
CROSS JOIN MASTER_TABLE_CLEANED_ AS MATCH
;
QUIT;
然后,我将为每个地点创建 30 英里内的所有地点的计数。
问题在于,这会产生一个我的 SAS 无法处理的大得离谱的表(900M 行)。
我怎样才能更有效地处理这个问题?
【问题讨论】:
-
使用表中坐标与斯普林菲尔德坐标相比的距离公式 - 您可以一次循环遍历每个坐标对并进行计算以确定位置是否在范围内
-
@DanielMarcus 澄清一下,我需要为所有 30k(30k 个不同的 Springfields 相互配对)执行此操作
-
如果时间不是问题,我会一个一个去
-
看起来,至少,您应该能够通过避免重复计算将结果集减半。如果您知道从 Town_X 到 Town_Y 的“乌鸦飞翔”距离,那么您不需要存储从 Town_Y 到 Town_X 的距离,因为它们是相同的。
-
遗憾的是,如果您想找到最小距离,您需要首先计算所有距离或找到一种不同的过滤方式。即,如果它的两个状态超过它可能是无效的。您还有其他可以添加到此练习中的限制吗?