3 votos

Rotar símbolos perpendicularmente al ángulo de la línea (ArcGIS)

Tengo líneas que representan corrientes curvas (línea azul en la imagen) y quiero angular símbolos perpendiculares al ángulo en sus ubicaciones particulares (características de punto simbolizadas como líneas rojas en la imagen).

Con Propiedades de la capa - Simbología -> Avanzada puedo utilizar una Expresión de campo para girar mi Simbología como se desee. Por lo tanto, necesito crear un campo en la tabla de atributos con el número de ángulo correcto en él que luego puedo demandar en la expresión de campo. ¿Sabe alguien cómo puedo formular una expresión que me indique el ángulo que debe girar el punto para ser perpendicular a la línea?

Trabajo con ArcGIS 10.2.

Deseado:

enter image description here

4voto

overstay_info Puntos 11

No hay ningún cálculo que pueda hacerlo. Afortunadamente esto está incorporado en las capas de eventos de puntos de LR. Convierta sus líneas en Rutas utilizando la función Herramienta de creación de rutas , ubique sus puntos en la línea como una tabla de eventos utilizando el Herramienta de localización de elementos a lo largo de la ruta y, a continuación, utilizar la tabla de eventos para construir una capa de eventos puntuales utilizando el Hacer la herramienta Route Event Layer con la opción del ángulo. Si exporta esa capa desde el índice, se convertirá en una clase de característica de punto normal que tiene todos sus atributos de punto junto con un campo LOC_ANGLE que le indica el ángulo normal a la línea. Los ángulos serán ángulos aritméticos (en sentido contrario a las agujas del reloj empezando por el Este). Este ángulo puede ser utilizado para rotar su símbolo.

En mi opinión, todos los usuarios que trabajan regularmente con redes lineales que tienen características de puntos o líneas relacionadas a lo largo de ellas deberían estar familiarizados con las herramientas de la caja de herramientas LR.

1voto

Alex Tereshenkov Puntos 13433

Puedes hacerlo con un poco de arcpy.

1) Hay que hacer el Spatial Join entre los puntos y las líneas para transferir el valor ID de cada línea a cada punto.

2) Averiguar el vértice más cercano de la recta y el punto de entrada.

3) Calcula la dirección de este segmento.

4) Actualizar el campo de rotación de los puntos (con el ID de la línea unida).

import arcpy
import math

def GetAzimuthPolyline(firstPoint,lastPoint):
    radian = math.atan((lastPoint.X - firstPoint.X)/(lastPoint.Y - firstPoint.Y))
    degrees = radian * 180 / math.pi
    return degrees

spatial_reference=arcpy.SpatialReference(3857)
lines_fc = r"C:\GIS\Temp\ArcGISHomeFolder\Default.gdb\_lines"
pnts_fc = r"C:\GIS\Temp\ArcGISHomeFolder\Default.gdb\_points_SpatialJoin2"

lines = [f for f in arcpy.da.SearchCursor(lines_fc,["ID","SHAPE@"],None,spatial_reference)]
pnts = [p for p in arcpy.da.SearchCursor(pnts_fc,["ID","SHAPE@"],None,spatial_reference)]

line_vertices_dict = {line[0]:line[1].getPart(0) for line in lines}

#finding out which vertex of the line is the closest to each of the
#points - to calculate direction later
nearest_vertex = dict.fromkeys([pnt[0] for pnt in pnts])
for pnt in pnts:
    vertex_tuple = line_vertices_dict[pnt[0]]
    vertex_id = 0
    for vertex in vertex_tuple:
        distance = round(pnt[1].distanceTo(vertex),2)

        if not nearest_vertex[pnt[0]]:
            nearest_vertex[pnt[0]] = ({vertex_id:distance})

        if vertex_id == 0:
            if distance < nearest_vertex[pnt[0]][vertex_id]:
                nearest_vertex[pnt[0]] = ({vertex_id:distance})

        else:
            if distance < nearest_vertex[pnt[0]].values()[0]:
                nearest_vertex[pnt[0]] = ({vertex_id:distance})
        vertex_id += 1
print nearest_vertex

#{u'A1': {0: 157.06},
#u'C3': {3: 553.08},
#u'D4': {0: 244.37},
#u'E5': {1: 271.14},
#u'B2': {1: 779.33}}

#creating a dictionary of line directions - to be used for point symbols rotation
angles_dict = {pnt[0]:
               GetAzimuthPolyline(pnt[1].firstPoint,line_vertices_dict[pnt[0]]
                                  [nearest_vertex[pnt[0]].keys()[0]]) for pnt in pnts}

#calculating the direction of the segment connecting the symbol point and the nearest vertex
with arcpy.da.UpdateCursor(pnts_fc,["ID","RotatField"]) as upd_cur:
    for row in upd_cur:
        row[1] = angles_dict[row[0]]
        upd_cur.updateRow(row)

Así es como podría verse:

enter image description here

0voto

lianameere Puntos 17

Puede hacerlo muy fácilmente utilizando la herramienta NEAR-Tool de la ArcToolbox con el parámetro opcional "Angle" marcado. Ya sea que agregue un campo doble para su Ángulo y lo calcule restando 90 grados del campo NEAR_ANGLE (agregado desde NEAR-Tool) o que use el campo NEAR_ANGLE directamente y reste los 90 grados por el Constructor de Expresiones dentro de las propiedades de Rotación.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X