Как объединить 2 JSON-файла в одну JSON FeatureCollection - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть два файла JSON, каждый из которых содержит FeatureCollection с одинаковой структурой, но разными данными.Я пытаюсь объединить их в один файл JSON в виде единой коллекции FeatureCollection, содержащей все данные.Мне почти удалось это сделать, но «FeatureCollection» повторяется в начале файла, что делает его недействительным JSON.

Я думаю, что это как-то связано с тем, как я JSON кодирую два файлапо отдельности, а затем снова, когда я их объединяю, но после дня попыток различных комбинаций мне не удалось выяснить это.

Это код, который создает первый файл 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 Ответ

1 голос
/ 13 апреля 2019

Когда вы объединяете два набора данных, оба с собственной копией «type», объединение создаст вывод, содержащий оба элемента.

Рассмотрим ...

$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
)
...