İki veya daha fazla yörünge arasındaki benzerlik


11

Kamyon verilerim var ( http://www.chorochronos.org/ ).

Bu veriler Atina'daki kamyonların çoklu yörüngelerinin gps koordinatlarıdır.

Çok benzer olanları silmek için, yörüngeler arasındaki benzerliği hesaplamalıyım!

Sorun:

Kırmızı ve Yeşil benzer, ancak mavi, siyah ve (kırmızı veya yeşil) farklı yörüngelerdir. Kırmızı veya yeşil benzerlerinden birini silmek istiyorum.

Veriler nokta cinsindendir (geometri, enlem ve boylam, x ve y) (gps koordinatları), görüntü yörüngelere örnektir


1
Kırmızı ve yeşil benzer, yeşil ve siyah benzer, ancak kırmızı ve siyah benzer değilse ne olur? Ayrıca, "benzer" i nasıl tanımlarsınız - bu, çizginin diğer çizginin veya başka bir metriğin mesafesine düşen bir oranı mıdır?
phloem

Sadece diğerlerinden farklı yörüngelerle kalmak istiyorum. Yörüngeler hatlar değil, gps koordinatlarıdır ...
user2883056

1
Postgis ve postgresql için etiketleriniz var, ancak soru bedeninizde de bahsetmeyin. Etiketleme önemli olsa da, bu ürünleri kullanıyorsanız, bunları sorunuzun gövdesine kaydetmenizi şiddetle tavsiye ederim, çünkü başlığa baktıktan sonra bu, sorunuzun tüm dikkatleri çeken bölümü olacaktır.
PolyGeo

2
@Phloem ile hemfikirim - kilit soru "benzerini nasıl tanımlarsın?" Tüm rotalar AB'den geçiyor, bu yüzden bu anlamda 'benzer'. Başarılı bir sonucu nasıl değerlendireceğiniz hakkında daha fazla bilgi vermeniz gerekir
Stephen Lead

Yanıtlar:


10

Gerçekten kolay, ama fantastik olmayan bir önlem, ST_HausdorffDistance fonksiyonu ile yapılan her kombinasyon arasındaki Hausdorff mesafesini elde etmektir . Şeklinizden yaklaşık LineStrings kullanarak, bunların tümü mavi renkte gösterilir ve Hausdorff mesafesi kırmızı çizgi çiftlerinden biri için gösterilir:

Hausdorff mesafesi

Ve 6 kombinasyonu azalan sırada sıralamak için sorgu:

WITH data AS (
  SELECT 'blue' AS name, 'LINESTRING (60 200, 110 290, 200 320, 330 320, 430 240, 450 200)'::geometry AS geom
  UNION SELECT 'black', 'LINESTRING (60 200, 120 270, 235 297, 295 207, 450 200)'::geometry
  UNION SELECT 'green', 'LINESTRING (60 200, 280 190, 450 200)'::geometry
  UNION SELECT 'red', 'LINESTRING (60 200, 150 210, 257 195, 360 210, 430 190, 450 200)'::geometry)
SELECT a.name || ' <-> ' || b.name AS compare, ST_HausdorffDistance(a.geom, b.geom)
FROM data a, data b WHERE a.name < b.name
ORDER BY ST_HausdorffDistance(a.geom, b.geom) DESC;

     compare     | st_hausdorffdistance
-----------------+----------------------
 blue <-> green  |                  130
 blue <-> red    |                  125
 black <-> blue  |     110.102502131467
 black <-> green |     104.846289061163
 black <-> red   |     97.9580173908678
 green <-> red   |     15.2677257073823
(6 rows)

Bu nedenle, bu örnek için iyi çalışıyor, ancak kümelenme hatları için harika veya sağlam bir teknik değil, çünkü tek metrik, tam hatların farklılıklarını karşılaştırmak yerine en büyük mesafeye sahip tek noktadır. Çok daha iyi yöntemler var, ancak daha karmaşık olacaklar.


Güzel cevap. Muhtemelen ST_Interpolate noktası gibi bir şey kullanmış ve daha sonra naif bir yaklaşım olarak ilgili her bir nokta için ortalama mesafeleri hesaplamış olurdum. Çok daha iyi yöntemlerle neyi düşündünüz?
John Powell

1
@ JohnBarça daha iyi yöntemler, her bir çizginin kapsama alanının mekânsal istatistiklerini karşılaştırmak olacaktır. Bir yöntem her satırı rasterleştirir, rasterle Gauss bulanıklığı yapar, ardından her kombinasyondan çakışan raster değerlerinin korelasyonunu belirler. ST_Segmentize ve ST_Interpolate araçlarına dayanan bir yöntem de işe yarayacaktır.
Mike T

4

PostGres / PostGIS'e erişimim yok, ama işte ArcGIS'de (veya diğerlerinde) nasıl devam edeceğim.

  1. Orijinal satırların uzunluğunu statik bir sütuna hesaplayın
  2. Çizgilerinizi "benzer" olarak tanımladığınız şekilde tamponlayın. Tamponları çözmeyin. Ortaya çıkan arabelleklerin orijinal satıra eşit FID değeri olacaktır.
  3. Tamponları ve orijinal çizgileri kesiştir. Ortaya çıkan katman, söz konusu kavşağa katılan FID'leri tanımlayacaktır (örneğin, "FID_lines" ve "FID_buff").
  4. Katmanı # 3'ten iki orijinal FID sütunu ve orijinal uzunluk sütunu ile çözün.
  5. Bir tanım sorgusu veya başka araçlar (elbette kendi arabelleği ile arabelleğe alınan ve kesişen bir çizgi tamamen çakışacaktır) kullanarak iki orijinal FID sütunu için aynı değere sahip sonuç satırlarını yoksayın.
  6. Sayısal bir sütun ekleyin ve yeni uzunlukla doldurun
  7. Her bir yakındaki satırın arabelleğine düşen orijinal çizginin oranını elde etmek için yeni uzunluğu orijinal uzunlukla (yeni bir sütuna) bölün.
  8. Oran için değerleri kontrol edin. "Yeterince benzer" olarak tanımladığınızları saklayın. Örneğin, belki de uzunluğunun% 75'i için başka bir çizginin arabelleğine düşen bir çizgi yeterince benzerdir, belki de kesiminiz% 50 anlaşmadır, vb.
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.