Rumah  >  Soal Jawab  >  teks badan

Bagaimana untuk mengekod dan menyahkod geoJson dengan betul yang mengandungi tatasusunan dan objek dalam php

Bagaimana untuk menyahkod geoJson dengan betul yang mengandungi kedua-dua tatasusunan dan rentetan dalam php.ini? Masalah yang saya hadapi ialah membacanya dari pangkalan data dan menukarnya kembali kepada json, tatasusunan koordinat hilang.

Saya sedang membacanya daripada fail geoJson.json (sah) dan menyimpannya dalam pangkalan data mysql menggunakan: $jsondata = json_decode($srcfile, true); masih mempunyai tatasusunan koordinat yang lengkap.

Data asal kelihatan seperti ini: (kecuali terdapat 1000 koordinat)

{
 "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"
 }

}

Apabila saya menariknya daripada pangkalan data dan menjalankan json_encode($data) padanya, output kelihatan seperti ini - semua koordinat tiada.

{
     "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. Adakah cara yang lebih baik untuk menyimpannya supaya lebih mudah digunakan? (Saya menggunakan modx xpdo dan ia nampaknya tidak menyokong jenis pangkalan data JSON dalam model - ia hanya menukarnya kepada teks panjang)

atau

  1. Apakah cara yang betul untuk mengekodnya kembali ke json yang sah dan mengekalkan koordinatnya?

Kemas kini - Kaedah import ditambah

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;

    }

Dapatkan semula data:

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 hari yang lalu428

membalas semua(1)saya akan balas

  • P粉766520991

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

    Nah, peliknya, MODX mengacaukan saya... MODX menggunakan kurungan segi empat sama dua untuk menunjukkan kod yang perlu diproses atau disertakan - iaitu

    [[nama coretan kod]] [[*serta_nama_ketulan]]

    Tunggu

    Apabila ia melihat struktur koordinat:

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

    Ia pada asasnya menerangkannya sebagai:

    "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

    Jadi penyelesaian sebenar ialah:

    json_encode($feature, JSON_PRETTY_PRINT );

    balas
    0
  • Batalbalas