有些情況獲得的數據是Multi類型的,如MultiPolygon和MultiLineString類型,這些類型在空間計算上,很多函數都用不上。像如MultiLineString類型想進行最短路徑查詢就比較不方便。postgis導入的時候能夠選擇simple類型,但是有時候就是導不進去。
image.png
image.png
如上圖這種情況,其實就可以將這些多邊形進行打散,進行單獨處理。這就需要用到st_numgeometries和st_geometryN兩個函數了。
integer ST_NumGeometries(geometry geom);
Returns the number of Geometries. If geometry is a GEOMETRYCOLLECTION (or MULTI*) return the number of geometries, for single geometries will return 1, otherwise return NULL.
SELECT ST_NumGeometries(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
st_numgeometries 計算Multi的單個數量
geometry ST_GeometryN(geometry geomA, integer n);
Return the 1-based Nth geometry if the geometry is a GEOMETRYCOLLECTION, (MULTI)POINT, (MULTI)LINESTRING, MULTICURVE or (MULTI)POLYGON, POLYHEDRALSURFACE Otherwise, return NULL
SELECT
n,
ST_AsEWKT (ST_GeometryN(the_geom, n)) AS geomewkt
FROM
(
VALUES
(
ST_GeomFromEWKT (
'MULTIPOINT(1 2 7, 3 4 7, 5 6 7, 8 9 10)'
)
),
(
ST_GeomFromEWKT (
'MULTICURVE(CIRCULARSTRING(2.5 2.5,4.5 2.5, 3.5 3.5), (10 11, 12 11))'
)
)
) AS foo (the_geom)
CROSS JOIN generate_series (1, 100) n
WHERE
n <= ST_NumGeometries (the_geom);
ST_GeometryN 取index為 n的geometry
SELECT st_geometryN(geom,n) from grid_class_sure_hex gcsh CROSS JOIN generate_series (1, 100) n where gcsh.name='aaaaa' and n <= ST_NumGeometries (gcsh.geom);
--其中generate_series (1, 100)可以根據情況自己設置
最后的每個小的多邊形都可以點擊,是能夠達到效果的。