默認情況下,PostGIS根據多邊形的邊界框((MINX, MINY), (MINX, MAXY), (MAXX, MAXY), (MAXX, MINY), (MINX, MINY))
計算多邊形的包絡或範圍。將多邊形旋轉爲與X軸平行
這給了像這樣的結果:
不過,我正在尋找更多像這樣的結果:
據我所知,最好的算法,我可以拿出是:
- 確定角
a
到旋轉多邊形X
成與x軸平行 - 旋轉
X
a
度,計算旋轉後的多邊形的包絡Y
X
- 旋轉
Y
-a
度
你怎麼能計算步驟# 1在PostGIS中?
默認情況下,PostGIS根據多邊形的邊界框((MINX, MINY), (MINX, MAXY), (MAXX, MAXY), (MAXX, MINY), (MINX, MINY))
計算多邊形的包絡或範圍。將多邊形旋轉爲與X軸平行
這給了像這樣的結果:
不過,我正在尋找更多像這樣的結果:
據我所知,最好的算法,我可以拿出是:
a
到旋轉多邊形X
成與x軸平行X
a
度,計算旋轉後的多邊形的包絡Y
X
Y
-a
度你怎麼能計算步驟# 1在PostGIS中?
這是一個實現。它不處理退化情況,並且您可能不喜歡矩形選擇如果區域配合。我正在爲postgis提交 提交,但這應該足以與 一起工作,我在postgis中獲得了一個補丁。
create or replace function ST_MinimumRectangle(g geometry) returns geometry
language 'plpgsql' as $$
declare
hull geometry;
begin
hull = ST_ExteriorRing(ST_ConvexHull(g));
-- one side must lie along the rectangle.
-- so, for each side, rotate, bbox, counter-rotate bbox
with sides as (
select ST_PointN(hull, n) as a, ST_PointN(hull, n+1) as b,
n as side
from generate_series(1,ST_NPoints(hull)-1) n
),
angles as (
select side, a, b, st_azimuth(a, b) as angle from sides
),
boxes as (
select ST_Rotate(ST_Envelope(ST_Rotate(hull, -angle)),angle) as rect, side, angle from angles
)
select rect into hull from boxes order by ST_Area(rect), side limit 1
;
return hull;
end;
$$ immutable strict;
小修復。
不知怎的,它的工作對我來說:
select ST_Rotate(ST_Envelope(ST_Rotate(hull, **angle**)),**-angle**)
太糟糕了,有一個爲PostGIS中沒有[ST_MinimumRectangle(http://www.h2gis.org/docs/dev/ST_MinimumRectangle/)功能,參見[增強權證#3176](https://trac.osgeo.org/postgis/ticket/3176) –