def gerar_linhas_largura(poligono, lista_pontos, li_pontos_extent, linha_part, projecao_geo): "retorna linhas entre par de pontos" spatialReference4674 = arcpy.SpatialReference(4674) linha_shapely = linha_part lista_linhas = [] lista_linhas_final = [] circvetores = PtCircBorda() diametroExtent = circvetores.distancia_dois_pontos( li_pontos_extent[0][0],li_pontos_extent[0][1], li_pontos_extent[1][0],li_pontos_extent[1][1], ) if len(lista_pontos) <= 2: lista_pontos = [ linha_part.coords[0], [linha_part.centroid.x,linha_part.centroid.y], linha_part.coords[-1], ] total_index = len(lista_pontos) for Id in xrange(total_index-1): ponto1 = lista_pontos[Id] ponto2 = lista_pontos[Id+1] ptm_x = (ponto1[0] + ponto2[0])/2 ptm_y = (ponto1[1] + ponto2[1])/2 circvetores = PtCircBorda(ptm_x, ptm_y) ptx_m, pty_m, ptx_inv, pty_inv = \ circvetores.retorna_pontos_metade_entre_vetores(ponto1[0], ponto1[1],ponto2[0], ponto2[1], diametroExtent) line_shapely = shapely.geometry.LineString([[ptx_m, pty_m], [ptx_inv, pty_inv]]) ponto_m = shapely.geometry.Point([ptm_x, ptm_y]) linha_largura = line_shapely.intersection(poligono) if linha_largura._is_empty: continue try: if linha_largura.type != "LineString": bufferM = ponto_m.buffer(0.000005) prepared_bufferM = shapely.prepared.prep(bufferM) hits = filter(prepared_bufferM.intersects, linha_largura) linha_largura = hits[0] polyline = arcpy.FromWKT(linha_largura.wkt, spatialReference4674) except: continue lista_linhas_final.append(polyline) lista_linhas.append(linha_largura) line_union = shapely.ops.unary_union(lista_linhas) polyline_final = arcpy.FromWKT(line_union.wkt,spatialReference4674) return lista_linhas_final, polyline_final
def cortar_conexoes(poligono, linhas, pontos, raio = 0.005): linhas = loads(linhas.WKT) poligono = loads(poligono.WKT) lista_polysCortar = [] if pontos.type == "Point": lista_pontos = [pontos] else: lista_pontos = pontos for ponto in lista_pontos: circulo = ponto.buffer(0.0001) polyConex = circulo.intersection(linhas).buffer(0.000005) bordaCirculo = circulo.boundary circunDividida = bordaCirculo.difference(polyConex) linhas_merge = shapely.ops.linemerge(circunDividida) lista_linhas = list(linhas_merge) funcCirculoBorda = PtCircBorda(ponto.x, ponto.y) lista_linhasm = [] for linha_part in lista_linhas: pt1x = linha_part.coords[0][0] pt1y = linha_part.coords[0][1] pt2x = linha_part.coords[-1][0] pt2y = linha_part.coords[-1][1] ptx_m, pty_m, ptx_inv, pty_inv = funcCirculoBorda.retorna_pontos_metade_entre_vetores( pt1x, pt1y, pt2x, pt2y, raio ) linha_metade = shapely.geometry.LineString([[ponto.x, ponto.y], [ptx_m, pty_m]]) linham_poly_final= None linham_poly = linha_metade.intersection(poligono) if linham_poly.type != "LineString": for linham in list(linham_poly): if linham.intersects(circulo): linham_poly_final = linham else: linham_poly_final = linham_poly lista_linhasm.append(linham_poly_final) pass linhasm_unidas = shapely.ops.unary_union(lista_linhasm) polyCortador = linhasm_unidas.buffer(0.000005) lista_polysCortar.append(polyCortador) polyCortarUnido = shapely.ops.unary_union(lista_polysCortar) poligonos_separados = poligono.difference(polyCortarUnido) return poligonos_separados