2012-10-02 20 views
8

Yollar ve oteller hakkındaki verileri saklamak için MySQL Spatial Extensions kullanıyorum. Yol verisini LineString olarak saklarken otel verilerini bir Nokta olarak saklıyorum. Tablolar bu gibi gözüküyordu.MySQL Uzamsal Uzantıları Kullanarak Bir Noktadan N LineString Bul

http://i.stack.imgur.com/8IVVA.png

Sorunum bir numarası N ve P noktası, P noktasından N yakın yollar bulmak için SQL sorgusu nedir verilir? Mesafe, yukarıda gösterilen gibi bir noktaya giden yol arasındaki en küçük dikey mesafe ile tanımlanır. (gerçekte, en yakın mesafe otoyol kapısı ve otel arasında olmalıdır, ancak bu durumda, herhangi bir noktadan karayolu girebiliriz: P)

Bunun için tek bir SQL deyim çözümü yoksa problem, ara bir SQL sorgusu ve bir post-processing benim için kabul edilebilir. Fakat verimli bir SQL sorgusu ve verilerin nasıl post-işlem yapılacağı neydi?

Sen veritabanında iki işlevi oluşturabilir
+0

Cevabınızı henüz çözdünüz mü? :) – bonCodigo

+0

Lütfen MySQL 5.5 kullandığınızdan emin olun, aksi takdirde mekansal işlevsellik sorunuza cevap verecek kadar uygulanmaz. – TheSteve0

cevap

2

:

  1. mesafe: Bu iki nokta
  2. arasında size mesafeyi verecek
  3. DistanceFromLine: Burada mesafe hattında her noktadan hesaplanacaktır ve size verecektir En kısa mesafe.

Nokta ve çizgiler arasındaki mesafeyi karşılaştırın ve en kısa olanını seçin. İşte

Mesafe fonksiyonu


İşte
delimiter // 

CREATE FUNCTION distance (latA double, lonA double, latB double, LonB double) 
RETURNS double DETERMINISTIC 
    BEGIN 
     SET @RlatA = radians(latA); 
     SET @RlonA = radians(lonA); 
     SET @RlatB = radians(latB); 
     SET @RlonB = radians(LonB); 
     SET @deltaLat = @RlatA - @RlatB; 
     SET @deltaLon = @RlonA - @RlonB; 
     SET @d = SIN(@deltaLat/2) * SIN(@deltaLat/2) + 
     COS(@RlatA) * COS(@RlatB) * SIN(@deltaLon/2)*SIN(@deltaLon/2); 
     RETURN 2 * ASIN(SQRT(@d)) * 637101; 
    END// 

olan DistanceFromLine fonksiyonudur:


DROP function IF EXISTS `DistanceFromLine`; 
delimiter // 
    CREATE FUNCTION `DistanceFromLine`(
    route LINESTRING, point1 POINT 
    ) RETURNS INT DETERMINISTIC 
     BEGIN 
     DECLARE a INT Default 0 ; 
     DECLARE minDistance INT Default 0; 
     DECLARE currentDistance INT Default 0; 
     DECLARE currentpoint point ; 
     DECLARE size INT Default 0 ; 
     SET size = NumPoints(route); 
       simple_loop: LOOP 
     SET a = a+1; 
     SET currentpoint = PointN(route,a); 
     SET currentDistance = Distance(X(point1), Y(point1),  
       X(currentpoint),Y(currentpoint)); 

     IF a = 1 THEN 
     SET minDistance = currentDistance; 
      END IF; 

     IF currentDistance < minDistance THEN 
     SET minDistance = currentDistance; 
     END IF; 
     IF a=size THEN 
       LEAVE simple_loop; 
     END IF; 
      END LOOP simple_loop; 
    RETURN (minDistance); 
END// 

0

Bu oldu çok kullanışlı bir Benim için swer, ama daha gelişmiş veya sadece farklı coğrafi sorgu işlevlerine sahip olan MySQL 5.7.18 kullanıyorum. Kaydedilen mesafe işlevine artık gerek yok - ST_Distance_Sphere kullanın. Yani burada modern (5.7.6+) MySQL ile DistanceFromLine uyumlu hale getirmek için aynı kod bir güncelleme ...

DROP function IF EXISTS `DistanceFromLine`; 
delimiter // 
    CREATE FUNCTION `DistanceFromLine`(
    route LINESTRING, point1 POINT 
    ) RETURNS INT DETERMINISTIC 
     BEGIN 
     DECLARE a INT Default 0 ; 
     DECLARE minDistance INT Default 0; 
     DECLARE currentDistance INT Default 0; 
     DECLARE currentpoint point ; 
     DECLARE size INT Default 0 ; 
     SET size = ST_NumPoints(route); 
       simple_loop: LOOP 
     SET a = a+1; 
     SET currentpoint = ST_PointN(route,a); 
     SET currentDistance = ST_Distance_Sphere(point1,currentpoint); 

     IF a = 1 THEN 
     SET minDistance = currentDistance; 
      END IF; 

     IF currentDistance < minDistance THEN 
     SET minDistance = currentDistance; 
     END IF; 
     IF a=size THEN 
       LEAVE simple_loop; 
     END IF; 
      END LOOP simple_loop; 
    RETURN (minDistance); 
END// 
0

Ben de bu konuda çalışan, ama ne yazık ki Otelleri için en yakın yol bulma edilmiş bir konumdur elverişsiz çözüm. Yolun girdiği girişin kesin cevap olduğunu anladım. Başka bir deyişle adres. Bu, bir adres tablosuna ve adrese en yakın adres yoluna eşleşen noktalara sahip olmak anlamına gelir.

İlgili konular