Tek noktadan çoklu poligona kadar tüm mesafeleri hesaplama [kapalı]


9

İki katmanı var: özellikleri (95 nesne) tanımlayan bir nokta katmanı ve özellikleri (211 nesneleri) ile ilişkili arazi arazileri tanımlayan bir çokgen katman. Her nokta bir veya daha fazla çokgen ile ilgilidir. Ne üretmek istiyorum o nokta ile ilişkili çokgenlerin TÜM her noktaya mesafeleri bir tablo (en yakın kenar veya çokgen centroid - ya da yapacak). En yakın mesafeyi hesaplamak QGIS ve ArcGIS'de nispeten kolaydır, ancak bu hesaplamalar en azından kullandığım yöntemlerle tüm uzak çokgenleri atlar. İdeal olarak bir çıktı istiyorum

Point_ID | distance to polygon 1 | distance to polygon 2 | distance to polygon 3 | etc.

ArcGIS 10 veya QGIS 2.2+ içerisindeki tüm işaretçiler çok yardımcı olacaktır.


Bu, ArcGIS'teki yakın analizlerle yapılabilir, ancak her nokta için bunu yapmak biraz otomasyon gerektirir. Python betiklemesini biliyor musunuz?
Emil Brundage

Emil - Hayır, Python'a aşina değilim ama belki öğrenmeliyim.
NickN

Yanıtlar:


1

Bunu başarmak için QGIS'deki Mesafe Matrisini kullanabilirsiniz . Önce içine poligonları dönüştürmek gerekir ağırlık merkezi noktalarından biri tarafından Vektör > Geometri Araçlar > Poligon centroids veya çokgen centroids ait SAGA sürümü yoluyla. Bunun nedeni, Mesafe Matrisi işlevinin yalnızca 2 nokta katmanı arasında analiz yapabilmesidir. Ayrıca, çıktı şöyle olurdu:

Point_1 | PolygonCentroid_1 | Distance
Point_1 | PolygonCentroid_2 | Distance
Point_1 | PolygonCentroid_3 | Distance
Point_2 | PolygonCentroid_1 | Distance
Point_2 | PolygonCentroid_2 | Distance

Çıktı bir .csv dosyası olacaktır, böylece düzeni Microsoft Excel gibi başka bir yazılım kullanarak elle düzenleyebilirsiniz.


Teşekkürler Joseph - Benim gibi CBS'ye yeni gelen biri için, istediğim cevapları almanın en basit yolu bu.
NickN

En hoş geldiniz dostum! Bu prosedür (ve sonuçlar) basittir, ancak GIS yazılımına daha aşina olduğunuzda, diğer cevaplarda açıklanan daha gelişmiş prosedürleri kullanmayı deneyebilirsiniz.
Joseph

1
@nickN Bu yöntemin sadece küçük bir notu olan centroidler, şekline bağlı olarak her zaman bir poligonun içine düşmez. Bu var mümkün bazı yanlış mesafeler / sıralamaları alabilir, ama bu bir sorun olup olmayacağı gibi veri ve gereksinimlerine bağlıdır. Aksi takdirde, bu ArcGIS'in GNT'sinin QGIS versiyonudur, ancak ikincisi noktalardan daha fazlasını işleyebilir ve QGIS'nin sonuçtaki adları / kimlikleri nasıl ele aldığından emin değilim.
Chris W

5

Bu QGIS (herhangi bir sürüm yapacağını düşünüyorum) ve DB yöneticisinde çok basit bir SQL deyimi kullanarak elde etmek oldukça basittir. Ancak bunun için bir çeşit uzamsal veri tabanında (Postgis veya uzamsal) olmalıdır. Çoğu insan için daha erişilebilir olduğundan, spatialite kullandığımı varsayacağım, ancak SQL deyimleri Postgis için aynıdır.

  1. Yeni bir Spatialite veritabanı oluşturun;
  2. Nokta ve çokgen katmanlarınızı yeni veritabanına aktarın;
  3. DB yöneticisi eklentisini açın, veritabanını seçin ve aşağıdaki SQL ifadelerinden birini çalıştırın:

Tüm noktalardan tüm çokgen sınırlarına mesafe

SELECT 
  f.point_id,
  g.polygon_id,
  st_distance(g.geom, f.geom) AS distance
FROM
  points_table AS f, 
  polygons_table AS g

İlgili çokgen sınırlarına tüm noktalara uzaklık (ortak bir alan olduğu varsayılarak)

SELECT 
  f.point_id,
  g.polygon_id,
  st_distance(g.geom, f.geom) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

İlgili çokgenler sentroidlerine tüm noktalara mesafe :

SELECT 
  f.point_id,
  g.polygon_id,
  st_distance(f.geom, st_centroid(g.geom)) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

Katmanlarınızdan sonuca herhangi bir alan ekleyebileceğinize dikkat edin:

SELECT 
  f.point_id,
  f.point_number,
  g.polygon_id,
  g.parcel_name,
  st_distance(f.geom, st_centroid(g.geom)) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

Veya tüm alanlar:

SELECT 
  f.*,
  g.*,
  st_distance(f.geom, st_centroid(g.geom)) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

Uzamsal veritabanının nasıl oluşturulacağı ve katmanın nasıl içe aktarılacağı hakkında daha fazla girdiye ihtiyacınız varsa, bana bildirin, yanıtı düzenleyeceğim.
Alexandre Neto

Merhaba Alexandre, neden basit bir NEREDE değil de katılın?
Luigi Pirelli

Paul Ramsey'in sunumlarından birinde yakaladığım bir şey. Join'ın açık kullanımını savunmasının nedenini hatırlayamıyorum, ancak diyorsa ...: -PI, herhangi bir fark olup olmadığını görmek için her iki sorgu üzerinde EXPLAIN çalıştırmaya çalışacaktır.
Alexandre Neto

SpatialLite'da yeniyim - bu cevap üzerinde çalıştığım bir sorunu ele alıyor gibi görünüyor. Masam boş. Belki de bunu anlamıyorum. "Pothole VRI" adında bir çokgen katmanı ve "Grid Pothole Center" adında başka bir nokta katmanı var. Yukarıdaki kodu kullanarak aşağıdaki kodu ekliyorum: SEÇİN f.id, g.id, st_distance (f.geom, st_centroid (g.geom)) 'Grid Pothole Center' AS f'den 'Pothole VRI' AS g __ Şu başlıkları içeren boş bir tablo x alıyorum: id, id: 1, distance Burada neyi yanlış yaptım? QGIS 3.6 Kullanarak
Mark Thompson

4

Civarında Tablo üret ArcGIS aracı istediğini yapacak, ancak bir Gelişmiş lisans gerektirmektedir ve için yapacağım tüm puan / çokgenler - birbiriyle ilişkili olanları değil. Bu, 95 nesnenizin her biri için tüm 211 mülk için sıralanmış mesafeyi alacağınız anlamına gelir, böylece tabloda 20.045 satır. Sonuçta ortaya çıkan tabloya filtre uygulamanız gerekir veya Emil'in göreve göre seçimler oluşturma görevi otomatikleştirilir ve yalnızca bu gruplarda çalıştırılır.

Filtrelemeye gelince, evet, tek ihtiyacınız olan birleştirme (ardından bir tanım sorgusu veya seçim). Araç sonucu size IN_FID ve NEAR_FID değerini verir. Aracı nasıl çalıştırdığınıza bağlı olarak (noktaya yakın özellikler veya özelliğe yakın nokta) hangi FID'nin hangisi olduğunu belirleyin. Daha sonra nokta ve özellik tablolarınızı (her ikisini de) uygun FID'ye dayalı olarak araç sonucuna birleştirirsiniz.

Bu, 211 mülk kaydınızın her birinin 95 noktadan hangisine ait olduklarını söyleyen bir niteliğe sahip olduğunu varsayar; çünkü bir sonraki adım, bir kaydın iki alanının olması gereken birleştirilmiş tablolarda tüm kayıtları seçmek (veya tanım sorgusu) eşleşme noktası adı alanı = özellikle ilişkilendirilmiş nokta adı alanı. Eşleşmedikleri durumlar, o nokta ile ilişkili olmayan çokgenlerdir, bu nedenle o noktaya olan mesafelerini umursamazsınız.

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.