6 votos

Inserción de los centroides de los polígonos en una columna adicional en PostGIS

Estoy tratando de calcular los centroides x e y de una tabla utilizando ST_Centroide . La documentación dice que devuelve el centro geométrico de una geometría. Primero hice una columna X :

ALTER TABLE "test_table" ADD X double precision;

y pensaba almacenar allí la componente x del centroide. Mi código para calcular el centroide es el siguiente:

select
  ST_Centroid(a.the_geom) 
FROM 
  "test_table" AS a

Sin embargo, esta consulta devuelve el siguiente resultado que no entiendo:

"01010000006BAEC2FBDFC61E415B3E9E2946520541"
"0101000000E6ABADEBFEC51E4102E9A95858520541"
"01010000003233333321C61E410BD7A37061520541"
"0101000000F710787300C61E4177C8C783D94E0541"

Mi segundo problema con este enfoque es tratar de almacenar el resultado. Cuando intenté insertar este resultado en la Columna X No he podido averiguar la sintaxis correcta. Lo que intenté usar fue:

INSERT INTO "test_table" (X)
VALUES ( ST_Centroid(a.the_geom) ),
FROM "test_table" AS a

y también

INSERT INTO "test_table" (X)
VALUES ( SELECT ST_Centroid(a.the_geom) 
FROM "test_table" AS a)

pero ninguno de ellos funciona.

Mis dos preguntas básicas son (1) cuál es el valor que devuelve ST_Centroid y (2) ¿cómo puedo insertar el resultado en una tabla existente?

0 votos

He probado la solución de Underdark, o una variación de la misma: ALTER TABLE parcels2012_2 ADD x double precision; ALTER TABLE parcels2012_2 ADD y double precision; UPDATE parcels2012_2 SET x = ST_X(ST_PointOnSurface(the_geom)); UPDATE parcels2012_2 SET y = ST_Y(ST_PointOnSurface(the_geom)); Sin embargo, obtengo un error: ¡NOTICE: TopologyException: side location conflict at -80.206658911211804 26.809848924607316 ERROR: GEOS pointonsurface() threw an error! ¿Alguna idea? Puedo devolver fácilmente puntos individuales, e incluso pequeños subconjuntos, pero no puede manejar los 625.000 polígonos en un solo comando.

0 votos

Esto es una pregunta, no una respuesta.

0 votos

Le recomiendo que formule una nueva pregunta si su investigación indica que no se ha respondido ya aquí o en otro lugar.

14voto

tobes Puntos 19

Si quieres columnas x e y:

ALTER TABLE "test_table" ADD x double precision;
ALTER TABLE "test_table" ADD y double precision;
UPDATE "test_table" SET x = ST_X(ST_Centroid(the_geom));
UPDATE "test_table" SET y = ST_Y(ST_Centroid(the_geom));

Si prefiere una columna de geometría (ajuste el nombre del esquema y el CRS según sus necesidades):

SELECT AddGeometryColumn ('test_schema','test_table','centroid_geom',4326,'POINT',2);
UPDATE "test_table" SET centroid_geom = ST_Centroid(the_geom);

9voto

Xavier Nodet Puntos 2498

Debe utilizar Función ST_X .

Suponiendo que quieras rellenar una columna de una tabla que ya tiene una columna de geometría con la coordenada x del centroide puedes usar algo como

UPDATE test_table
SET x = ST_X(ST_Centroid(the_geom));

Si necesitas algo diferente publica la estructura completa de la tabla si necesitas una ayuda más precisa.

4voto

Adam Ernst Puntos 6939

Es una geometría (un punto, de hecho). Lo que está viendo es la representación de texto del punto como Binario Bien Conocido (WKB) para propósitos de depuración probablemente querrá texto bien conocido (WKT) (ver https://postgis.net/docs/using_postgis_dbmanagement.html#OpenGISWKBWKT ),

select
  ST_AsText(ST_Centroid(a.the_geom) )
FROM 
  "test_table" AS a

Mostrará lo que usted quiere ver.

Para hacer la suma necesitas una columna de geometría en lugar de una doble. Para ello hay que utilizar addGeometryColumn que se encarga de toda la contabilidad necesaria para usted (cosas como añadir la columna a los metadatos de las columnas de geometría, etc.).

0 votos

Gracias @iant. ¿Hay alguna forma de acceder a cada elemento que devuelve? Algo así como ST_AsText(ST_Centroid(a.the_geom),1) para que pueda obtener x y y por separado. Tengo una columna llamada ` the_geom geometry` pero asumo que es la geometría por defecto de cada elemento.

1 votos

Acabo de encontrarlo - He utilizado ST_X(ST_Centroid(a.the_geom)) y ST_Y(ST_Centroid(a.the_geom))

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X