Linestringlerde rastgele fishnet hücrelerinde birbirinden belirli bir mesafede puan oluşturun


10

1x1 km hücrelik bir balık ağı aldığımız bir arazi protokolümüz var. Bazı hücreler rastgele seçilir. Her hücreye 4 puan koymamız gerekiyor ve bu noktalar da bir yolda olmalı. Noktaları arasındaki minimum mesafe her hücrelerin her puan için 500 milyon olmak zorunda MÜMKÜNSE veya değilse, biz mümkün olan maksimum mesafe istiyorum.

İlk denemede her hücreyi 500x500 m'lik dört hücreye ST_CreateFishnet ile böldükten sonra alt hücrelerin merkezindeki noktalara ve sonra en yakın yola (ST_ClosestPoint) nokta koyduk. Bazı iyi sonuçlar elde ediyoruz, ancak aşağıdaki örnekte, 5. noktanın 6'dan çok yakın olduğunu ve sol yolda hareket ettirilebildiğini görebilirsiniz.

WITH
r1 AS (         -- only sub-cells which intersects random cells
    SELECT id_maille, ROW_NUMBER() OVER() AS id_grille, fishnet_500.geomgrille
    FROM fishnet_500
        JOIN t_mailles
            ON ST_Intersects(ST_Buffer(t_mailles.geom,-200), fishnet_500.geomgrille)     -- buffer < 0 to not select neightbours
)
,
r2 AS (         -- cut roads in every cells
SELECT id_maille, id_grille, ST_Intersection((ST_Dump(roads.geom)).geom, r1.geomgrille) as geomroute
FROM roads
    JOIN r1
        ON ST_Intersects(roads.geom, r1.geomgrille)
)
                -- select point on each road the closest to cell centroid
SELECT r2.id_maille, r2.id_grille, ST_ClosestPoint(ST_Union(r2.geomroute),ST_Centroid(r1.geomgrille)) as geomipa
FROM r2
    JOIN r1
        ON r2.id_grille = r1.id_grille
GROUP BY r2.id_maille, r2.id_grille, r1.geomgrille
ORDER BY r2.id_maille, r2.id_grille

Denemek istiyorsanız, burada bulabileceğiniz bir arşive 3 katmanı (rastgele hücreler, alt fisnet ve yollar ile file) koyarım .

Sanırım birçok olasılığı deneyen bir özyinelemeli algoritmadan kaçınamayız ama emin değilim.

resim açıklamasını buraya girin


Şimdiye kadar kullandığınız kodu paylaşabilir misiniz?
18'de Cushen

Başka kısıtlamalar var mı? Örneğin, alt hücrenin en uzak köşesindeki bir nokta ile başlamak daha kolay olur, bu da diğer noktaları çok yakın olduğu için atmanızın daha az olası olmasını sağlar mı?
Mart'ta Simbamangu

Evet, düşünülen köşedeki hücreye dokunan başka hücre olmadığında köşelerde noktalarla başlamak iyidir. Puanlar tüm ızgara üzerinde birbirinden en az mesafede olmalıdır.
Nicolas Boisteault

Yanıtlar:


1

PostGIS veritabanınıza bağlayarak bunu R veya python'da yapmak ister misiniz? Her 1x1 km'lik hücredeki tüm satırlarda ST_DumpPoints kullandıysanız, her biri> 500m arasındaki mesafe veya olabildiğince uzak olan 4 nokta seçmek için birçok kullanılabilir algoritmadan birini kullanabilmeniz gerekir.

Belki de sırt çantası sorunu için Wikipedia'da bahsedilen algoritmalardan biri olan https://en.wikipedia.org/wiki/Knapsack_problem , size bazı fikirler verecektir. Veya bir MCMC algoritmasının iyi çalışacağını düşünüyorum.

İki ızgara birbirine bitişikse, bitişik ızgaralardaki noktalar arasındaki mesafe önemli mi?


Son sorunuza cevap vermek için. Evet, son yorumumda belirtildiği gibi: "Puanlar tüm ızgarada birbirinden minimum mesafede olmalıdır". Yardımın için teşekkürler.
Nicolas Boisteault
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.