PostGIS kullanarak noktalardan çizgi oluşturuluyor mu?


10

Çok sayıda aracın pozisyon verilerini içeren bir PostGIS masam var ve bu noktalardan çizgiler oluşturmak istiyorum.

Veriler araç kimliğine göre seçilebilir ve zaman damgası ile sıralanabilir, ancak sonuçtan nasıl satır oluşturulur?

Temel olarak ihtiyacım olan şey, 1'den 2'ye kadar olan bir satır segmenti, çizgiyi sonlandırın ve sonra tekrar 2'den 3'e kadar olan nokta.

İkincisine ihtiyaç duyulur çünkü aracın seyir yönünü ve hızını bir noktadan diğerine hesaplamak istiyorum.


1
GROUP_ Vehicle_id ve ORDER BY zaman damgası çalıştıktan sonra ST_MakeLine () işlevi bunu yapar. Bakınız: postgis.refractions.net/docs/ST_MakeLine.html
Micha

Tamam, ben sadece denedim ve aşağıdaki ifadeyi yayınladım: SELECT ais_data.mmsi, ST_MakeLine(ais_data.geom) AS newgeom INTO ais_lines FROM (SELECT * FROM ais_data ORDER BY ais_data.mmsi, ais_data.bs_ts ASC) AS ais_data GROUP BY ais_data.mmsi;Bu bana her aracın izini verecek ve tam olarak ihtiyacım olan şey değil. ST_MakeLine () 'den nokta 1'den nokta 2'ye bir çizgi oluşturmasını, çizgiyi sonlandırmasını ve 2. noktadan 3. noktaya yeni bir hat başlatmasını nasıl söyleyebilirim?
Thomas Becker

"Nokta 1", "nokta 2", "nokta 3" nedir? Onları nasıl tanıyorsunuz?
Micha

Onları zaman damgasının sırası ile tanımayı düşündüm ... ORDER BY ais_data.bs_ts- bu mümkün mü? Bu nedenle, nokta 1, nokta 2 vb. Temel olarak Select ifadesinin sonucu olarak her satırda verilen nokta bilgisidir.
Thomas Becker

Bir ilk adımda araç başına bir satır oluşturmak ve sonra posta listesi PostGIS ipuçlarını kullanarak bu hattan köşe oluşturabilir postgis.17.x6.nabble.com/...
ThomasG77

Yanıtlar:


12

Kendi kendine birleşmeler veya ilişkili alt sorgular kullanılarak birkaç şekilde yapılabilir, ancak pencere işlevlerini kullanmak muhtemelen en kolay yoldur.

İşlev lead(), verilen bölümde önde olan bir değer döndürür ve bölümümüz(PARTITION BY <vehicle_id> ORDER BY <timestamp>)

Bu sorgu bize araç numarasını, bölümdeki o noktanın konumunu (onunla başlayan çizginin konumuna eşittir) ve çizgiyi yapacak iki geometriyi verir. Tabii ki son nokta için NULL geom2 döndürür, bu yüzden dış sorguda bunu kontrol etmemiz gerekir.

SELECT mmsi, num, ST_MAKELINE(geom,geom2) FROM (
  SELECT mmsi, row_number() OVER w AS num, geom, lead(geom) OVER w AS geom2
  FROM ais_data WINDOW w AS (PARTITION BY mmsi ORDER BY bs_ts) ) as q
WHERE geom2 IS NOT NULL;
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.