默认情况下,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) –