PostgreSQL对空间数据和Arcgis sde库的支持 暨 postgis空间数据(geometry/geographic)和st_geometry的区别与联系<详解篇>
兄弟,别走a,看完你就懂了,懂了文末扫码支持一下。
一、发现坑
最近在用pgsql搭建空间数据库,使用过程中突然发现多部件图形怎么也保存不进去。
二、测试坑
分别在前端applyEdit接口保存多部件图形,以及在Arcmap中存储多部件数据,发现前端可保存,但图形信息为null,属性信息保存,返回200,页面无图形显示;arcmap中多部件数据直接丢失。
三、分析坑
安装postgis时加载扩展,是不是少了什么没有安装呢,百思不得其解,询问ESRI技术人员,说的也是模棱两可,不中要害。但发现网上教程都是这么装的,pg库里查看扩展也一个没少,摊手。
CREATE EXTENSION postgis;
CREATE EXTENSION pgrouting;
CREATE EXTENSION postgis_topology;
CREATE EXTENSION fuzzystrmatch;
CREATE EXTENSION postgis_tiger_geocoder;
CREATE EXTENSION address_standardizer;
从Arcgis的空间数据和postgis的空间数据对比区别与联系入
2.1. ArcGIS 所支持的 PostgreSQL 数据类型
创建表或向数据库中的表添加新列时,列将创建为特定的数据类型。数据类型是用于确定数据值自身以及可对数据执行哪些操作的分类,也表示列中数据在数据库中的存储方式。
从 ArcGIS 访问数据库表时,可以使用特定数据类型。在目录树中通过“数据库连接”节点或在 ArcMap 中通过查询图层访问数据库表时,ArcGIS 会过滤掉任何不支持的数据类型。如果直接访问数据库表,则不支持的数据类型不会显示在 ArcGIS 界面,您也无法通过 ArcGIS 编辑这些数据。同样,复制包含不受 ArcGIS 支持的数据类型的表时,将只复制支持的数据类型;将表粘贴到另一个数据库或地理数据库时,不会存在不支持的数据类型列。
在 ArcGIS 中创建要素类或表时,或者使用 ArcGIS 向现有表或要素类添加列时,可向字段分配 12 种可能的 ArcGIS 数据类型。未与这些类型对应的数据库数据类型不能直接在 ArcGIS 客户端应用程序中使用。
第一列列出了 ArcGIS 数据类型。第二列列出了将在数据库中创建的 PostgreSQL 数据类型。第三列显示了在 ArcGIS 中查看时哪些其他 PostgreSQL 数据类型(如果有)会映射到 ArcGIS 数据类型。
ArcGIS 所支持的 PostgreSQL 数据类型
如果您的表中包含了一列具有 ArcGIS 不支持的数据类型的数据,则可以将该列转换为文本。但是请仅在想要查看该列中值时这样做;如果您将执行的分析需要用到该列中值,请不要这样做。例如,您可以执行 SELECT 语句选择 tableb 中的列,并将小数列 (total) 转换为文本:
SELECT id, name, total::text
FROM me.mydb.tableb;
几何数据类型
如表中所示,ArcGIS 可在 PostgreSQL 中创建并处理两种几何数据类型:Esri ST_Geometry 或 PostGIS 几何。下面两部分将提供有关这两种数据类型的详细背景。
ST_Geometry
以下是 ST_Geometry 空间数据类型的常规描述。有关特定于 PostgreSQL 实施的信息,请参阅 PostgreSQL 中的 ST_Geometry。
ST_Geometry 数据类型遵循用户定义数据类型 (UDT) 的 SQL 3 规范,用于创建可存储空间数据(如地标、街道或土地宗地的位置)的列。该数据类型可通过符合国际标准化组织 (ISO) 和开放地理空间联盟 (OGC) 标准的结构化查询语言 (SQL) 来访问地理数据库和数据库。通过向表示地理要素的对象(点、线及面)提供存储空间,此存储类型扩展了数据库的功能。此存储类型旨在充分利用数据库资源,与数据库要素(如复制与分区)兼容,以及快速访问空间数据。
ST_Geometry 本身是抽象的、无法实例化的超类。但其子类可以实例化。实例化的数据类型是可定义为表列的数据类型,并且其类型值插入表列之中。
虽然可以将列定义为类型 ST_Geometry,但是您无法将 ST_Geometry 值插入此列,因为无法对 ST_Geometry 进行实例化。相反,您可以插入子类值。
下图说明了 ST_Geometry 数据类型及其子类的等级。
ST_Geometry 的子类分为两类:基础几何子类和同类集合子类。基础几何包括 ST_Point、ST_LineString 和 ST_Polygon,而同类集合包括 ST_MultiPoint、ST_MultiLineString 和 ST_MultiPolygon。与名称的含义一致,同类集合是基础几何的集合。除了共享基础几何属性之外,同类集合还具有某些自身的属性。
每个子类都存储其名称所指的几何类型;例如,ST_MultiPoint 存储多点。下表是子类及其说明的列表:
ST_Geometry 子类型
请注意每个子类都继承 ST_Geometry 的属性,但超类还有其本身的属性。适用于 ST_Geometry 数据类型的函数可接受任何子类实体类型。不过,有些函数定义在子类级别,且仅接受特定的子类。例如,ST_GeometryN 函数仅将 ST_MultiLinestring、ST_MultiPoint 或 ST_MultiPolygon 子类型值作为输入。
PostGIS Geometry
PostGIS 是在空间上启用 PostgreSQL 数据库的产品。PostGIS 遵从开放地理空间联盟 (OGC) 关于结构化查询语言 (SQL) 的简单要素规范。它使用 OGC 熟知二进制 (WKB) 和熟知文本 (WKT) 表示几何。
PostGIS 有两个空间类型选项:几何空间类型和地理空间类型。ArcGIS 仅支持几何类型。
将 PostGIS 几何存储类型与 ArcGIS 一起使用时,请牢记以下规则:
必须使用 PostGIS 数据库模板创建用于地理数据库的 PostgreSQL 数据库或在数据库中启用 PostGIS。
注:
如果使用创建企业级地理数据库地理处理工具创建地理数据库,则将使用 PostGIS 模板以外的其他模板来创建数据库。因此,如果想要使用 PostGIS 几何类型,必须使用 PostGIS 模板手动创建数据库。然后,在运行创建企业级地理数据库地理处理工具时,便可以指定现有数据库,地理数据库也将在其中创建。
要使用 PostGIS 几何类型,必须安装 PostGIS。安装 PostgreSQL 之后安装 PostGIS。请确保要使用的 ArcGIS 版本支持所安装的 PostGIS 版本。
安装 PostGIS 时,会在 PostgreSQL 数据库集群中创建 PostGIS 模板数据库。使用 PostGIS 模板数据库可创建用于存储地理数据库的数据库。
授予创建 PostGIS 几何列的权限
如果数据库对 PostGIS 可用,则将在公共方案中创建两个表,即 geometry_columns 和 spatial_ref_sys。必须为 sde 用户和将在地理数据库中创建数据的所有用户至少授予对 geometry_columns 表的 SELECT、INSERT、UPDATE 和 DELETE 权限和对 spatial_ref_sys 表的 SELECT 权限。
GRANT select, insert, update, delete
ON TABLE public.geometry_columns
TO ;
GRANT select
ON TABLE public.spatial_ref_sys
TO ;
创建使用 PostGIS 几何的要素类
创建要素类时,ArcGIS 使用在 sde_dbtune 表中设置的配置参数来确定使用哪种空间数据类型。此参数为 GEOMETRY_STORAGE。在 PostgreSQL 中的地理数据库中,此参数可设置为 ST_GEOMETRY 或 PG_GEOMETRY(PostGIS 几何类型的设置)。因此,当您要使用 ArcGIS 创建使用 PostGIS 几何类型的要素类时,指定 GEOMETRY_STORAGE 参数设置为 PG_GEOMETRY 的配置关键字。
默认情况下,新要素类使用 ST_Geometry 存储。如果要以 PostGIS 存储类型存储大部分数据,则将 sde_dbtune 表中 DEFAULTS 配置关键字下的 GEOMETRY_STORAGE 参数值更改为 PG_GEOMETRY。或者,如果仅要以 PostGIS 存储类型存储部分要素类,则可在创建要素类时指定 PG_GEOMETRY 配置关键字。从地理数据库中导出时,PG_GEOMETRY 关键字以如下方式显示:
##PG_GEOMETRY
GEOMETRY_STORAGE “PG_GEOMETRY”
UI_TEXT “User Interface text description for POSTGIS geometry storage”
END
PostgreSQL 中的 ST_Geometry
ST_Geometry 如何存储空间数据
使用 ArcGIS 创建采用 ST_Geometry 存储的要素类
使用 ArcGIS 访问包含 ST_Geometry 列的 PostgreSQL 表
注册 ST_Geometry 列
PostGIS的几何图形教程
四、解决坑
待补
感谢
http://desktop.arcgis.com/zh-cn/arcmap/10.3/manage-data/gdbs-in-postgresql/data-types-postgresql.htm
http://desktop.arcgis.com/zh-cn/arcmap/10.3/manage-data/gdbs-in-postgresql/stgeometry-postgresql.htm