跳转到主要内容

用于读取OSM XML/GZ/BZ2/PBF文件的库

项目描述

osmiter

一个简单的用于解析OSM数据的库。支持简单的OSM XML文件以及OSM GZ、OSM BZ2和OSM PBF。

请注意,osmiter使用Google的protobuf库,它是用纯Python编写的,速度并不快。

示例用法

import osmiter

shop_count = 0

for feature in osmiter.iter_from_osm("some_osm_file.osm"):
    if feature["type"] == "node" and "shop" in feature["tag"]:
        shop_count += 1

print(f"this osm file containes {shop_count} shop nodes")

osmiter生成什么?

对于每个功能(节点/路线/关系),它生成一个包含元素属性(如 idlattimestamp)的字典以及2个额外项:键 "type" 保存 "node"/"way"/"relation" 和键 "tag" 保存一个包含功能标签的字典(此字典可能为空)。

此外,节点将包含键 "lat""lon" 以保存节点坐标,路线将包含键 "nd" 以保存由该路线引用的所有节点_id的列表,关系将包含一个键 "member" 以保存每个成员属性的字典列表。

几乎所有属性都以字符串形式返回,但以下属性除外:

  • idrefversionchangesetuidchangeset_count → int
  • latlon → float
  • openvisible → bool
  • timestampaware datetime.datetime 项目。

数据验证

osmiter 几乎不执行数据验证,因此可能接收到没有节点的路线、没有成员的关系、空标签值、无效坐标、对不存在项目的引用或重复的 ID※。

但是,这里做出了一些数据假设

  1. 每个要素都有一个 id 属性。
    (※) 对于 OSM PBF 文件,如果对象缺少 ID,则根据 osmformat.proto 定义将分配 -1,这可能导致多个具有相同 ID -1 的对象。
  2. 每个节点都必须定义 latlon
  3. 在属性类型转换表上定义的每个属性都必须可转换为其类型。
    因此,id == 0x1453changeset_count == AAAAAAref == 12.433lat == 1.23E+10 将引发异常;
    timestamp 值必须是 ISO8601 兼容的或由整数表示的纪元时间。
  4. 布尔属性只有在设置为 true(不区分大小写)时才被认为是真实的。值 1onyesTRUE 都将评估为 False。

每个元素的最低要求

最基本节点

{
    "id": int,
    "type": "node",
    "lat": float,
    "lon": float,
    "tag": Dict[str, str], # May be empty
}

最基本路线

{
    "id": int,
    "type": "way",
    "tag": Dict[str, str], # May be empty
    "nd": List[int],
}

最基本关系

{
    "id": int,
    "type": "relation",
    "tag": Dict[str, str], # May be empty
    "member": List[ dict ]
}

示例元素

请参阅相应的 OSM XML 示例

{
    "type": "node",
    "tag": {}
    "id": 298887269,
    "lat": 54.0901746,
    "lon": 12.2482632,
    "user": "SvenHRO",
    "uid": 46882,
    "visible": True,
    "version": 1,
    "changeset": 676636,
    "timestamp": datetime.datetime(2008, 9, 21, 21, 37, 45, tzinfo=datetime.timezone.utc)
}
{
    "type": "node",
    "tag": {"name": "Neu Broderstorf", "traffic_sign": "city_limit"},
    "id": 1831881213,
    "version": 1,
    "changeset": 12370172,
    "lat": 54.0900666,
    "lon": 12.2539381,
    "user": "lafkor",
    "uid": 75625,
    "visible": True,
    "timestamp": datetime.datetime(2012, 7, 20, 9, 43, 19, tzinfo=datetime.timezone.utc),
}
{
    "type": "way",
    "tag": {"highway": "unclassified", "name": "Pastower Straße"},
    "id": 26659127,
    "user": "Masch",
    "uid": 55988,
    "visible": True,
    "version": 5,
    "changeset": 4142606,
    "timestamp": datetime.datetime(2010, 3, 16, 11, 47, 8, tzinfo=datetime.timezone.utc),
    "nd": [292403538, 298884289, 261728686]
}
{
    "type": "relation",
    "tag": {
        "name": "Küstenbus Linie 123",
        "network": "VVW",
        "operator": "Regionalverkehr Küste",
        "ref": "123",
        "route": "bus",
        "type": "route"
    },
    "id": 56688,
    "user": "kmvar",
    "uid": 56190,
    "visible": True,
    "version": 28,
    "changeset": 6947637,
    "timestamp": datetime.datetime(2011, 1, 12, 14, 23, 49, tzinfo=datetime.timezone.utc),
    "member": [
        {"type": "node", "ref": 294942404, "role": ""},
        {"type": "node", "ref": 364933006, "role": ""},
        {"type": "way", "ref": 4579143, "role": ""},
        {"type": "node", "ref": 249673494, "role": ""},
    ]
}

参考


osmiter.iter_from_osm

iter_from_osm(  
    source: Union[str, bytes, os.PathLike, int, IO[bytes]],  
    file_format: Union[str, NoneType] = None,  
    filter_attrs: Union[Iterable[str], NoneType] = None) -> Iterator[dict]

从提供的源文件生成所有项目。

如果源是 str/bytes/os.PathLike(路径),则格式将根据文件扩展名猜测。否则,如果源是 int(文件描述符)或文件类似对象,则必须提供 file_format 参数。

类似文件的源必须在二进制模式下打开。格式必须是 "xml"、"gz"、"bz2"、"pbf" 之一。

osmiter 大部分时间都在解析元素属性。如果只使用特定属性,请将包含所需属性的 Iterable(最好是集合)传递给 filter_attrs 以进行过滤。

无论您在 filter_attrs 中定义什么属性,一些属性始终会被解析

  • "id"、"lat" 和 "lon":对于节点
  • "id":对于路线和关系
  • "type"、"ref" 和 "role":对于成员

filter_attrs 对于 PBF 文件被忽略。


osmiter.iter_from_xml_buffer

iter_from_xml_buffer(
    buff: IO[bytes],
    filter_attrs: Union[Iterable[str], NoneType] = None) -> Iterator[dict]

生成给定 OSM XML 缓冲区内的所有项目。有关 filter_attrs 的说明,请参阅 osmiter.iter_from_osm 文档。


osmiter.iter_from_pbf_buffer

iter_from_pbf_buffer(buff: IO[bytes]) -> Iterator[dict]

生成给定 OSM PBF 缓冲区内的所有项目。


osmiter.parser_xml.iter_from_xml_buffer

osmiter.iter_from_xml_buffer 相同。


osmiter.parser_xml.OSMError

用于表示 XML 数据问题的异常(继承自 RuntimeException)。


osmiter.iter_from_pbf_buffer

iter_from_pbf_buffer(buff: BinaryIO) -> Iterator[dict]

生成给定 OSM PBF 文件内的所有项目。


osmiter.parser_pbf.iter_from_pbf_buffer

osmiter.iter_from_pbf_buffer 相同。


osmiter.parser_pbf.ParserPbf

用于解析 PBF 文件的内部对象。不要使用。


osmiter.parser_pbf.PBFError

用于表示 OSM PBF 文件问题的异常(继承自 RuntimeException)。


许可证

osmiter 在 MIT 许可证下提供,包含在 license.md 文件中。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分发

osmiter-1.3.1.tar.gz (16.6 kB 查看散列值)

上传时间 源代码

构建发行版

osmiter-1.3.1-py3-none-any.whl (17.6 kB 查看散列值)

上传时间 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面