Conserver un seul point d'intérêt latitude longitude par zone

Pour toutes les discussions javascript, jQuery et autres frameworks
Répondre
Jpe54
Messages : 60
Enregistré le : 10 mars 2017, 14:11

Conserver un seul point d'intérêt latitude longitude par zone

Message par Jpe54 » 03 août 2023, 09:14

Bonjour,

En javascript, comment trier un tableau de latitude Longitude par distance à vol d'oiseau ?

But, ne conserver qu'un seul point tous les x mètres ?

Des formules de calcul existent pour la distance voire des mots clef comme distanceTo en leaflet mais dépendent de l'ordre des coordonnées GPS lues ?

Merci par avance !

Bien cordialement,

PS : De mémoire sur le site https://www.datavis.fr il existait une formule pour un "parcours de représentant" ordonnant des points de passage malheureusement ce site semble ne plus exister.
Modifié en dernier par Jpe54 le 02 sept. 2023, 10:31, modifié 1 fois.

Jpe54
Messages : 60
Enregistré le : 10 mars 2017, 14:11

Re: Comment Trier latitude longitude par distance

Message par Jpe54 » 05 août 2023, 14:35

La ténacité finit peut-être par payer.... :D

je partage avec vous cette page github lié à l'algorithme que je recherchais sous un nom erroné. Il s'agit du "problème du voyageur de commerce" :

https://github.com/jhackshaw/tspvis qui contient des exemples de routines javascript... et un lien https://tspvis.com/ ouvrant une page de test qui, en cliquant sur le point d'interrogation face au mot ALGORITHME, permet la visualisation de la routine utilisée !

c'est un début, en l'état reste à savoir si cela va permettre d'avancer faute de code html exemple

Bon usage à tous.

Avatar du membre
webmaster
Administrateur du site
Messages : 578
Enregistré le : 28 févr. 2017, 15:19

Re: Comment Trier latitude longitude par distance

Message par webmaster » 05 août 2023, 18:54

Bonjour Jpe,

C'est pas évident ce genre d'algo en JS. Il faut cogiter et faire des essais.
Ou alors chercher des librairies toute prêtes...
TJS : 25 ans et mon livre Tout JavaScript chez Dunod
https://www.toutjavascript.com/livre/index.php

Jpe54
Messages : 60
Enregistré le : 10 mars 2017, 14:11

Re: Comment Trier latitude longitude par distance

Message par Jpe54 » 02 sept. 2023, 10:27

Bonsoir,

Effectivement, j'ai aussi l'impression que nombre de sites "pédagogue" ont disparu...

Cogitation pour qu'à l'issu de nombreuses photos prises lors de voyages ne reste plus qu'un WayPoint pour chaque lieu intéressant :

