OpenStreetMap modification du code pour concevoir un trajet

CR16_Padawan Messages postés 61 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 22 septembre 2024 - 20 avril 2024 à 09:18
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 - 3 mai 2024 à 09:49

Bonjour à tous,

j'utilise dans mon appli une MapView avec OpenStreetMap(OSM). Sa fonction est d'établir un trajet en fonction d'un point de départ et d'arrivée. Le code que j'utilise est basé sur des points GPS, comme ceci:

GeoPoint startPoint = new GeoPoint(48.549999, 2.11667);
/...
GeoPoint endPoint = new GeoPoint(48.700001, 2.3);

Mon problème est, que mon appli utilise des noms de ville. Je dois donc, soit obtenir les coordonnées GPS de la ville choisi par l'utilisateur ou modifier le code pour que le programme le fasse automatiquement.

Je pensais faire un peu comme ça:

GeoPoint startPoint = new GeoPoint(preferenceManager.getString(Constants.KEY_MY_LATITUDE), preferenceManager.getString(Constants.KEY_MY_LONGITUDE);
/...
GeoPoint endPoint = new GeoPoint(preferenceManager.getString(Constants.KEY_OTHER_LATITUDE), preferenceManager.getString(Constants.KEY_OTHER_LONGITUDE);

Cela implique du coup d'avoir les coordonnées de chaque ville!!! ????????

Ca me parait compliqué donc je suppose qu'il va falloir que je modifie le code pour que ça ressemble approximativement à ça:

GeoPoint startPoint = new GeoPoint(preferenceManager.getString(Constants.KEY_MY_TOWN);
/...
GeoPoint endPoint = new GeoPoint(preferenceManager.getString(Constants.KEY_OTHER_TOWN);

A mon avis il faudra utiliser autre chose que GeoPoint.

J'ai passé des jours à chercher mais en vain.

Si quelqu'un a une proposition.

Merci d'avance.


A voir également:

7 réponses

BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 909
22 avril 2024 à 09:30

Hello,

Plutôt que de stocker les coordonnés de toutes les communes (de France ? International ?), je te conseille d'utiliser un webservice qui te fourni déjà ce type d'information. Celle-ci, par exemple, peut peut-être répondre à ton besoin:

https://adresse.data.gouv.fr/api-doc/adresse


0
CR16_Padawan Messages postés 61 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 22 septembre 2024 1
22 avril 2024 à 19:40

Bonjour Bruno,

Effectivement ça pourrait être plus simple.

Pour schématiser, j'ai une mapView et le nom d'une ville que je stock dans une Constants. La ville est modifiable par l'utilisateur à son bon vouloir via une activity prévue à cet effet.

Le but de mon appli est que lorsque l'utilisateur ouvre la carte, la vue ce centre automatiquement sur la ville stockée donc si je comprend bien il faudrait envoyer une requete vers le site https://adresse.data.gouv.fr/api-doc/adresse pour obtenir ce GeoJson:

{
     "type":"FeatureCollection",
     "version":"draft",
     "features":[
        {
           "type":"Feature",
           "geometry":{
              "type":"Point",
              "coordinates":[
                 2.290084,
                 49.897443
              ]
           },
           "properties":{
              "label":"8 Boulevard du Port 80000 Amiens",
              "score":0.49159121588068583,
              "housenumber":"8",
              "id":"80021_6590_00008",
              "type":"housenumber",
              "name":"8 Boulevard du Port",
              "postcode":"80000",
              "citycode":"80021",
              "x":648952.58,
              "y":6977867.25,
              "city":"Amiens",
              "context":"80, Somme, Hauts-de-France",
              "importance":0.6706612694243868,
              "street":"Boulevard du Port"
           }
        }
     ],
     "attribution":"BAN",
     "licence":"ODbL 1.0",
     "query":"8 bd du port",
     "limit":1
  }

mais après comment utiliser ces données dans mon appli pour que ça fasse ce que je veux (ex: extraire les coordonnées GPS)?

En parallèle je me suis renseigné ailleurs (pour être honnête) et on m'a fait télécharger ADMIN EXPRESS mais je n'ai aucune idée de comment l'utiliser.

Ca te parle?


0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 909
23 avril 2024 à 11:41

mais après comment utiliser ces données dans mon appli pour que ça fasse ce que je veux (ex: extraire les coordonnées GPS)?

Il faut parser le JSON que tu reçois (regarde GSON) pour récupérer les données GPS dont tu as besoin, dans le noeud "geometry". Je vois qu'il y a une lib qui ferait le job: https://github.com/filosganga/geogson

En parallèle je me suis renseigné ailleurs (pour être honnête) et on m'a fait télécharger ADMIN EXPRESS mais je n'ai aucune idée de comment l'utiliser.

Jamais utilisé pour ma part. J'imagine que l'on t'a demandé de télécharger ce jeu de données pour pouvoir l'embarquer dans l'app et ainsi éviter un appel webservice. Perso, je préfère faire appel à un webservice. 


0
CR16_Padawan Messages postés 61 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 22 septembre 2024 1
Modifié le 24 avril 2024 à 16:15

Bonjour Bruno,

merci pour ce lien. J'ai récupéré les différents fichiers (26) maintenant il faut que j'essaie de comprendre comment ça fonctionne. 

J'ai essayer de trouver des infos sur comment Geocoder mais sur ce site https://developer.android.com/reference/android/location/Geocoder beaucoup de chose sont déconseillé en API 33.

Je suppose que le point de départ pour faire ma requête vers le site est mon activité Map.

J'apprécierai beaucoup ton aide (encore).

Merci d'avance.


0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
CR16_Padawan Messages postés 61 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 22 septembre 2024 1
30 avril 2024 à 17:07

bonjour,

voici où j'en suis.

J'ai inséré un .Json dans un fichier Assets

[
...
        {
            "insee_code": "98613",
            "city_code": "uvea",
            "zip_code": "98600",
            "label": "uvea",
            "latitude": "-13.281862538",
            "longitude": "-176.161927918",
            "department_name": "wallis-et-futuna",
            "department_number": "986",
            "region_name": "wallis-et-futuna",
            "region_geojson_name": "Wallis-et-Futuna"
        }
...
]

j'utilise ce code qui fonctionne plutôt bien mais je rencontre un petit soucis.

        TextView txtCities=findViewById(R.id.txtCities);
        TextView txtSize=findViewById(R.id.txtSize);
        EditText edtCities=findViewById(R.id.edtCities);

        try{
            //file name should same as in assets folder with  .json extension


            //load json
            InputStream jsonFile=getAssets().open("cities.json");
            int size= jsonFile.available();
            byte[] buffer=new byte[size];
            jsonFile.read(buffer);
            jsonFile.close();

            //now we will fetch json file
            String json,city_code;
            int max,zip_code;
            String latitude,longitude;

            json= new String(buffer, StandardCharsets.UTF_8);
            JSONArray jsonArray=new JSONArray(json);
            max=jsonArray.length();

            //now fetch each json object

            for (int i = 0; i < max; i++) {

                JSONObject jsonObject = jsonArray.getJSONObject(i);
                zip_code = jsonObject.getString("zip_code");
                city_code = jsonObject.getString("city_code");

                if (city_code.equals("montville")) {

                    city_code = jsonObject.getString("city_code");
                    zip_code = jsonObject.getInt("zip_code");

                    latitude = (jsonObject.getString("latitude"));
                    longitude = (jsonObject.getString("longitude"));

                    txtCities.setText("city_code: " + city_code + "\n" + "zip_code: " + zip_code + "\n" +
                            "latitude: " + latitude + "\n" + "longitude: " + longitude);
                    txtSize.setText("Size_max: " + max +"\n"+ "Size_i: " + i);
                    break;
                }

            }
        }catch (Exception e){
            Log.e(TAG, "loadjson: error" + e );
        }

j'ai mis une condition pour arrêter la recherche lorsque la cible est trouvée

if (city_code.equals("montville")) {

celle-ci ne fonctionne que si c'est écrit en dur comme au-dessus.

j'ai essayé comme ça mais ça ne fonctionne pas.

if (preferenceManager.getString(Constants.KEY_POSTAL).equals(zip_code)){
if ((city_code.equals(preferenceManager.getString(Constants.KEY_TOWN))) {
if ((edtCities.equals(city_code)) {

De plus le fichier .Json est assez lourd(17.38MB) du coup j'ai ce message:

The file size(17.38MB) exceeds the configured limit (2.56MB). Code insight features are not available.

Merci d'avance pour votre participation.

0
CR16_Padawan Messages postés 61 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 22 septembre 2024 1
30 avril 2024 à 19:07

Re,

j'ai trouvé la solution pour utiliser le contenu de l'EditText:

String townName=binding.edtTown.getText().toString();

(edtCities.equals(city_code)){

il fallait juste faire un .getText().toString()

Par contre pour le poids du fichier est-ce que ça peut poser problème?


0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 909
3 mai 2024 à 09:49

Hello,

Le poids du fichier peut effectivement poser problème. De mémoire, il est "difficile" de publier une app > 50Mo sur le store. De plus, ça me semble beaucoup trop lourd pour "juste" avoir une liste de villes. Tu dois avoir 75% d'infos inutiles...

Concernant la saisie, il faut que tu implémentes l'auto-complétion. C'est-à-dire que dès que l'utilisateur entre 2 ou 3 caractères, tu requêtes ta source de données pour ne lui proposer que les villes qui commencent par les caractères saisis.

Après une petite recherche, je te propose d'utiliser le endpoint /communes de cette API: https://api.gouv.fr/documentation/api-geo: il te suffit de mettre 3 lettres dans le champ "nom" pour avoir toutes les communes Françaises commençant par ces caractères.

A toi de voir.


0