5 votos

Encontrar la distancia entre el punto y el borde del polígono en dirección este usando PyQGIS?

Necesito encontrar la distancia en dirección este desde cada punto hasta el borde del polígono más cercano:

enter image description here

Puedo encontrar la distancia más corta en cualquier dirección con:

pointlayer = QgsProject.instance().mapLayersByName('points_inter_squares')[0]
points = [[f.geometry(),f['Ruta_100km']] for f in pointlayer.getFeatures()]

squarelayer = QgsProject.instance().mapLayersByName('squares')[0]
squares = [[f.geometry(),f['Ruta_100km']] for f in squarelayer.getFeatures()]

for point in points:
    print(min([QgsGeometry.distance(point[0],square[0]) for square in squares if point[1]!=square[1]]))

>>12639.380321901293
>>3320.150455611874
>>6650.862023710273
>>2452.079442886869

'Ruta_100km' es el ID de las Casillas, así que mido la distancia a todas las Casillas menos a la que cruza los Puntos.

¿Existe algún método que permita especificar la dirección al medir la distancia?

1 votos

Podrías extender una línea desde tus puntos en dirección este e intersectar con la cuadrícula, encontrar el segmento que toca tu punto de creación y obtener la longitud de ese segmento. El segmento hacia el este debe ser una distancia muy grande para asegurar que haya una intersección encuentre la extensión de su cuadrícula y use el valor máximo de X.

0 votos

¿La longitud de los lados de los cuadrados es siempre de 100 km y las coordenadas del origen de la cuadrícula son un múltiplo entero de 100 km o buscas una solución general?

0 votos

La cuadrícula no siempre es de 100 km, sino que siempre es una cuadrícula cuadrada.

5voto

DBM Puntos 51

Una solución general: Siempre que una malla descrita por su origen (x0, y0) y un espacio de rejilla d_grid (100 km en su ejemplo), el problema se reduce a calcular la diferencia entre los puntos de prueba p = (x, y) la coordenada x y la coordenada x de la línea de la cuadrícula N-S que se encuentra junto a p , x_square Así que la pregunta es, ¿qué es x_square :

enter image description here

Lo siguiente no necesita una capa de rejilla, sino sólo la descripción de la rejilla como se ha descrito anteriormente:

for p in points:
    # assumption: grid origin (x0, y0), spacing d_grid
    # metric coordinate system
    y = p.geometry().asPoint().x()
    # calculate y-distance to origin
    dx0 = x - x0
    # calculate number of square in which p(x, y) lies (2 in the example)
    square_count = int(dx0 / d_grid) + 1
    # calculate x-coordinate of N-S grid line next to p
    x_square = x0 + d_grid * square_count
    # calculate the desired distance
    dp = x_square - x
    print(dp)

4voto

Anton8000 Puntos 165

Basándome en el comentario de @Michael Stimson he conseguido resolverlo creando una línea que se extiende hacia el este, intersectando ésta con los polígonos, encontrando la coordenada min x de la(s) línea(s) resultante(s) y restando esta minx-startx. También debería funcionar con polígonos de forma irregular. Requiere tener los ids de los polígonos en los puntos (por ejemplo intersectándolos) para excluir cualquier polígono que intersecte directamente el punto.

pointlayer = QgsProject.instance().mapLayersByName('points_inter_squares')[0]
points = [[f.geometry(),f['Ruta_100km']] for f in pointlayer.getFeatures()]

squarelayer = QgsProject.instance().mapLayersByName('squares')[0]
squares = [[f.geometry(),f['Ruta_100km']] for f in squarelayer.getFeatures()]

max_search_distance = 200000

for geom, pointid in points:
    startx, starty = geom.asMultiPoint()[0]
    endx = startx+max_search_distance
    line = QgsGeometry.fromPolyline([QgsPoint(startx,starty), QgsPoint(startx+max_search_distance,starty)])
    intersections = [QgsGeometry.intersection(line,square[0]) for square in squares if (pointid!=square[1] and QgsGeometry.intersects(line,square[0]))]
    minx = min([l.asPolyline()[0][0] for l in intersections], default=startx) #If no feature is found, set minx to startx which will give 0 distance when subtracting
    print(minx-startx)

enter image description here

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