PostgreSQL 地理数据库的拓扑
拓扑是用于保持数据完整性和管理空间相关要素类行为的规则。地理数据库拓扑中存储着与以下内容有关的信息:参与拓扑的要素类(这些要素类必须位于相同的要素数据集中)、分配给拓扑的拓扑容差、各要素类在拓扑中的相对等级以及应用于拓扑的一系列规则。
要深入了解与拓扑有关的概念,请参阅拓扑基础知识和 ArcGIS 中的拓扑。
ArcGIS for Desktop 中的拓扑
目录树中的拓扑显示在参与要素类所在的要素数据集下。拓扑使用以下图标表示:
可通过查看拓扑属性 对话框的“要素类”选项卡来了解要素数据集中参与拓扑的要素类。
单击“规则”选项卡可显示应用于拓扑的规则。验证拓扑后,可通过“错误”选项卡为每个规则生成一个错误和异常列表。
PostgreSQL 数据库中的拓扑
在 DBMS 中,拓扑存储在 gdb_items 表中。与拓扑有关的规则存储在 definition 列中。
验证拓扑时,所发现的与每个拓扑相关的脏区和拓扑错误存储在连接到地理数据库的用户的方案中的一组表中。这些表分别为 t_<id>_dirtyareas、t_<id>_lineerrors、t_<id>_pointerrors 和 t_<id>_polyerrors。表名称中的 ID 对应于 gdb_items 表 datasetsubtype1 字段中的拓扑 ID。每个错误表会将违反的规则存储在 toporuleid 字段中。此字段与 gdb_items 表的 iteminfo 字段关联。
以下是脏区和拓扑错误表的定义以及拓扑表的示例(当拓扑表出现在 PostgreSQL 中时)。
t_<id>_dirtyareas
验证拓扑时会创建此表。
字段名 |
字段类型 |
描述 |
是否允许为空 |
---|---|---|---|
objectid |
integer |
脏区要素在拓扑中的唯一标识符 |
NOT NULL |
isretired |
integer |
此代码表示脏区是否已达到最大折点数 (250)。 达到此限制时,将创建一个新的脏区要素并且现有的脏区要素将退出工作(值变为 1)。 0 = 尚未达到最大折点数限制;1 = 已达到最大折点数限制 |
NOT NULL |
dirtyarea |
st_geometry geometry |
Shape 字段 |
t_<id>_pointerrors、t_<id>_lineerrors 和 t_<id>_polyerrors
对拓扑规则的任何违反行为都会以错误要素的形式表示。与脏区相同,这些错误要素也在单独的拓扑错误表中进行存储和管理。这些表都共用一个几乎完全相同的方案定义,只是特定于拓扑错误的 shape 类型的附加字段有所不同。正如表名所指明的那样,这些表根据发生错误的要素(线、点或面)的类型存储有关于拓扑错误的信息。
完成拓扑验证后,这些表才会存在于数据库中。
字段名 |
字段类型 |
描述 |
是否允许为空 |
---|---|---|---|
objectid |
整型 |
拓扑错误要素在指定的拓扑错误表中的唯一 ID;拓扑错误在拓扑中不具有唯一的 ID,它们只在其指定的错误表中具有唯一的 ID。 |
NOT NULL |
originclassid |
整型 |
源要素类的对象类 ID |
NOT NULL |
originid |
整型 |
与拓扑错误相关的源要素类中要素的要素 ID。 | |
destclassid |
整型 |
目标要素类的对象类 ID | |
destid |
整型 |
与拓扑错误相关的目标要素类中要素的要素 ID。 | |
toporuletype |
整型 |
拓扑规则的类型;与 esriTopologyRuleType 常量中的值相对应 |
NOT NULL |
toporuleid |
整型 |
存储在 gdb_items 表的 iteminfo 列中的拓扑规则的 ID |
NOT NULL |
isexception |
整型 |
用于指示拓扑错误是否已经被标记为异常的代码。0 = 未被标记为异常(默认值);1 = 已被标记为异常 |
NOT NULL |
shape |
st_geometry 或几何 |
指示 shape 类型 |
与存储在地理数据库管理员用户的方案中的其他系统表不同,脏区表和拓扑错误表是在创建拓扑的用户的方案中创建的。
下图显示的是已验证的拓扑的表:
虚线表示各列之间的隐含关系。
XML 工作空间文档中的拓扑
由于拓扑是数据集类型,所以拓扑出现在 XML 文档中类型为 FeatureDataset 的 DataElement 标签下。拓扑规则也包括在内,并使用 TopologyRule 标签进行分组。对于要素数据集 water 中的拓扑 landbase_topology,XML 文档中的条目如下所示:
<DatasetDefinitions xsi:type="esri:ArrayOfDataElement">
- <DataElement xsi:type="esri:DEFeatureDataset">
<CatalogPath>/V=sde.DEFAULT/FD=sde.sasha.Landbase</CatalogPath>
<Name>sde.sasha.Landbase</Name>
- <Children xsi:type="esri:ArrayOfDataElement">
- <DataElement xsi:type="esri:DETopology">
<CatalogPath>/V=sde.DEFAULT/FD=sde.sasha.Landbase/TOPO=sde.sasha.Landbase_Topology</CatalogPath>
<Name>sde.sasha.Landbase_Topology</Name>
<DatasetType>esriDTTopology</DatasetType>
<DSID>-1</DSID>
<Versioned>true</Versioned>
<CanVersion>true</CanVersion>
- <Extent xsi:type="esri:EnvelopeN">
<XMin>503924.656249088</XMin>
<YMin>680110.56250334</YMin>
<XMax>512514.562497088</XMax>
<YMax>689084.187511697</YMax>
- <SpatialReference xsi:type="esri:ProjectedCoordinateSystem">
<WKT>PROJCS["NAD_1927_StatePlane_Alabama_East_FIPS_0101", GEOGCS["GCS_North_American_1927", DATUM["D_North_American_1927", SPHEROID["Clarke_1866",6378206.4,294.9786982]], PRIMEM["Greenwich",0.0], UNIT["Degree",0.0174532925199433]], PROJECTION["Transverse_Mercator"], PARAMETER["False_Easting",500000.0], PARAMETER["False_Northing",0.0], PARAMETER["Central_Meridian", -85.83333333333333], PARAMETER["Scale_Factor",0.99996], PARAMETER["Latitude_Of_Origin",30.5], UNIT["Foot_US",0.3048006096012192]]</WKT>
<XOrigin>489871.255812</XOrigin>
<YOrigin>665787.099562</YOrigin>
<XYScale>499999.999534338</XYScale>
<ZOrigin>0</ZOrigin>
<ZScale>1</ZScale>
<MOrigin>0</MOrigin>
<MScale>1</MScale>
<XYTolerance>6.56166666666667E-04</XYTolerance>
<ZTolerance>2</ZTolerance>
<MTolerance>2</MTolerance>
<HighPrecision>true</HighPrecision>
</SpatialReference>
</Extent>
- <SpatialReference xsi:type="esri:ProjectedCoordinateSystem">
<WKT>PROJCS["NAD_1927_StatePlane_Alabama_East_FIPS_0101", GEOGCS["GCS_North_American_1927", DATUM["D_North_American_1927", SPHEROID["Clarke_1866",6378206.4,294.9786982]], PRIMEM["Greenwich",0.0], UNIT["Degree",0.0174532925199433]], PROJECTION["Transverse_Mercator"], PARAMETER["False_Easting", 500000.0], PARAMETER["False_Northing",0.0], PARAMETER["Central_Meridian", -85.83333333333333], PARAMETER["Scale_Factor",0.99996], PARAMETER["Latitude_Of_Origin",30.5], UNIT["Foot_US",0.3048006096012192]]</WKT>
<XOrigin>489871.255812</XOrigin>
<YOrigin>665787.099562</YOrigin>
<XYScale>499999.999534338</XYScale>
<ZOrigin>0</ZOrigin>
<ZScale>8192</ZScale>
<MOrigin>0</MOrigin>
<MScale>8192</MScale>
<XYTolerance>6.56166666666667E-04</XYTolerance>
<ZTolerance>2</ZTolerance>
<MTolerance>2</MTolerance>
<HighPrecision>true</HighPrecision>
</SpatialReference>
<ClusterTolerance>0.5</ClusterTolerance>
<ZClusterTolerance>-1</ZClusterTolerance>
<MaxGeneratedErrorCount>-1</MaxGeneratedErrorCount>
- <FeatureClassNames xsi:type="esri:Names">
<Name>sde.RJP.Blocks</Name>
<Name>sde.RJP.Parcels</Name>
</FeatureClassNames>
- <TopologyRules xsi:type="esri:ArrayOfTopologyRule">
- <TopologyRule xsi:type="esri:TopologyRule">
<HelpString />
<RuleID>183</RuleID>
<Name />
<GUID>7D3E7075-16CF-47AD-A8F4-842B921B1E1E</GUID>
<TopologyRuleType>esriTRTAreaNoOverlap</TopologyRuleType>
<OriginClassID>100</OriginClassID>
<OriginSubtype>0</OriginSubtype>
<DestinationClassID>100</DestinationClassID>
<DestinationSubtype>0</DestinationSubtype>
<TriggerErrorEvents>false</TriggerErrorEvents>
<AllOriginSubtypes>true</AllOriginSubtypes>
<AllDestinationSubtypes>true</AllDestinationSubtypes>
</TopologyRule>
- <TopologyRule xsi:type="esri:TopologyRule">
<HelpString />
<RuleID>184</RuleID>
<Name />
<GUID>6F58891D-5BD9-4848-802E-90458152B0CE</GUID>
<TopologyRuleType>esriTRTAreaCoveredByArea</TopologyRuleType>
<OriginClassID>100</OriginClassID>
<OriginSubtype>1</OriginSubtype>
<DestinationClassID>98</DestinationClassID>
<DestinationSubtype>1</DestinationSubtype>
<TriggerErrorEvents>false</TriggerErrorEvents>
<AllOriginSubtypes>false</AllOriginSubtypes>
<AllDestinationSubtypes>false</AllDestinationSubtypes>
</TopologyRule>
</TopologyRules>
</DataElement>