st_geometry instalar ejemplos descargar postgresql postgis plpgsql

postgresql - instalar - postgis install



Dos puntos más cercanos en el límite de la geometría de Postgis (4)

Tengo una tabla de geofences que almacena geometry de polígono.

También tengo un punto A que está dentro de la geometría. Lo que tengo que hacer es encontrar los dos puntos más cercanos desde el punto A que se encuentran en la superficie de la geometría del polígono.

Función en PostGIS:

CREATE OR REPLACE FUNCTION accuracyCheck(Polygon geometry ,decimal lat ,decimal lon) RETURNS VARCHAR AS $BODY$ DECLARE height DECIMAL; DECLARE accuracy VARCHAR(250); BEGIN CREATE TEMPORARY TABLE closePointStorage AS SELECT ST_AsText(ST_ClosestPoint(geometry ,ST_GeomFromText(''POINT(lat lon)'',0) ) ) AS closestPoint FROM ( SELECT ST_GeomFromText(geometry) as geometry FROM gfe_geofences WHERE is_active=true ) As tempName; CREATE TEMPORARY TABLE areaStorage ON COMMIT DROP AS SELECT ST_Area(ST_GeomFromText(''Polygon((23.0808622876029 96.1304006624291 ,28.0808622876029 99.1304006624291 ,100 200 ,23.0808622876029 96.1304006624291 ))'' ,0) ) AS area; CREATE TEMPORARY TABLE distanceStorage ON COMMIT DROP AS SELECT ST_Distance( ST_GeomFromText(''POINT(23.0808622876029 96.1304006624291)'',-1) ,ST_GeomFromText(''POINT(28.0808622876029 99.1304006624291)'',-1) ) AS distance; height = (SELECT area FROM areaStorage) /(0.5*(SELECT distance FROM distanceStorage)); IF height < (SELECT radius_meters FROM gfe_geofences Where is_active=true) THEN accuracy = "FullConfirm"; RETURN accuracy; ELSE accuracy = "PartiallyConfirm"; RETURN accuracy; END IF; END; $BODY$ LANGUAGE plpgsql;

Solo quiero encontrar dos puntos en el límite de la geometría del polígono. Al igual que he encontrado uno de la consulta:

CREATE TEMPORARY TABLE closePointStorage AS SELECT ST_AsText(ST_ClosestPoint(geometry ,ST_GeomFromText(''POINT(lat lon)'',0) ) ) AS closestPoint FROM ( SELECT ST_GeomFromText(geometry) as geometry FROM gfe_geofences WHERE is_active=true ) AS tempName;

Aparte de este punto, tengo que encontrar uno más con una distancia mayor que el punto que se encuentra arriba pero más pequeño que el resto de puntos.


1) Tipo de idea de campo izquierdo, pero para encontrar el segundo punto más cercano a su destino, ¿por qué no encontrar el punto más cercano al punto que ya encontró?

2) O, más germaine a su pregunta específica,

  • encontrar el conjunto de puntos dentro de un rango razonable del punto,
  • encuentre la intersección de ese conjunto con el conjunto de puntos que se encuentran en el borde del polígono (que supongo que puede ser otra función de PostGIS; no he usado postG desde hace tiempo, así que no estoy seguro)

3) Más lejos en el campo izquierdo, descargue parte de su conjunto de datos en Mongo y use la función $ near ... http://docs.mongodb.org/manual/reference/operator/near/


Generalmente, no hay un segundo punto más cercano en el polígono de límites, si incluye las líneas. Al igual que no hay un número real segundo más cercano a cero. O solo desea considerar los puntos en las esquinas, como sugiere Markus. O solo tienes un punto más cercano.


Supongo que desea encontrar el borde del polígono que pasa más cerca del punto en cuestión

Para obtener la distancia ''d'' del punto ''C'' de la línea [A, B] Primero traduzca todos los puntos, de modo que A esté en 0,0

B -= A //vector subtraction C -= A

Luego normaliza B por lo que es de longitud 1.0

len = sqrt( B . B) //dotproduct of two vectors is the length squared B /= len //scalar divide by length

Encuentra la longitud de A que está en ángulo recto a C

dotp = B . C //dot product again closestPointOnLine = B * dotp //scalar multiply

Ahora toma la distancia

diff = (C - ClosestPointOnLine) d = sqrt(diff . diff)

No estoy seguro de cómo hacer eso en SQL. Deberá hacer lo anterior para cada borde de su polígono, y luego encontrar el valor más pequeño ''d''

Por cierto, el signo del producto cruzado de B y C ahora te dirá si el punto está dentro del polígono o no.


Use ST_DumpPoints () para volcar los puntos del polígono, luego seleccione de esa orden por ST_Distance a un límite 2.?

Así que es algo como

SELECT * from ST_DumpPoints(poly) order by ST_Distance(A,geom) asc limit 2;

(asume que esta es una selección interna donde poli es el polígono, A es el punto para comparar y geom es la columna de geom de uno de los puntos en el que se está comparando poli)