理想情况下会是这样的,但WKT没有圆圈类型。
ST_GeomFromText('CIRCLE(10 20, 10)',4326)
虽然圆形类型在几何类型中是listed,但
circle <(x,y),r> (center point and radius)
我想知道是否可以直接在sql中使用circle类型:
update <table>
set the_geom = circle '((10, 20),10)'::geometry
where id = <id>;
但它说SQL Error [42846]: ERROR: cannot cast type circle to geometry
。
使用ST_Buffer存储圆圈是一个很好的选择,所以我不想使用它。
替代解决方案可能是jsonb + geojson,但它也不支持圈子。
UPD:有我的表结构。目前我使用经度/纬度/半径,但我想使用geo_json或the_geom。 GeoJSON和WKT怎么不支持圆圈?
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)
);
答案 0 :(得分:1)
Circle
是postgresql的原生文件,您可以在manual文档中看到。Geometry
是一种与PostGis
扩展程序相关的类型,并没有CIRCLE
但是使用多边形的多边形代替。ST_
开头的功能也是Postgis
个功能,仅适用于Postgis
geometry
或geography
数据类型<强> SQL DEMO: 强>
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;
答案 1 :(得分:1)
GIST 索引可让您高效地使用圆圈。如果这是您打算在此表中存储的唯一内容,那么您可以这样做:
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 ));
正如其他人所指出的,您不能将此表与不兼容的 GEOMETRY 类型混合使用。
为了使用上面的索引,您必须用类似的术语来表达您的 WHERE 条件:circle( point( latitude, longitude ), radius )
或 '<( latitude, longitude ), radius >'::circle
并使用 GIST 知道的运算符 ... 下面列出。我知道将圆的欧几里得形状投影到非欧几里得球面几何上有局限性,但出于索引目的,它应该小心工作。
https://www.postgresql.org/docs/current/gist-builtin-opclasses.html