示例#1
0
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
示例#2
0
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