官术网_书友最值得收藏!

Polygon decomposition

There are two levels of polygon geometry decomposition: they can be broken down either into LineStrings or into points. Decomposition into points is very similar to decomposition of a LineString: the ST_DumpPoints is used:

  SELECT ST_DumpPoints(
ST_MakePolygon(
ST_MakeLine(ARRAY[ST_MakePoint(20,50),ST_MakePoint(19.95,49.98), ST_MakePoint(19.90,49.90),ST_MakePoint(20,50)]),
ARRAY[ST_MakeLine(ARRAY[ST_MakePoint(19.95,49.97),ST_MakePoint(19.943,49.963), ST_MakePoint(19.955,49.965),ST_MakePoint(19.95,49.97)])]
)
);

st_dumppoints
------------------------------------------------------
("{1,1}",010100000000000000000034400000000000004940)
("{1,2}",01010000003333333333F333403D0AD7A370FD4840)
("{1,3}",01010000006666666666E633403333333333F34840)
("{1,4}",010100000000000000000034400000000000004940)
("{2,1}",01010000003333333333F333405C8FC2F528FC4840)
("{2,2}",0101000000C520B07268F133402506819543FB4840)
("{2,3}",010100000014AE47E17AF43340EC51B81E85FB4840)
("{2,4}",01010000003333333333F333405C8FC2F528FC4840)

There's a slight difference in the geometry dump format: the path array now consists of two numbers. The first one is the index of the ring (1 being the exterior ring, and the following numbers the subsequent interior rings), and the second is the index a of point in the ring.

For extracting whole rings, PostGIS offers the following possibilities:

  • Dumping the rings into a set of rows. For that, ST_DumpRings is used:
       SELECT ST_DumpRings(
ST_MakePolygon(
ST_MakeLine(ARRAY[ST_MakePoint(20,50),ST_MakePoint(19.95,49.98),
ST_MakePoint(19.90,49.90),ST_MakePoint(20,50)]),

ARRAY[ST_MakeLine(ARRAY[ST_MakePoint(19.95,49.97),ST_MakePoint
(19.943,49.963),
ST_MakePoint(19.955,49.965),ST_MakePoint(19.95,49.97)])]
)
);


st_dumprings
----------------------------------
({1},01030000000100000004000000(...)
  • Extracting the exterior ring:
       SELECT ST_ExteriorRing(
ST_MakePolygon(
ST_MakeLine(ARRAY[ST_MakePoint(20,50),ST_MakePoint(19.95,49.98),
ST_MakePoint(19.90,49.90),ST_MakePoint(20,50)]),

ARRAY[ST_MakeLine(ARRAY[ST_MakePoint(19.95,49.97),
ST_MakePoint(19.943,49.963),ST_MakePoint(19.955,49.965),
ST_MakePoint(19.95,49.97)])]
)
);

st_exteriorring
--------------------------
01020000000400000000(...)
  • Extracting the interior rings based on their index:
        SELECT ST_InteriorRingN(
ST_MakePolygon(
ST_MakeLine(ARRAY[ST_MakePoint(20,50),ST_MakePoint(19.95,49.98),
ST_MakePoint(19.90,49.90),ST_MakePoint(20,50)]),


ARRAY[ST_MakeLine(ARRAY[ST_MakePoint(19.95,49.97),
ST_MakePoint(19.943,49.963),
ST_MakePoint(19.955,49.965),ST_MakePoint(19.95,49.97)])]
), 1
);

st_interiorringn
---------------------------
010200000004000000333(...)
Interior ring extracted from a polygon.
主站蜘蛛池模板: 贵阳市| 吉安县| 平远县| 阿坝| 东乌珠穆沁旗| 土默特左旗| 大田县| 台湾省| 晋城| 黎城县| 贵州省| 上高县| 高雄县| 清河县| 五峰| 那坡县| 威海市| 方正县| 新闻| 普宁市| 虎林市| 临沂市| 革吉县| 广宁县| 库伦旗| 信阳市| 边坝县| 观塘区| 高要市| 安康市| 九台市| 汨罗市| 历史| 京山县| 梧州市| 邢台市| 鄂尔多斯市| 瑞金市| 沅陵县| 封开县| 宜都市|