POSTGIS里的geometry 和geography,如何正確計(jì)算空間距離

geometry:既可以存放平面坐標(biāo)系又可以存放地理坐標(biāo)系數(shù)據(jù)

geography:地理坐標(biāo)系,在POSTGIS1.5版本添加的此功能

POSTGIS中使用雙冒號(hào)
::geography
這種寫法其實(shí)就是為了顯式地處理geometry中可以同時(shí)存放平面坐標(biāo)和球面坐標(biāo)的問題,使用::geography時(shí)坐標(biāo)串的wkt值并沒有變化,說明并不是做了轉(zhuǎn)換,而是指定

POSTGIS導(dǎo)數(shù)據(jù)工具是使用shp2pgsql.exe進(jìn)行操作的,而不是ogr2ogr。

POSTGIS自己的導(dǎo)數(shù)據(jù)工具是通過AddGeometryColumn函數(shù)添加空間數(shù)據(jù)表的,它不能指定geometry和geography,所以使用POSTGIS自己帶的工具入庫時(shí)數(shù)據(jù)直接默認(rèn)就是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 '長(zhǎng)整型';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 '創(chuàng)建時(shí)間';COMMENT ON COLUMN "public"."test"."failure_time" IS ' 
失效時(shí)間';COMMENT ON COLUMN "public"."test"."id" IS '主鍵 ID'

turf.js是計(jì)算的平面距離

通過AddGeometryColumn函數(shù)生成的空間表字段會(huì)在表中新增這幾行記錄

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函數(shù)設(shè)置的字段為空間字段中會(huì)在表中有以下記錄,記錄中并不能找到我們?cè)O(shè)置的坐標(biāo)系,如:SRID=4490;的字樣,所以推測(cè)坐標(biāo)信息是存放在其它內(nèi)置的表中的,所以不管是插入數(shù)據(jù)前執(zhí)行ST_SetSRID函數(shù)還是插入后執(zhí)行該函數(shù),整個(gè)數(shù)據(jù)表所有數(shù)據(jù)條數(shù)都會(huì)被認(rèn)定為這一被設(shè)置的坐標(biāo)系。

geom geometry NULL,

pg配置的網(wǎng)頁管理工具上通過CREATE SCRIPT生成的字段則是如下,將類型和坐標(biāo)系分開了

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)

有個(gè)疑問,pg中關(guān)于表中某字段的空間坐標(biāo)系pg到底存放在哪里的,好像沒有地方可以直接看到。

shp2pgsql.exe工具如果通過-s參數(shù)指定了坐標(biāo)系的話,在生成的sql中會(huì)有如下信息帶在空間字段里的每一條數(shù)據(jù)中,
而實(shí)際查看庫中的數(shù)據(jù)并沒有SRID=4490;MULTIPOLYGON(((106.908851425664 30.517018528798,字樣,
所以通過postgis自帶工具導(dǎo)入數(shù)據(jù)時(shí)它并沒有使用-s參數(shù),
所以pg中空間表的坐標(biāo)系信息確實(shí)存放在與表本身無關(guān)的其它位置。

shp2pgsql.exe工具生成的坐標(biāo)信息

GIS引擎開發(fā)

最近自己用Mapserver包裝了一個(gè)GIS引擎作為Geoserver的替代方案,適合小微企業(yè)和個(gè)人用戶,下載地址:

Mapserver-server.zip

解壓密碼:2234,后續(xù)我將按計(jì)劃進(jìn)行完善,力爭(zhēng)做到輕量、易用、穩(wěn)定、高性能、開源。

同時(shí)我將按低價(jià)提供服務(wù),并低價(jià)出售源代碼,以保證日常開銷。

參考:

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容