用于读取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生成什么?
对于每个功能(节点/路线/关系),它生成一个包含元素属性(如 id
、lat
或 timestamp
)的字典以及2个额外项:键 "type"
保存 "node"/"way"/"relation"
和键 "tag"
保存一个包含功能标签的字典(此字典可能为空)。
此外,节点将包含键 "lat"
和 "lon"
以保存节点坐标,路线将包含键 "nd"
以保存由该路线引用的所有节点_id的列表,关系将包含一个键 "member"
以保存每个成员属性的字典列表。
几乎所有属性都以字符串形式返回,但以下属性除外:
id
、ref
、version
、changeset
、uid
和changeset_count
→ intlat
、lon
→ floatopen
和visible
→ booltimestamp
→ aware datetime.datetime 项目。
数据验证
osmiter 几乎不执行数据验证,因此可能接收到没有节点的路线、没有成员的关系、空标签值、无效坐标、对不存在项目的引用或重复的 ID※。
但是,这里做出了一些数据假设
- 每个要素都有一个
id
属性。
(※) 对于 OSM PBF 文件,如果对象缺少 ID,则根据 osmformat.proto 定义将分配-1
,这可能导致多个具有相同 ID-1
的对象。 - 每个节点都必须定义
lat
和lon
。 - 在属性类型转换表上定义的每个属性都必须可转换为其类型。
因此,id == 0x1453
、changeset_count == AAAAAA
、ref == 12.433
或lat == 1.23E+10
将引发异常;
timestamp
值必须是 ISO8601 兼容的或由整数表示的纪元时间。 - 布尔属性只有在设置为
true
(不区分大小写)时才被认为是真实的。值1
、on
、yes
、TRUE
都将评估为 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的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 96bf468b79a11926d5fa56e4b2543f104765cbe366221d1903e8d5ef9c91accc |
|
MD5 | ae2024861dc2f1f96ce794e4e5ae0c91 |
|
BLAKE2b-256 | 90fe9ff251765d6bdb979f645079d166f8741f0165b4b01e44303c618b1773f2 |
osmiter-1.3.1-py3-none-any.whl的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | bbd26ed1532df84c407521a8589cd7f640a2c93b4b6390dd22cd3252f83eb08b |
|
MD5 | e549d8b1385c2651deb02a266ee198a9 |
|
BLAKE2b-256 | 127d09ce36209de8412df23dffa2e0c6326f19dff9a38fde4cea7368e812bb19 |