Sólo una actualización. Después de seguir Whuber consejos, me encontré con que el Generar Matriz de Ponderaciones Espaciales simplemente utiliza Python bucles y diccionarios para determinar vecinos. Hice el proceso a continuación.
La primera parte de bucles a través de cada vértice de cada grupo de bloques. Crea un diccionario con el vértice de coordenadas como las llaves y una lista de bloque de la Id de grupo que tiene un vértice en el que coordinar como el valor. Tenga en cuenta que esto requiere de un topológicamente aseado conjunto de datos, ya que sólo es perfecto vértice/vértice se superponen registrará como un vecino de la relación. Afortunadamente la Oficina del Censo de los tigres grupo de bloques shapefiles están bien en este sentido.
La segunda parte de bucles a través de cada vértice de cada grupo de bloques de nuevo. Crea un diccionario con el bloque de Identificadores de grupo como las llaves y el bloque del grupo vecino identificación de los valores.
# 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
En retrospectiva, me doy cuenta de que podría haber utilizado un método diferente para la segunda parte que no requieren de un bucle a través de la shapefile de nuevo. Pero esto es lo que he usado, y funciona bastante bien, incluso para 1000s de los grupos de bloques a la vez. No he intentado hacerlo con el conjunto de Estados Unidos, pero se puede realizar para todo el estado.
Saludos!