У меня есть laravel, выводящий следующее:
[ { "id": 3, "lat": "38.8978378", "lon": "-77.0365123" }, { "id": 4, "lat": "44.8", "lon": "1.7" }, { "id": 22, "lat": "37.59046", "lon": "-122.348994" } ]
Я бы хотел, чтобы это был формат geoJson:
{ "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": {"type": "Point", "coordinates": [lat, lon]}, "properties": { "name": "value" } } ] }
Я знаю, что мне нужен какой-то цикл. Но я не уверен, как структурировать его в PHP. Любое руководство будет высоко оценено. Попытка создать приложение карты, которое может иметь несколько тысяч маркеров на мировом уровне. Я уже думаю о кластеризации, но нужно пройти этот базовый шаг.
Благодаря!
Я изменил цикл, расположение было немного выключено. И превратили его в функцию, если кому-то интересно:
function geoJson ($locales) { $original_data = json_decode($locales, true); $features = array(); foreach($original_data as $key => $value) { $features[] = array( 'type' => 'Feature', 'geometry' => array('type' => 'Point', 'coordinates' => array((float)$value['lat'],(float)$value['lon'])), 'properties' => array('name' => $value['name'], 'id' => $value['id']), ); }; $allfeatures = array('type' => 'FeatureCollection', 'features' => $features); return json_encode($allfeatures, JSON_PRETTY_PRINT); }
Просто используйте json_decode()
для исходных значений и перестройте / восстановите новый. Рассмотрим этот пример:
$original_json_string = '[{"id": 3,"lat": "38.8978378","lon": "-77.0365123"},{"id": 4,"lat": "44.8","lon": "1.7"},{"id": 22,"lat": "37.59046","lon": "-122.348994"}]'; $original_data = json_decode($original_json_string, true); $coordinates = array(); foreach($original_data as $key => $value) { $coordinates[] = array('lat' => $value['lat'], 'lon' => $value['lon']); } $new_data = array( 'type' => 'FeatureCollection', 'features' => array( 'type' => 'Feature', 'geometry' => array('type' => 'Point', 'coordinates' => $coordinates), 'properties' => array('name' => 'value'), ), ); $final_data = json_encode($new_data, JSON_PRETTY_PRINT); print_r($final_data);
$final_data
должно давать что-то вроде:
{ "type": "FeatureCollection", "features": { "type": "Feature", "geometry": { "type": "Point", "coordinates": [ { "lat": "38.8978378", "lon": "-77.0365123" }, { "lat": "44.8", "lon": "1.7" }, { "lat": "37.59046", "lon": "-122.348994" } ] }, "properties": { "name": "value" } } }