Tengo una cadena de líneas: LINESTRING(-1.3326397 50.9174932,-1.3319842 50.9166939)
y selecciono dos puntos que se encuentran en esa línea.
¿Cómo puedo obtener la distancia entre estos dos puntos (en metros)?
Tengo una cadena de líneas: LINESTRING(-1.3326397 50.9174932,-1.3319842 50.9166939)
y selecciono dos puntos que se encuentran en esa línea.
¿Cómo puedo obtener la distancia entre estos dos puntos (en metros)?
Hay varias funciones de referencia lineal que puede utilizarse para referenciar subconjuntos de LineStrings, que pueden convertirse en un geography
y obtener la longitud de la geodésica con ST_Length .
Por ejemplo, obtener la distancia a lo largo de line
que están cerca de los puntos pta
y ptb
:
SELECT
ST_Length(ST_LineSubstring(
line,
ST_LineLocatePoint(line, pta),
ST_LineLocatePoint(line, ptb))::geography)
FROM (
SELECT
'SRID=4326;LINESTRING(-1.3326397 50.9174932,-1.3319842 50.9166939)'::geometry line,
'SRID=4326;POINT(-1.33262 50.91741)'::geometry pta,
'SRID=4326;POINT(-1.33202 50.91679)'::geometry ptb
) data;
Devolviendo una distancia de 83,315 m (línea azul; la línea roja es la original).
Tenga en cuenta que en versiones anteriores de PostGIS, las funciones se llamaban ST_Line_Locate_Point
y ST_Line_Substring
Así que muchos tienen que ajustar el ejemplo para que funcione.
En caso de "ERROR: 2nd arg must be smaller then 3rd arg", la consulta puede hacerse más robusta para encontrar los valores más bajos y más altos de A y B con el least
y greatest
Funciones SQL, por ejemplo
SELECT
ST_Length(ST_LineSubstring(
line,
least(ST_LineLocatePoint(line, pta), ST_LineLocatePoint(line, ptb)),
greatest(ST_LineLocatePoint(line, pta), ST_LineLocatePoint(line, ptb)))::geography)
FROM (
SELECT
'SRID=4326;LINESTRING(-1.3326397 50.9174932,-1.3319842 50.9166939)'::geometry line,
'SRID=4326;POINT(-1.33262 50.91741)'::geometry pta,
'SRID=4326;POINT(-1.33202 50.91679)'::geometry ptb
) data;
que ahora funcionará si pta
y ptb
se intercambian.
Pruebe a utilizar
ST_Distance(geometría g1, geometría g2) y ST_Transform(geometría g1, entero srid)
por ejemplo
SELECT ST_Distance(
ST_Transform(ST_SetSRID( ST_GeomFromText('POINT(-1.3326397 50.9174932)',4326),4326 ), srid),
ST_Transform(ST_SetSRID( ST_GeomFromText('POINT(,-1.3319842 50.9166939)',4326),4326 ), srid)
);
Para srid introduzca una proyección en metros.
["SELECT
ST_Distance(line, pta) AS dst_ptb,
ST_Distance(line, ptb) AS dst_pta,
ST_Length(ST_LineSubstring(
line,
least(ST_Line_Locate_Point(line, pta), ST_Line_Locate_Point(line, ptb)),
greatest(ST_Line_Locate_Point(line, pta), ST_Line_Locate_Point(line, ptb)))::geography) AS dst_line
FROM (
SELECT
'SRID=4326;LINESTRING(1.457834243774414 43.597960902821576,1.462029218673706 43.59636807591895)'::geometry line,
'SRID=4326;POINT(1.457994 43.598124)'::geometry ptb,
'SRID=4326;POINT(1.461628 43.596128)'::geometry pta
) data"
])
1 - Línea de distancia a pta
2 - Línea de distancia a ptb
3 - Línea de subcadena entre los 2 puntos de localización
A a B = dst_pta + dst_ptb + dst_line
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.