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 0x7fbb903b2b30>)
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
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 │ ├───────────────┼─────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ way/510877938 │ roof │ POLYGON ((-21.8993055 64.1178719, -21.899306 64.1178873, -21.8993073 64.1179236, -21.8993574 64.1179233, -21.8993598 64.1179923, -21.8989031 64.1179954, -21.8989008 64.1179296, -21.8990524 64.1179286, -21.899051 64.1178885, -21.8990505 64.1178736, -21.8993055 64.1178719)) │ │ way/511057576 │ yes │ POLYGON ((-21.6698697 64.1941409, -21.6697423 64.1942004, -21.6696597 64.1941669, -21.6697871 64.1941074, -21.6698697 64.1941409)) │ │ way/511057577 │ yes │ POLYGON ((-21.6710025 64.193715, -21.6707693 64.1937256, -21.6707514 64.1936511, -21.6708294 64.1936475, -21.670839 64.1936874, -21.6709942 64.1936803, -21.6710025 64.193715)) │ │ way/511057578 │ yes │ POLYGON ((-21.655652 64.1954664, -21.6555715 64.1955274, -21.6553285 64.1954668, -21.655409 64.1954057, -21.6555254 64.1954348, -21.6555632 64.1954061, -21.6556705 64.1954329, -21.6556327 64.1954615, -21.655652 64.1954664)) │ │ way/511057579 │ yes │ POLYGON ((-21.6572989 64.1958751, -21.6572043 64.1959347, -21.657042 64.195886, -21.6571366 64.1958263, -21.6572989 64.1958751)) │ │ way/511057580 │ yes │ POLYGON ((-21.6608682 64.1962431, -21.6607861 64.1963055, -21.6605474 64.1962459, -21.6606295 64.1961836, -21.6608682 64.1962431)) │ │ way/511057582 │ yes │ POLYGON ((-21.6634244 64.1943575, -21.6634257 64.1944093, -21.6633023 64.1944098, -21.663301 64.1943581, -21.6634244 64.1943575)) │ │ way/511057584 │ yes │ POLYGON ((-21.6683593 64.1937493, -21.6683469 64.19383, -21.6683082 64.1938289, -21.6683016 64.1938721, -21.6682219 64.1938698, -21.6682286 64.1938266, -21.6680825 64.1938223, -21.6680949 64.1937416, -21.6683593 64.1937493)) │ │ way/511057586 │ yes │ POLYGON ((-21.6655688 64.1937807, -21.6655407 64.1938402, -21.6654088 64.1938284, -21.6654369 64.1937688, -21.6655688 64.1937807)) │ │ way/511057587 │ yes │ POLYGON ((-21.6818498 64.1937795, -21.681764 64.1938548, -21.6816455 64.1938292, -21.6817313 64.1937539, -21.6818498 64.1937795)) │ │ · │ · │ · │ │ · │ · │ · │ │ · │ · │ · │ │ way/107105973 │ residential │ POLYGON ((-21.8201446 64.1412982, -21.8199398 64.1412787, -21.8200264 64.1411059, -21.8202312 64.1411254, -21.8201446 64.1412982)) │ │ way/107105975 │ residential │ POLYGON ((-21.8196601 64.1418505, -21.8194529 64.1418308, -21.8194049 64.1419272, -21.8196121 64.1419468, -21.8196601 64.1418505)) │ │ way/107105976 │ residential │ POLYGON ((-21.8211316 64.1404779, -21.8214175 64.1405051, -21.8213767 64.1405868, -21.8210908 64.1405597, -21.8211316 64.1404779)) │ │ way/107105978 │ yes │ POLYGON ((-21.8187266 64.1423477, -21.8184424 64.1423208, -21.8184566 64.1422923, -21.8183771 64.1422847, -21.8184107 64.1422173, -21.8184935 64.1422251, -21.8185074 64.1421971, -21.8187884 64.1422238, -21.8187266 64.1423477)) │ │ way/107105979 │ residential │ POLYGON ((-21.8205108 64.1416355, -21.8206511 64.1416459, -21.8206611 64.1416189, -21.8207808 64.1416314, -21.8208267 64.1415403, -21.8207296 64.141531, -21.8207369 64.1415209, -21.8207256 64.1415119, -21.8206717 64.1415087, -21.8206557 64.1415119, -21.8206491 64.1415223, -21.820566 64.141516, -21.8205108 64.1416355)) │ │ way/107105980 │ residential │ POLYGON ((-21.8187685 64.1420163, -21.8186069 64.1420028, -21.8186015 64.142015, -21.8185681 64.1420123, -21.8185637 64.1420222, -21.8185928 64.1420246, -21.8185883 64.1420349, -21.8185625 64.1420327, -21.8185261 64.1421155, -21.8187138 64.1421312, -21.8187301 64.1420943, -21.8187816 64.1420986, -21.8188063 64.1420423, -21.8187589 64.1420384, -21.8187685 64.1420163)) │ │ way/107105981 │ residential │ POLYGON ((-21.8213255 64.1388772, -21.8210993 64.138857, -21.8211019 64.1388514, -21.8210743 64.138849, -21.8211109 64.1387709, -21.8211437 64.1387738, -21.8211764 64.1387041, -21.8213883 64.138723, -21.8213903 64.1387188, -21.8214569 64.1387248, -21.8213898 64.138868, -21.8213322 64.1388629, -21.8213255 64.1388772)) │ │ way/107105983 │ residential │ POLYGON ((-21.8219915 64.1404765, -21.821799 64.1404593, -21.8218264 64.1404008, -21.8218568 64.1404036, -21.8218615 64.1403936, -21.8217678 64.1403852, -21.8218078 64.1402996, -21.8219708 64.1403142, -21.8219789 64.1402968, -21.822111 64.1403085, -21.8221018 64.1403281, -21.8221588 64.1403331, -21.8221191 64.1404179, -21.8219859 64.1404061, -21.8219814 64.1404157, -21.8220184 64.1404189, -21.8219915 64.1404765)) │ │ way/107105985 │ residential │ POLYGON ((-21.8202674 64.1422144, -21.8200069 64.1421892, -21.8200268 64.142149, -21.8200742 64.1421218, -21.8201025 64.142125, -21.8201208 64.1420822, -21.820322 64.1420996, -21.8202674 64.1422144)) │ │ way/107105986 │ residential │ POLYGON ((-21.8196293 64.1384857, -21.8194564 64.1383692, -21.8195959 64.1383298, -21.8196409 64.1383601, -21.819743 64.1383313, -21.8198894 64.1384298, -21.8197667 64.1384645, -21.8197482 64.1384521, -21.8196293 64.1384857)) │ ├───────────────┴─────────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ ? rows (>9999 rows, 20 shown) 3 columns │ └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Count all buildings¶
features_relation.count("feature_id")
┌───────────────────┐ │ count(feature_id) │ │ int64 │ ├───────────────────┤ │ 25359 │ └───────────────────┘
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)
tags | geometry | |
---|---|---|
feature_id | ||
way/234057990 | {'addr:housenumber': '11', 'addr:postcode': '1... | POLYGON ((-21.95344 64.13321, -21.95333 64.133... |
way/234057991 | {'addr:housenumber': '12', 'addr:postcode': '1... | POLYGON ((-21.95379 64.13326, -21.95376 64.133... |
way/234057992 | {'addr:housenumber': '14', 'addr:postcode': '1... | POLYGON ((-21.95834 64.13629, -21.95824 64.136... |
way/234057993 | {'addr:housenumber': '18', 'addr:postcode': '1... | POLYGON ((-21.95894 64.13643, -21.95885 64.136... |
way/234057994 | {'addr:city': 'Reykjavík', 'addr:housenumber':... | POLYGON ((-21.95659 64.13594, -21.95649 64.136... |
... | ... | ... |
relation/8232994 | {'building': 'school', 'type': 'multipolygon'} | POLYGON ((-21.90492 64.13062, -21.90486 64.130... |
relation/8400887 | {'building': 'yes', 'type': 'multipolygon'} | POLYGON ((-21.79151 64.21451, -21.79072 64.214... |
relation/8444475 | {'addr:city': 'Reykjavík', 'addr:housenumber':... | MULTIPOLYGON (((-21.88303 64.13894, -21.88365 ... |
relation/9269609 | {'addr:housenumber': '9', 'addr:street': 'Boða... | POLYGON ((-21.96675 64.1493, -21.96662 64.1491... |
relation/9533933 | {'addr:city': 'Reykjavík', 'addr:postcode': '1... | POLYGON ((-21.92925 64.13361, -21.92858 64.134... |
25359 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
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/149917527 │ secondary │ LINESTRING (25.5827947 58.3528062, 25.5827226 58.3526156, 25.5826135 58.3523422, 25.5825481 58.352166, 25.5822249 58.3513361, 25.5821381 58.3510967, 25.5820185 58.3507844, 25.5819725 58.3506679, 25.5818779 58.3503529, 25.5816753 58.3496765, 25.5815727 58.349334) │ │ way/150399584 │ tertiary │ LINESTRING (25.9859717 59.2499788, 25.9867103 59.2501131, 25.9871663 59.2501689, 25.9874241 59.2501613, 25.9876025 59.2501055, 25.9926904 59.2459331, 25.9928675 59.2457878, 25.9943481 59.2446196, 25.9946305 59.2443514, 25.9948725 59.244042, 25.9949632 59.2437807, 25.9948849 59.2435359, 25.9946499 59.2432911, 25.9941278 59.2430108, 25.9921588 59.2422902, 25.9920213 59.2422399, 25.989087 59.241166, 25.9858972 59.2399986, 25.9854535 59.2398232, 25.9851118 59.2396193, 25.9849291 59.23939, 25.9849079 59.2393003, 25.9848855 59.2392053, 25.9849291 59.238998, 25.9850703 59.2387195, 25.9860779 59.2375991, 25.986392 59.2372221, 25.9864764 59.237081, 25.9865086 59.236945, 25.986519 59.2368189, 25.9864917 59.2366733, 25.9863968 59.2364976, 25.9853033 59.2350873, 25.9850728 59.2348032, 25.9818251 59.2306638, 25.9799305 59.2283655, 25.9797696 59.2282471, 25.9791809 59.227814, 25.9786767 59.2273909, 25.9784145 59.2271226, 25.9782531 59.2268852, 25.9779219 59.2255482, 25.9773367 59.2226051, 25.9772475 59.2221484, 25.9772231 59.2219139, 25.9772228 59.2216911, 25.9772533 59.2214619, 25.9773168 59.2211746, 25.977434 59.220838, 25.9775703 59.2205888, 25.9779304 59.2200635, 25.9783605 59.2195801, 25.9790535 59.2190196, 25.9949501 59.2077649, 25.9954373 59.2073555, 25.9956995 59.2070664, 25.9959011 59.2067153, 25.9960222 59.2062093, 25.9959438 59.205674, 25.9957012 59.2050564, 25.9946305 59.2027398, 25.9943491 59.2022466, 25.9938693 59.2017428, 25.9934961 59.2014748, 25.9930309 59.2012118, 25.9924978 59.200981, 25.9858631 59.1987321, 25.9815435 59.1972759, 25.9813286 59.1972167, 25.9806277 59.1970446, 25.9802565 59.1969618, 25.9791692 59.1967973, 25.9784709 59.1967183, 25.9776191 59.1966598, 25.9707859 59.1963412, 25.9670491 59.1961737, 25.9642517 59.1960483, 25.9641686 59.1960446, 25.9639518 59.1960349, 25.9627159 59.1959629, 25.9620907 59.1958959, 25.9614321 59.1957686, 25.960821 59.1956105, 25.9600404 59.1953244, 25.9596093 59.1951365, 25.9593185 59.1949503, 25.9588908 59.1945911, 25.958748 59.1943809, 25.9584672 59.1939403, 25.9583686 59.193682, 25.9581445 59.1925149, 25.9579493 59.192015, 25.9578621 59.1917918, 25.9573509 59.1909218, 25.9566722 59.1900356, 25.9560671 59.1893332, 25.9555192 59.1889403, 25.9530417 59.1871636, 25.9526182 59.1866677, 25.9522753 59.1861718, 25.9521341 59.1858205, 25.9520131 59.1853349, 25.9519929 59.185056, 25.9520524 59.1822779, 25.9520745 59.1814798, 25.9521095 59.1812698) │ │ way/150656084 │ tertiary │ LINESTRING (24.852607 59.4238368, 24.8530147 59.4237064, 24.8533991 59.4236681, 24.854107 59.4236217, 24.8543728 59.4236171, 24.8549306 59.4236186, 24.855334 59.4236448, 24.8557109 59.4236941, 24.856308 59.4238013, 24.8565972 59.4238655, 24.8569336 59.4239934) │ │ way/150656089 │ tertiary │ LINESTRING (24.8569336 59.4239934, 24.8572382 59.4240515, 24.8585303 59.4243179, 24.8589903 59.4244172, 24.8592996 59.424484, 24.8598825 59.4246137, 24.8603466 59.424717, 24.8612411 59.4249203, 24.862024 59.4251013, 24.8623882 59.4251843, 24.8630273 59.425327, 24.8634948 59.4254332, 24.8639523 59.4255356, 24.8644452 59.4256484, 24.865188 59.4258217, 24.8659194 59.425988, 24.866026 59.4260125, 24.866128 59.4260352, 24.8666067 59.4261425, 24.8671036 59.4262579, 24.8674152 59.4263317, 24.867515 59.4263554, 24.8677793 59.4264157, 24.8694654 59.4268003, 24.8698249 59.4268823, 24.8703266 59.4269968, 24.8705492 59.4270511) │ │ way/150818503 │ primary │ LINESTRING (25.8482938 59.2042821, 25.8517484 59.2070219, 25.8522061 59.2073543, 25.8530296 59.2079365, 25.8543986 59.2085911, 25.8553001 59.2089674, 25.8568204 59.2094829, 25.8579269 59.2097588, 25.8586284 59.2099069, 25.8596868 59.2100689, 25.8606476 59.2101875, 25.8617367 59.2102813, 25.8629051 59.2103513, 25.8671466 59.2105441, 25.8718654 59.2108271, 25.8735041 59.2111101, 25.8751429 59.2115143, 25.8762881 59.2119489, 25.8775266 59.2125574, 25.8787719 59.2134563, 25.8799999 59.2144046, 25.8827511 59.2166077, 25.885007 59.218414, 25.8858954 59.2191308, 25.8867727 59.2198131, 25.8877981 59.2205291, 25.8882469 59.22078, 25.8887447 59.2210059, 25.8887883 59.2210213, 25.8902135 59.2215234, 25.8909809 59.2217434, 25.8911382 59.2217846, 25.8953939 59.2229002, 25.8962713 59.2231302, 25.8978661 59.2235482, 25.8988363 59.2238156, 25.9002395 59.2243445, 25.9021809 59.2253809, 25.9181591 59.2356409, 25.9219566 59.2380789, 25.9245309 59.2397477, 25.9258829 59.2406166, 25.9271721 59.2414336, 25.9275375 59.2416951, 25.9277149 59.2418408, 25.9278541 59.2420057, 25.9300384 59.2451052, 25.9302909 59.2455236, 25.9305707 59.2459871, 25.9307728 59.2462852, 25.9309914 59.2465282, 25.9312109 59.2467158, 25.9314445 59.246851, 25.931753 59.2470296) │ │ way/151079531 │ tertiary │ LINESTRING (25.3594872 58.1261215, 25.3594663 58.1262047, 25.3594728 58.1262928, 25.35953 58.1264135) │ │ way/151079532 │ primary │ LINESTRING (25.3585537 58.1259776, 25.3586885 58.1259629, 25.3588407 58.1259488, 25.3589547 58.1259187) │ │ way/151079535 │ primary │ LINESTRING (25.3564827 58.126169, 25.3562189 58.1261857, 25.3561166 58.1261924, 25.3560812 58.1261947, 25.3554148 58.1262242, 25.3551129 58.1262375, 25.3547227 58.1262492, 25.354599 58.1262554, 25.3532914 58.1263128, 25.3526425 58.1263133, 25.3521577 58.1263009, 25.3516087 58.1262868, 25.3506825 58.1262476, 25.3504979 58.1262386, 25.350029 58.1261976, 25.3497251 58.1261679, 25.3489606 58.1260655, 25.3481757 58.1259695, 25.3477573 58.1259183, 25.3472265 58.1258534, 25.3466502 58.1257855, 25.3464969 58.1257674, 25.3463543 58.1257507, 25.343018 58.1253599, 25.3426346 58.1253212, 25.3424959 58.1253105, 25.3417837 58.1252417) │ │ way/151079536 │ primary │ LINESTRING (25.3592827 58.1258399, 25.3593479 58.1258318, 25.3594596 58.1258089, 25.359634 58.1257677) │ │ way/151109963 │ secondary │ LINESTRING (26.9705812 59.366308, 26.9696044 59.3661348, 26.9692501 59.3660911) │ │ · │ · │ · │ │ · │ · │ · │ │ · │ · │ · │ │ way/71898149 │ secondary │ LINESTRING (24.9815351 59.4510417, 24.9811283 59.4504471) │ │ way/71898150 │ tertiary │ LINESTRING (24.98917 59.4568811, 24.9891289 59.4570238, 24.989049 59.4571384, 24.9887418 59.4575311) │ │ way/71939951 │ trunk │ LINESTRING (24.8904415 59.4397143, 24.8877099 59.4391669, 24.8873554 59.4390958, 24.8851965 59.4386628, 24.8777226 59.4371638) │ │ way/72470899 │ primary │ LINESTRING (23.3878749 58.5726765, 23.3880597 58.5727332, 23.3881436 58.5727558, 23.3881994 58.5727748, 23.3882778 58.5728152, 23.3883811 58.5728715, 23.3885288 58.5729304, 23.3887705 58.5729987, 23.38916 58.5730525, 23.3893221 58.5730743, 23.3899767 58.573165, 23.3901682 58.5731943, 23.3903599 58.5732357, 23.3907064 58.5732977, 23.3909159 58.5733201, 23.3911508 58.5733207, 23.3922736 58.5732776, 23.3931954 58.5732397, 23.3933647 58.5732091, 23.3934052 58.5731919, 23.3934531 58.5731715, 23.3935541 58.5731285) │ │ way/72561865 │ tertiary │ LINESTRING (23.8619865 58.7079273, 23.8621624 58.7075126, 23.8624942 58.7067304, 23.8625084 58.7066969, 23.8625363 58.7063295, 23.8624354 58.7059621, 23.8621713 58.7053386, 23.8617576 58.7045845, 23.8611982 58.7037367, 23.8611173 58.703648, 23.8607682 58.703289, 23.8602407 58.7028678, 23.8587743 58.7017494, 23.8568894 58.7004562, 23.8568211 58.7004093, 23.8548359 58.6990472, 23.8518845 58.6969737, 23.8513739 58.6966179, 23.8503 58.6959062, 23.8492031 58.6951971, 23.8481978 58.6945518, 23.8475897 58.6941891, 23.8467716 58.693781) │ │ way/72564594 │ tertiary │ LINESTRING (24.1022317 58.9044017, 24.1026204 58.9042496, 24.102932 58.9041276, 24.1038324 58.9037792, 24.1039141 58.9037491, 24.1055332 58.903153, 24.1058407 58.9030456, 24.1061547 58.9029181) │ │ way/72564602 │ tertiary │ LINESTRING (24.1014838 58.9046953, 24.101869 58.9045443) │ │ way/72612844 │ tertiary │ LINESTRING (25.5596504 59.4715916, 25.5608715 59.4715692, 25.5618733 59.4715509, 25.5624962 59.4714952, 25.5631989 59.4714217, 25.564635 59.4712572) │ │ way/72612846 │ tertiary │ LINESTRING (25.5021781 59.4631589, 25.50234 59.4632921) │ │ way/72612852 │ tertiary │ LINESTRING (25.50234 59.4632921, 25.503248 59.464022, 25.5036939 59.4643093, 25.5045649 59.4647349, 25.5070082 59.4656308, 25.5076459 59.465878, 25.508535 59.4662133, 25.5091863 59.4663944, 25.5111414 59.4670793, 25.5115933 59.4672317, 25.5123017 59.467365, 25.5130767 59.4674667, 25.5138817 59.467575, 25.514705 59.4677033, 25.515495 59.4678633, 25.51626 59.468055, 25.516879 59.4682282, 25.5170167 59.4682667, 25.5177483 59.46847, 25.517951 59.4685219, 25.5184833 59.4686583, 25.51925 59.4688333, 25.520025 59.4689967, 25.5208033 59.4691417, 25.5216 59.4692817, 25.5223933 59.4694117, 25.5232083 59.4695317, 25.524005 59.4696517, 25.524805 59.4697783, 25.5258132 59.4699524, 25.5261785 59.4700274, 25.52641 59.470075, 25.5272017 59.470245, 25.527985 59.47043, 25.5284759 59.4705571, 25.5287317 59.4706233, 25.5293502 59.4707559, 25.5299857 59.4709142, 25.5304787 59.4710135, 25.5309217 59.4710733, 25.5316433 59.471105, 25.5322257 59.4711312, 25.5326933 59.4711625, 25.5331561 59.4712338, 25.5343633 59.4714667, 25.5348239 59.4715337, 25.5352121 59.4715305, 25.5355464 59.4714948, 25.5359403 59.4714028, 25.5363599 59.471266, 25.5366874 59.4711813, 25.5370609 59.4711114, 25.5374777 59.4710987, 25.5378628 59.4711097, 25.5381956 59.4711616, 25.5385551 59.471263, 25.5386463 59.471295, 25.538978 59.4714114, 25.539545 59.4716233, 25.5407714 59.4721189, 25.5416704 59.4724926, 25.5424219 59.472853, 25.5428883 59.4731187, 25.543484 59.4734285, 25.5440581 59.4736742, 25.5444522 59.4738289, 25.5447736 59.4739108, 25.5451224 59.4739503, 25.5453605 59.4739546, 25.5454998 59.4739444, 25.5461651 59.4738623, 25.5484217 59.4735283, 25.5491617 59.4733767, 25.55064 59.4729917, 25.5518306 59.4727036, 25.5530617 59.472455, 25.5538567 59.47227, 25.5539158 59.4722545, 25.554625 59.4720683, 25.555395 59.4718833, 25.556332 59.4717133, 25.5570504 59.4716363, 25.5578665 59.4716003, 25.5596504 59.4715916) │ ├───────────────┴───────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ ? rows (>9999 rows, 20 shown) 3 columns │ └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Count loaded roads¶
features_relation.count("feature_id")
┌───────────────────┐ │ count(feature_id) │ │ int64 │ ├───────────────────┤ │ 24728 │ └───────────────────┘
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
29489.43287511074
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
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/26863444 │ {name=Kuhgrat, natural=peak, wikidata=Q4244296, wikimedia_commons=Category:Kuegrat, wikipedia=en:Kuhgrat} │ POINT (9.5608307 47.1666716) │ │ node/30603864 │ {crossing=uncontrolled, highway=crossing} │ POINT (9.5203855 47.1705163) │ │ node/32011241 │ {name=Oberplanken, place=hamlet} │ POINT (9.5450182 47.178495) │ │ node/32011242 │ {loc_name=Planka, loc_name:de=Planka, name=Planken, name:de=Planken, name:mk=Планкен, name:ru=Планкен, name:uk=Планкен, name:zh=普兰肯, opengeodb:lat=47.1858848, opengeodb:lon=9.5452211, place=village, population=445, postal_code=9498, website=https://www.planken.li/, wikidata=Q49660, wikipedia=de:Planken} │ POINT (9.5452211 47.1858848) │ │ node/32011279 │ {bus=yes, name=Schaanwald Zuschg, public_transport=stop_position} │ POINT (9.5622276 47.2113777) │ │ node/32011334 │ {crossing=uncontrolled, crossing:island=yes, highway=crossing} │ POINT (9.5187913 47.1719187) │ │ node/32011343 │ {crossing=uncontrolled, crossing:island=no, crossing_ref=zebra, highway=crossing} │ POINT (9.5087978 47.1647872) │ │ node/32011354 │ {crossing=uncontrolled, crossing:island=yes, highway=crossing, tactile_paving=no} │ POINT (9.5119617 47.1496875) │ │ node/32011360 │ {bus=yes, name=Vaduz Quäderle, public_transport=stop_position} │ POINT (9.5183012 47.1432488) │ │ node/32020981 │ {bus=yes, name=Eschen Presta, public_transport=stop_position} │ POINT (9.5284713 47.2074785) │ │ · │ · │ · │ │ · │ · │ · │ │ · │ · │ · │ │ way/284115729 │ {addr:city=Triesen, addr:country=LI, addr:housenumber=14, addr:postcode=9495, addr:street=Maschlinastrasse, building=apartments} │ POLYGON ((9.5257087 47.116193, 9.525701 47.11623, 9.5255504 47.1162157, 9.5255345 47.1162933, 9.5257857 47.1163172, 9.5258017 47.1162396, 9.5257965 47.1162391, 9.5258042 47.1162021, 9.5257087 47.116193)) │ │ way/328337684 │ {highway=path, tracktype=grade4} │ LINESTRING (9.5309695 47.1677601, 9.5312457 47.1677719, 9.5314399 47.1677555) │ │ way/408720754 │ {building=yes} │ POLYGON ((9.5082537 47.1450903, 9.5082649 47.1450668, 9.5082066 47.145054, 9.5081954 47.1450775, 9.5082537 47.1450903)) │ │ way/980924838 │ {building=yes} │ POLYGON ((9.53015 47.2145529, 9.5301362 47.2145351, 9.5301904 47.2145157, 9.5302042 47.2145336, 9.53015 47.2145529)) │ │ way/43341018 │ {cycleway:both=no, highway=residential, lit=yes, maxspeed=50, name=Tristelstrasse, surface=asphalt} │ LINESTRING (9.5439434 47.1203265, 9.5435746 47.1202864, 9.5433774 47.1203119, 9.5431956 47.1203594, 9.5429536 47.1204579, 9.5428477 47.1205154, 9.5427471 47.1205829, 9.5424159 47.120823, 9.5423131 47.1209343, 9.5422686 47.1210252, 9.54223 47.1211008, 9.5421986 47.1211624, 9.5421208 47.1212911, 9.5420591 47.1213568, 9.5419465 47.1214088, 9.5418177 47.1214544, 9.5416648 47.1215174) │ │ way/467032160 │ {landuse=grass} │ POLYGON ((9.5455113 47.2017008, 9.5455838 47.2018746, 9.5456547 47.2020257, 9.5460356 47.2019492, 9.5461053 47.202033, 9.5461912 47.2022226, 9.5462366 47.2024085, 9.5468649 47.2023763, 9.5483099 47.2022075, 9.5488763 47.2021917, 9.5492636 47.2021603, 9.5492186 47.2020387, 9.5493189 47.2019954, 9.549333 47.201909, 9.5494452 47.2017743, 9.5495179 47.2016106, 9.5493947 47.201515, 9.5491553 47.2014958, 9.5488548 47.201535, 9.5487161 47.2016371, 9.5484849 47.2011737, 9.5489819 47.2010952, 9.5486236 47.200781, 9.548604 47.2004357, 9.5483559 47.2001361, 9.5475955 47.2003155, 9.5474507 47.200239, 9.5472854 47.2001887, 9.5472249 47.2002387, 9.5460729 47.2001414, 9.5462646 47.2003626, 9.5462555 47.200473, 9.5465119 47.2008112, 9.5462544 47.2009023, 9.5461411 47.2007282, 9.545616 47.2008841, 9.5452163 47.2009694, 9.5452791 47.2011361, 9.5453811 47.2013512, 9.5458531 47.201271, 9.5459872 47.2016245, 9.5455113 47.2017008)) │ │ way/297358616 │ {highway=path} │ LINESTRING (9.5314893 47.1019879, 9.5316497 47.10196, 9.5318021 47.1019651, 9.531981 47.1019523, 9.5321293 47.1019286, 9.5322925 47.1019101, 9.5324383 47.1018718, 9.5326546 47.1018204, 9.5329196 47.1018301, 9.5331822 47.1018521, 9.5333722 47.1018772, 9.5335646 47.1019538) │ │ way/346556176 │ {addr:city=Triesen, addr:country=LI, addr:housenumber=10, addr:postcode=9495, addr:street=Weiherstrasse, building=yes} │ POLYGON ((9.5330071 47.1130913, 9.5330471 47.1129556, 9.5329149 47.1129376, 9.5328807 47.1130536, 9.532916 47.1130584, 9.5329102 47.1130781, 9.5330071 47.1130913)) │ │ way/1056833088 │ {building=yes} │ POLYGON ((9.4987575 47.0651143, 9.4987944 47.0650658, 9.4986707 47.0650222, 9.4986338 47.0650707, 9.4987575 47.0651143)) │ │ way/979816844 │ {addr:city=Eschen, addr:country=LI, addr:housenumber=31, addr:postcode=9492, addr:street=Sagenstrasse, building=yes} │ POLYGON ((9.5137626 47.2109118, 9.513672 47.2109144, 9.5136645 47.2107937, 9.5137554 47.2107911, 9.5137569 47.2108166, 9.5137707 47.2108162, 9.5137747 47.2108804, 9.5137607 47.2108808, 9.5137626 47.2109118)) │ ├────────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ ? 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/26863444 | {'name': 'Kuhgrat', 'natural': 'peak', 'wikida... | POINT (9.56083 47.16667) |
node/30603864 | {'crossing': 'uncontrolled', 'highway': 'cross... | POINT (9.52039 47.17052) |
node/32011241 | {'name': 'Oberplanken', 'place': 'hamlet'} | POINT (9.54502 47.1785) |
node/32011242 | {'loc_name': 'Planka', 'loc_name:de': 'Planka'... | POINT (9.54522 47.18588) |
node/32011279 | {'bus': 'yes', 'name': 'Schaanwald Zuschg', 'p... | POINT (9.56223 47.21138) |
... | ... | ... |
relation/7182745 | {'landuse': 'residential', 'type': 'multipolyg... | POLYGON ((9.52731 47.11932, 9.52722 47.11939, ... |
relation/7111273 | {'landuse': 'residential', 'type': 'multipolyg... | POLYGON ((9.49936 47.16394, 9.49929 47.16412, ... |
relation/16160185 | {'landuse': 'meadow', 'type': 'multipolygon'} | POLYGON ((9.57481 47.17175, 9.5744 47.17193, 9... |
relation/7079161 | {'landuse': 'residential', 'type': 'multipolyg... | POLYGON ((9.51731 47.17089, 9.51731 47.171, 9.... |
relation/16354156 | {'landuse': 'grass', 'type': 'multipolygon'} | POLYGON ((9.55162 47.23007, 9.55201 47.23013, ... |
51737 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: >