SQL Server — SQLServer PHP для GeoJSON

Попытка написать страницу 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] …..

1

Решение

Вы можете разобрать их, используя 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
)
)

Вы можете увидеть полную сделку здесь

https://3v4l.org/ecLFJ

Тогда вы сможете подключить его туда, где вам это нужно, и json_encode так далее…

[["-77.083060324719384","42.15108721847372"],["-77.087448024528669","42.151768518696542"]]

Конечно, я работаю только с тем небольшим вкладом, который у вас был в вопросе, но это может сработать.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]