Sadece bir güncelleme. Whuber'ın tavsiyelerini izledikten sonra, Mekansal Ağırlık Üret Matrisinin komşuları belirlemek için sadece Python döngüleri ve sözlüklerini kullandığını gördüm. Aşağıdaki işlemi tekrarladım.
İlk bölüm, her blok grubunun her köşesinde dolaşır. Anahtar olarak tepe koordinatlarına sahip bir sözlük ve değer olarak bu koordinatta tepe noktasına sahip blok grubu kimliklerinin bir listesini oluşturur. Yalnızca mükemmel tepe / tepe noktası çakışması komşu bir ilişki olarak kaydedileceğinden, bunun topolojik olarak düzgün bir veri kümesi gerektirdiğini unutmayın. Neyse ki Sayım Bürosu'nun TIGER blok grubu şekil dosyaları bu açıdan sorun yaratmaz.
İkinci kısım, her blok grubunun her köşesinden tekrar geçer. Anahtarlar olarak blok grubu kimlikleri ve değerler olarak grubun komşu kimlikleri ile bir sözlük oluşturur.
# 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
Geriye dönüp baktığımda, ikinci kısım için şekil dosyasının içinden tekrar geçmeyi gerektirmeyen farklı bir yöntem kullanabileceğimin farkındayım. Ama bu benim kullandığım şey ve bir seferde 1000'li blok grupları için bile oldukça iyi çalışıyor. Bunu tüm ABD ile yapmayı denemedim, ancak bütün bir devlet için idam edilebilir.