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 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