그냥 업데이트. Whuber의 조언을 따르면, 공간 가중치 생성 매트릭스는 단순히 파이썬 루프와 사전을 사용하여 이웃을 결정한다는 것을 알았습니다. 아래 과정을 재현했습니다.
첫 번째 부분은 모든 블록 그룹의 모든 정점을 반복합니다. 키로 정점 좌표가있는 사전과 해당 좌표에 정점이 값으로있는 블록 그룹 ID 목록을 만듭니다. 완벽한 정점 / 정점 겹침 만 인접 관계로 등록되므로 위상 적으로 깔끔한 데이터 세트가 필요합니다. 다행히도 인구 조사국의 TIGER 블록 그룹 형태 파일은 이와 관련하여 문제가 없습니다.
두 번째 부분은 모든 블록 그룹의 모든 정점을 다시 반복합니다. 블록 그룹 ID를 키로 사용하고 해당 블록 그룹의 인접 ID를 값으로 사용하여 사전을 작성합니다.
# Create dictionary of vertex coordinate : [...,IDs,...]
BlockGroupVertexDictionary = {}
BlockGroupCursor = arcpy.SearchCursor(BlockGroups.shp)
BlockGroupDescription = arcpy.Describe(BlockGroups.shp)
BlockGroupShapeFieldName = BlockGroupsDescription.ShapeFieldName
#For every block group...
for BlockGroupItem in BlockGroupCursor :
BlockGroupID = BlockGroupItem.getValue("BKGPIDFP00")
BlockGroupFeature = BlockGroupItem.getValue(BlockGroupShapeFieldName)
for BlockGroupPart in BlockGroupFeature:
#For every vertex...
for BlockGroupPoint in BlockGroupPart:
#If it exists (and isnt empty interior hole signifier)...
if BlockGroupPoint:
#Create string version of coordinate
PointText = str(BlockGroupPoint.X)+str(BlockGroupPoint.Y)
#If coordinate is already in dictionary, append this BG's ID
if PointText in BlockGroupVertexDictionary:
BlockGroupVertexDictionary[PointText].append(BlockGroupID)
#If coordinate is not already in dictionary, create new list with this BG's ID
else:
BlockGroupVertexDictionary[PointText] = [BlockGroupID]
del BlockGroupItem
del BlockGroupCursor
#Create dictionary of ID : [...,neighbors,...]
BlockGroupNeighborDictionary = {}
BlockGroupCursor = arcpy.SearchCursor(BlockGroups.shp)
BlockGroupDescription = arcpy.Describe(BlockGroups.shp)
BlockGroupShapeFieldName = BlockGroupDescription.ShapeFieldName
#For every block group
for BlockGroupItem in BlockGroupCursor:
ListOfBlockGroupNeighbors = []
BlockGroupID = BlockGroupItem.getValue("BKGPIDFP00")
BlockGroupFeature = BlockGroupItem.getValue(BlockGroupShapeFieldName)
for BlockGroupPart in BlockGroupFeature:
#For every vertex
for BlockGroupPoint in BlockGroupPart:
#If it exists (and isnt interior hole signifier)...
if BlockGroupPoint:
#Create string version of coordinate
PointText = str(BlockGroupPoint.X)+str(BlockGroupPoint.Y)
if PointText in BlockGroupVertexDictionary:
#Get list of block groups that have this point as a vertex
NeighborIDList = BlockGroupVertexDictionary[PointText]
for NeighborID in NeighborIDList:
#Don't add if this BG already in list of neighbors
if NeighborID in ListOfBGNeighbors:
pass
#Add to list of neighbors (as long as its not itself)
elif NeighborID != BlockGroupID:
ListOfBGNeighbors.append(NeighborID)
#Store list of neighbors in blockgroup object in dictionary
BlockGroupNeighborDictionary[BlockGroupID] = ListOfBGNeighbors
del BlockGroupItem
del BlockGroupCursor
del BlockGroupVertexDictionary
후시로, 나는 shapefile을 다시 반복 할 필요가없는 두 번째 부분에 대해 다른 방법을 사용할 수 있음을 알고 있습니다. 그러나 이것은 내가 사용한 것이며 한 번에 1000 개의 블록 그룹에서도 잘 작동합니다. 나는 미국 전체에서 시도하지는 않았지만 전체 국가에서 실행할 수 있습니다.