PostGIS: розділити багатокутник у заданому співвідношенні


11

Чи є зручний спосіб розділити багатокутник на nчастини, більш-менш рівні за розміром у PostGIS?


Рівна площа або однаковий розмір (тобто однакова ширина і висота)?
Антоній -ГІСКО-

Площа, незалежно від пропорцій.
Адам Матан

1
пов’язана публікація gis.stackexchange.com/questions/5300/…
Кірк Куйкендалл

Я здивований, що для R просторового рішення не існує
Бред Несом

Відповіді:


8

Це стара проблема, що не має простого рішення. Єдиний підхід, на який я натрапив - це зробити функцію, яку ви надаєте заголовок і кількість частин, а комп'ютер проводить випробування, поки він не отримає рівних площ. Існує функція 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;

2

Одним із підходів може бути поділ багатокутника повністю на трикутники, кожен із заданою площею. Тоді було б спробувати згрупувати ці (сусідні) трикутники назад у багатокутники (меншої чи меншої) площі розміру / n. Це була б якась спеціальна версія проблеми "підмножина" або "рюкзак" (і я не знаю, як почати це з PostGIS).


Чи можете ви надати більше інформації про алгоритми?
Маджид Ходжаті
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.