Donc, celui-ci est un très difficile je pense, donc je vais essayer de le rendre aussi clair que possible.Hardcore SQL (ite): fetch intersection de segments
Donc, fondamentalement, j'ai données géographiques:
Nodes (#ID,lat,lng)
WayNodes (#ID,#node_id,#way_id, sequence)
Ways(#id,name)
Et ce que je veux est d'obtenir l'intersection de deux GROUPE façons. Par exemple, j'ai besoin de trouver des intersection entre les chemins appelés "name1": {way1, way2, way3} et les moyens appelés "name2": {way4, way5, way6}
Alors ce dont j'ai besoin est pour faire un équivalent à ceci:
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));
Mais en SQL!
Je pense genre de, il est possible, ma demande ressemble à ça: (F1, F2 et F3 remplacer deux fonctions très longues, qui calculent X, Y et det, ils devraient être corrects.)
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"
Apparemment quelque chose ne fonctionne pas dans la jonction ... une idée?
à peu près ... Je me sens stupide! Hmmm je vais juste vérifier cela fonctionne avant de confirmer. Merci ! – Julien
Ne vous inquiétez pas; nous l'avons tous fait. –
Ouais c'était presque tout. Là, j'ai également changé le et wn1.sequence = wn2.sequence - 1 Que j'ai mis dans le JOIN. Je ne peux pas croire que ça marche! Merci beaucoup ! – Julien