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) );Circle es nativo para postgresql como puede ver en la documentación del manual .Geometry es un tipo relacionado con PostGis Extension, y no tiene CIRCLE , sino que usa polígonos con muchos puntos.ST_ también son funciones de Postgis y funcionan solo con el tipo de datos de geometry o geography de Postgis 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;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