1 votos

Cálculo de la distancia entre un punto y un objeto MultiPolygon PostGIS

Estoy trabajando en una capa con MultiPolígonos y estoy tratando de calcular la distancia más corta entre un MultiPolígono y un punto que está contenido en ese MultiPolígono, usando Django y PostGIS.

Primero compruebo qué MultiPolígono contiene ese Punto y lo almaceno en una variable:

mpoly = MPoly.objects.filter(geom__contains=location)

Luego, estoy tratando de calcular la distancia entre el punto y el objeto mpoly utilizando la interfaz psycopg2:

curs.execute("SELECT ST_Distance(ST_GeogFromText(%s), ST_GeogFromText('SRID=4326;Point(24.050, 35.311)')) FROM MPoly" % mpoly)

Pero da el siguiente error de sintaxis:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
   ProgrammingError: syntax error at or near ";"
   LINE 1: SELECT ST_Distance(ST_GeomFromText(SRID=4326;MULTIPOLYGON ((23.567..

Creo que el error proviene del formato de "mpoly", pero ¿por qué? Si escribo en un intérprete de Python >> mpoly, imprime Objeto MultiPolígono en 0x7fc8d5130

1voto

jumentous Puntos 31

Una investigación sobre el tema de WKT-Geometrías y la sintaxis de st_geogfromtext revela, que su consulta debería ser algo así:

select st_distance(st_geogfromtext('srid=4326;multipolygon (((30 20, 45 40, 10 40, 30 20)),((15 5, 40 10, 10 20, 5 10, 15 5)))'),st_geogfromtext('srid=4326;point(40 20)'));
   st_distance   
-----------------
 892746.97610591

Tu error fue escribir punto(40 , 20), no punto(40 20). Tenga en cuenta que las comillas simples son obligatorias si utiliza la función st_geogfromtext, mientras que la distinción entre mayúsculas y minúsculas no es un problema. Por lo tanto, tal vez usted también podría tratar de citar su %s, como John Powell ya indicado.

Además, ¿está realmente seguro de querer calcular la distancia más corta de un punto que está dentro de un multipolígono? Porque, si el multipolígono contiene el punto, la distancia del punto al multipolígono es 0 por definición. Véase, por ejemplo, esta consulta, en la que un punto se encuentra dentro de los límites del multipolígono:

select st_distance(st_geogfromtext('srid=4326;multipolygon (((30 20, 45 40, 10 40, 30 20)),((15 5, 40 10, 10 20, 5 10, 15 5)))'),st_geogfromtext('srid=4326;point(20 12)'));
 st_distance 
-------------
           0

Si realmente quieres tener la distancia del punto a los límites del multipolígono, podrías intentar convertir el multipolígono en una multilínea o similar.

0voto

abyss.7 Puntos 130

Después de la útil respuesta de @yorkie me gustaría publicar una solución completa de mi problema sobre el cálculo de la distancia entre un objeto MultiPolígono y un Punto. La respuesta cubre el caso de que el objeto MultiPolygon contiene ese punto.

Al principio, convertí la geometría MultiPolygon en MultiLineString porque si MultiPolygon contiene el punto la distancia será cero (0.0).

curs.execute("SELECT ST_Boundary('%s')::geometry(MULTILINESTRING,4326)" % poly[0].geom)

Después de eso, convertí la geometría MultiLineString anterior en Texto Conocido.

curs.execute("SELECT ST_AsEWKT('%s')" % curs.fetchone())

y almacené el resultado en una variable:

t = curs.fetchone()

y finalmente, calculé la distancia:

curs.execute("select st_distance(st_geogfromtext('%s'),st_geogfromtext('srid=4326;point(24.050 35.311)'))" % t)

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