PostGIS: bir çokgeni belirli bir oranda bölme


Yanıtlar:


8

Bu basit bir çözümü olmayan eski bir sorundur. Karşılaştığım tek yaklaşım, bir başlık verdiğiniz bir işlev yapmak ve parçaların sayısı ve bilgisayar eşit alanlar elde edene kadar denemeler yapmaktır. AutoCAD'de bununla birlikte bir LISP işlevi vardır. Postgis'de aynı şekilde çalışır, işte Postning'in Manning'den bir alıntısı , bu kod bir çokgeni iki eşit parçaya ayırır:

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

Bir yaklaşım, çokgeni her biri belirli bir alana sahip üçgenlere tamamen bölmek olabilir. O zaman bu (bitişik) üçgenleri (az ya da çok) büyüklükteki alan / n çokgenlerine ayırmaya çalışmak olur. Bu, "alt küme toplamı" veya "sırt çantası" sorununun özelleştirilmiş bir versiyonu olacaktır (ve PostGIS ile nasıl başlayacağımı bilemezdim).


Algoritmalar hakkında daha fazla bilgi verebilir misiniz?
Majid Hojati
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.