#!/usr/bin/env python # -*- coding: utf-8 -*- from utils import shp2_geojson_obj from utils import create_shply_multigeom from utils import out_geoj in_shp_line = "../geodata/topo_line.shp" in_shp_overlap = "../geodata/topo_line_overlap.shp" shp1_data = shp2_geojson_obj(in_shp_line) shp2_data = shp2_geojson_obj(in_shp_overlap) shp1_lines = create_shply_multigeom(shp1_data, "MultiLineString") shp2_lines_overlap = create_shply_multigeom(shp2_data, "MultiLineString") overlap_found = False for line in shp1_lines: if line.equals(shp2_lines_overlap): print "equals" overlap_found = True if line.within(shp2_lines_overlap): print "within" overlap_found = True # output the overlapping linestrings if overlap_found: print "now exporting overlaps to GeoJSON" out_int = shp1_lines.intersection(shp2_lines_overlap) out_geoj(out_int, '../geodata/overlapping_lines.geojson')
#!/usr/bin/env python # -*- coding: utf-8 -*- # # for every polygon in a polygon layer there can only be # one point object located in each polygon # the number of points per polygon can be defined by the user from utils import shp2_geojson_obj from utils import create_shply_multigeom import json in_shp_poly = "../geodata/topo_polys.shp" in_shp_point = "../geodata/topo_points.shp" ply_geojs_obj = shp2_geojson_obj(in_shp_poly) pt_geojs_obj = shp2_geojson_obj(in_shp_point) shply_polys = create_shply_multigeom(ply_geojs_obj, "MultiPolygon") shply_points = create_shply_multigeom(pt_geojs_obj, "MultiPoint") def valid_point_in_poly(polys, points): """ Determine if every polygon contains max one point and that each point is not located on the EDGE or Vertex of the polygon :param point: Point data set :param poly: Polygon data set :return: True or False if False a dictionary containing polygon ids that contain no or multiple points """ pts_in_polys = [] pts_touch_plys = []
#!/usr/bin/env python # -*- coding: utf-8 -*- import json from shapely.geometry import asShape, MultiPolygon from utils import shp2_geojson_obj, out_geoj # out two input test Shapefiles shp1 = "../geodata/temp1-ply.shp" shp2 = "../geodata/temp2-ply.shp" # output resulting GeoJSON file out_geojson_file = "../geodata/result_identity.geojson" # convert our Shapefiles to GeoJSON then to python dictionaries shp1_data = shp2_geojson_obj(shp1) shp2_data = shp2_geojson_obj(shp2) def create_polys(shp_data): """ :param shp_data: input GeoJSON :return: MultiPolygon Shapely geometry """ plys = [] for feature in shp_data['features']: shape = asShape(feature['geometry']) plys.append(shape) new_multi = MultiPolygon(plys) return new_multi
#!/usr/bin/env python # -*- coding: utf-8 -*- from utils import shp2_geojson_obj from utils import create_shply_multigeom from utils import out_geoj from shapely.geometry import Point, MultiPoint in_shp_line = "../geodata/topo_line.shp" in_shp_point = "../geodata/topo_points.shp" # create our geojson like object from a Shapefile shp1_data = shp2_geojson_obj(in_shp_line) shp2_data = shp2_geojson_obj(in_shp_point) # convert the geojson like object to shapely geometry shp1_lines = create_shply_multigeom(shp1_data, "MultiLineString") shp2_points = create_shply_multigeom(shp2_data, "MultiPoint") def create_start_end_pts(lines): ''' Generate a list of all start annd end nodes :param lines: a Shapely geometry LineString :return: Shapely multipoint object which includes all the start and end nodes ''' list_end_nodes = [] list_start_nodes = [] for line in lines:
#!/usr/bin/env python # -*- coding: utf-8 -*- from utils import shp2_geojson_obj from utils import create_shply_multigeom from utils import out_geoj from shapely.geometry import Point in_shp_dangles = "../geodata/topo_dangles.shp" shp1_data = shp2_geojson_obj(in_shp_dangles) shp1_lines = create_shply_multigeom(shp1_data, "MultiLineString") def find_dangles(lines): """ Locate all dangles :param lines: list of Shapely LineStrings or MultiLineStrings :return: list of dangles """ list_dangles = [] for i, line in enumerate(lines): # each line gets a number # go through each line added first to second # then second to third and so on shply_lines = lines[:i] + lines[i + 1:] # 0 is start point and -1 is end point # run through for start_end in [0, -1]: # convert line to point node = Point(line.coords[start_end]) # Return True if any element of the iterable is true. # https://docs.python.org/2/library/functions.html#any
#!/usr/bin/env python # -*- coding: utf-8 -*- from utils import shp2_geojson_obj from utils import create_shply_multigeom from utils import out_geoj from shapely.geometry import Point in_shp_dangles = "../geodata/topo_dangles.shp" shp1_data = shp2_geojson_obj(in_shp_dangles) shp1_lines = create_shply_multigeom(shp1_data, "MultiLineString") def find_dangles(lines): """ Locate all dangles :param lines: list of Shapely LineStrings or MultiLineStrings :return: list of dangles """ list_dangles = [] for i, line in enumerate(lines): # each line gets a number # go through each line added first to second # then second to third and so on shply_lines = lines[:i] + lines[i+1:] # 0 is start point and -1 is end point # run through for start_end in [0, -1]: # convert line to point node = Point(line.coords[start_end]) # Return True if any element of the iterable is true. # https://docs.python.org/2/library/functions.html#any
#!/usr/bin/env python # -*- coding: utf-8 -*- from utils import shp2_geojson_obj from utils import create_shply_multigeom from utils import out_geoj in_shp_lines = "../geodata/topo_line.shp" shp1_data = shp2_geojson_obj(in_shp_lines) shp1_lines = create_shply_multigeom(shp1_data, "MultiLineString") in_shp_poly = "../geodata/topo_polys.shp" ply_geojs_obj = shp2_geojson_obj(in_shp_poly) shply_polys = create_shply_multigeom(ply_geojs_obj, "MultiPolygon") # nearest point using linear referencing # with interpolation and project # pt_interpolate = line.interpolate(line.project(point)) # create point centroids from all polygons # measure distance from centroid to nearest line segment def within_tolerance(polygons, lines, tolerance): """ Discover if all polygon centroids are within a distance of a linestring data set, if not print out centroids that fall outside tolerance :param polygons: list of polygons :param lines: list of linestrings :param tolerance: value of distance in meters :return: list of all points within tolerance """