美文网首页GIS
POSTGIS里的geometry 和geography,如何正

POSTGIS里的geometry 和geography,如何正

作者: 开源GIS地图与信创 | 来源:发表于2021-08-06 11:56 被阅读0次

    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中空间表的坐标系信息确实存放在与表本身无关的其它位置。

    shp2pgsql.exe工具生成的坐标信息

    GIS引擎开发

    最近自己用Mapserver包装了一个GIS引擎作为Geoserver的替代方案,适合小微企业和个人用户,下载地址:

    Mapserver-server.zip

    解压密码:2234,后续我将按计划进行完善,力争做到轻量、易用、稳定、高性能、开源。

    同时我将按低价提供服务,并低价出售源代码,以保证日常开销。

    参考:

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

    相关文章

      网友评论

        本文标题:POSTGIS里的geometry 和geography,如何正

        本文链接:https://www.haomeiwen.com/subject/uambvltx.html