Snippet Wednesday - Geometrical operations with Shapely πŸ”΄πŸŸ¦

Hi all,

For this second Snippet Wednesday, I wanted to share the functions that I use a lot to convert between VIKTOR Geopolylines and polygons and shapely.

Shapely is a very powerful geometry package, especially in 2D applications it can be very strong. It allows you to easily perform operations such as finding overlap between polygons, interpolating points every n meters along a line… This makes it especially useful in GIS-like applications, and so I have use it a lot on dyke projects such as for instance the hdsr piping tool. I hope it is also useful to you!

From VIKTOR to Shapely

from shapely.geometry import Point, LineString, Polygon
from viktor.geometry import GeoPoint, GeoPolyline, GeoPolygon

def convert_geo_point_to_shapeply_point(geo_point: GeoPoint) -> Point:
    """Convert a VIKTOR SDK GeoPoint in RD into a shapely Point"""
    return Point(geo_point.rd)

def convert_geo_polyline_to_linestring(geo_polyline: GeoPolyline) -> LineString:
    """Convert a VIKTOR SDK GeoPolyline in RD into a shapely LineString"""
    list_points = [pt.rd for pt in geo_polyline.points]
    return LineString(list_points)

def convert_geopolygon_to_shapely_polgon(geopolygon: GeoPolygon) -> Polygon:
    """Convert a VIKTOR SDK GeoPolygon in RD into a shapely Polygon"""
    return Polygon([points.rd for points in geopolygon.points])

From Shapely back to VIKTOR

from shapely import LineString, Polygon, Point
from viktor.geometry import GeoPoint, GeoPolygon, Geopolyline

def convert_shapely_point_to_geo_point(point: Point) -> GeoPoint:
    """Convert a shapely Point in RD coordinates into a VIKTOR GeoPoint"""
    return GeoPoint.from_rd(*list(point.coords))

def convert_linestring_to_geo_polyline(linestring: LineString) -> GeoPolyline:
    """Convert a shapely LineString in RD coordinates into a VIKTOR GeoPolyline"""
    linestring_points = list(linestring.coords)
    return GeoPolyline(*[GeoPoint.from_rd(pt) for pt in linestring_points])

def convert_shapely_polygon_to_geopolygon(polygon: Polygon) -> GeoPolygon:
    """Convert a shapely polygon in RD coordinates into a VIKTOR GeoPolygon"""
    return GeoPolygon(*[GeoPoint.from_rd(point) for point in polygon.exterior.coords])