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)