Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

362
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!