Problème
Les utilisateurs peuvent fournir jusqu'à quatre coordonnées de latitude et de longitude, dans n'importe quel ordre. Ils le font avec Google Maps. En utilisant la fonction Polygon
API (v3), les coordonnées sélectionnées doivent mettre en évidence la zone sélectionnée entre les quatre coordonnées.
Question
Comment trier un tableau de coordonnées de latitude et de longitude dans le sens (inverse) des aiguilles d'une montre ?
Solutions et recherches
Questions de StackOverflow
- Dessiner des polygones redimensionnables (sans intersection)
- Comment trier les points d'un polygone Google maps pour que les lignes ne se croisent pas ?
- Classer quatre points dans le sens des aiguilles d'une montre
Sites connexes
- http://www.daftlogic.com/projects-google-maps-area-calculator-tool.htm
- http://en.literateprograms.org/Quickhull_%28Javascript%29
- http://www.geocodezip.com/map-markers_ConvexHull_Polygon.asp
- http://softsurfer.com/Archive/algorithm_0103/algorithm_0103.htm
Algorithmes connus
- Scan de Graham (trop compliqué)
- Algorithme de Jarvis March (traite N points)
- Coque convexe récursive (enlève un point)
Code
Voici ce que j'ai pour l'instant :
// Ensures the markers are sorted: NW, NE, SE, SW
function sortMarkers() {
var ns = markers.slice( 0 );
var ew = markers.slice( 0 );
ew.sort( function( a, b ) {
if( a.position.lat() < b.position.lat() ) {
return -1;
}
else if( a.position.lat() > b.position.lat() ) {
return 1;
}
return 0;
});
ns.sort( function( a, b ) {
if( a.position.lng() < b.position.lng() ) {
return -1;
}
else if( a.position.lng() > b.position.lng() ) {
return 1;
}
return 0;
});
var nw;
var ne;
var se;
var sw;
if( ew.indexOf( ns[0] ) > 1 ) {
nw = ns[0];
}
else {
ne = ns[0];
}
if( ew.indexOf( ns[1] ) > 1 ) {
nw = ns[1];
}
else {
ne = ns[1];
}
if( ew.indexOf( ns[2] ) > 1 ) {
sw = ns[2];
}
else {
se = ns[2];
}
if( ew.indexOf( ns[3] ) > 1 ) {
sw = ns[3];
}
else {
se = ns[3];
}
markers[0] = nw;
markers[1] = ne;
markers[2] = se;
markers[3] = sw;
}
Nous vous remercions.