Создайте действительный шейп-файл с PhpMyAdmin \ ShapeFile - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь создать шейп-файл с библиотекой 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"]
        ]
    ]
}
...