2015-06-19 64 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**)