Bagaimana untuk mengekod dan menyahkod geoJson dengan betul yang mengandungi tatasusunan dan objek dalam php
P粉739079318
P粉739079318 2024-01-28 23:48:55
0
1
442

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粉739079318
P粉739079318

membalas semua(1)
P粉766520991

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 );
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan