2015-06-19 16 views
1

默認情況下,PostGIS根據多邊形的邊界框((MINX, MINY), (MINX, MAXY), (MAXX, MAXY), (MAXX, MINY), (MINX, MINY))計算多邊形的包絡或範圍。將多邊形旋轉爲與X軸平行

這給了像這樣的結果:

enter image description here

不過,我正在尋找更多像這樣的結果:

enter image description here

據我所知,最好的算法,我可以拿出是:

  1. 確定角a到旋轉多邊形X成與x軸平行
  2. 旋轉Xa度,計算旋轉後的多邊形的包絡YX
  3. 旋轉Y-a

你怎麼能計算步驟# 1在PostGIS中?

+0

太糟糕了,有一個爲PostGIS中沒有[ST_MinimumRectangle(http://www.h2gis.org/docs/dev/ST_MinimumRectangle/)功能,參見[增強權證#3176](https://trac.osgeo.org/postgis/ticket/3176) –

回答

0

這是一個實現。它不處理退化情況,並且您可能不喜歡矩形選擇如果區域配合。我正在爲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; 
0

小修復。

不知怎的,它的工作對我來說:

select ST_Rotate(ST_Envelope(ST_Rotate(hull, **angle**)),**-angle**)