OSM PBF Loader¶
OSMPbfLoader
can really quickly parse full OSM extract in the form of *.osm.pbf
file.
It can download and parse a lot of features much faster than the OSMOnlineLoader
, but it's much more useful when a lot of different features are required at once (like when using predefined filters).
When only a single or few features are needed, OSMOnlineLoader
might be a better choice, since OSMPbfLoader
will use a full extract of all features in a given region and will have to iterate over all of them.
import geopandas as gpd
from shapely.geometry import Point, box
from srai.constants import REGIONS_INDEX, WGS84_CRS
from srai.geometry import buffer_geometry
from srai.loaders.osm_loaders import OSMPbfLoader
from srai.loaders.osm_loaders.filters import GEOFABRIK_LAYERS, HEX2VEC_FILTER
from srai.loaders.osm_loaders.filters.popular import get_popular_tags
from srai.regionalizers import geocode_to_region_gdf
Using OSMPbfLoader to download data for a specific area¶
Download all features from HEX2VEC_FILTER
in Warsaw, Poland¶
loader = OSMPbfLoader()
warsaw_gdf = geocode_to_region_gdf("Warsaw, Poland")
warsaw_features_gdf = loader.load(warsaw_gdf, HEX2VEC_FILTER)
warsaw_features_gdf
0%| | 0.00/90.8M [00:00<?, ?B/s]
0%| | 32.8k/90.8M [00:00<04:53, 309kB/s]
0%| | 81.9k/90.8M [00:00<03:49, 395kB/s]
0%| | 197k/90.8M [00:00<02:09, 698kB/s]
0%|▏ | 426k/90.8M [00:00<01:11, 1.26MB/s]
1%|▎ | 885k/90.8M [00:00<00:38, 2.33MB/s]
2%|▋ | 1.80M/90.8M [00:00<00:20, 4.41MB/s]
4%|█▍ | 3.62M/90.8M [00:00<00:10, 8.43MB/s]
7%|██▌ | 6.37M/90.8M [00:00<00:06, 13.7MB/s]
10%|███▊ | 9.26M/90.8M [00:00<00:04, 17.6MB/s]
13%|████▉ | 12.1M/90.8M [00:01<00:03, 20.2MB/s]
17%|██████▏ | 15.0M/90.8M [00:01<00:03, 22.0MB/s]
20%|███████▎ | 17.9M/90.8M [00:01<00:03, 23.2MB/s]
23%|████████▍ | 20.8M/90.8M [00:01<00:02, 24.1MB/s]
26%|█████████▋ | 23.7M/90.8M [00:01<00:02, 24.6MB/s]
29%|██████████▊ | 26.6M/90.8M [00:01<00:02, 25.0MB/s]
32%|████████████ | 29.4M/90.8M [00:01<00:02, 25.3MB/s]
36%|█████████████▏ | 32.3M/90.8M [00:01<00:02, 25.5MB/s]
39%|██████████████▎ | 35.2M/90.8M [00:01<00:02, 25.6MB/s]
42%|███████████████▌ | 38.1M/90.8M [00:02<00:02, 25.8MB/s]
45%|████████████████▋ | 41.0M/90.8M [00:02<00:01, 25.9MB/s]
48%|█████████████████▉ | 43.9M/90.8M [00:02<00:01, 25.9MB/s]
52%|███████████████████ | 46.7M/90.8M [00:02<00:01, 25.9MB/s]
55%|████████████████████▏ | 49.6M/90.8M [00:02<00:01, 26.0MB/s]
58%|█████████████████████▍ | 52.5M/90.8M [00:02<00:01, 26.0MB/s]
61%|██████████████████████▌ | 55.4M/90.8M [00:02<00:01, 26.0MB/s]
64%|███████████████████████▊ | 58.3M/90.8M [00:02<00:01, 26.1MB/s]
67%|████████████████████████▉ | 61.2M/90.8M [00:02<00:01, 26.1MB/s]
71%|██████████████████████████ | 64.0M/90.8M [00:03<00:01, 26.0MB/s]
74%|███████████████████████████▎ | 66.9M/90.8M [00:03<00:00, 26.0MB/s]
77%|████████████████████████████▍ | 69.8M/90.8M [00:03<00:00, 26.0MB/s]
80%|█████████████████████████████▋ | 72.7M/90.8M [00:03<00:00, 26.0MB/s]
83%|██████████████████████████████▊ | 75.6M/90.8M [00:03<00:00, 26.0MB/s]
86%|███████████████████████████████▉ | 78.5M/90.8M [00:03<00:00, 26.0MB/s]
90%|█████████████████████████████████▏ | 81.3M/90.8M [00:03<00:00, 26.0MB/s]
93%|██████████████████████████████████▎ | 84.2M/90.8M [00:03<00:00, 26.0MB/s]
96%|███████████████████████████████████▌ | 87.1M/90.8M [00:03<00:00, 26.0MB/s]
99%|████████████████████████████████████▋| 90.0M/90.8M [00:04<00:00, 26.1MB/s]
0%| | 0.00/90.8M [00:00<?, ?B/s]
100%|██████████████████████████████████████| 90.8M/90.8M [00:00<00:00, 109GB/s]
Finished operation in 0:00:58
geometry | aeroway | amenity | building | healthcare | historic | landuse | leisure | military | natural | office | shop | sport | tourism | water | waterway | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
feature_id | ||||||||||||||||
node/1813618197 | POINT (21.01174 52.23409) | None | bicycle_parking | None | None | None | None | None | None | None | None | None | None | None | None | None |
node/1814437609 | POINT (21.10331 52.24343) | None | None | None | None | None | None | None | None | None | None | jewelry | None | None | None | None |
node/1816586086 | POINT (21.09564 52.24604) | None | None | None | None | None | None | playground | None | None | None | None | None | None | None | None |
node/1816586087 | POINT (21.09564 52.24617) | None | recycling | None | None | None | None | None | None | None | None | None | None | None | None | None |
node/1818608481 | POINT (21.00281 52.22848) | None | bicycle_parking | None | None | None | None | None | None | None | None | None | None | None | None | None |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
way/267195862 | POLYGON ((20.9239 52.23076, 20.9242 52.23073, ... | None | None | semidetached_house | None | None | None | None | None | None | None | None | None | None | None | None |
way/267195863 | POLYGON ((20.92391 52.23116, 20.92407 52.23114... | None | None | semidetached_house | None | None | None | None | None | None | None | None | None | None | None | None |
way/267195865 | POLYGON ((20.92426 52.23093, 20.92413 52.23094... | None | None | detached | None | None | None | None | None | None | None | None | None | None | None | None |
way/267195867 | POLYGON ((20.92391 52.23116, 20.92392 52.23118... | None | None | semidetached_house | None | None | None | None | None | None | None | None | None | None | None | None |
way/267195869 | POLYGON ((20.9239 52.23076, 20.92391 52.23082,... | None | None | semidetached_house | None | None | None | None | None | None | None | None | None | None | None | None |
348063 rows × 16 columns
Plot features¶
Inspired by prettymaps
clipped_features_gdf = warsaw_features_gdf.clip(warsaw_gdf.geometry.union_all())
ax = warsaw_gdf.plot(color="lavender", figsize=(16, 16))
# plot water
clipped_features_gdf.dropna(subset=["water", "waterway"], how="all").plot(
ax=ax, color="deepskyblue"
)
# plot greenery
clipped_features_gdf[
clipped_features_gdf["landuse"].isin(
["grass", "orchard", "flowerbed", "forest", "greenfield", "meadow"]
)
].plot(ax=ax, color="mediumseagreen")
# plot buildings
clipped_features_gdf.dropna(subset=["building"], how="all").plot(
ax=ax, color="dimgray", markersize=0.1
)
xmin, ymin, xmax, ymax = warsaw_gdf.total_bounds
ax.set_xlim(xmin, xmax)
ax.set_ylim(ymin, ymax)
ax.set_axis_off()
Download all features from popular tags based on OSMTagInfo in Vienna, Austria¶
popular_tags = get_popular_tags(in_wiki_only=True)
num_keys = len(popular_tags)
f"Unique keys: {num_keys}."
'Unique keys: 378.'
{k: popular_tags[k] for k in list(popular_tags)[:10]}
{'4wd_only': ['yes'], 'LandPro08:reviewed': ['no'], 'abandoned': ['yes'], 'abandoned:railway': ['rail'], 'abutters': ['residential'], 'access': ['agricultural', 'customers', 'delivery', 'designated', 'destination', 'forestry', 'military', 'no', 'permissive', 'permit', 'private', 'unknown', 'yes'], 'access_control': ['full', 'partial'], 'addr:TW:dataset': ['137998'], 'addr:city': ['London', '臺北市'], 'addr:country': ['CZ', 'DE', 'RU', 'TW', 'US']}
vienna_center_circle = buffer_geometry(Point(16.37009, 48.20931), meters=1000)
vienna_center_circle_gdf = gpd.GeoDataFrame(
geometry=[vienna_center_circle],
crs=WGS84_CRS,
index=gpd.pd.Index(data=["Vienna"], name=REGIONS_INDEX),
)
loader = OSMPbfLoader()
vienna_features_gdf = loader.load(vienna_center_circle_gdf, popular_tags)
vienna_features_gdf
0%| | 0.00/49.0M [00:00<?, ?B/s]
0%| | 26.6k/49.0M [00:00<03:04, 266kB/s]
0%| | 80.9k/49.0M [00:00<01:54, 427kB/s]
0%|▏ | 175k/49.0M [00:00<01:13, 661kB/s]
1%|▎ | 369k/49.0M [00:00<00:41, 1.16MB/s]
1%|▍ | 515k/49.0M [00:00<00:38, 1.27MB/s]
2%|▊ | 968k/49.0M [00:00<00:20, 2.38MB/s]
4%|█▍ | 1.92M/49.0M [00:00<00:09, 4.71MB/s]
8%|██▊ | 3.74M/49.0M [00:00<00:05, 9.02MB/s]
14%|█████ | 6.75M/49.0M [00:00<00:02, 15.6MB/s]
18%|██████▋ | 8.93M/49.0M [00:01<00:02, 17.5MB/s]
25%|█████████▏ | 12.2M/49.0M [00:01<00:01, 22.2MB/s]
30%|███████████▏ | 14.8M/49.0M [00:01<00:01, 23.3MB/s]
37%|█████████████▌ | 18.0M/49.0M [00:01<00:01, 25.9MB/s]
42%|███████████████▌ | 20.6M/49.0M [00:01<00:01, 26.0MB/s]
49%|██████████████████ | 23.8M/49.0M [00:01<00:00, 27.8MB/s]
54%|████████████████████ | 26.6M/49.0M [00:01<00:00, 27.3MB/s]
61%|██████████████████████▌ | 29.8M/49.0M [00:01<00:00, 28.6MB/s]
67%|████████████████████████▋ | 32.6M/49.0M [00:01<00:00, 28.4MB/s]
73%|███████████████████████████▏ | 35.9M/49.0M [00:01<00:00, 29.7MB/s]
80%|█████████████████████████████▍ | 39.0M/49.0M [00:02<00:00, 30.0MB/s]
86%|███████████████████████████████▋ | 42.0M/49.0M [00:02<00:00, 29.4MB/s]
92%|█████████████████████████████████▉ | 44.9M/49.0M [00:02<00:00, 29.2MB/s]
99%|████████████████████████████████████▍| 48.3M/49.0M [00:02<00:00, 30.4MB/s]
0%| | 0.00/49.0M [00:00<?, ?B/s]
100%|█████████████████████████████████████| 49.0M/49.0M [00:00<00:00, 83.7GB/s]
/opt/hostedtoolcache/Python/3.10.18/x64/lib/python3.10/site-packages/quackosm/pb f_file_reader.py:2612: UserWarning: Select clause contains more than 100 columns (found 378 columns). Query might fail with insufficient memory resources. Consider applying more restrictive OsmTagsFilter for parsing. warnings.warn(
Finished operation in 0:00:31
geometry | access | admin_level | advertising | amenity | area:highway | artwork_type | atm | barrier | bench | ... | tunnel | type | usage | vehicle | vending | waste | water | water_source | waterway | wheelchair | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
feature_id | |||||||||||||||||||||
node/1167275147 | POINT (16.35999 48.21305) | None | None | None | None | None | None | None | None | None | ... | None | None | None | None | None | None | None | None | None | None |
node/1167275155 | POINT (16.36003 48.2132) | None | None | None | None | None | None | None | None | None | ... | None | None | None | None | None | None | None | None | None | None |
node/1167275172 | POINT (16.35906 48.21284) | None | None | None | None | None | None | None | None | None | ... | None | None | None | None | None | None | None | None | None | None |
node/1167275175 | POINT (16.3597 48.21325) | None | None | None | None | None | None | None | None | None | ... | None | None | None | None | None | None | None | None | None | None |
node/1167275195 | POINT (16.35903 48.21273) | None | None | None | None | None | None | None | None | None | ... | None | None | None | None | None | None | None | None | None | None |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
way/201856400 | LINESTRING (16.36802 48.20278, 16.36799 48.20272) | None | None | None | None | None | None | None | None | None | ... | None | None | None | None | None | None | None | None | None | None |
way/201856402 | LINESTRING (16.36884 48.20026, 16.36883 48.200... | None | None | None | None | None | None | None | None | None | ... | None | None | None | None | None | None | None | None | None | None |
way/201856403 | LINESTRING (16.36861 48.20065, 16.36877 48.200... | None | None | None | None | None | None | None | None | None | ... | None | None | None | None | None | None | None | None | None | None |
way/202489567 | POLYGON ((16.36844 48.2041, 16.36849 48.2041, ... | None | None | None | fast_food | None | None | None | None | None | ... | None | None | None | None | None | None | None | None | None | yes |
way/202498198 | LINESTRING (16.3708 48.21891, 16.37101 48.2188... | None | None | None | None | None | None | None | retaining_wall | None | ... | None | None | None | None | None | None | None | None | None | None |
23607 rows × 194 columns
Plot features¶
Uses default
preset colours from prettymaps
clipped_vienna_features_gdf = vienna_features_gdf.clip(vienna_center_circle)
ax = vienna_center_circle_gdf.plot(color="#F2F4CB", figsize=(16, 16))
# plot water
clipped_vienna_features_gdf.dropna(subset=["water", "waterway"], how="all").plot(
ax=ax, color="#a8e1e6"
)
# plot streets
clipped_vienna_features_gdf.dropna(subset=["highway"], how="all").plot(
ax=ax, color="#475657", markersize=0.1
)
# plot buildings
clipped_vienna_features_gdf.dropna(subset=["building"], how="all").plot(
ax=ax, color="#FF5E5B"
)
# plot parkings
clipped_vienna_features_gdf[
(clipped_vienna_features_gdf["amenity"] == "parking")
| (clipped_vienna_features_gdf["highway"] == "pedestrian")
].plot(ax=ax, color="#2F3737", markersize=0.1)
# plot greenery
clipped_vienna_features_gdf[
clipped_vienna_features_gdf["landuse"].isin(
["grass", "orchard", "flowerbed", "forest", "greenfield", "meadow"]
)
].plot(ax=ax, color="#8BB174")
xmin, ymin, xmax, ymax = vienna_center_circle_gdf.total_bounds
ax.set_xlim(xmin, xmax)
ax.set_ylim(ymin, ymax)
ax.set_axis_off()
Download all grouped features based on Geofabrik layers in New York, USA¶
manhattan_bbox = box(-73.994551, 40.762396, -73.936872, 40.804239)
manhattan_bbox_gdf = gpd.GeoDataFrame(
geometry=[manhattan_bbox],
crs=WGS84_CRS,
index=gpd.pd.Index(data=["New York"], name=REGIONS_INDEX),
)
loader = OSMPbfLoader()
new_york_features_gdf = loader.load(manhattan_bbox_gdf, GEOFABRIK_LAYERS)
new_york_features_gdf
/opt/hostedtoolcache/Python/3.10.18/x64/lib/python3.10/site-packages/quackosm/osm_extracts/__init__.py:592: GeometryNotCoveredWarning: Skipping extract because of low IoU value (bbbike_newyork, 0.000187). warnings.warn(
0%| | 0.00/97.9M [00:00<?, ?B/s]
0%| | 38.9k/97.9M [00:00<08:13, 198kB/s]
0%| | 98.3k/97.9M [00:00<04:27, 365kB/s]
0%| | 190k/97.9M [00:00<02:50, 573kB/s]
0%|▏ | 399k/97.9M [00:00<01:28, 1.10MB/s]
1%|▎ | 651k/97.9M [00:00<01:01, 1.57MB/s]
1%|▍ | 1.08M/97.9M [00:00<00:39, 2.45MB/s]
2%|▊ | 2.14M/97.9M [00:00<00:19, 5.03MB/s]
4%|█▎ | 3.54M/97.9M [00:00<00:12, 7.81MB/s]
7%|██▍ | 6.60M/97.9M [00:00<00:06, 14.8MB/s]
10%|███▊ | 10.1M/97.9M [00:01<00:04, 21.0MB/s]
13%|████▉ | 12.9M/97.9M [00:01<00:03, 23.1MB/s]
16%|██████ | 15.9M/97.9M [00:01<00:03, 25.3MB/s]
19%|███████▏ | 18.9M/97.9M [00:01<00:02, 26.5MB/s]
22%|████████▏ | 21.8M/97.9M [00:01<00:02, 27.2MB/s]
25%|█████████▎ | 24.6M/97.9M [00:01<00:02, 27.7MB/s]
28%|██████████▍ | 27.6M/97.9M [00:01<00:02, 28.2MB/s]
31%|███████████▌ | 30.4M/97.9M [00:01<00:02, 28.3MB/s]
34%|████████████▌ | 33.3M/97.9M [00:01<00:02, 28.5MB/s]
37%|█████████████▋ | 36.4M/97.9M [00:01<00:02, 29.0MB/s]
40%|██████████████▊ | 39.3M/97.9M [00:02<00:02, 28.9MB/s]
43%|███████████████▉ | 42.2M/97.9M [00:02<00:01, 28.9MB/s]
46%|█████████████████ | 45.2M/97.9M [00:02<00:01, 29.4MB/s]
49%|██████████████████▏ | 48.2M/97.9M [00:02<00:01, 29.3MB/s]
52%|███████████████████▎ | 51.1M/97.9M [00:02<00:01, 29.3MB/s]
55%|████████████████████▍ | 54.0M/97.9M [00:02<00:01, 29.3MB/s]
58%|█████████████████████▌ | 57.0M/97.9M [00:02<00:01, 29.0MB/s]
61%|██████████████████████▋ | 59.9M/97.9M [00:02<00:01, 28.9MB/s]
64%|███████████████████████▋ | 62.8M/97.9M [00:02<00:01, 28.7MB/s]
67%|████████████████████████▊ | 65.6M/97.9M [00:03<00:01, 28.3MB/s]
70%|█████████████████████████▉ | 68.6M/97.9M [00:03<00:01, 24.6MB/s]
73%|███████████████████████████ | 71.7M/97.9M [00:03<00:00, 26.4MB/s]
76%|████████████████████████████▏ | 74.5M/97.9M [00:03<00:00, 26.6MB/s]
79%|█████████████████████████████▎ | 77.6M/97.9M [00:03<00:00, 27.8MB/s]
82%|██████████████████████████████▍ | 80.4M/97.9M [00:03<00:00, 27.6MB/s]
85%|███████████████████████████████▌ | 83.5M/97.9M [00:03<00:00, 28.5MB/s]
88%|████████████████████████████████▋ | 86.4M/97.9M [00:03<00:00, 28.3MB/s]
91%|█████████████████████████████████▊ | 89.5M/97.9M [00:03<00:00, 29.2MB/s]
94%|██████████████████████████████████▉ | 92.4M/97.9M [00:03<00:00, 28.8MB/s]
97%|████████████████████████████████████ | 95.3M/97.9M [00:04<00:00, 28.6MB/s]
0%| | 0.00/97.9M [00:00<?, ?B/s]
100%|██████████████████████████████████████| 97.9M/97.9M [00:00<00:00, 115GB/s]
Finished operation in 0:00:36
geometry | accommodation | buildings | catering | education | fuel_parking | health | highway_links | landuse | leisure | ... | public | railways | shopping | tourism | traffic | transport | very_small_roads | water | water_traffic | waterways | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
feature_id | |||||||||||||||||||||
node/2644512030 | POINT (-73.96347 40.79874) | None | None | None | None | None | None | None | None | None | ... | None | None | shop=convenience | None | None | None | None | None | None | None |
node/2652371191 | POINT (-73.96383 40.80335) | None | None | amenity=restaurant | None | None | None | None | None | None | ... | None | None | None | None | None | None | None | None | None | None |
node/2674566010 | POINT (-73.96115 40.80142) | None | None | None | None | None | None | None | None | None | ... | None | None | amenity=vending_machine | None | None | None | None | None | None | None |
node/2676085867 | POINT (-73.94711 40.77966) | None | None | amenity=restaurant | None | None | None | None | None | None | ... | None | None | None | None | None | None | None | None | None | None |
node/4970497088 | POINT (-73.94532 40.79095) | None | None | None | None | None | None | None | None | None | ... | None | None | None | None | highway=crossing | None | None | None | None | None |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
way/1123883122 | LINESTRING (-73.97988 40.78381, -73.98008 40.7... | None | None | None | None | None | None | None | None | None | ... | None | None | None | None | None | None | None | None | None | None |
way/1123883123 | LINESTRING (-73.97988 40.78381, -73.97981 40.7... | None | None | None | None | None | None | None | None | None | ... | None | None | None | None | None | None | None | None | None | None |
way/1150705656 | LINESTRING (-73.97303 40.76428, -73.97307 40.7... | None | None | None | None | None | None | None | None | None | ... | None | None | None | None | None | None | None | None | None | None |
way/1150789783 | POLYGON ((-73.97081 40.79135, -73.9707 40.7913... | None | None | None | None | None | None | None | None | sport=tennis | ... | None | None | None | None | None | None | None | None | None | None |
way/1150789784 | POLYGON ((-73.97068 40.79129, -73.97056 40.791... | None | None | None | None | None | None | None | None | sport=tennis | ... | None | None | None | None | None | None | None | None | None | None |
50955 rows × 27 columns
Plot features¶
Inspired by https://snazzymaps.com/style/14889/flat-pale
ax = manhattan_bbox_gdf.plot(color="#e7e7df", figsize=(16, 16))
# plot greenery
new_york_features_gdf[new_york_features_gdf["leisure"] == "leisure=park"].plot(
ax=ax, color="#bae5ce"
)
# plot water
new_york_features_gdf.dropna(subset=["water", "waterways"], how="all").plot(
ax=ax, color="#c7eced"
)
# plot streets
new_york_features_gdf.dropna(subset=["paths_unsuitable_for_cars"], how="all").plot(
ax=ax, color="#e7e7df", linewidth=1
)
new_york_features_gdf.dropna(
subset=["very_small_roads", "highway_links", "minor_roads"], how="all"
).plot(ax=ax, color="#fff", linewidth=2)
new_york_features_gdf.dropna(subset=["major_roads"], how="all").plot(
ax=ax, color="#fac9a9", linewidth=3
)
# plot buildings
new_york_features_gdf.dropna(subset=["buildings"], how="all").plot(
ax=ax, color="#cecebd"
)
xmin, ymin, xmax, ymax = manhattan_bbox_gdf.total_bounds
ax.set_xlim(xmin, xmax)
ax.set_ylim(ymin, ymax)
ax.set_axis_off()
Using OSMPbfLoader to download data for a specific area and transforming it to GeoParquet file¶
Download all grouped features based on Geofabrik layers in Reykjavík, Iceland¶
loader = OSMPbfLoader()
reykjavik_gdf = geocode_to_region_gdf("Reykjavík, IS")
reykjavik_features_gpq = loader.load_to_geoparquet(reykjavik_gdf, GEOFABRIK_LAYERS)
reykjavik_features_gpq
0%| | 0.00/62.9M [00:00<?, ?B/s]
0%| | 12.3k/62.9M [00:00<10:55, 95.9kB/s]
0%| | 41.0k/62.9M [00:00<06:10, 170kB/s]
0%| | 98.3k/62.9M [00:00<03:35, 292kB/s]
0%|▏ | 209k/62.9M [00:00<02:02, 511kB/s]
1%|▎ | 438k/62.9M [00:00<01:05, 961kB/s]
1%|▌ | 893k/62.9M [00:00<00:34, 1.82MB/s]
3%|█ | 1.80M/62.9M [00:00<00:17, 3.50MB/s]
6%|██▏ | 3.62M/62.9M [00:01<00:08, 6.83MB/s]
10%|███▋ | 6.31M/62.9M [00:01<00:05, 11.2MB/s]
14%|█████▎ | 8.99M/62.9M [00:01<00:03, 13.9MB/s]
19%|██████▊ | 11.6M/62.9M [00:01<00:03, 15.9MB/s]
23%|████████▍ | 14.3M/62.9M [00:01<00:02, 17.2MB/s]
27%|█████████▉ | 16.9M/62.9M [00:01<00:02, 18.2MB/s]
31%|███████████▍ | 19.5M/62.9M [00:01<00:02, 18.7MB/s]
35%|█████████████ | 22.1M/62.9M [00:01<00:02, 19.0MB/s]
39%|██████████████▌ | 24.7M/62.9M [00:02<00:01, 19.1MB/s]
43%|████████████████ | 27.3M/62.9M [00:02<00:01, 19.2MB/s]
48%|█████████████████▌ | 29.9M/62.9M [00:02<00:01, 19.6MB/s]
52%|███████████████████▏ | 32.5M/62.9M [00:02<00:01, 19.7MB/s]
56%|████████████████████▋ | 35.1M/62.9M [00:02<00:01, 19.7MB/s]
60%|██████████████████████ | 37.6M/62.9M [00:02<00:01, 19.6MB/s]
64%|███████████████████████▌ | 40.1M/62.9M [00:02<00:01, 19.4MB/s]
68%|█████████████████████████ | 42.7M/62.9M [00:03<00:01, 19.5MB/s]
72%|██████████████████████████▌ | 45.2M/62.9M [00:03<00:00, 19.5MB/s]
76%|████████████████████████████ | 47.7M/62.9M [00:03<00:00, 19.5MB/s]
80%|█████████████████████████████▌ | 50.2M/62.9M [00:03<00:00, 19.4MB/s]
84%|███████████████████████████████ | 52.7M/62.9M [00:03<00:00, 19.3MB/s]
88%|████████████████████████████████▍ | 55.2M/62.9M [00:03<00:00, 19.3MB/s]
92%|█████████████████████████████████▉ | 57.7M/62.9M [00:03<00:00, 19.4MB/s]
95%|███████████████████████████████████ | 59.7M/62.9M [00:03<00:00, 19.3MB/s]
98%|████████████████████████████████████▏| 61.6M/62.9M [00:04<00:00, 18.4MB/s]
0%| | 0.00/62.9M [00:00<?, ?B/s]
100%|██████████████████████████████████████| 62.9M/62.9M [00:00<00:00, 119GB/s]
Finished operation in 0:00:22
PosixPath('files/372cc10dc2cb70fec59ce6093baa282a6c709187d7106ba7ccc97660a0426039_098931824b94bfe02e01bc4987422a39ec47bd3f6924e5325ddae0846badafba_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_features_gpq))
features_relation
┌─────────────────┬───────────────┬─────────────┬─────────────────┬────────────────────┬───────────┬──────────────┬─────────┬───────────────┬─────────┬─────────┬───────────────────┬─────────────────────┬─────────┬─────────┬─────────┬───────────────────────────┬─────────┬─────────┬──────────┬───────────────────┬─────────┬─────────────────────────┬───────────┬──────────────────┬─────────┬───────────────┬───────────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ feature_id │ accommodation │ air_traffic │ buildings │ catering │ education │ fuel_parking │ health │ highway_links │ landuse │ leisure │ major_roads │ minor_roads │ miscpoi │ money │ natural │ paths_unsuitable_for_cars │ pofw │ public │ railways │ shopping │ tourism │ traffic │ transport │ very_small_roads │ water │ water_traffic │ waterways │ geometry │ │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ geometry │ ├─────────────────┼───────────────┼─────────────┼─────────────────┼────────────────────┼───────────┼──────────────┼─────────┼───────────────┼─────────┼─────────┼───────────────────┼─────────────────────┼─────────┼─────────┼─────────┼───────────────────────────┼─────────┼─────────┼──────────┼───────────────────┼─────────┼─────────────────────────┼───────────┼──────────────────┼─────────┼───────────────┼───────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ node/5581376908 │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ highway=crossing │ NULL │ NULL │ NULL │ NULL │ NULL │ POINT (-21.7281026 64.1294801) │ │ node/5594794402 │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ highway=crossing │ NULL │ NULL │ NULL │ NULL │ NULL │ POINT (-21.827036 64.0986751) │ │ node/5594794405 │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ highway=crossing │ NULL │ NULL │ NULL │ NULL │ NULL │ POINT (-21.8274817 64.0987943) │ │ node/5594797949 │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ highway=crossing │ NULL │ NULL │ NULL │ NULL │ NULL │ POINT (-21.8301829 64.1020943) │ │ node/5594797959 │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ highway=crossing │ NULL │ NULL │ NULL │ NULL │ NULL │ POINT (-21.8366017 64.1097874) │ │ node/5598130322 │ NULL │ NULL │ NULL │ amenity=restaurant │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ POINT (-21.9122784 64.1431872) │ │ node/5804867375 │ NULL │ NULL │ NULL │ amenity=bar │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ POINT (-21.9340774 64.1463017) │ │ node/5873818547 │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ highway=crossing │ NULL │ NULL │ NULL │ NULL │ NULL │ POINT (-21.8827521 64.1336397) │ │ node/5873818560 │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ highway=crossing │ NULL │ NULL │ NULL │ NULL │ NULL │ POINT (-21.8850238 64.1351931) │ │ node/5873818574 │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ highway=traffic_signals │ NULL │ NULL │ NULL │ NULL │ NULL │ POINT (-21.8852863 64.1352798) │ │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ │ way/497237953 │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ highway=path │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ LINESTRING (-21.7692598 64.0947813, -21.7693609 64.0947345, -21.7694441 64.0946654, -21.7695862 64.0946208, -21.7697203 64.0944896, -21.7698544 64.0944216, -21.7699966 64.09424, -21.7701226 64.0941416, -21.770179 64.094083, -21.7702103 64.0940469) │ │ way/497237954 │ NULL │ NULL │ building=ruins │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ POLYGON ((-21.7599503 64.0946694, -21.7598195 64.0947062, -21.7598982 64.0947595, -21.7600289 64.0947227, -21.7599503 64.0946694)) │ │ way/497238319 │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ highway=path │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ LINESTRING (-21.7857919 64.0642789, -21.7860666 64.0641927, -21.786568 64.0640919, -21.7873008 64.0639927, -21.7875386 64.0639915, -21.7880332 64.0640213, -21.7882243 64.0640594, -21.7885505 64.0641391, -21.7887739 64.0641657, -21.7889621 64.064157, -21.7891565 64.0641415, -21.7892763 64.0641627, -21.7896628 64.0643452, -21.7897393 64.0644028, -21.7897504 64.0644726, -21.7897063 64.0646378, -21.7897276 64.0647416, -21.7897678 64.0648084, -21.7897472 64.064867, -21.7896424 64.0649538, -21.7894126 64.0651013, -21.7892276 64.0652017, -21.7891398 64.0652784, -21.7891127 64.0653633, -21.7891208 64.0654387, -21.7892128 64.0655978, -21.7892616 64.0657956, -21.7892458 64.0658222, -21.7892068 64.0658537, -21.7892267 64.0658874, -21.7897044 64.0661584, -21.7900731 64.0661876, -21.7901615 64.0662209, -21.7905986 64.0665041, -21.7907234 64.0665704, -21.7908108 64.0665754, -21.790971 64.0665519, -21.7910792 64.0665565, -21.791178 64.0665979, -21.7913604 64.0667199, -21.7917252 64.0668231, -21.7917252 64.0670249, -21.7916072 64.0671797, -21.7919075 64.0672956, -21.7918877 64.0674077, -21.7919029 64.0674514, -21.7919435 64.0674951) │ │ way/497243480 │ NULL │ NULL │ building=yes │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ shop=dry_cleaning │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ POLYGON ((-21.8738816 64.1331448, -21.8742107 64.1333258, -21.8739799 64.1334076, -21.8736435 64.1332266, -21.8738816 64.1331448)) │ │ way/497246861 │ NULL │ NULL │ building=garage │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ POLYGON ((-21.9568261 64.1456098, -21.9567044 64.1455457, -21.956514 64.1456145, -21.9566357 64.1456786, -21.9568261 64.1456098)) │ │ way/497247728 │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ highway=secondary │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ LINESTRING (-21.8800163 64.1235588, -21.8803299 64.1231576, -21.8803642 64.123116, -21.8804554 64.1230103) │ │ way/497250377 │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ highway=secondary │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ LINESTRING (-21.8807596 64.1229698, -21.8805854 64.1229482, -21.8805161 64.1229399) │ │ way/497250378 │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ highway=secondary │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ LINESTRING (-21.8805161 64.1229399, -21.8803599 64.1229215) │ │ way/497252540 │ NULL │ NULL │ building=yes │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ POLYGON ((-21.8495439 64.119822, -21.8496638 64.119767, -21.8495478 64.1197188, -21.8494278 64.1197737, -21.8495439 64.119822)) │ │ way/497253907 │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ highway=residential │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ LINESTRING (-21.8701507 64.1215101, -21.8700147 64.1215903, -21.8698833 64.1216786, -21.869859 64.1216967, -21.8697723 64.121762) │ ├─────────────────┴───────────────┴─────────────┴─────────────────┴────────────────────┴───────────┴──────────────┴─────────┴───────────────┴─────────┴─────────┴───────────────────┴─────────────────────┴─────────┴─────────┴─────────┴───────────────────────────┴─────────┴─────────┴──────────┴───────────────────┴─────────┴─────────────────────────┴───────────┴──────────────────┴─────────┴───────────────┴───────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ ? rows (>9999 rows, 20 shown) 29 columns │ └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Count all buildings¶
features_relation.filter("buildings IS NOT NULL").count("feature_id")
┌───────────────────┐ │ count(feature_id) │ │ int64 │ ├───────────────────┤ │ 25372 │ └───────────────────┘
You can see more examples of how to use PbfFileReader
from the QuackOSM
library in the docs: https://kraina-ai.github.io/quackosm/latest/examples/pbf_file_reader/