franksierra / osm-pbf
与 Open Street Map 的 .osm.pbf 压缩文件协同工作。
1.0.4
2024-02-05 14:17 UTC
Requires
- php: >=5.6
- ext-zlib: *
- google/protobuf: ^3.15.0
- mdurrant/php-binary-reader: ^1.0
README
此包让您能够处理 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; } } }