2010-07-16 2 views
1

Так что это очень сложно, я думаю, поэтому постараюсь сделать его максимально ясным.Hardcore SQL (ite): выбор участка пересечения

Так в основном, у меня есть географические ДАННЫЕ:

Nodes (#ID,lat,lng) 
WayNodes (#ID,#node_id,#way_id, sequence) 
Ways(#id,name) 

И то, что я хочу, чтобы получить пересечение двух ГРУПП путей. Например, мне нужно найти пересечения между способами, называемыми «name1»: {way1, way2, way3} и способами, называемыми «name2»: {way4, way5, way6}

Так что мне нужно чтобы сделать эквивалент этому:

float x; 
float y; 

float A1 = Y2-Y1; 
float B1 = X1-X2; 
float C1 = A1*X1+B1*Y1; 

float A2 = Y4-Y3; 
float B2 = X3-X4; 
float C2 = A2*X3+B2*Y3; 

float det = A1*B2 - A2*B1; 

if(det == 0){ 
    //Lines are parallel 
    x = 0.0; 
    y = 0.0; 

}else{ 
    x = (B2*C1 - B1*C2)/det; 
    y = (A1*C2 - A2*C1)/det; 
} 

BOOL intersection = (x<MAX(X1,X2) && x<MAX(X3,X4) && x>MIN(X1,X2) && x>MIN(X3,X4)); 

Но в SQL!

Я вроде думаю, что это возможно, мой запрос выглядит следующим образом: (F1, F2 и F3 заменить две очень длинные функции, которые вычисляют X, Y и йе, они должны быть правильными.)

SELECT F1(n1.lat,n1.lng,n2.lat,n2.lng,n3.lat,n3.lng,n4.lat,n4.lng) AS x, 
F2(n1.lat,n1.lng,n2.lat,n2.lng,n3.lat,n3.lng,n4.lat,n4.lng) AS y, 
F3(n1.lat,n1.lng,n2.lat,n2.lng,n3.lat,n3.lng,n4.lat,n4.lng) AS det, 
FROM Nodes n1, Nodes n2, Nodes n3, Nodes n4 
JOIN WayNodes wn1 ON n1.id = wn1.node_id 
JOIN WayNodes wn2 ON n2.id = wn1.node_id 
JOIN WayNodes wn3 ON n3.id = wn1.node_id 
JOIN WayNodes wn4 ON n4.id = wn1.node_id 
JOIN Way w1 ON wn1.way_id = w1.id AND wn2..way_id = w1.id 
JOIN Way w2 ON wn3..way_id = w2.id AND wn4..way_id = w2.id 
WHERE det != 0 AND 
x < MAX(n1.lng, n2.lng) 
AND x > MIN(n1.lng, n2.lng) 
AND x < MAX(n3.lng, n4.lng) 
AND x > MIN(n3.lng, n4.lng) 
AND wn1.sequence=wn2.sequence - 1 
AND wn3.sequence=wn4.sequence - 1 
AND w1.name = "name1" 
AND w2.name = "name2" 

Видимо, что-то не работает на стыке ... любая идея?

ответ

1

ли это, что вам нужно ...

JOIN WayNodes wn1 ON n1.id = wn1.node_id 
JOIN WayNodes wn2 ON n2.id = wn2.node_id 
JOIN WayNodes wn3 ON n3.id = wn3.node_id 
JOIN WayNodes wn4 ON n4.id = wn4.node_id 
+0

довольно много ... я чувствую себя глупо! Хм, я просто проверю, работает ли это до подтверждения. Благодаря ! – Julien

+1

Не волнуйся; мы все это сделали. –

+0

Да, это было почти все. Там я также изменил И wn1.sequence = wn2.sequence - 1 Который я положил в JOIN. Я не могу поверить, что это работает! Большое спасибо ! – Julien