La superficie de ese polígono no siempre tiene un centroide de polígono. Considere el siguiente ejemplo.
SELECT
"PolygonWithInnerRing".ST_asSVG() AS "SVG",
"PolygonWithInnerRing".ST_Centroid().ST_asSVG() AS "CENTROID_SVG"
FROM (
SELECT NEW ST_Polygon('Polygon ((-5 -5, 5 -5, 0 5, -5 -5), (-2 -2, -2 0, 2 0, 2 -2, -2 -2))') as "PolygonWithInnerRing"
FROM "DUMMY"
);
SVG ligeramente modificado para una mejor visualización, similar al siguiente:
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="-5.01 -5.01 10.02 10.02">
<path fill="yellow" stroke="black" stroke-width="0.1%" d="
M -5,5 l 10,0 -5,-10 Z
M -2,2 l 0,-2 4,0 0,2 Z
"/>
<rect width="1%" height="1%" stroke="red" stroke-width="1%" x="0" y="1.79365"/>
</svg>
Muestra que el núcleo (el punto rojo) está ubicado dentro del anillo interior, por lo que no es la superficie del polígono.
En algunos casos, necesitará tener un punto (como un marcador de algún tipo en el mapa) que se encuentre en algún lugar de la superficie de un polígono en particular. Ese es el propósito de un método ST_PointOnSurface()
.
Actualice el ejemplo anterior para incluir el cálculo del punto en la superficie.
SELECT
"PolygonWithInnerRing".ST_asSVG() AS "SVG",
"PolygonWithInnerRing".ST_PointOnSurface().ST_asSVG() AS "CENTROID_SVG"
FROM (
SELECT NEW ST_Polygon('Polygon ((-5 -5, 5 -5, 0 5, -5 -5), (-2 -2, -2 0, 2 0, 2 -2, -2 -2))') as "PolygonWithInnerRing"
FROM "DUMMY"
);
Nuevamente modifique ligeramente el estilo de los objetos SVG, de modo que el núcleo esté en rojo y el punto en la superficie en azul.
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="-5.01 -5.01 10.02 10.02">
<path fill="yellow" stroke="black" stroke-width="0.1%" d="
M -5,5 l 10,0 -5,-10 Z
M -2,2 l 0,-2 4,0 0,2 Z
"/>
<rect width="1%" height="1%" stroke="red" stroke-width="1%" x="0" y="1.79365"/>
<rect width="1%" height="1%" stroke="blue" stroke-width="1%" x="-2.25" y="0"/>
</svg>
Puede ver en la visualización que el punto azul está ubicado en la superficie amarilla.