শুধু একটি আপডেট। হুবার পরামর্শ অনুসরণ করার পরে, আমি আবিষ্কার করেছি যে জেনারেট স্পেশিয়াল ওয়েট ম্যাট্রিক্স প্রতিবেশী নির্ধারণের জন্য পাইথনের লুপ এবং অভিধানগুলি কেবল ব্যবহার করে। আমি নীচে প্রক্রিয়া পুনরুত্পাদন।
প্রথম অংশটি প্রতিটি ব্লক গ্রুপের প্রতিটি শীর্ষবিন্দুতে লুপ করে। এটি কী হিসাবে মেরুদণ্ডের স্থানাঙ্কের সাথে একটি অভিধান এবং ব্লক গ্রুপ আইডির একটি তালিকা তৈরি করে যা মান হিসাবে স্থানাঙ্কের একটি সূচক রয়েছে। মনে রাখবেন যে এর জন্য শীর্ষস্থানীয় ঝরঝরে ডেটাসেট প্রয়োজন, কারণ নিখুঁত ভার্টেক্স / ভার্টেক্স ওভারল্যাপ প্রতিবেশীর সম্পর্ক হিসাবে নিবন্ধিত হবে। ভাগ্যক্রমে আদমশুমারি ব্যুরোর টিআইজিআর ব্লক গ্রুপের আকারগুলি সঠিকভাবে এ ক্ষেত্রে সঠিক।
দ্বিতীয় অংশটি প্রতিটি ব্লক গ্রুপের প্রতিটি ভার্টেক্সের মধ্য দিয়ে ফিরে আসে। এটি কী হিসাবে ব্লক গ্রুপ আইডি এবং একটি ব্লক গ্রুপের প্রতিবেশী আইডিগুলিকে মান হিসাবে একটি অভিধান তৈরি করে।
# 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
অন্ধকারে আমি বুঝতে পারি যে আমি দ্বিতীয় অংশের জন্য আবার একটি আলাদা পদ্ধতি ব্যবহার করতে পারি যার জন্য আবার শেফফিলের মধ্য দিয়ে লুপিংয়ের প্রয়োজন হয় না। তবে এটি আমি ব্যবহার করেছি এবং এটি একসাথে ব্লকের বিভিন্ন গোষ্ঠীর পক্ষেও বেশ ভাল কাজ করে। আমি এটি পুরো মার্কিন যুক্তরাষ্ট্রে করার চেষ্টা করিনি, তবে এটি পুরো রাজ্যের জন্য কার্যকর করতে পারে।