Maison  >  Questions et réponses  >  le corps du texte

Comment encoder et décoder correctement geoJson contenant des tableaux et des objets en php

Comment décoder correctement le geoJson contenant à la fois un tableau et une chaîne dans php.ini ? Le problème que j'ai est de le lire à partir de la base de données et de le reconvertir en json, le tableau de coordonnées est perdu.

Je le lis actuellement à partir d'un fichier geoJson.json (valide) et je le stocke dans une base de données mysql en utilisant : $jsondata = json_decode($srcfile, true); ce qui fonctionne très bien - il est dans la base de données (mysql) et semble correct et a toujours le tableau de coordonnées complet.

Les données originales ressemblent à ceci : (sauf qu'il y a 1000 coordonnées)

{
 "type": "Feature",
 "geometry": {
      "coordinates": [
           [
                [
                     [
                          -64.59727115377405,
                          60.30061384178721
                     ],
                     [
                          -64.52477086139639,
                          60.29980770242815
                     ]
                ]
           ],
           [
                [
                     [
                          -64.59727115377405,
                          60.30061384178721
                     ],
                     [
                          -64.52477086139639,
                          60.29980770242815
                     ]
                ]
           ]

      ],
      "type": "MultiPolygon"
 },
 "properties": {
      "prov_type": "province",
      "prov_code": "24",
      "prov_name_fr": "Qu\u00e9bec",
      "geo_point_2d": [
           53.3945173679,
           -71.7823138976
      ],
      "prov_name_en": "Quebec",
      "year": "2019",
      "prov_area_code": "CAN"
 }

}

Lorsque je l'extrait de la base de données et que j'exécute json_encode($data) dessus, le résultat ressemble à ceci : toutes les coordonnées sont manquantes.

{
     "type":"Feature",
     "geometry":{
          "coordinates":,
          "type":"MultiPolygon"
     },
     "properties":{
          "prov_type":"province",
          "prov_code":"35",
          "prov_name_fr":"Ontario",
          "geo_point_2d":[50.4486575765,-86.0470011166],
          "prov_name_en":"Ontario",
          "year":"2019",
          "prov_area_code":"CAN"
     }
}
  1. Y a-t-il une meilleure façon de le stocker pour qu'il soit plus facile à utiliser ? (J'utilise modx xpdo et il ne semble pas prendre en charge le type de base de données JSON dans le modèle - il le convertit simplement en texte long)

ou

  1. Quelle est la bonne façon de le recoder en json valide et de conserver les coordonnées intactes ?

Mise à jour - Méthode d'importation ajoutée

public function importGeodata()
    {

        // $srcfile = file_get_contents('/var/www/vhosts/mcgill.local/src/core/components/mcgill/data/provinces.json');

        $srcfile = file_get_contents('/var/www/vhosts/mcgill.local/src/core/components/mcgill/data/us-states.json');

        $jsondata = json_decode($srcfile, true);

        // echo '<pre>';print_r($jsondata); echo '</pre>'; 


        foreach($jsondata['features'] as $feature)
        {
            // $search = $feature['properties']['prov_name_en']; // FOR CANADA
            $search = $feature['properties']['NAME']; // FOR USA
            

            if(!$updateObj = $this->modx->getObject('CatalogStates', array('name' => $search)))
            {
                echo '<br>Could not find object: ' . $search;
            }else{
                echo '<br>Found  object: '.$search;

  
                $updateObj->set('feature', json_encode(array($feature)));

                if(!$updateObj->save())
                {
                    echo '<br>Error saving object: ' . $search;
                }

            }

        }

        return;

    }

Récupérer des données :

public function getGeoJson()
      {

           $criteria = $this->modx->newQuery('CatalogStates');

           $criteria->where([
                'id:IN' => array(1,2),
           ]);

           if($states = $this->modx->getCollection('CatalogStates',$criteria)) // returns an array of objects
           {
                foreach($states as $state)
                {
                     $feature = $state->get('feature');
                     $coordinates = $feature['geometry']['coordinates'];
                     print_r($coordinates); // this returns the coordinates array
                     echo json_encode($coordinates); // this returns nothing!?
                }
           }
      }

P粉739079318P粉739079318288 Il y a quelques jours430

répondre à tous(1)je répondrai

  • P粉766520991

    P粉7665209912024-01-29 17:58:24

    Eh bien, bizarrement, MODX m'a foiré... MODX utilise des doubles crochets pour indiquer le code qui doit être traité ou inclus - c'est-à-dire

    [[nom de l'extrait de code]] [[*include_chunk_name]]

    Attendez

    Quand il voit la structure des coordonnées :

    "coordinates": [
           [
                [
                     [
                          -64.59727115377405,
                          60.30061384178721
                     ],
                     [
                          -64.52477086139639,
                          60.29980770242815
                     ]
                ]
           ],
           [
                [
                     [
                          -64.59727115377405,
                          60.30061384178721
                     ],
                     [
                          -64.52477086139639,
                          60.29980770242815
                     ]
                ]
           ]
    
      ]

    Cela l'explique essentiellement comme :

    "coordinates": [[ // try to run a code snip here
                // run this code snip (and fail)
                [[-64.59727115377405,60.30061384178721], 
                // give up trying to output anything till we find a matching closing brace

    La vraie solution est donc :

    json_encode($feature, JSON_PRETTY_PRINT );

    répondre
    0
  • Annulerrépondre