如何将2个JSON文件合并为一个JSON FeatureCollection

时间:2019-04-13 12:10:17

标签: php json merge geojson

我有两个JSON文件,每个文件包含一个具有相同结构但数据不同的FeatureCollection。我正在尝试将它们合并为一个JSON文件,作为包含所有数据的单个FeatureCollection。我几乎可以做到这一点,但是在文件的开头重复了“ FeatureCollection”,使其成为无效的JSON。

我认为这与我对两个文件进行JSON编码的方式有关,然后在我将它们组合时再次进行编码,但是在尝试了各种组合的一天后,我仍无法弄清楚。 / p>

这是创建第一个JSON文件(其中$ results由数据库查询生成)的代码:

$geojson = array( 'type' => 'FeatureCollection', 'features' => array());

while ( $results->fetch() ) {
    $feature = array(
        'type' => 'Feature', 
              'properties' => array(
            'name' => $results->field('name')
            ),
      'geometry' => array(
        'type' => 'Point',
        'coordinates' => array((float)$results->field('long'), (float)$results->field('lat'))
            )
        );
    array_push($geojson['features'], $feature);
};

// // Create JSON file
    $fp = fopen('file1.json', 'w');
fwrite($fp, json_encode($geojson));
fclose($fp);

以相同的方式创建第二个文件(file2.json),例如:

$geojson = array( 'type' => 'FeatureCollection', 'features' => array());

while ( $results->fetch() ) {
    $feature = array(
        'type' => 'Feature', 
              'properties' => array(
            'name' => $results->field('name')
            ),
      'geometry' => array(
        'type' => 'Point',
        'coordinates' => array((float)$results->field('long'), (float)$results->field('lat'))
            )
        );
    array_push($geojson['features'], $feature);
};

// // Create JSON file
    $fp = fopen('file2.json', 'w');
fwrite($fp, json_encode($geojson));
fclose($fp);

然后我将使用以下代码将它们组合起来:

    $jsonString = file_get_contents('file2.json');
    $jsonString2 = file_get_contents('file1.json');   
    $data = json_decode($jsonString, true);
    $data2 = json_decode($jsonString2, true);

    $op = array_merge_recursive( $data, $data2 );

    $fp = fopen('file3.json', 'w');
    fwrite($fp, json_encode($op));
    fclose($fp); 

生成的文件主要很好,它包含我需要的所有数据,并且格式正确,除了文件开头具有以下事实:

{"type":["FeatureCollection","FeatureCollection"],"features":[{"type":"Feature","properties":{"name":"......etc

代替:

{"type":["FeatureCollection"],"features":[{"type":"Feature","properties":{"name":"......etc

我不知道为什么开头有两个“ FeatureCollection”实例,或者怎么只产生一个实例。

1 个答案:

答案 0 :(得分:1)

合并两组数据时,它们各自都有自己的“类型”副本,合并将创建包含这两项的输出。

考虑...

$data = [ "type" => "FeatureCollection"];
$data2 = [ "type" => "FeatureCollection"];

$op = array_merge_recursive( $data, $data2 );

print_r($op);

这将输出

Array
(
    [type] => Array
        (
            [0] => FeatureCollection
            [1] => FeatureCollection
        )

)

这是两个源数组的组合。

解决此问题的一种简单方法是重新设置数组中的值,此代码仅选择第一个值并将其设置为该值。

$op["type"] = $op["type"][0];
print_r($op);

会给...

Array
(
    [type] => FeatureCollection
)