Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

363
Vistas
Almacenar círculos en el campo de geometría de Postgres

Idealmente, sería algo como esto, pero WKT no tiene un tipo de círculo.

 ST_GeomFromText('CIRCLE(10 20, 10)',4326)

Aunque el tipo de círculo se incluye entre los tipos geométricos,

 circle <(x,y),r> (center point and radius)

Me pregunto si es posible usar el tipo de círculo directamente en sql:

 update <table> set the_geom = circle '((10, 20),10)'::geometry where id = <id>;

Pero dice SQL Error [42846]: ERROR: cannot cast type circle to geometry .

Usar ST_Buffer para almacenar círculos es una chapuza, así que no quiero usarlo.

La solución alternativa podría ser jsonb + geojson, pero tampoco admite círculos.

UPD: Ahí está mi estructura de tablas. Actualmente estoy usando longitud/latitud/radio, pero me gustaría usar geo_json o the_geom. ¿Cómo es posible que GeoJSON y WKT no admitan un círculo?

 CREATE SEQUENCE my_table_id_seq INCREMENT BY 1 MINVALUE 1 START 1; CREATE TABLE my_table ( id INT NOT NULL, longitude NUMERIC(10, 7) DEFAULT NULL, latitude NUMERIC(10, 7) DEFAULT NULL, radius INT DEFAULT NULL, geo_json JSONB, the_geom Geometry DEFAULT NULL, PRIMARY KEY(id) );
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

  • Circle es nativo para postgresql como puede ver en la documentación del manual .
  • La Geometry es un tipo relacionado con PostGis Extension, y no tiene CIRCLE , sino que usa polígonos con muchos puntos.
  • Las funciones que comienzan con ST_ también son funciones de Postgis y funcionan solo con el tipo de datos de geometry o geography de Postgis

DEMOSTRACIÓN SQL:

 create table points ( p POINT not null); create table lines ( l LINE not null); create table circles ( c CIRCLE not null); insert into points (p) values ( POINT(1.2, 123.1) ); insert into lines (l) values ( LINE(POINT(1.2, 123.1), POINT(-5, -123)) ); insert into circles (c) values ( CIRCLE(POINT(1.2, 123.1), 10) ); SELECT * FROM points; SELECT * FROM lines; SELECT * FROM circles;
over 4 years ago · Santiago Trujillo Denunciar

0

El índice GIST le permite trabajar eficientemente con círculos. Si eso es lo único que pretende almacenar en esta tabla, puede hacerlo así:

 CREATE TABLE my_table ( id INT NOT NULL, longitude NUMERIC(10, 7) DEFAULT NULL, latitude NUMERIC(10, 7) DEFAULT NULL, radius INT DEFAULT NULL, geo_json JSONB ); CREATE INDEX idx_my_table ON my_table USING GIST ( circle( point( latitude, longitude ), radius ));

Como han señalado otros, no puede mezclar esta tabla con tipos de GEOMETRÍA, que son incompatibles.

Para utilizar el índice anterior, debe expresar su criterio DONDE en términos similares: circle( point( latitude, longitude ), radius ) o '<( latitude, longitude ), radius >'::circle y usar los operadores que GIST conoce sobre... que se enumeran a continuación. Soy consciente de que proyectar la forma euclidiana de un círculo en una geometría esférica no euclidiana tiene limitaciones, pero para fines de indexación debería funcionar bien con cuidado.

https://www.postgresql.org/docs/current/gist-builtin-opclasses.html

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda