Más

Nx_spatial no lee todas las características del shapefile

Nx_spatial no lee todas las características del shapefile


Tengo un shapefile de polilínea para una red de carreteras. Las carreteras se dividen en cada intersección (nodo), p. Ej. si dos carreteras se cruzan en un punto, se dividen en cuatro enlaces (bordes). Entonces, usando la tabla de atributos del shapefile, sé que este shapefile tiene 600 bordes. Pero cuando se lee el shapefilenx_espacial, los bordes totales encontrados son solo 497. Me gustaría saber por qué faltan otros 103 enlaces de carreteras (bordes). Gracias

importar nx_spatial as ns roads = ns.read_shp (path) #path = path to polyline shapefile roads.number_of_edges () #output = 497

Espero que esta información ayude: Windows7, Python 2.7 Anaconda 64bit, Eclipse. El problema está relacionado con nx_spatial. Pero no pude crear esa etiqueta por una reputación baja.


Esto no tiene nada que ver con su versión de Python o su sistema operativo.

El módulo Python Networkx (nx_spatial es muy antiguo, use directamente NetworkX: read_shp) no corta las líneas en cada intersección y simplifica las geometrías de las líneas en coordenadas de inicio y final.

Genera un networkx.DiGraph a partir de shapefiles. Las geometrías de puntos se traducen en nodos, las líneas en aristas. Las tuplas de coordenadas se utilizan como claves. Los atributos se conservan, las geometrías de línea se simplifican en coordenadas de inicio y final. Acepta un único shapefile o directorio de muchos shapefiles.

Ejemplo:

número de características:

import fiona features = fiona.open ('test.shp') print len ​​(features) 5 for feat in features: print feat ['geometry'] {'type': 'LineString', 'communities': [(3.0, 2.0 ), (2.0, 3.0), (2.0, 4.0)]} {'tipo': 'LineString', 'coordenadas': [(1.0, 2.0), (2.0, 3.0), (3.0, 4.0)]} {' tipo ':' LineString ',' coordenadas ': [(2.0, 1.0), (3.0, 2.0), (4.0, 2.0), (4.0, 4.0)]} {' tipo ':' LineString ',' coordenadas ': [(1.0, 1.0), (2.0, 1.0), (3.0, 1.0)]} {'tipo': 'LineString', 'coordenadas': [(0.0, 0.0), (1.0, 1.0), (1.0, 2.0 ), (1.0, 4.0)]}

número de nodos y aristas:

import networkx as nx G = nx.read_shp ('test.shp') print G.nodes () [(1.0, 2.0), (3.0, 2.0), (3.0, 1.0), (4.0, 4.0), (2.0, 1.0), (1.0, 1.0), (0.0, 0.0), (1.0, 4.0), (3.0, 4.0), (2.0, 4.0)] print len ​​(G.nodes ()) 10 print G.edges () [ ((1.0, 2.0), (3.0, 4.0)), ((3.0, 2.0), (2.0, 4.0)), ((2.0, 1.0), (4.0, 4.0)), ((1.0, 1.0), ( 3.0, 1.0)), ((0.0, 0.0), (1.0, 4.0))] longitud de impresión (G.edges ()) 5

Bordes del gráfico G:

Lo que quieres es un gráfico plano:

En teoría de grafos, un grafo plano es un grafo que se puede incrustar en el plano, es decir, se puede dibujar en el plano de tal manera que sus bordes se crucen solo en sus puntos finales. En otras palabras, se puede dibujar de tal manera que ningún borde se cruce entre sí.

Resultado con un algoritmo de gráfico plano (desafortunadamente, el módulo NetworkX no es compatible con gráfico plano)

características = fiona.open ('test_Arc.shp') len (características) 11 para dote en características: print feat ['geometría'] {'tipo': 'LineString', 'coordenadas': [(0.0, 0.0), ( 1.0, 1.0)]} {'tipo': 'LineString', 'coordenadas': [(1.0, 1.0), (2.0, 1.0)]} {'tipo': 'LineString', 'coordenadas': [(1.0, 1.0), (1.0, 2.0)]} {'tipo': 'LineString', 'coordenadas': [(1.0, 2.0), (2.0, 3.0)]} {'tipo': 'LineString', 'coordenadas': [(1.0, 2.0), (1.0, 4.0)]} {'tipo': 'LineString', 'coordenadas': [(2.0, 1.0), (3.0, 1.0)]} {'type': 'LineString', 'coordenadas': [(2.0, 1.0), (3.0, 2.0)]} {'tipo': 'LineString', 'coordenadas': [(2.0, 3.0), (3.0, 4.0)]} {'tipo': 'LineString', 'coordenadas': [(2.0, 3.0), (2.0, 4.0)]} {'tipo': 'LineString', 'coordenadas': [(3.0, 2.0), (2.0, 3.0)]} { 'tipo': 'LineString', 'coordenadas': [(3.0, 2.0), (4.0, 2.0), (4.0, 4.0)]}

Ver el vídeo: Creating Shapefile or Layers in QGIS