Voronoi diagram for polygons is a tool to create a Voronoi diagram also known as Thiessen polygons for polygons. It’s based on Shapely and GeoPandas. There are lots of tools to create a Voronoi diagram for points, for example Create Thiessen Polygons (Analysis) in ArcGIS Pro or ArcGIS Desktop, Voronoi Polygons in QGIS, or voronoi_diagram in Shapely. All of them are really cool. How about a Voronoi diagram for polygons? That’s what this tool does.
Important! It’s based on
voronoi_diagram from Shapely which is new in version 1.8.dev0. As of today, it is still a developing version. (2020-07-26) You have to install or upgrade to the latest developing version from source firstly:
pip install git+https://github.com/Toblerity/Shapely
pip install --upgrade git+https://github.com/Toblerity/Shapely
Quick installation with
pip install voronoi-diagram-for-polygons
Or from github:
pip install git+https://github.com/longavailable/voronoi-diagram-for-polygons
Also, you can just copy related functions from longsgis/longsgis.py to your work.
pip install --upgrade voronoi-diagram-for-polygons
pip uninstall voronoi-diagram-for-polygons
import geopandas as gpd from longsgis import voronoiDiagram4plg builtup = gpd.read_file('input.geojson'); builtup.crs = 32650 boundary = gpd.read_file('boundary.geojson'); boundary.crs = 32650 vd = voronoiDiagram4plg(builtup, boundary) vd.to_file('output.geojson', driver='GeoJSON')
It may produce multipolygons (consisted by some unconnected polygons) around the boundary.
Special input may cause overlap. See the following:
To avoid this, I recommend reasonable preprocessing of the input, but use a buffer operation with high-resolution carefully. A buffer operation with high-resolution will result in circular arcs, which will generate too many vertices in a local area. This may trigger other bugs. In my practices, the following code snippet worked well.
def bufferDissolve(gdf, distance, join_style=3): '''Create buffer and dissolve thoese intersects. Parameters: gdf: Type: geopandas.GeoDataFrame distance: radius of the buffer Type: float Returns: gdf_bf: buffered and dissolved GeoDataFrame Type: geopandas.GeoDataFrame ''' #create buffer and dissolve by invoking `unary_union` smp = gdf.buffer(distance, join_style).unary_union #convert to GeoSeries and explode to single polygons gs = gpd.GeoSeries([smp]).explode() #convert to GeoDataFrame gdf_bf = gpd.GeoDataFrame(geometry=gs, crs=gdf.crs).reset_index(drop=True) return gdf_bf
If this tool is useful to your research, star and cite it as below:
Xiaolong Liu, & Meixiu Yu. (2020, July 26). longavailable/voronoi-diagram-for-polygons. Zenodo. http://doi.org/10.5281/zenodo.3960407
Easily, you can import it to Mendeley.