Harita eşleştirme GPS'i yol ağına işaret ediyor!


11

Postgres ve PostGIS için oldukça yeniyim.

Bazı GPS noktalarının basit bir harita eşleme (veya isterseniz yol çıkarımı) yapmaya çalışıyorum. Ben kullanıyorum postgres (PostGIS) .

Veritabanımda GPS puanlarımı içeren bir tablo var: gpspoints (Lat, Long, zaman, hız, azimut, geometri, ...)

Ben de yol ağına bir şekil dosyası benim veritabanına ithal: yolları (gid, idrte, sürüm, nomrte, norte, clsrte, geom, ...) - Ben bağlantıların azimut var, ve ben ST_azimuth postgis işlevini kullanarak nasıl hesaplayabilirim emin değilim. Tüm sahip olduğum yukarıda sıralanan sütunlar içeren yol ağının bir şekil dosyası.

Her bir GPS noktasını, yalnızca bağlantının yönü GPS noktasının azimutu (+ veya -15 derece) ile uyumluysa ve yansıtılan konumu alırsa, en yakın bağlantıyla (noktanın etrafında 20 metrelik bir tamponda) ilişkilendirmek istiyorum. Aksi takdirde, kabul edilebilir bir azimutu olan 20 metre tamponu içinde en yakın bağlantıyı aramasını istiyorum! (Resimdeki gibi!)

Yansıtılan GPS noktalarının yeni koordinatlarının "gpspoints" tablosuna "projectedLat" ve "projectedLong" olarak eklenmesini istiyorum.

(Aşağıdaki resimde, gerçek noktalar bir yön kullanılarak gösterilirken, yansıtılan noktalar herhangi bir yön işaretine sahip değildir) resim açıklamasını buraya girin


Bu ilginç bir problem. Ben 20m arabellek içinde sonraki nokta da kabul edilemez bir azimut varsa, o zaman aramaya devam etmek istiyorum varsayalım?
John Powell

Evet John, ama sadece 20 metre tamponu olan yol bölümleri için ! Aslında, 20 m tamponundaki yol parçalarını tanımlamak, sonra kabul edilebilir bir azimut olan en yakın segmenti bulmak istiyorum!
Nader

"Bağlantıların azimutuna sahip değilim ve ST_azimuth postgis işlevini kullanarak nasıl hesaplayabileceğimi bilmiyorum. Tüm sahip olduğum yukarıda sıralanan sütunları içeren yol ağının bir şekil dosyası." Sen (ve) ile Postgres / PostGIS içine yollar getirebilir shp2pgsql . O zaman kullanabilirsiniz ST_Azimuth, ancak sayısallaştırma yönüne göre size azimutu söyleyeceğini unutmayın .
alphabetasoup

Yanıtlar:


1

Tamamen çözülmüş bir cevabım yok, ama belki başlamanız için yeterli. Bu işlevler yardımcı olabilir:

ST_Line_Locate_Point (), mesafeyi bir çizgi boyunca bir noktanın toplam çizgi uzunluğunun bir bölümü olarak verir. ST_Line_Interpolate_Point (), bir çizgi boyunca belirli bir mesafedeki (yine toplam uzunluğun bir kısmı olarak) bir nokta için bir nokta geometrisi döndürür.

Ne senin çizgi üzerinde gpspoints (aşağıdaki bir alt sorguda, bir yan tümce olarak formüle edilmiş) en yakın olan bir konum 'new_pts' nokta geometrisi almak için önermek. Sonra bu noktayı aslında hatta en yakın noktayı bulmak için kullanın, ancak çok daha küçük bir mesafede, bu yüzden başlangıca daha yakın olacaktır. Sonra bu bulunan noktayı, aralarındaki azimutu almak için 'new_pt' ile birlikte kullanın. Bu, az çok o noktada çizginin teğetini temsil eder.

Ardından, gpspoint'in eklenip eklenmeyeceğini belirlemek için bu açıyı gps noktalarınızın azimutuyla karşılaştırabilirsiniz.

with new_pts AS (
    SELECT ST_ClosestPoint(geom, gpspoints) AS geompt
    FROM routes JOIN gpspoints ON ST_Distance(routes.geom, gpspoints.geom)<20
    )


SELECT ST_Azimuth(new_pts.geompt, 
    ST_Line_Interpolate_Point(routes.geom, 
        ST_Line_Locate_Point(routes.geom, new_pts.geompt)*0.999))

FROM routes JOIN new_pts ON ST_Distance(routes.geom,new_pts.geompt)<20;

Yine, test edilmedi, ama umarım biraz yardımcı olur.


0

böyle bir şey deneyin:

  1. çoklu çizgilerinizin yönünü derece cinsinden hesaplayın, örnek: örneğin ArcGIS Alan Hesaplayıcısında: 180 + math.atan2 ((! Shape.firstpoint.X! -! Shape.lastpoint.X!), (! Shape.firstpoint.Y! -! Şekil. Son nokta Y!)) * (180 / math.pi)

  2. yol ağınızı yol köşelerine (noktalara) dönüştürün ve PostGIS'e aktarın.

  3. eşleşen algoritmayı uygula:

    Eşleştirmeye INSERT (gid, Vehicle_id, segment_id, tarih, saat, the_geom)

    DIGINCT ON (b.gid) b.gid, b.vehicle_id, a.segment_id, b.date, b.time, ST_Closestpoint (ST_Collect (a.the_geom), b.the_geom)

    segment_vertices_geom bir iç birleşim aracı_geom b AÇIK ST_Dwithin'de (ST_Transform (a.the_geom, 32632),

    ST_Transform (b.the_geom, 32632), 20) NEREDE ((CAST (a.azimuth AS float8) - CAST (b.direction AS float8)) <180 VEYA (CAST (a.azimuth AS float8) - CAST (b.direction Float8)) -180) b.gid, b.vehicle_id, a.segment_id, b.date, b.time, a.the_geom, b.the_geom SİPARİŞ B.gid, ST_Distance (a.the_geom, b .the_geom);

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.