Voici une solution exclusivement javascript liée à cette problématique, avec l'assistance de L'IA (ChatGPT : https://www.chatbotgpt.fr) à condition d'évaluer correctement le cahier des charges de cette manière :

************************************
Regrouper l'intégralité d'un tableau de latitude Longitude par zone selon une distance souhaitée
1- Regrouper tous les points d'une zone par distance
2- Ne conserver qu'un seul point dans chaque zone
3- Compiler toutes les zones en un seul fichier.
************************************

Résultat sur une collecte de 850 photos et autant coordonnées GPS il ne reste que les 140 endroit photographiés si choix de distance de 50 mètres à vol d'oiseau...

Le code à nécessité quelques retouches mais le résultat est Impressionnant !

Toutes remarques sont les bienvenues.

Amitiés à tous

Voici le script :

Code : Tout sélectionner

// ======================================================================================================================
// 1- Extraire dans cet ordre lat, lng, name d'un tableau ["Libellé", latitude, longitude]
// ======================================================================================================================
const coordinates = wpt[0].map((item) => [item[1], item[2], item[0]]);

// ======================================================================================================================
// 2- Regroupement [latitude, longitude, name] par zone selon distance voulue
// ======================================================================================================================
// Ecart souhaité en mètres entre deux Points d'intérêt à conserver
const distanceMax = 50;
const groupes = regrouperParZoneEtDistance(coordinates, distanceMax);
// ======================================================================================================================

// ======================================================================================================================
// Regrouper les coordonnées [latitude, longitude, name] par zone et par distance
// ======================================================================================================================
function regrouperParZoneEtDistance(coordinates, distanceMax) {
    const groupes = [];
    // Créer les zones
    for (let i = 0; i < coordinates.length; i++) {
        const point = coordinates[i];
        let groupeExistant = false;
        // Récupérer uniquements les coordonnées de la zone
        for (let j = 0; j < groupes.length; j++) {
            const groupe = groupes[j];
            const distanceEntrePoints = distance(point[0], point[1], groupe.latitude, groupe.longitude);
            if (distanceEntrePoints <= distanceMax) {
                groupe.coordinates.push({
                    latitude: point[0],
                    longitude: point[1],
                    name: point[2],
                });
                groupeExistant = true;
                break;
            }
        }
        if (!groupeExistant) {
            groupes.push({
                latitude: point[0],
                longitude: point[1],
                coordinates: [
                    {
                        latitude: point[0],
                        longitude: point[1],
                        name: point[2],
                    },
                ],
            });
        }
    }
    return groupes;
}

// ======================================================================================================================
// Formule de Haversine pour calcul de distance en mètres entre deux coordonnées au format [latitude, longitude]
// ======================================================================================================================
function distance(lat1, lon1, lat2, lon2) {
    // Rayon de la Terre en km
    const R = 6371;
    const dLat = ((lat2 - lat1) * Math.PI) / 180;
    const dLon = ((lon2 - lon1) * Math.PI) / 180;
    const lat1Rad = (lat1 * Math.PI) / 180;
    const lat2Rad = (lat2 * Math.PI) / 180;
    const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1Rad) * Math.cos(lat2Rad);
    const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    // Convertir en mètres;
    const distance = R * c * 1000;
    return distance;
}

// ======================================================================================================================
// 4- Compiler les coordonnées de toutes les zones en un seul tableau
// ======================================================================================================================
var tableauCoordonnees = groupes.map((groupe) => [groupe.latitude, groupe.longitude, groupe.coordinates[0].name]);

Avatar du membre
webmaster
Administrateur du site
Messages : 578
Enregistré le : 28 févr. 2017, 15:19

Re: Conserver un seul point d'intérêt latitude longitude par zone

Message par webmaster » 04 sept. 2023, 10:23

Intéressant retour de l'IA sur le développement
Je m'en sers pas mal pour la génération d'images d'illustrations et pour faire des pictos et icones

Faudra que je m'y mette aussi comme assistant sur le developpement de fonctionnalités
TJS : 25 ans et mon livre Tout JavaScript chez Dunod
https://www.toutjavascript.com/livre/index.php

Jpe54
Messages : 60
Enregistré le : 10 mars 2017, 14:11

Re: Conserver un seul point d'intérêt latitude longitude par zone

Message par Jpe54 » 29 oct. 2023, 10:41

Pour Information le site https://www.datavis.fr est de nouveau accessible !

Le problème du "voyageur de commerce" pour optimiser un parcours est toujours présent avec LA solution : https://www.datavis.fr/playing/salesman-problem

Bon usage à qui est interessé. Ce site est une mine d'information...

Mira23
Messages : 1
Enregistré le : 22 janv. 2024, 03:05

Re: Conserver un seul point d'intérêt latitude longitude par zone

Message par Mira23 » 22 janv. 2024, 03:40

To sort a table of latitude and longitude points by undertale yellow distance in JavaScript, you can use the Haversine formula to calculate the great-circle distance between two points on the Earth's surface.

lilycollins9x
Messages : 7
Enregistré le : 09 janv. 2024, 03:00

Re: Conserver un seul point d'intérêt latitude longitude par zone

Message par lilycollins9x » 23 janv. 2024, 10:55

Congratulations,

To sort a latitude and longitude table by distance as the crow flies, you can use the sortBy() JavaScript function. This function takes as a parameter a comparison function that is called for each element of the array. The comparison function will return a negative number if the first element is less than the second element, a positive number if the first element is greater than the second element, and 0 if the two elements are equal.

To calculate the distance the crow flies between two points, you can use the following formulaslope:

distance = Math.sqrt((x1 - x2)² + (y1 - y2)²)
where x1and y1are the abscissa coordinates and coordinates of the first point, and x2are y2the abscissa coordinates and coordinates of the second point.

Répondre