Python 高效(空间)网络邻居?

Python 高效(空间)网络邻居?,python,geospatial,arcgis,Python,Geospatial,Arcgis,我想确定网络边缘的第k阶邻居,特别是一大组街道的邻居。例如,我有一条我感兴趣的街道,称之为焦点街道。对于每一条重点街道,我想找到共享一个交叉口的街道,这些街道是一级邻居。然后,对于与焦点街道共享交叉口的每条街道,我希望找到它们的邻居(这些是二级邻居),依此类推 使用ArcGIS的地理处理库(arcpy)计算一阶邻居需要6个多小时,二阶邻居需要18个多小时。不用说,我想找到一个更有效的解决方案。我已经创建了一个python字典,它在每一条街道上都设置了键,并包含连接的街道作为值。例如: st2ne

我想确定网络边缘的第k阶邻居,特别是一大组街道的邻居。例如,我有一条我感兴趣的街道,称之为焦点街道。对于每一条重点街道,我想找到共享一个交叉口的街道,这些街道是一级邻居。然后,对于与焦点街道共享交叉口的每条街道,我希望找到它们的邻居(这些是二级邻居),依此类推

使用ArcGIS的地理处理库(arcpy)计算一阶邻居需要6个多小时,二阶邻居需要18个多小时。不用说,我想找到一个更有效的解决方案。我已经创建了一个python字典,它在每一条街道上都设置了键,并包含连接的街道作为值。例如:

st2neighs = {street1: [street2, street3, street5], street2: [street1, street4], ...}.  
1号街与2号、3号、5号街相连;2号街与1号街和4号街相连;等研究区域内约有30000条街道,大多数街道之间的连接不到7条下面代码中使用的数据的酸洗版本

我假设知道一阶邻居可以让我有效地跟踪高阶邻居。但以下代码提供了不正确的结果:

##Select K-order neighbors from a set of sampled streets.
##saves in dictionary format such that
##the key is the sampled street and the neighboring streets are the values

##################
##IMPORT LIBRARIES
##################

import random as random
import pickle

#######################
##LOAD PICKLED DATA
#######################

seg_file = open("seg2st.pkl", "rb")
st_file = open("st2neighs.pkl", "rb")
seg2st = pickle.load(seg_file)
st2neigh = pickle.load(st_file)

##################
##DEF FUNCTIONS
##################

##Takes in a dict of segments (key) and their streets (values).
##returns the desired number of sampled streets per segment
##returns a dict keyed segment containing tlids.
def selectSample(seg2st, nbirths):
    randSt = {}
    for segK in seg2st.iterkeys():
        ranSamp = [int(random.choice(seg2st[segK])) for i in xrange(nbirths)]
        randSt[segK] = []
        for aSamp in ranSamp:
                randSt[segK].append(aSamp)

    return randSt

##Takes in a list of all streets (keys) and their first order neighbors (values)
##Takes in a list of sampled  streets
##returns a dict of all sampled streets and their neighbors.
##Higher order selections should be possible with findMoreNeighbors
##logic is the same but replacing sample (input) with output from
##findFirstNeighbors

def findFirstNeighbors(st2neigh, sample):
    compSts = {}
    for samp in sample.iterkeys():
        for rSt in sample[samp]:
            if rSt not in compSts:
                compSts[rSt] = []
            for compSt in st2neigh[rSt]:
                compSts[rSt].append(compSt)

    return compSts

def findMoreNeighbors(st2neigh, compSts):
    for aSt in compSts:
        for st in compSts[aSt]:
            for nSt in st2neigh[st]:
                if nSt not in compSts[aSt]:
                    compSts[aSt].append(nSt)
    moreNeighs = compSts
    return moreNeighs

#####################
##The nHoods
#####################

samp = selectSample(seg2st, 1)
n1 = findFirstNeighbors(st2neigh, samp)
n2 = findMoreNeighbors(st2neigh, n1)
n3 = findMoreNeighbors(st2neigh, n2)

#####################
##CHECK RESULTS
#####################
def checkResults(neighList):
    cntr = {}
    for c in neighList.iterkeys():
        cntr[c] = 0
        for a in neighList[c]:
            cntr[c] += 1
    return cntr

##There is an error no streets **should** have 2000+ order neighbors
c1 = checkResults(n1)
c2 = checkResults(n2)
c3 = checkResults(n3)

救命啊

在我看来,您想要实现的是:


这实际上是一个直接的算法。设R是关系“是一阶邻居”,因此,如果两条街道x,y在R中,则x是y的一阶邻居。因此,对于二阶邻居,您需要计算由R组成的R。对于三阶邻居(由R组成的R),您需要计算由R组成的R。依此类推。

在我看来,您想要实现的是以下内容:


这实际上是一个直接的算法。设R是关系“是一阶邻居”,因此,如果两条街道x,y在R中,则x是y的一阶邻居。因此,对于二阶邻居,您需要计算由R组成的R。对于三阶邻居(由R组成的R),由R组成的R。等等。

是的,关系的组合是代码预期行为的良好形式化。然而,我仍然不清楚为什么代码不能像预期的那样工作…我无法下载你的zip文件,尝试了3次没有工作(不完整的标题)。但你的指纹好像坏了。看起来FindMoreNeights确实实现了组合。是的,关系组合是代码预期行为的良好形式化。然而,我仍然不清楚为什么代码不能像预期的那样工作…我无法下载你的zip文件,尝试了3次没有工作(不完整的标题)。但你的指纹好像坏了。似乎FordMeNeNebor确实实现了这篇文章。你也可以考虑在这里问:你也可以考虑在这里问: