เพียงแค่อัปเดต หลังจากทำตามคำแนะนำของ Whuber ฉันพบว่า Generate Spatial Weights Matrix ใช้ Python ลูปและพจนานุกรมเพื่อกำหนดเพื่อนบ้าน ฉันทำซ้ำกระบวนการด้านล่าง
ส่วนแรกวนซ้ำทุกจุดสุดยอดของทุกกลุ่มบล็อก มันสร้างพจนานุกรมที่มีพิกัดจุดสุดยอดเป็นกุญแจและรายการของรหัสกลุ่มบล็อกที่มีจุดสุดยอดที่พิกัดนั้นเป็นค่า โปรดทราบว่านี่ต้องใช้ชุดข้อมูลที่เป็นระเบียบเรียบร้อยเนื่องจากชุดข้อมูลจุดยอด / จุดยอดที่สมบูรณ์แบบเท่านั้นที่จะทำการลงทะเบียนเป็นความสัมพันธ์กับเพื่อนบ้าน โชคดีที่รูปร่างบล็อกกลุ่ม TIGER ของ Census Bureau นั้นใช้ได้ในเรื่องนี้
ส่วนที่สองจะวนซ้ำทุกจุดสุดยอดของทุกกลุ่มบล็อกอีกครั้ง มันสร้างพจนานุกรมที่มี 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 ครั้ง ฉันไม่ได้ลองทำกับทั้งประเทศสหรัฐอเมริกา แต่มันสามารถดำเนินการสำหรับทั้งรัฐ