franksierra/osm-pbf

与 Open Street Map 的 .osm.pbf 压缩文件协同工作。

1.0.4 2024-02-05 14:17 UTC

This package is auto-updated.

Last update: 2024-09-05 15:32:49 UTC


README

Software License Latest Version on Packagist Total Downloads

此包让您能够处理 Open Street Maps 协议缓冲文件,.osm.pbf。我从 https://download.geofabrik.de/ 获取它们,并且还没有尝试处理 planet.osm

安装

使用 composer 需要此包。

composer require franksierra/osm-pbf

使用方法

您可以使用 Reader 类读取 osm.pbf 文件

use OsmPbf\Reader;

创建一个指向 .osm.pbf 文件的二进制句柄,并将其传递给 Reader() 构造函数

$file_handler = fopen("PathToFile.osm.pbf", "rb");
$pbfreader = new Reader($file_handler);

调用函数 readFileHeader() 获取正在读取的文件的一些有用信息

$file_header = $pbfreader->readFileHeader();

获取边界框的函数

$file_header->getBbox()->getLeft();
$file_header->getBbox()->getBottom();
$file_header->getBbox()->getRight();
$file_header->getBbox()->getTop();

获取复制品信息的函数(WIP:更新数据集)

$file_header->getOsmosisReplicationTimestamp();
$file_header->getOsmosisReplicationSequenceNumber();
$file_header->getOsmosisReplicationBaseUrl();

开始数据读取:您可以使用 skipToBlock($index) 函数从任何给定索引开始(可能恢复失败的操作)

$pbfreader->skipToBlock(0); 
while ($pbfreader->next()) {
    $elements = $pbfreader->getElements();
    $this->processElements($elements);
}

processElements($elements) 函数应由您自己实现,但可能类似于以下内容

private function processElements($elements)
    {
        $type = $elements['type'];

        $records = [];
        $tags = [];
        $nodes = [];
        $relations = [];

        foreach ($elements['data'] as $element) {
            $insert_element = [
                'id' => $element['id'],
                'changeset_id' => $element['changeset_id'],
                'visible' => $element['visible'],
                'timestamp' => $element['timestamp'],
                'version' => $element['version'],
                'uid' => $element['uid'],
                'user' => $element['user'],
            ];
            if ($type == "node") {
                $insert_element["latitude"] = $element["latitude"];
                $insert_element["longitude"] = $element["longitude"];
            }
            if (isset($element["timestamp"])) {
                $insert_element["timestamp"] = str_replace("T", " ", $element["timestamp"]);
                $insert_element["timestamp"] = str_replace("Z", "", $element["timestamp"]);
            }
            $records[] = $insert_element;

            foreach ($element["tags"] as $tag) {
                $insert_tag = [
                    $type . "_id" => $element["id"],
                    "k" => $tag["key"],
                    "v" => $tag["value"]
                ];
                $tags[] = $insert_tag;
            }
            foreach ($element["nodes"] as $node) {
                $insert_node = [
                    $type . "_id" => $element["id"],
                    "node_id" => $node["id"],
                    "sequence" => $node["sequence"]
                ];
                $nodes[] = $insert_node;
            }

            foreach ($element["relations"] as $relation) {
                $insert_relation = [
                    $type . "_id" => $element["id"],
                    "member_type" => $relation["member_type"],
                    "member_id" => $relation["member_id"],
                    "member_role" => $relation["member_role"],
                    "sequence" => $relation["sequence"]
                ];
                $relations[] = $insert_relation;
            }
        }
    }