Попытка написать страницу PHP, которая будет возвращать GeoJSON с сервера MS Sql.
ОШИБКА msg: элемент геометрии должен быть объектом, но является строкой
вместо.
Каков результат:
[{"type":"Feature","geometry":"\"MULTILINESTRING ((-77.083060324719384 42.15108721847372, -77.087448024528669 42.151768518696542
Мой код:
$sql = "SELECT name, pwl_id, wbcatgry, basin, fact_sheet, geom.STAsText() as geo FROM dbo.total";
while ($res = sqlsrv_fetch_array($stmt,SQLSRV_FETCH_ASSOC)) {
$str = $res['geo'];
$wkt = explode("((",$str);
$msg [] = array(
'type' => 'Feature',
'geometry' => ($res['geo']), //<<<--- where I'm stuck.
// 'geometry' => json_decode($res['geo'], true),
'properties' => array(
"PWL_ID" => $res['pwl_id'],
"Name" => $res['name'],
Я сделал это в MySQL, используя
ST_AsGeoJSON(`geom`) as geo and 'geometry' => json_decode($res['Geo'])
но SQL-сервер не имеет функции AsGeoJSON.
Я думал, что смогу взять геотекст, разобрать его и воссоздать то, что мне нужно, но я надеялся на лучший подход, и я не уверен на 100% в коде синтаксического анализа.
Вывод будет выглядеть так:
{«type»: «Feature», «properties»: {«PWL_ID»: 18, «Name»: «IN787»,},
«geometry»: {«type»: «MultiLineString», «arguments»: [[[
-73.781598476340562, 42.633203605299833], [-73.764907547494587, 42.63285861396318], [-73.75312949415769, 42.639574643901661] …..
Вы можете разобрать их, используя preg_match_all
$string = "MULTILINESTRING ((-77.083060324719384 42.15108721847372, -77.087448024528669 42.151768518696542";
$pattern = '/((-?\d+\.\d+)\s(-?\d+\.\d+))/';
$arr = preg_match_all($pattern,$string,$matches);
print_r($matches);
Какие выводы
Array (
[0] => Array (
[0] => -77.083060324719384 42.15108721847372
[1] => -77.087448024528669 42.151768518696542
)
[1] => Array (
[0] => -77.083060324719384 42.15108721847372
[1] => -77.087448024528669 42.151768518696542
)
[2] => Array (
[0] => -77.083060324719384
[1] => -77.087448024528669
)
[3] => Array (
[0] => 42.15108721847372
[1] => 42.151768518696542
)
)
Я организовал захват таким образом, чтобы получить более простой в использовании результат, и он будет соответствовать только парам координат.
Так что те, что вам нужно, это пункт 2
а также 3
, Остальное довольно тривиально.
Но я решил быть милым,
$len = count($matches[0]);
$coordinates = [];
for($i=0;$i<$len;++$i){
$coordinates[] = [
$matches[2][$i], $matches[3][$i]
];
}
print_r($coordinates);
Какие выводы
Array (
[0] => Array (
[0] => -77.083060324719384
[1] => 42.15108721847372
)
[1] => Array (
[0] => -77.087448024528669
[1] => 42.151768518696542
)
)
Вы можете увидеть полную сделку здесь
Тогда вы сможете подключить его туда, где вам это нужно, и json_encode
так далее…
[["-77.083060324719384","42.15108721847372"],["-77.087448024528669","42.151768518696542"]]
Конечно, я работаю только с тем небольшим вкладом, который у вас был в вопросе, но это может сработать.
Других решений пока нет …