在Postgres几何字段中存储圆圈

时间:2017-04-28 15:51:12

标签: postgresql geometry postgis geojson wkt

理想情况下会是这样的,但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)
);

2 个答案:

答案 0 :(得分:1)

  • Circle是postgresql的原生文件,您可以在manual文档中看到。
  • Geometry是一种与PostGis扩展程序相关的类型,并没有CIRCLE但是使用多边形的多边形代替。
  • ST_开头的功能也是Postgis个功能,仅适用于Postgis geometrygeography数据类型

<强> 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