Las funciones de esta sección responden una pregunta sobre una geometría y no sobre un tipo temporal. Cada una indica cómo lee una geometría delimitada por arcos circulares, ya que una respuesta construida a partir de los arcos mismos y una construida a partir de una aproximación poligonal de ellos no son la misma respuesta.
Devuelve el rectángulo de área mínima que encierra una geometría
orientedEnvelope(geometry) → geometry
El rectángulo se orienta en el ángulo que lo hace más pequeño, que en general no es el ángulo de los ejes. Se devuelve como una línea cuando la geometría está contenida en una y como un punto cuando la geometría es uno. Una geometría que lleva un arco circular se responde sobre el arco mismo: el rectángulo se coloca contra el círculo en el que se encuentra el arco y no contra la cadena de segmentos que lo aproxima.
SELECT ST_AsText(round(orientedEnvelope(geometry 'Polygon((0 0,3 4,-1 7,-4 3,0 0))'), 6)); -- POLYGON((0 0,3 4,-1 7,-4 3,0 0)) SELECT ST_AsText(round(orientedEnvelope(geometry 'Linestring(0 0,10 0)'), 6)); -- LINESTRING(0 0,10 0) SELECT ST_AsText(round(orientedEnvelope(geometry 'Circularstring(0 0,0.5 0.1,1 0)'), 6)); -- POLYGON((1 0.1,0 0.1,0 0,1 0,1 0.1))
Devuelve la geometría convexa más pequeña que encierra una geometría
convexHull(geometry) → geometry
El resultado es un polígono en el que cada esquina es un punto de la geometría, una línea cuando la geometría está contenida en una y un punto cuando la geometría es uno. Una geometría que lleva un arco circular se responde sobre el arco mismo, por lo que la envolvente está delimitada por el arco y se devuelve como una geometría curva y no como un polígono que la aproxima.
SELECT ST_AsText(round(convexHull(geometry 'Multipoint(0 0,10 0,10 10,0 10,5 5)'), 6)); -- POLYGON((0 0,0 10,10 10,10 0,0 0)) SELECT ST_AsText(round(convexHull(geometry 'Polygon((0 0,10 0,10 10,5 5,0 10,0 0))'), 6)); -- POLYGON((0 0,0 10,10 10,10 0,0 0)) SELECT ST_AsText(round(convexHull(geometry 'Circularstring(5 0,0 5,-5 0)'), 6)); -- CURVEPOLYGON(COMPOUNDCURVE((5 0,-5 0),CIRCULARSTRING(-5 0,0 5,5 0)))
Devuelve verdadero si una geometría no tiene ningún punto en el que se cruce o se toque a sí misma
isSimple(geometry) → boolean
Un punto siempre es simple, un multipunto es simple cuando no repite ningún punto, una línea es simple cuando se encuentra consigo misma solo donde dos de sus segmentos se siguen y, cuando se cierra, en el punto donde se cierra, y una geometría de área es simple cuando cada uno de sus anillos lo es. Además, dos líneas de una multilínea pueden encontrarse en un punto que termina ambas. Una geometría que lleva un arco circular se encuentra consigo misma a lo largo de un arco y no en un punto, lo que la intersección de segmentos en la que esto se basa no lee, por lo que tal geometría se responde sobre la cadena de segmentos que aproxima sus arcos.
SELECT isSimple(geometry 'Linestring(0 0,10 10,10 0,0 10)'); -- false SELECT isSimple(geometry 'Linestring(0 0,10 0,10 10,0 0)'); -- true SELECT isSimple(geometry 'Multilinestring((0 0,10 0),(10 0,10 10))'); -- true
Devuelve la geometría que contiene todos los puntos situados a una distancia dada de una geometría
buffer(geometry,float,options text='') → geometry
La frontera del resultado está formada por los dos desplazamientos de la geometría a la distancia dada, por la unión que rellena el lado exterior de cada giro y por el extremo que cierra cada final de una línea abierta. Una distancia negativa contrae una geometría de área y devuelve una geometría vacía para una de cualquier otra dimensión. La cadena options lleva los estilos como pares clave=valor separados por espacios: endcap es uno de round, flat o square, join uno de round, mitre o bevel, y mitre_limit la razón a partir de la cual una unión en inglete pasa a ser biselada.
SELECT ST_AsText(round(buffer(geometry 'Point(0 0)', 1), 6)); -- CURVEPOLYGON(CIRCULARSTRING(-1 0,1 0,-1 0)) SELECT ST_AsText(round(buffer(geometry 'Polygon((0 0,10 0,10 10,0 10,0 0))', -1, 'join=mitre'), 6)); -- CURVEPOLYGON(COMPOUNDCURVE((1 1,9 1),(9 1,9 9),(9 9,1 9),(1 9,1 1))) SELECT ST_AsText(round(buffer(geometry 'Curvepolygon(Circularstring(0 0,2 2,4 0,2 -2, 0 0))', 1), 6)); -- CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(-1 0,2 3,5 0),CIRCULARSTRING(5 0,2 -3,-1 0)))
Devuelve la matriz de intersección DE-9IM de dos geometrías o si coincide con un patrón
relate(geometry,geometry) → text relate(geometry,geometry,text) → boolean
La matriz indica, para cada par formado por el interior, la frontera y el exterior de la primera geometría y de la segunda, la dimensión de lo que comparten: F cuando no comparten nada, 0, 1 o 2 cuando comparten puntos, una curva o un área. Un arco circular se lee sobre su propio círculo y no sobre una cadena de segmentos que lo aproxima, y el interior y la frontera de una colección de geometrías son los de la unión de sus miembros. Con un patrón, la función responde si la matriz coincide con él, como lo hace ST_Relate con tres argumentos: un carácter T del patrón coincide con cualquiera de 0, 1 y 2, y un carácter * coincide con cualquier cosa.
SELECT relate(geometry 'Polygon((0 0,4 0,4 4,0 4,0 0))', geometry 'Linestring(2 2,6 2)'); -- 1020F1102 SELECT relate(geometry 'Polygon((0 0,2 0,2 2,0 2,0 0))', geometry 'Polygon((2 0,4 0,4 2,2 2,2 0))'); -- FF2F11212 SELECT relate(geometry 'Curvepolygon(Circularstring(0 0,2 2,4 0,2 -2,0 0))', geometry 'Point(2 1.9)'); -- 0F2FF1FF2 SELECT relate(geometry 'Polygon((0 0,4 0,4 4,0 4,0 0))', geometry 'Point(2 2)', 'T*****FF*'); -- true
Devuelve verdadero si dos geometrías satisfacen una relación espacial
contains(geometry,geometry) → boolean
covers(geometry,geometry) → boolean
touches(geometry,geometry) → boolean
geoEquals(geometry,geometry) → boolean
disjoint({geometry,geography},{geometry,geography}) → boolean
intersects({geometry,geography},{geometry,geography}) → boolean
Cada una responde como la función de PostGIS del mismo nombre con el prefijo ST_ sobre los mismos argumentos, sin llamar a GEOS. Sobre dos geometrías con Z, disjoint e intersects se evalúan en 3D, como ST_3DIntersects, y en 2D cuando una de ellas no tiene Z. Las relaciones de contención contains, covers y touches no tienen forma 3D y rechazan una geometría con Z. Dos geografías se intersecan sobre el esferoide WGS 84, como lo decide ST_Intersects. La igualdad de dos conjuntos de puntos se llama geoEquals en todos los motores, ya que PostGIS declara equals(geometry, geometry) como un alias obsoleto de ST_Equals; lee los puntos, mientras que el operador = compara los vértices.
SELECT contains(geometry 'Polygon((0 0,4 0,4 4,0 4,0 0))', geometry 'Point(2 2)'); -- true SELECT touches(geometry 'Polygon((0 0,4 0,4 4,0 4,0 0))', geometry 'Point(4 2)'); -- true SELECT intersects(geometry 'Point(1 1 1)', geometry 'Point(1 1 2)'); -- false SELECT geoEquals(geometry 'Linestring(0 0,2 0)', geometry 'Linestring(0 0,1 0,2 0)'); -- true
Devuelve verdadero si dos geometrías están a una distancia dada
dwithin(geometry,geometry,float) → boolean dwithin(geography,geography,float,spheroid boolean=true) → boolean
Dos geometrías con Z se miden en 3D, como ST_3DDWithin, y en 2D cuando una de ellas no tiene Z. Para geografías, el cálculo se realiza en el esferoide WGS 84 por defecto. Si el último argumento es falso, se utiliza un cálculo esférico más rápido.
SELECT dwithin(geometry 'Point(0 0 0)', geometry 'Point(0 0 2)', 1.5); -- false SELECT dwithin(geometry 'Point(0 0 0)', geometry 'Point(0 0)', 1.5); -- true SELECT dwithin(geography 'Point(0 0)', geography 'Point(0 1)', 110800); -- true SELECT dwithin(geography 'Point(0 0)', geography 'Point(0 1)', 110800, false); -- false
Devuelve el área, el perímetro o el centroide de una geometría o una geografía
area(geometry) → float area(geography,spheroid boolean=true) → float perimeter(geometry) → float perimeter(geography,spheroid boolean=true) → float centroid(geometry) → geometry centroid(geography,spheroid boolean=true) → geography
Cada una responde como la función de PostGIS del mismo nombre con el prefijo ST_, sin llamar a GEOS, salvo que el área de una superficie delimitada por arcos de circunferencia se mide sobre sus arcos, por la forma cerrada del segmento circular que cada arco añade a su cuerda: para el disco de radio 1 a continuación el área es π, que ST_Area, al reemplazar cada cuarto de circunferencia por 32 segmentos, da como 3,1403. Una geografía se mide en metros cuadrados o en metros sobre el esferoide WGS 84 por defecto, y sobre la esfera, un cálculo más rápido, si el último argumento es falso. Sobre la esfera, el área es la que delimitan los círculos máximos que unen los vértices, que ST_Area sobre una geografía en la esfera aproxima: para el cuadrado de un grado en el ecuador a continuación, la aproximación es un 0,67 por ciento menor.
SELECT area(geometry 'Polygon((0 0,4 0,4 4,0 4,0 0))'); -- 16 SELECT area(geometry 'CurvePolygon(CircularString(0 0,1 1,2 0,1 -1,0 0))'); -- 3.141592653589793 SELECT ST_AsText(centroid(geometry 'Polygon((0 0,4 0,4 4,0 4,0 0))')); -- POINT(2 2) SELECT round(area(geography 'Polygon((0 0,1 0,1 1,0 1,0 0))')::numeric); -- 12308778361 SELECT round(area(geography 'Polygon((0 0,1 0,1 1,0 1,0 0))', false)::numeric); -- 12364031799
Devuelve la distancia, la línea que une los puntos más cercanos o la distancia máxima de dos geometrías o geografías
distance(geometry,geometry) → float distance(geography,geography,spheroid boolean=true) → float shortestLine(geometry,geometry) → geometry shortestLine(geography,geography,spheroid boolean=true) → geography maxDistance(geometry,geometry) → float
Dos geometrías con Z se miden en 3D, como las funciones de PostGIS con el prefijo ST_3D, y una geometría con Z y otra sin ella se rechazan. Para geografías, el cálculo se realiza en el esferoide WGS 84 por defecto. Si el último argumento es falso, se utiliza un cálculo esférico más rápido. La línea más corta de dos geografías une sus puntos más cercanos sobre la esfera, como los une ST_ShortestLine sobre geografías.
SELECT distance(geometry 'Point(0 0 0)', geometry 'Point(3 4 12)'); -- 13 SELECT ST_AsText(shortestLine(geometry 'Point(0 0 0)', geometry 'Linestring(1 -1 1,1 1 1)')); -- LINESTRING Z (0 0 0,1 0 1) SELECT round(maxDistance(geometry 'Linestring(0 0 0,1 0 0)', geometry 'Point(0 0 2)')::numeric, 6); -- 2.236068 SELECT round(distance(geography 'Point(0 0)', geography 'Point(0 1)', false)::numeric, 3); -- 111195.080
Devuelve la frontera, la inversión o las partes de una geometría
boundary(geometry) → geometry reverse(geometry) → geometry numGeometries(geometry) → integer geometryN(geometry,integer) → geometry numPoints(geometry) → integer
Cada una responde como la función de PostGIS del mismo nombre con el prefijo ST_, numPoints contando todos los vértices como lo hace ST_NPoints y geometryN contando desde 1. La frontera de una geometría vacía es la geometría vacía de la dimensión de una frontera. La frontera de una curva compuesta son sus dos puntos extremos, o vacía cuando se cierra, y la frontera de una multisuperficie son las fronteras de sus miembros; ST_Boundary rechaza ambas.
SELECT ST_AsText(boundary(geometry 'Polygon((0 0,4 0,4 4,0 4,0 0))')); -- LINESTRING(0 0,4 0,4 4,0 4,0 0) SELECT ST_AsText(reverse(geometry 'Linestring(0 0,4 0,4 3)')); -- LINESTRING(4 3,4 0,0 0) SELECT numGeometries(geometry 'MultiPoint(1 1,5 5)'); -- 2 SELECT ST_AsText(geometryN(geometry 'MultiPoint(1 1,5 5)', 2)); -- POINT(5 5) SELECT numPoints(geometry 'Polygon((0 0,4 0,4 4,0 4,0 0))'); -- 5
Devuelve el punto en una fracción de una línea, la parte entre dos fracciones o la fracción más cercana a un punto
lineInterpolatePoint(geometry,float) → geometry lineSubstring(geometry,float,float) → geometry lineLocatePoint(geometry,geometry) → float
Cada una responde como la función de PostGIS del mismo nombre con el prefijo ST_, siendo una fracción una parte de la longitud de la línea entre 0 y 1.
SELECT ST_AsText(lineInterpolatePoint(geometry 'Linestring(0 0,4 0,4 3)', 0.25)); -- POINT(1.75 0) SELECT ST_AsText(lineSubstring(geometry 'Linestring(0 0,4 0,4 3)', 0.25, 0.8)); -- LINESTRING(1.75 0,4 0,4 1.6) SELECT lineLocatePoint(geometry 'Linestring(0 0,4 0,4 3)', geometry 'Point(4 4)'); -- 1
Devuelve la colección de un arreglo de geometrías o la línea que las une
collect(geometry[]) → geometry makeLine(geometry[]) → geometry
Una colección toma su tipo únicamente de los tipos de las geometrías, como lo da la función de PostGIS ST_Collect, de modo que un arreglo de un punto devuelve un multipunto, y una línea une los puntos y las líneas del arreglo en su orden, como los une ST_MakeLine. Un arreglo vacío devuelve NULL.
SELECT ST_AsText(collect(ARRAY[geometry 'Point(1 1)'])); -- MULTIPOINT((1 1)) SELECT ST_AsText(collect(ARRAY[geometry 'Point(1 1)', geometry 'Linestring(0 0,1 1)'])); -- GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1)) SELECT ST_AsText(makeLine(ARRAY[geometry 'Point(1 1)', geometry 'Point(2 2)'])); -- LINESTRING(1 1,2 2)
Devuelve la representación Well-Known Text, Extended Well-Known Text, Extended Well-Known Binary o GeoJSON de una geometría o una geografía
asText({geometry,geography},maxdecimaldigits integer=15) → text
asEWKT({geometry,geography},maxdecimaldigits integer=15) → text
asEWKB({geometry,geography},endian text='') → bytea
asGeoJSON(geometry,maxdecimaldigits integer=9,options integer=8) → text
asGeoJSON(geography,maxdecimaldigits integer=9,options integer=0) → text
Cada una responde como la función de PostGIS del mismo nombre con el prefijo ST_. El GeoJSON indica el sistema de referencia de coordenadas que piden sus opciones, la suma de 1 para el rectángulo delimitador, 2 para el nombre corto del sistema, como en EPSG:3857, 4 para su nombre largo y 8 para el nombre corto de cualquier sistema salvo WGS 84, que es el valor por defecto para una geometría; una geografía no toma ninguna opción por defecto.
SELECT asText(geometry 'SRID=3857;Point(1.123456789 2)', 3);
-- POINT(1.123 2)
SELECT asEWKT(geometry 'SRID=3857;Point(1 2)');
-- SRID=3857;POINT(1 2)
SELECT asEWKB(geometry 'Point(1 1)', 'XDR');
-- \x00000000013ff00000000000003ff0000000000000
SELECT asGeoJSON(geometry 'SRID=3857;Point(1 2)');
-- {"type":"Point","crs":{"type":"name","properties":{"name":"EPSG:3857"}},"coordinates":[1,2]}
SELECT asGeoJSON(geometry 'SRID=4326;Point(1 2)');
-- {"type":"Point","coordinates":[1,2]}
Transforma una geometría o una geografía a un identificador de referencia espacial
transform(geometry,integer) → geometry transform(geography,integer) → geography
Una geometría se transforma como la transforma la función de PostGIS ST_Transform. Una geografía se transforma únicamente a un sistema de coordenadas de longitud y latitud, como lo exige la conversión de una geometría en una geografía.
SELECT asEWKT(transform(geometry 'SRID=4326;Point(4.35 50.85)', 3857), 2); -- SRID=3857;POINT(484239.78 6594803.23) SELECT asEWKT(transform(geography 'Point(4.35 50.85)', 3857)); -- ERROR: Only lon/lat coordinate systems are supported
Densifica una geometría o una geografía de modo que ningún segmento sea más largo que una distancia
segmentize(geometry,float) → geometry segmentize(geography,float) → geography
Una geometría se densifica en el plano, la distancia en las unidades de su sistema de referencia espacial, y una geografía sobre la esfera, la distancia en metros, como las densifica la función de PostGIS ST_Segmentize. Un punto, un multipunto y un valor vacío se devuelven sin cambios, al igual que un triángulo, un TIN y una superficie poliédrica. Una distancia que no es positiva se rechaza.
SELECT ST_AsText(segmentize(geometry 'Linestring(0 0,3 0)', 1)); -- LINESTRING(0 0,1 0,2 0,3 0) SELECT asText(segmentize(geography 'Linestring(4.35 50.85,2.35 48.85)', 100000), 4); -- LINESTRING(4.35 50.85,3.8343 50.3533,3.3293 49.8543,2.8347 49.3532,2.35 48.85)
Devuelve los grupos de un arreglo de geometrías
clusterKMeans(geometry[],k integer) → integer[] clusterDBSCAN(geometry[],eps float,minpoints integer) → integer[] clusterIntersecting(geometry[]) → geometry[] clusterWithin(geometry[],distance float) → geometry[]
clusterKMeans y clusterDBSCAN devuelven el número del grupo de cada geometría, en el orden del arreglo, como las numeran las funciones de ventana de PostGIS ST_ClusterKMeans y ST_ClusterDBSCAN sobre las filas en ese orden: una geometría vacía está en el grupo -1 de k-means, y una geometría que DBSCAN no ubica en ningún grupo tiene el número NULL. clusterIntersecting y clusterWithin devuelven una colección de geometrías por grupo, como las devuelven los agregados de PostGIS ST_ClusterIntersecting y ST_ClusterWithin. Un arreglo vacío devuelve NULL.
SELECT clusterKMeans(ARRAY[geometry 'Point(0 0)', geometry 'Point(1 0)', geometry 'Point(10 10)',
geometry 'Point(11 10)', geometry 'Point(30 30)'], 2);
-- {1,1,1,1,0}
SELECT clusterDBSCAN(ARRAY[geometry 'Point(0 0)', geometry 'Point(1 0)', geometry 'Point(10 10)',
geometry 'Point(11 10)', geometry 'Point(30 30)'], 1.5, 2);
-- {0,0,1,1,NULL}
SELECT array_length(clusterWithin(ARRAY[geometry 'Point(0 0)', geometry 'Point(1 0)', geometry 'Point(10 10)',
geometry 'Point(11 10)', geometry 'Point(30 30)'], 2), 1);
-- 3
Devuelve la región que dos geometrías comparten
intersection(geometry,geometry) → geometry
Las cuatro operaciones booleanas de esta sección responden sobre los (multi)polígonos que llevan los tipos temporales cuyos valores son regiones, y cada una toma el nombre de la función de PostGIS para la que responde sin el prefijo ST_, de modo que una consulta alcanza este motor quitando el prefijo y PostGIS conservándolo. Son planas y bidimensionales: se rechazan una geografía, una dimensión Z y una geometría que no sea un (multi)polígono. Un resultado vacío se responde como NULL.
SELECT ST_AsText(intersection(geometry 'Polygon((1 1,1 5,5 5,5 1,1 1))', geometry 'Polygon((3 3,3 7,7 7,7 3,3 3))')); -- POLYGON((5 3,3 3,3 5,5 5,5 3)) SELECT ST_AsText(intersection(geometry 'Polygon((1 1,1 5,5 5,5 1,1 1))', geometry 'MultiPolygon(((2 2,2 4,3 4,3 2,2 2)),((4 2,4 4,6 4,6 2,4 2)))')); -- MULTIPOLYGON(((3 2,2 2,2 4,3 4,3 2)),((5 2,4 2,4 4,5 4,5 2))) SELECT intersection(geometry 'Polygon((1 1,1 2,2 2,2 1,1 1))', geometry 'Polygon((10 10,10 11,11 11,11 10,10 10))') IS NULL; -- true
Devuelve la región que dos geometrías cubren en conjunto
geoUnion(geometry,geometry) → geometry
UNION es una palabra reservada de SQL, por lo que esta lleva el nombre del tipo sobre el que responde, como hacen setUnion y spanUnion. Dos geometrías que no se tocan se responden como un multipolígono.
SELECT ST_AsText(geoUnion(geometry 'Polygon((1 1,1 5,5 5,5 1,1 1))', geometry 'Polygon((3 3,3 7,7 7,7 3,3 3))')); -- POLYGON((5 1,1 1,1 5,3 5,3 7,7 7,7 3,5 3,5 1))
Devuelve la región de la primera geometría que la segunda no cubre
difference(geometry,geometry) → geometry
Una segunda geometría situada dentro de la primera deja un agujero en lugar de dividirla.
SELECT ST_AsText(difference(geometry 'Polygon((1 1,1 5,5 5,5 1,1 1))', geometry 'Polygon((3 3,3 7,7 7,7 3,3 3))')); -- POLYGON((5 1,1 1,1 5,3 5,3 3,5 3,5 1)) SELECT ST_AsText(difference(geometry 'Polygon((1 1,1 5,5 5,5 1,1 1))', geometry 'Polygon((2 2,2 4,4 4,4 2,2 2))')); -- POLYGON((5 1,1 1,1 5,5 5,5 1),(2 4,2 2,4 2,4 4,2 4))
Devuelve la región que cubre exactamente una de dos geometrías
symDifference(geometry,geometry) → geometry
Es la unión de las dos geometrías menos la región que comparten, por lo que una geometría contra sí misma se responde como NULL.
SELECT ST_AsText(symDifference(geometry 'Polygon((1 1,1 5,5 5,5 1,1 1))', geometry 'Polygon((3 3,3 7,7 7,7 3,3 3))')); -- MULTIPOLYGON(((7 3,5 3,5 5,3 5,3 7,7 7,7 3)),((5 1,1 1,1 5,3 5,3 3,5 3,5 1))) SELECT symDifference(geometry 'Polygon((1 1,1 3,3 3,3 1,1 1))', geometry 'Polygon((1 1,1 3,3 3,3 1,1 1))') IS NULL; -- true