Я пытаюсь создать шейп-файл с библиотекой PhpMyAdmin\ShapeFile
.
Я последовал примеру в репозитории проекта Github, но я хотел бы создать шейп-файл внутри элементов многоугольника, а не внутри точечных элементов.
Мне также интересно, могут ли координаты шейп-файла быть десятичными в лат. (EPSG: 4326 WGS84) или мне нужно их преобразовать.
Файл, который я создаю, не работает в QGIS (ошибок нет, но он не отображается).
Вот мой PHP-код:
$xmin=0;
$xmax=0;
$ymin=0;
$ymax=0;
$sql = "SELECT poli FROM poligons WHERE ID = '$id'";
$res = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_array($res)) {
$poli = json_decode($row[0],true);
foreach ($poli["geometry"][0] as $vert) {
if ($xmin==0 || $vert[1]< $xmin) $xmin = $vert[1];
if ($xmax==0 || $vert[1]> $xmax) $xmax = $vert[1];
if ($ymin==0 || $vert[0]< $ymin) $ymin = $vert[0];
if ($ymax==0 || $vert[0]> $ymax) $ymax = $vert[0];
}
}
$shp = new ShapeFile(5, [
'xmin' => $xmin,
'ymin' => $ymin,
'xmax' => $xmax,
'ymax' => $ymax,
]);
$res = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_array($res)) {
$poli = json_decode($row[0],true);
// I don't know if I should pass 1 or 5 to create new shape record
// in next line: 5 is for polygons 1 for points...
$record = new ShapeRecord(5);
$firstVertex=true;
$record_to_repeat=null;
foreach ($poli["geometry"][0] as $vert) {
$record->addPoint([
'x' => $vert[1],
'y' => $vert[0],
]);
if ($firstVertex) {
$record_to_repeat = $record;
$firstVertex = false;
}
$shp->addRecord($record);
}
$shp->addRecord($record_to_repeat);
}
$shp->saveToFile("extraction_$id.*");
Вот json, извлеченный из одной записи моей таблицы (содержимое переменной $ poli). Я подтверждаю, что вершины правильно извлечены из строкового файла Json. Shp, похоже, сгенерирован с ними внутри (ошибки не возникают в $record->addPoint(...)
и $shp->addRecord(...)
):
{
"type": "POLYGON",
"id": "1",
"title": "303",
"geometry": [
[
["43.91270111368998", "10.763205885887146"],
["43.91284216823677", "10.762763321399689"],
["43.912703045946344", "10.762830376625061"],
["43.912710774970996", "10.762543380260468"],
["43.91272623301729", "10.761880874633789"],
["43.912737826549396", "10.761044025421143"],
["43.912919458257605", "10.760885775089264"],
["43.91306244453156", "10.761824548244476"],
["43.91320349822197", "10.761883556842804"],
["43.91304698657257", "10.762304663658142"],
["43.91313586978198", "10.762417316436768"],
["43.913207362701925", "10.76258897781372"],
["43.91293491624973", "10.763594806194305"],
["43.91279772642933", "10.763554573059082"],
["43.91278033614783", "10.763546526432037"],
["43.91269531692063", "10.763541162014008"]
]
]
}