1

理想情况下会是这样,但 WKT 没有圆形类型。

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

虽然,圆形类型在几何类型中,

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)
);
4

2 回答 2

1
  • Circle如您在手册文档中所见,它是 postgresql 的原生版本。
  • Geometry是一种与PostGis扩展相关的类型,它没有CIRCLE但使用具有很多点的多边形。
  • 以开头的函数ST_也是Postgis函数,仅适用于Postgis geometryorgeography数据类型

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;
于 2017-04-28T19:24:39.043 回答
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

于 2021-03-27T06:37:27.703 回答