Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

POSTGIS里的geometry 和geography,如何正确计算空间距离 #197

Open
liujiusheng opened this issue Feb 1, 2021 · 0 comments
Open

Comments

@liujiusheng
Copy link
Owner

liujiusheng commented Feb 1, 2021

geometry:既可以存放平面坐标系又可以存放地理坐标系数据

geography:地理坐标系,在POSTGIS1.5版本添加的此功能

POSTGIS中使用双冒号
::geography
这种写法其实就是为了显式地处理geometry中可以同时存放平面坐标和球面坐标的问题,使用::geography时坐标串的wkt值并没有变化,说明并不是做了转换,而是指定

POSTGIS导数据工具是使用shp2pgsql.exe进行操作的,而不是ogr2ogr。

POSTGIS自己的导数据工具是通过AddGeometryColumn函数添加空间数据表的,它不能指定geometry和geography,所以使用POSTGIS自己带的工具入库时数据直接默认就是geometry类型。

通过Esri File GDB工具读取的字段里类型为geography

CREATE TABLE "public"."test"("OBJECTID" integer,"geom" geography,"shortint" INTEGER,"longint" INTEGER,"double" DECIMAL,"text"  VARCHAR(50),"date" timestamptz,"blob" bytea,"SHAPE_Length" DECIMAL,"SHAPE_Area" DECIMAL,"create_time" timestamp,"failure_time" timestamp,"id" serial4);COMMENT ON COLUMN "public"."test"."OBJECTID" IS 'OBJECTID';COMMENT ON COLUMN "public"."test"."geom" IS '几何';COMMENT ON COLUMN "public"."test"."shortint" IS '短整形';COMMENT ON COLUMN "public"."test"."longint" IS '长整型';COMMENT ON COLUMN "public"."test"."double" IS '双精度';COMMENT ON COLUMN "public"."test"."text" IS '文本';COMMENT ON COLUMN "public"."test"."date" IS '日期';COMMENT ON COLUMN "public"."test"."blob" IS 'blob';COMMENT ON COLUMN "public"."test"."SHAPE_Length" IS 'SHAPE_Length';COMMENT ON COLUMN "public"."test"."SHAPE_Area" IS 'SHAPE_Area';COMMENT ON COLUMN "public"."test"."create_time" IS '创建时间';COMMENT ON COLUMN "public"."test"."failure_time" IS ' 
失效时间';COMMENT ON COLUMN "public"."test"."id" IS '主键 ID'

turf.js是计算的平面距离

通过AddGeometryColumn函数生成的空间表字段会在表中新增这几行记录

geom geometry(MultiPolygon, 4490) NULL,
CONSTRAINT enforce_dims_geom CHECK ((st_ndims(geom) = 2)),
CONSTRAINT enforce_geotype_geom CHECK (((geometrytype(geom) = 'MultiPolygon'::text) OR (geom IS NULL))),
CONSTRAINT enforce_srid_geom CHECK ((st_srid(geom) = 4490))

通过ST_SetSRID函数设置的字段为空间字段中会在表中有以下记录,记录中并不能找到我们设置的坐标系,如:SRID=4490;的字样,所以推测坐标信息是存放在其它内置的表中的,所以不管是插入数据前执行ST_SetSRID函数还是插入后执行该函数,整个数据表所有数据条数都会被认定为这一被设置的坐标系。

geom geometry NULL,

pg配置的网页管理工具上通过CREATE SCRIPT生成的字段则是如下,将类型和坐标系分开了

geom geometry,
CONSTRAINT enforce_srid_geom CHECK (st_srid(geom) = 4490),
CONSTRAINT enforce_dims_geom CHECK (st_ndims(geom) = 2),
CONSTRAINT enforce_geotype_geom CHECK (geometrytype(geom) = 'MultiPolygon'::text OR geom IS NULL)

有个疑问,pg中关于表中某字段的空间坐标系pg到底存放在哪里的,好像没有地方可以直接看到。

shp2pgsql.exe工具如果通过-s参数指定了坐标系的话,在生成的sql中会有如下信息带在空间字段里的每一条数据中,
而实际查看库中的数据并没有SRID=4490;MULTIPOLYGON(((106.908851425664 30.517018528798,字样,
所以通过postgis自带工具导入数据时它并没有使用-s参数,
所以pg中空间表的坐标系信息确实存放在与表本身无关的其它位置。

image

参考:

https://developer.aliyun.com/article/228281

@liujiusheng liujiusheng changed the title POSTGIS里的geometry 和geography POSTGIS里的geometry 和geography,计算空间距离的正确姿势 Feb 2, 2021
@liujiusheng liujiusheng changed the title POSTGIS里的geometry 和geography,计算空间距离的正确姿势 POSTGIS里的geometry 和geography,如何正确计算空间距离 Aug 6, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant