Bir çizgide en yakın noktaya belirli bir noktaya nasıl ulaşılır?


28

PostGIS'i uzun zamandır kullanıyorum ancak LINESTRINGgeometriyi kullanmak zorunda kaldım ...! :)

İşte yapmak istediğim şey: Bir bağlantı hattım var (belirli bir şehrin sokaklarını temsil eden, SRID 3395) ve belirli bir noktaya en yakın bağlantı hattını bulmak istiyorum (GPS pozisyonu, SRID 4326).

Bulduğum çözüm, expand()yöntemi kullanarak benim noktamdaki tüm çizgileri seçmek ve yöntemi kullanarak her çizgiyle noktam arasındaki mesafeyi belirlemek ST_Distance().

İşte SQL:

SELECT myLineId, myLineName, ST_Distance(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395),myLineGeom) AS myLineDistance
FROM myLines
WHERE myLineGeom && expand(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395), 100)
ORDER BY myLineDistance;

Elde ettiğim sonuçlar iyi görünüyor ancak uygulamamda bir sorun olduğunu hissediyorum.

1) Sizce expand()tüm ilgili çizgileri bulabilir misiniz?

2) Kullanmanın ST_Distance()doğru yöntem olduğunu düşünüyor musunuz ? Sanırım yanlış yapıyorum çünkü almak istediğim mesafe nokta ile çizginin arasındaki en küçük mesafe değil, nokta ile çizginin noktalarından biri arasındaki mesafe değil.

İllüstrasyon:

alt metin

Yanıtlar:


11

reklam 1) Kullanılmış işlevlerinizin belgelerine bakarak şunu söylerim: "Evet, tüm ilgili bağlantılar bulunur."

genişlet (geometri, yüzer)

Bu fonksiyon, ikinci argümanda belirtilen miktarda giriş geometrisinin sınırlama kutusundan her yöne genişletilmiş bir sınırlama kutusu döndürür. Sorguya bir dizin filtresi eklemek için distance () sorguları için çok kullanışlıdır.

A & B

"&&" operatörü "örtüşen" operatördür. A'nın sınırlayıcı kutusu B'nin sınırlayıcı kutusuyla çakışırsa, operatör true değerini döndürür.

reklam 2) İstediğinizi elde ederek elde edebilmeniz gerekir:

line_interpolate_point(linestring, line_locate_point(LineString, Point))

line_interpolate_point (bağlantı çizgisi, konum)

Bir çizgi boyunca bir noktayı enterpolasyon eder. İlk argüman bir LINESTRING olmalıdır. İkinci argüman, noktanın konumlandırılması gereken toplam 2d uzunluğunun bir kısmını temsil eden 0 ile 1 arasında bir şamandıradır8.

line_locate_point (LineString, Point)

Toplam 2d satır uzunluğunun bir kesri olarak, LineString üzerindeki verilen Noktaya en yakın noktanın konumunu gösteren 0 ile 1 arasında bir şamandıra döndürür. Bir Noktayı çıkarmak için döndürülen konumu kullanabilirsiniz (line_interpolate_point)

Kaynak: http://main.merlin.com.ua/doc/postgis/docs/ch06.html


2. nokta için, sadece bir POINT geometrisi ve bir LINESTRING geometrisi arasındaki ST_Distance'in tezler arasında mümkün olan en küçük mesafeyi sağlayıp sağlamadığını merak ediyordum (aka POINT ve LINGESTRING arasındaki dikey çizginin uzunluğu); her LINESTRING geometrisinden uzaklık istiyorum :)
Vivi

Ve sanırım aradığım mesafe o değil çünkü "line_locate_point işlevi, LineString'de verilen Noktaya en yakın noktanın konumunu temsil eden 0 ile 1 arasında bir değer veriyor": /
Vivi

Korkarım beni son yorumunuzda kaybettiniz. Şimdi ne istediğinizi artık emin değilim;)
underdark

1
Üzgünüm :) Bunu istiyorum: bir LINESTRING geometrisi (bir yolu temsil eder) ve bir POINT geometrisi vererek, yolda olan (LINESTRING geometri tanımının bir noktası olmayabilir) en yakın POINT geometrisine sahip olmak istiyorum. Açık mı? Belki de
yazımın


7

alo

Öncelikle ST_Distance'ın ne döndürdüğü hakkındaki soru. ST_Distance, çizgi ile nokta arasındaki en kısa mesafeyi döndürür (veya hangi geometri tiplerinin girildiği) Bu, nokta (1 3) ve çizginin (0 0,0 10) arasındaki ST_Distance değerinin 1 döndüreceği anlamına gelir. gelin ve (0 0) veya gelin ve (0 10) ama gelin (1 3) - (0 3) arası.

Anladığım kadarıyla ST_Distance size istediğiniz cevabı veriyor.

Yukarıdaki örnekteki noktayı (0 3) bulmak istiyorsanız, PostGIS 1.5 kullanıyorsanız ST_Closestpoint kullanabilirsiniz. Benim örneğimde şöyle kullanın: ST_Closestpoint ('LINESTRING (0 0,0 10)' :: geometri, ' NOKTA (1 3) ':: geometri) sonra noktayı (0 3), noktanıza en yakın çizgideki noktayı almalısınız.

HTH Nicklas


5

Buldum :) (Peki sanırım: P)

Kullanılması ST_Line_Locate_Point()ve ST_Line_Interpolate_point()ben LineString tanımının bir parçası DEĞİLDİR ama hat :) Tüm yapmam gereken sözü üzerine IS bir noktaya başardı bu noktaya benim açımdan mesafe almak için ve ben bittim.

SELECT AsText(ST_Line_Interpolate_Point(myLineGeom,ST_Line_Locate_Point(myLineGeom,ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395))))
FROM myLines
WHERE myGeom && expand(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395), 100)

ST_Line_Locate_Point()Yöntem verilen noktaya çizgiye en yakın noktasının konumu, bulmak ST_Line_Interpolate_Pointyöntem bir noktaya bu konumu açın.


1
Nokta ve çizgi arasındaki St_distance aynı cevabı verecektir. Neden böyle yapmak zorunda olduğunu düşünüyorsun?
Nicklas Avén

1
ST_Distance'ın herhangi bir geometri tipinde kullanılabileceğini düşünüyorum. postgis.refractions.net/docs/ST_Distance.html :ST_Distance(geometry g1, geometry g2)
Magno C

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.