PBF File Reader¶
PBFFileReader
can really quickly parse full OSM extract in the form of *.osm.pbf
file.
It uses DuckDB
with spatial
extension to convert pbf
files into geoparquet
files without GDAL dependency.
Reader can filter objects by geometry and by OSM tags with option to split tags into columns or keep it as a single dictionary.
Caching strategy is implemented to reduce computations, but it can be overriden using ignore_cache
parameter.
Download all buildings in Reykjavík, Iceland¶
Filtering the data with geometry and by tags, with tags in exploded form
import urllib.request
from quackosm import PbfFileReader, geocode_to_geometry
iceland_pbf_url = "https://download.geofabrik.de/europe/iceland-latest.osm.pbf"
iceland_pbf_file = "iceland.osm.pbf"
urllib.request.urlretrieve(iceland_pbf_url, iceland_pbf_file)
('iceland.osm.pbf', <http.client.HTTPMessage at 0x7fd581f18d10>)
reykjavik_geometry = geocode_to_geometry("Reykjavík, IS")
reykjavik_geometry
To filter out buildings, we will utilize format used also in the osmnx
library: a dictionary with keys representing tag keys and values that could be a bool, string or a list of string.
By default, QuackOSM
will return only the tags that are present in the passed filter.
In this example we will select all the buildings using { "building": True }
filter and only building
tag values will be present in the result.
reader = PbfFileReader(
geometry_filter=reykjavik_geometry, tags_filter={"building": True}
)
reykjavik_buildings_gpq = reader.convert_pbf_to_parquet("iceland.osm.pbf")
reykjavik_buildings_gpq
Finished operation in 0:00:17
PosixPath('files/iceland_ae99e3d94b104c32f569e07bbca0718664a35b810b85c9d092c1e9221f26aa22_f2f6702ed375b9cc7c1af2b83286016228f49730ff409f3e255b136a0fcce996_exploded.parquet')
Read those features using DuckDB¶
import duckdb
connection = duckdb.connect()
connection.load_extension("parquet")
connection.load_extension("spatial")
features_relation = connection.read_parquet(str(reykjavik_buildings_gpq))
features_relation
┌─────────────────┬─────────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ feature_id │ building │ geometry │ │ varchar │ varchar │ geometry │ ├─────────────────┼─────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ node/3658949571 │ yes │ POINT (-21.8811836 64.1381114) │ │ way/835072972 │ yes │ POLYGON ((-21.7402294 64.1335215, -21.7400256 64.1335121, -21.7402078 64.1334263, -21.7402521 64.1334282, -21.7402354 64.1334964, -21.7402294 64.1335215)) │ │ way/835072973 │ yes │ POLYGON ((-21.7404391 64.1335062, -21.7402354 64.1334964, -21.7402521 64.1334282, -21.740375 64.1334339, -21.7403795 64.1334159, -21.7404603 64.1334197, -21.7404391 64.1335062)) │ │ way/835072974 │ yes │ POLYGON ((-21.7406428 64.1335163, -21.7405623 64.1335122, -21.7405592 64.1335248, -21.7404756 64.1335209, -21.7404787 64.1335081, -21.7404391 64.1335062, -21.7404603 64.1334197, -21.7406641 64.1334292, -21.7406428 64.1335163)) │ │ way/835072975 │ yes │ POLYGON ((-21.7408408 64.1335496, -21.7407523 64.1335455, -21.7407581 64.1335217, -21.7406428 64.1335163, -21.7406641 64.1334292, -21.7408679 64.1334387, -21.7408408 64.1335496)) │ │ way/835072976 │ yes │ POLYGON ((-21.7412319 64.1337839, -21.7414606 64.1337965, -21.7413371 64.133875, -21.7412076 64.1338679, -21.7412319 64.1337839)) │ │ way/835072977 │ yes │ POLYGON ((-21.7410032 64.1337713, -21.7412319 64.1337839, -21.7412076 64.1338679, -21.7412008 64.1338916, -21.7411025 64.1338862, -21.7411119 64.1338537, -21.7409815 64.1338465, -21.7409988 64.1337866, -21.7410032 64.1337713)) │ │ way/835072978 │ yes │ POLYGON ((-21.7405459 64.1337462, -21.7407746 64.1337587, -21.7407702 64.133774, -21.7407447 64.1338622, -21.7406526 64.1338571, -21.7406616 64.133826, -21.740525 64.1338185, -21.7405459 64.1337462)) │ │ way/835072979 │ yes │ POLYGON ((-21.7381047 64.1341653, -21.7380682 64.1342022, -21.7380357 64.134196, -21.7379905 64.1342416, -21.737783 64.1342024, -21.73782 64.1341651, -21.7378429 64.1341694, -21.7378875 64.1341243, -21.7379258 64.1341316, -21.7381047 64.1341653)) │ │ way/835072980 │ yes │ POLYGON ((-21.7382474 64.1340946, -21.7382104 64.134132, -21.7381778 64.1341258, -21.7381333 64.1341707, -21.7381047 64.1341653, -21.7379258 64.1341316, -21.7379622 64.1340949, -21.737985 64.1340992, -21.7380302 64.1340536, -21.738073 64.1340617, -21.7382474 64.1340946)) │ │ · │ · │ · │ │ · │ · │ · │ │ · │ · │ · │ │ way/105282006 │ residential │ POLYGON ((-21.8163864 64.1121628, -21.8162155 64.1121404, -21.8161779 64.1121952, -21.8159686 64.1121678, -21.8158887 64.1122841, -21.8162488 64.1123312, -21.8163219 64.1122246, -21.8163422 64.1122273, -21.8163864 64.1121628)) │ │ way/105282007 │ residential │ POLYGON ((-21.8152568 64.1118384, -21.8149815 64.1119797, -21.8151918 64.1120578, -21.8152348 64.1120357, -21.8153022 64.1120607, -21.8154742 64.1119723, -21.8153822 64.1119382, -21.815325 64.1119676, -21.8152602 64.1119435, -21.8153776 64.1118832, -21.8152568 64.1118384)) │ │ way/105282009 │ residential │ POLYGON ((-21.8144478 64.1111579, -21.8142819 64.1111721, -21.8143057 64.1112248, -21.8141759 64.111236, -21.814219 64.1113317, -21.8143706 64.1113187, -21.8143469 64.111266, -21.8144909 64.1112536, -21.8144478 64.1111579)) │ │ way/105282010 │ residential │ POLYGON ((-21.8165486 64.111807, -21.8162853 64.1117709, -21.8162531 64.1118157, -21.8161605 64.111803, -21.8161084 64.1118754, -21.8161981 64.1118877, -21.8161921 64.111896, -21.8163236 64.111914, -21.8163179 64.111922, -21.8164142 64.1119352, -21.8164072 64.1119449, -21.8165259 64.1119612, -21.8165876 64.1118755, -21.8165715 64.1118733, -21.8165799 64.1118617, -21.8165156 64.1118529, -21.8165486 64.111807)) │ │ way/105282011 │ residential │ POLYGON ((-21.817395 64.1118341, -21.817188 64.1118332, -21.8171856 64.1119354, -21.8172754 64.1119358, -21.8172746 64.1119706, -21.8175768 64.1119719, -21.8175779 64.1119247, -21.8175648 64.1119247, -21.8175657 64.1118874, -21.8173938 64.1118866, -21.817395 64.1118341)) │ │ way/105282012 │ residential │ POLYGON ((-21.8181433 64.1120749, -21.8179961 64.1120746, -21.8179955 64.1121236, -21.8179007 64.1121233, -21.8179001 64.1121749, -21.8178334 64.1121747, -21.8178318 64.1123016, -21.8179657 64.112302, -21.817966 64.1122779, -21.8180751 64.1122782, -21.818076 64.1122102, -21.8181064 64.1122102, -21.8181074 64.1121343, -21.8181425 64.1121344, -21.8181433 64.1120749)) │ │ way/105282014 │ residential │ POLYGON ((-21.8170366 64.1118126, -21.8169131 64.1118685, -21.8168686 64.1118438, -21.8168154 64.1118675, -21.816678 64.1118054, -21.816682 64.1118511, -21.8166603 64.1118559, -21.816668 64.1118729, -21.8166515 64.1118819, -21.8168647 64.1119765, -21.8170675 64.1118859, -21.8170366 64.1118126)) │ │ way/105282015 │ residential │ POLYGON ((-21.8151308 64.1118339, -21.8150382 64.1117931, -21.8149389 64.1118362, -21.8149654 64.1118478, -21.8148989 64.1118766, -21.8147283 64.1118015, -21.8145456 64.1118807, -21.8148033 64.1119941, -21.8149141 64.1119461, -21.8149016 64.1119406, -21.814967 64.1119123, -21.8149492 64.1119044, -21.8149997 64.1118825, -21.8150091 64.1118866, -21.8151308 64.1118339)) │ │ way/105282017 │ residential │ POLYGON ((-21.8142308 64.1114327, -21.8140089 64.1114744, -21.8140449 64.1115109, -21.8140212 64.1115154, -21.8140629 64.1115577, -21.814084 64.1115537, -21.8141713 64.1116423, -21.8143359 64.1116113, -21.8142558 64.1115301, -21.8143157 64.1115188, -21.8142308 64.1114327)) │ │ way/105333353 │ residential │ POLYGON ((-21.8042289 64.107979, -21.8041014 64.1079628, -21.8041263 64.1079254, -21.8039589 64.1079041, -21.803866 64.1080439, -21.8041609 64.1080813, -21.8042289 64.107979)) │ ├─────────────────┴─────────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ ? rows (>9999 rows, 20 shown) 3 columns │ └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Count all buildings¶
features_relation.count("feature_id")
┌───────────────────┐ │ count(feature_id) │ │ int64 │ ├───────────────────┤ │ 25378 │ └───────────────────┘
Keeping all the tags while filtering the data¶
To keep all of the tags present in the source data, we can use keep_all_tags
parameter. That way we will still return only buildings, but with all of the tags attached.
By default, all of those tags will be kept in a single column as a dict
.
reader.convert_pbf_to_geodataframe("iceland.osm.pbf", keep_all_tags=True)
Finished operation in 0:00:17
tags | geometry | |
---|---|---|
feature_id | ||
node/2975118984 | {'addr:housenumber': '85b', 'addr:postcode': '... | POINT (-21.78329 64.13645) |
way/477378166 | {'addr:city': 'Reykjavík', 'addr:postcode': '1... | POLYGON ((-21.7557 64.133, -21.75478 64.13273,... |
way/477378167 | {'addr:city': 'Reykjavík', 'addr:postcode': '1... | POLYGON ((-21.75443 64.13295, -21.75346 64.133... |
way/478854451 | {'building': 'garages', 'building:levels': '1'... | POLYGON ((-21.88544 64.1484, -21.88529 64.1483... |
way/478854452 | {'building': 'garages', 'building:levels': '1'... | POLYGON ((-21.88524 64.14861, -21.8851 64.1485... |
... | ... | ... |
way/788480020 | {'building': 'garage'} | POLYGON ((-21.88813 64.14531, -21.88804 64.145... |
way/788480021 | {'building': 'garage'} | POLYGON ((-21.88773 64.14524, -21.88775 64.145... |
way/788480022 | {'building': 'garage'} | POLYGON ((-21.88829 64.14526, -21.8883 64.1453... |
way/788480023 | {'building': 'garage'} | POLYGON ((-21.88901 64.1452, -21.88894 64.1452... |
way/788480024 | {'addr:housenumber': '6', 'addr:postcode': '10... | POLYGON ((-21.88898 64.14551, -21.88886 64.145... |
25378 rows × 2 columns
Download main roads for Estonia¶
Filtering the data only by tags, with tags in exploded form
highways_filter = {
"highway": [
"motorway",
"trunk",
"primary",
"secondary",
"tertiary",
]
}
estonia_pbf_url = "http://download.geofabrik.de/europe/estonia-latest.osm.pbf"
estonia_pbf_file = "estonia.osm.pbf"
urllib.request.urlretrieve(estonia_pbf_url, estonia_pbf_file)
reader = PbfFileReader(geometry_filter=None, tags_filter=highways_filter)
estonia_features_gpq = reader.convert_pbf_to_parquet(estonia_pbf_file)
estonia_features_gpq
Finished operation in 0:00:18
PosixPath('files/estonia_87e7b741e959b474170855fa123c243d4981d68b21ad4643272ecbeeafea35e2_noclip_exploded.parquet')
features_relation = connection.read_parquet(str(estonia_features_gpq))
features_relation
┌───────────────┬───────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ feature_id │ highway │ geometry │ │ varchar │ varchar │ geometry │ ├───────────────┼───────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ way/225647008 │ tertiary │ LINESTRING (24.5998569 58.463256, 24.600884 58.4635817, 24.6018623 58.4665192, 24.6119598 58.4737134, 24.61196 58.4738432, 24.6119607 58.4743254, 24.6119929 58.4746462, 24.6120936 58.4749347, 24.6122391 58.4751053, 24.6124296 58.4752729, 24.6126223 58.4755133, 24.6126944 58.4756859, 24.6128338 58.4762737, 24.6130236 58.4765033, 24.6133634 58.4766648, 24.6156352 58.4774154, 24.6183717 58.4782874, 24.6186458 58.4784186, 24.6188603 58.4785849, 24.6211639 58.4804054, 24.621484 58.480623, 24.6221741 58.4809657, 24.6226982 58.481226, 24.6300384 58.4849346, 24.6312986 58.4855717, 24.6344842 58.487182, 24.6349469 58.4874159) │ │ way/225672387 │ tertiary │ LINESTRING (24.5800876 58.2799113, 24.5805414 58.2798609) │ │ way/225672404 │ tertiary │ LINESTRING (24.5805414 58.2798609, 24.5812288 58.2797645, 24.5820115 58.2795894, 24.5831902 58.2792764, 24.5832498 58.2792658, 24.5842206 58.2790029, 24.5857857 58.2785873, 24.5865952 58.2783724, 24.5874187 58.2781537, 24.5877366 58.2780693, 24.588375 58.2778998, 24.5884112 58.2778902, 24.5891735 58.2776452, 24.5894582 58.2775537, 24.5896905 58.2774568, 24.5901964 58.2771992, 24.5902786 58.2771573, 24.5904781 58.2770574, 24.5910358 58.2767268) │ │ way/225684785 │ tertiary │ LINESTRING (27.1269555 58.0667254, 27.1278772 58.0667668, 27.1288413 58.0667754, 27.1299382 58.0667411, 27.1309066 58.0666897, 27.1312593 58.0666653, 27.1318653 58.0665621, 27.1324326 58.0664158, 27.1328862 58.0663041, 27.1329962 58.0662828, 27.1354357 58.0658113, 27.1360442 58.0657427, 27.1368681 58.0657053, 27.1373639 58.0656828, 27.1380452 58.065657, 27.1399134 58.0655114, 27.1400092 58.0654985, 27.1413189 58.0653228, 27.1427414 58.0651172, 27.1435299 58.0649929, 27.144044 58.0649329, 27.1446354 58.06495, 27.1478404 58.0651129, 27.148586 58.0651471, 27.1503342 58.0652586, 27.1515683 58.0653528, 27.1559603 58.0657813, 27.1580679 58.0660766, 27.1602537 58.0664626, 27.1602744 58.066466, 27.1625247 58.0668397, 27.1680436 58.0677352, 27.1716973 58.0683378, 27.1717072 58.0683394, 27.1739182 58.0687122, 27.1764034 58.0689435, 27.1779237 58.0690424, 27.1797479 58.069161) │ │ way/225684786 │ secondary │ LINESTRING (27.125323 58.0899061, 27.1244899 58.089718, 27.123518 58.0895723, 27.1224127 58.0894747, 27.1211521 58.0894262, 27.1195947 58.0894262, 27.1193186 58.0894262, 27.1174213 58.0894671, 27.1166642 58.0894671, 27.1163157 58.0894671, 27.1055263 58.089545, 27.1021327 58.0895716, 27.1018939 58.0895701, 27.1010406 58.0895647, 27.0979101 58.0896085, 27.0957483 58.0896271, 27.0951613 58.0896094, 27.0945828 58.0895636, 27.0938169 58.0894506) │ │ way/225732669 │ tertiary │ LINESTRING (26.2629906 57.6902407, 26.2619265 57.6892974, 26.2596534 57.6868921, 26.256671 57.6837827, 26.2550919 57.6820944, 26.2544649 57.681424, 26.2529596 57.6799601, 26.2525444 57.6793773, 26.2525574 57.67919, 26.2529207 57.6787252, 26.2539588 57.6775456, 26.2541275 57.6772889, 26.2543248 57.6768235, 26.254349 57.6766693, 26.2543473 57.6764684, 26.25429 57.6761524, 26.2542259 57.6760151, 26.2540461 57.6758018, 26.2538098 57.6755863, 26.2534779 57.6751663, 26.2525334 57.6743381, 26.2524406 57.6742567, 26.2514803 57.6735142, 26.2510261 57.672737, 26.2507796 57.6724386, 26.2504292 57.6721263, 26.2500139 57.6718765, 26.2493911 57.6715851, 26.2487682 57.6712242, 26.2484567 57.6709744, 26.2480155 57.6707037, 26.2468476 57.6701763, 26.2465362 57.6699126, 26.2461728 57.66917, 26.2457316 57.6688161, 26.2456148 57.6684899, 26.2453553 57.6680874, 26.2440394 57.6671578, 26.2439798 57.6671157, 26.2434607 57.6669075, 26.2416959 57.6664286, 26.2408135 57.6662551, 26.2403333 57.6661371, 26.2399181 57.665915, 26.2390616 57.6651723, 26.2382311 57.6642909, 26.2370762 57.6620419, 26.2366324 57.6612603, 26.2365734 57.6610678, 26.2366408 57.6608893, 26.2371088 57.6604328, 26.2374942 57.660153, 26.237797 57.6600057, 26.2386137 57.6597308, 26.2398432 57.6594805, 26.2401002 57.6593529, 26.2406415 57.6589209, 26.241137 57.6583711, 26.2413297 57.6580226, 26.2415041 57.6574335, 26.2416876 57.6561032, 26.2419473 57.6556253, 26.2422106 57.655141, 26.2432475 57.6536044, 26.2433484 57.6532607, 26.2435778 57.6530692, 26.2446606 57.6524605, 26.2455782 57.6518173, 26.2462939 57.651017, 26.246615 57.6505064, 26.2472573 57.6499074, 26.2481382 57.6492298, 26.249221 57.6486357, 26.249533 57.6483902, 26.2496431 57.6482429, 26.2501569 57.6478648, 26.2506065 57.6476438, 26.2511479 57.6474622, 26.2515792 57.6473787, 26.252506 57.6472805, 26.2550844 57.647089, 26.2557818 57.6469908, 26.2583143 57.6469269, 26.2594154 57.6470202, 26.2604156 57.6469908, 26.2607276 57.6470251, 26.2610028 57.647089, 26.2616084 57.6472903, 26.2627096 57.647526, 26.2636822 57.6476733, 26.265132 57.6477911, 26.2685362 57.6479679, 26.2694538 57.6480367, 26.2701879 57.6481398, 26.2709679 57.6483313, 26.2718396 57.6486848, 26.2721424 57.6487388, 26.2727572 57.648783, 26.2730508 57.6487388, 26.2733903 57.6486111, 26.273794 57.6485326, 26.2741152 57.648508, 26.2755007 57.6487339, 26.2765468 57.6488125, 26.2774827 57.6489548, 26.2777764 57.6490383, 26.2783453 57.6491562, 26.2789234 57.6492003, 26.2795106 57.649166, 26.2799786 57.649166, 26.2811072 57.6492249, 26.2813274 57.64922, 26.2816302 57.6492593, 26.2818963 57.6493575, 26.2821166 57.6495195, 26.2823827 57.6499516, 26.283181 57.6507273, 26.283548 57.6512772, 26.2841444 57.6519302, 26.2851997 57.6526863, 26.2854957 57.6532142, 26.2856349 57.6534623, 26.2857594 57.6536271, 26.2860889 57.6538899, 26.2875028 57.6547875, 26.287567 57.6550821, 26.2874111 57.6556908, 26.2874294 57.655843, 26.2875028 57.656005, 26.2889067 57.656599, 26.2893655 57.6568886, 26.2896635 57.6570702, 26.2899987 57.6572028, 26.2900833 57.6572374, 26.2901948 57.657283, 26.2904195 57.6574191, 26.2905401 57.657588) │ │ way/225799801 │ tertiary │ LINESTRING (22.4897404 58.2677193, 22.4896293 58.2676097, 22.4890933 58.267081, 22.4883444 58.2663563, 22.4878088 58.2658018, 22.4866706 58.2646235, 22.486602 58.2645492, 22.4864882 58.2644259, 22.4858383 58.2637462, 22.4855531 58.2634589, 22.485403 58.2633052, 22.4851648 58.2630612, 22.4848895 58.2627819, 22.484511 58.2625403, 22.4842369 58.2623654) │ │ way/225799805 │ tertiary │ LINESTRING (22.4905655 58.2685674, 22.4907255 58.2687693, 22.4910077 58.2690655, 22.4910907 58.2691527, 22.4914966 58.269579, 22.4925434 58.2705279, 22.4926243 58.2706012, 22.4936737 58.2713334, 22.4940226 58.2715769, 22.4948404 58.2720426, 22.495308 58.2723089) │ │ way/225799808 │ secondary │ LINESTRING (22.4895043 58.2682357, 22.4890559 58.2682909, 22.4884852 58.2683526, 22.4862281 58.2685801) │ │ way/225820537 │ secondary │ LINESTRING (27.1004992 58.1854404, 27.1012584 58.1851786) │ │ · │ · │ · │ │ · │ · │ · │ │ · │ · │ · │ │ way/68506670 │ tertiary │ LINESTRING (25.7339925 59.5874636, 25.7343855 59.588252) │ │ way/68539191 │ tertiary │ LINESTRING (24.127823 59.3053522, 24.1275223 59.3050325) │ │ way/68539202 │ tertiary │ LINESTRING (24.1275223 59.3050325, 24.1272142 59.3047101, 24.1271845 59.304679, 24.126197 59.3037192, 24.1256483 59.303186, 24.1248004 59.3023726, 24.1235999 59.3012209, 24.1231351 59.3007786, 24.1216075 59.2993251, 24.1208947 59.2985839, 24.1202542 59.297735, 24.1197046 59.2968437, 24.1194841 59.2964095, 24.1192899 59.2959602) │ │ way/68539409 │ tertiary │ LINESTRING (24.180055 59.3083445, 24.1795624 59.3080755) │ │ way/68539413 │ tertiary │ LINESTRING (24.1795624 59.3080755, 24.1776333 59.30703, 24.1771586 59.3067487, 24.1771304 59.306732, 24.176455 59.3063317, 24.174775 59.30523, 24.1706983 59.30207, 24.168102 59.2996789, 24.1680212 59.2996045, 24.1651084 59.2969218, 24.1648983 59.2967283, 24.1641786 59.2961451, 24.1631601 59.2954478, 24.1626178 59.2950765, 24.1608517 59.2941494, 24.1590359 59.2933046, 24.1585716 59.2931103, 24.157914 59.2928351, 24.1565876 59.29228, 24.1552656 59.2917562, 24.1542677 59.2914256, 24.1540134 59.2913414, 24.1513131 59.2905757, 24.1507135 59.2904314, 24.1486933 59.2899454, 24.147424 59.28964, 24.1464521 59.2893908, 24.1462507 59.2893391, 24.1448824 59.2889145, 24.1439647 59.2885827, 24.1436183 59.2884575, 24.1423767 59.2879367, 24.1407974 59.2870542, 24.1406767 59.2869867, 24.1397033 59.2862867, 24.1391917 59.2858742, 24.1377417 59.284705, 24.1371454 59.2843177, 24.1370713 59.2842696, 24.1361664 59.2838695, 24.1351031 59.2835361, 24.1350447 59.2835231, 24.1344154 59.2833829, 24.133673 59.2832775, 24.1331569 59.2832256, 24.1325592 59.2831932) │ │ way/68539419 │ secondary │ LINESTRING (24.2537169 59.2312202, 24.2534123 59.231169, 24.2531198 59.2311293, 24.2528303 59.2311026, 24.2525701 59.2310841, 24.2521906 59.2310696, 24.2518271 59.2310705, 24.2513903 59.2310905, 24.2502546 59.231168, 24.2501392 59.2311811) │ │ way/68539422 │ secondary │ LINESTRING (24.2544244 59.2313348, 24.2537169 59.2312202) │ │ way/68539430 │ primary │ LINESTRING (24.424527 59.205396, 24.4244992 59.2052166) │ │ way/68539437 │ primary │ LINESTRING (24.4244992 59.2052166, 24.4244622 59.2049634, 24.4244144 59.2047003, 24.4243638 59.2044461, 24.4243095 59.2042414, 24.4242414 59.2040561, 24.424177 59.203912, 24.4240879 59.2037429, 24.4240756 59.2037205, 24.4240437 59.2036623, 24.4239719 59.2035311, 24.4236165 59.2029702, 24.4233922 59.2026376, 24.4232303 59.2023799, 24.4232278 59.202376, 24.4230461 59.2021375) │ │ way/68539443 │ tertiary │ LINESTRING (24.4401745 59.1922042, 24.4405142 59.1921076) │ ├───────────────┴───────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ ? rows (>9999 rows, 20 shown) 3 columns │ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Count loaded roads¶
features_relation.count("feature_id")
┌───────────────────┐ │ count(feature_id) │ │ int64 │ ├───────────────────┤ │ 25150 │ └───────────────────┘
length_in_meters = (
features_relation.project(
"ST_Length(ST_Transform(geometry, 'EPSG:4326', 'EPSG:3301')) AS road_length"
)
.sum("road_length")
.fetchone()[0]
)
length_in_km = length_in_meters / 1000
length_in_km
29639.96114181701
Plot the roads using GeoPandas¶
With fast loading of geoparquet files using geoarrow.pyarrow
library.
import geoarrow.pyarrow as ga
from geoarrow.pyarrow import io
from quackosm._constants import GEOMETRY_COLUMN
parquet_table = io.read_geoparquet_table(estonia_features_gpq)
ga.to_geopandas(parquet_table.column(GEOMETRY_COLUMN)).plot()
<Axes: >
Download all data for Liechtenstein¶
Without filtering, with tags in a compact form
liechtenstein_pbf_url = "https://download.geofabrik.de/europe/liechtenstein-latest.osm.pbf"
liechtenstein_pbf_file = "liechtenstein.osm.pbf"
urllib.request.urlretrieve(liechtenstein_pbf_url, liechtenstein_pbf_file)
# Here explode_tags is set to False explicitly,
# but it would set automatically when not filtering the data
reader = PbfFileReader(geometry_filter=None, tags_filter=None)
liechtenstein_features_gpq = reader.convert_pbf_to_parquet(
liechtenstein_pbf_file, explode_tags=False
)
liechtenstein_features_gpq
Finished operation in 0:00:05
PosixPath('files/liechtenstein_nofilter_noclip_compact.parquet')
features_relation = connection.read_parquet(str(liechtenstein_features_gpq))
features_relation
┌─────────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ feature_id │ tags │ geometry │ │ varchar │ map(varchar, varchar) │ geometry │ ├─────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ node/3049048374 │ {natural=tree} │ POINT (9.5271977 47.2296022) │ │ node/3049048387 │ {natural=tree} │ POINT (9.5247044 47.2296637) │ │ node/3049048427 │ {natural=tree} │ POINT (9.519095 47.2302825) │ │ node/3049048431 │ {natural=tree} │ POINT (9.5195217 47.2303824) │ │ node/3049048434 │ {natural=tree} │ POINT (9.519507 47.2304324) │ │ node/3049048435 │ {natural=tree} │ POINT (9.528714 47.2304501) │ │ node/3049048441 │ {natural=tree} │ POINT (9.519919 47.2305173) │ │ node/3049048443 │ {natural=tree} │ POINT (9.5282111 47.2305258) │ │ node/3049048444 │ {natural=tree} │ POINT (9.5194408 47.2305423) │ │ node/3049048445 │ {natural=tree} │ POINT (9.5289474 47.2305794) │ │ · │ · │ · │ │ · │ · │ · │ │ · │ · │ · │ │ way/384586196 │ {addr:city=Schaan, addr:country=LI, addr:housenumber=23, addr:postcode=9494, addr:street=Winkelgass, building=yes} │ POLYGON ((9.5111064 47.1626013, 9.5110821 47.162505, 9.5108643 47.1625304, 9.5108886 47.1626267, 9.5111064 47.1626013)) │ │ way/384586197 │ {addr:city=Schaan, addr:country=LI, addr:housenumber=34, addr:postcode=9494, addr:street=Obergass, building=yes} │ POLYGON ((9.5112006 47.1634471, 9.5111946 47.1633604, 9.5110406 47.1633654, 9.5110466 47.163452, 9.5112006 47.1634471)) │ │ way/384586198 │ {addr:city=Schaan, addr:country=LI, addr:housenumber=36, addr:postcode=9494, addr:street=Obergass, building=yes} │ POLYGON ((9.5115215 47.1636951, 9.5114873 47.1635889, 9.5113647 47.1636071, 9.5113988 47.1637134, 9.5115215 47.1636951)) │ │ way/384586199 │ {addr:city=Schaan, addr:country=LI, addr:housenumber=40, addr:postcode=9494, addr:street=Obergass, building=yes} │ POLYGON ((9.5114257 47.1634274, 9.5113983 47.1633195, 9.5112741 47.163334, 9.5113015 47.163442, 9.5114257 47.1634274)) │ │ way/384586200 │ {addr:city=Schaan, addr:country=LI, addr:housenumber=9, addr:postcode=9494, addr:street=Winkelgass, building=yes} │ POLYGON ((9.5095717 47.1628091, 9.5095516 47.1627107, 9.5094254 47.1627226, 9.5094454 47.162821, 9.5095717 47.1628091)) │ │ way/384586201 │ {addr:city=Schaan, addr:country=LI, addr:housenumber=22, addr:postcode=9494, addr:street=Obergass, building=yes} │ POLYGON ((9.5107398 47.1636843, 9.5107345 47.1636105, 9.5105488 47.1636167, 9.5105578 47.1637422, 9.5106823 47.163738, 9.5106786 47.1636864, 9.5107398 47.1636843)) │ │ way/384586202 │ {addr:city=Schaan, addr:country=LI, addr:housenumber=12, addr:postcode=9494, addr:street=Im Ganser, building=yes} │ POLYGON ((9.5121649 47.1626287, 9.5121558 47.1624448, 9.5120096 47.1624481, 9.5120187 47.1626321, 9.5121649 47.1626287)) │ │ way/384586203 │ {addr:city=Schaan, addr:country=LI, addr:housenumber=20, addr:postcode=9494, addr:street=Obergass, building=yes} │ POLYGON ((9.5106178 47.1638496, 9.5106065 47.163766, 9.5104737 47.1637743, 9.5104851 47.163858, 9.5106178 47.1638496)) │ │ way/384586204 │ {addr:city=Schaan, addr:country=LI, addr:housenumber=60, addr:postcode=9494, addr:street=Reberastrasse, building=yes} │ POLYGON ((9.5100855 47.162727, 9.510065 47.1626541, 9.5099404 47.1626702, 9.5099513 47.1627091, 9.509934 47.1627113, 9.5099572 47.1627941, 9.5100992 47.1627757, 9.5100855 47.162727)) │ │ way/384586205 │ {addr:city=Schaan, addr:country=LI, addr:housenumber=26, addr:postcode=9494, addr:street=Obergass, building=yes} │ POLYGON ((9.510973 47.1636463, 9.5109748 47.1637445, 9.5110345 47.163744, 9.5110358 47.1638181, 9.5108631 47.1638196, 9.5108599 47.1636473, 9.510973 47.1636463)) │ ├─────────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ ? rows (>9999 rows, 20 shown) 3 columns │ └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Return data as GeoDataFrame¶
PbfFileReader
can also return the data in the GeoDataFrame form.
Here the caching strategy will be utilized - file won't be transformed again.
features_gdf = reader.convert_pbf_to_geodataframe(liechtenstein_pbf_file)
features_gdf
tags | geometry | |
---|---|---|
feature_id | ||
node/3049048374 | {'natural': 'tree'} | POINT (9.5272 47.2296) |
node/3049048387 | {'natural': 'tree'} | POINT (9.5247 47.22966) |
node/3049048427 | {'natural': 'tree'} | POINT (9.5191 47.23028) |
node/3049048431 | {'natural': 'tree'} | POINT (9.51952 47.23038) |
node/3049048434 | {'natural': 'tree'} | POINT (9.51951 47.23043) |
... | ... | ... |
way/1326044824 | {'foot': 'yes', 'highway': 'path', 'sac_scale'... | LINESTRING (9.59202 47.05101, 9.59186 47.05105... |
way/1326044826 | {'foot': 'yes', 'highway': 'path', 'name': 'Ij... | LINESTRING (9.59479 47.05773, 9.59483 47.05768... |
way/1328157719 | {'building': 'service'} | POLYGON ((9.52287 47.18156, 9.52291 47.1816, 9... |
way/1330218412 | {'landuse': 'landfill'} | POLYGON ((9.49633 47.20193, 9.49748 47.20169, ... |
way/1330218662 | {'building': 'yes'} | POLYGON ((9.49061 47.19143, 9.49062 47.19145, ... |
54034 rows × 2 columns
Plot the forests using GeoPandas¶
Filter all polygons and features with landuse
=forest
.
features_gdf[
features_gdf.geom_type.isin(("Polygon", "MultiPolygon"))
& features_gdf.tags.apply(lambda x: "landuse" in x and x["landuse"] == "forest")
].plot(color="green")
<Axes: >