Чи є зручний спосіб розділити багатокутник на n
частини, більш-менш рівні за розміром у PostGIS?
Чи є зручний спосіб розділити багатокутник на n
частини, більш-менш рівні за розміром у PostGIS?
Відповіді:
Це стара проблема, що не має простого рішення. Єдиний підхід, на який я натрапив - це зробити функцію, яку ви надаєте заголовок і кількість частин, а комп'ютер проводить випробування, поки він не отримає рівних площ. Існує функція LISP, яка функціонує в AutoCAD. У postgis це працює так само, ось уривок PostGIS в дії від Manning, цей код розбиває багатокутник на дві рівні частини:
WITH RECURSIVE
ref(the_geom, env) AS (
SELECT the_geom,
ST_Envelope(the_geom) As env,
ST_Area(The_geom)/2 As targ_area,
1000 As nit
FROM us.states
WHERE state = 'Idaho'
),
T(n,overlap) AS (
VALUES (CAST(0 As Float),CAST(0 As Float))
UNION ALL
SELECT n + nit, ST_Area(ST_Intersection(the_geom, ST_Translate(env, n+nit, 0)))
FROM T CROSS JOIN ref
WHERE ST_Area(ST_Intersection(the_geom, ST_Translate(env, n+nit, 0)))> ref.targ_area
) ,
bi(n) AS
(SELECT n
FROM T
ORDER BY n DESC LIMIT 1)
SELECT bi.n,
ST_Difference(the_geom, ST_Translate(ref.env, n,0)) As geom_part1,
ST_Intersection(the_geom, ST_Translate(ref.env, n,0)) As geom_part2
FROM bi CROSS JOIN ref;
Одним із підходів може бути поділ багатокутника повністю на трикутники, кожен із заданою площею. Тоді було б спробувати згрупувати ці (сусідні) трикутники назад у багатокутники (меншої чи меншої) площі розміру / n. Це була б якась спеціальна версія проблеми "підмножина" або "рюкзак" (і я не знаю, як почати це з PostGIS).