(S)hapefile (2) Graph/network converter in Python
When we process GIS data, a non-trivial problem is the conversion from shape lines to graph or network data structure. The latter may benefit from these out-of-box graphical libraries such as networkx and igraph. But the conversion is a headache to components open communities. This mostly urges me to finish this tiny but useful library.
Requirements: Python 2.7+ or Python 3.3+
sudo apt-get install python python-pip libgeos-dev
sudo pip install s2g
Extra utilities to run unittests,
sudo apt-get install python-tk sudo pip install matplotlib
You have two alternative ways to construct the graph. One is reading from a raw shapefiles with
(Under the hood, I involve fiona to read geometries and
shapely to analyze the data.).
Currently, this tool only supports conversion to undirected graph.
from s2g import ShapeGraph import networkx as nx sg = ShapeGraph(shapefile='path/to/roads.shp', to_graph=True) assert isinstance(sg.graph, nx.Graph)
The other way is designed for programmable usage or time-consuming process where intermediate data could be sniffed or saved. Here is an example to read lines with [fiona]:
from s2g import ShapeGraph import fiona from shapely.geometry import shape, LineString shp = 'path/to/shapefile.shp' with fiona.open(shp) as source: geoms =  for r in source: s = shape(r['geometry']) if isinstance(s, LineString): geoms.append(s) # create ShapeGraph object from a list of lines sg = ShapeGraph(geoms, to_graph=False) # detect major components mc = sg.gen_major_components() # major components are mc # convert the largest component to networkx Graph graph = sg.to_networkx() # equivalently sg.graph
Dive into source doc to discover other functionalities.
- Why not NetworkX's
I endeavored to avoid reinventing the wheel at the beginning. It has several limitations to meet common road network processing:
- It is not able to detect the major components when the shapefile has disconneted parts
- It has no buffer mechsnisms to determine the connectivities of line-line, line-point or point-point pairs
- It does not support parameter controlled sampling of road lines when we convert geometry lines into edges
- It has no pesudo edges to fix the disconnectivity of geometry elements
- shp2graph in R by Binbin Lu, as well as his talk on useR! 2011
- A Tutorial on Topology Correction of Shapefiles Using GRASS
- Why do I make s2g