Сегодня открою вам Америку на основе данных OpenStreetMap в PostgreSQL15/PostGIS и моего проекта openstreetmap_h3. Запустим запрос и сравним время его выполнения на колоночном хранилище Citus в PostgreSQL и на стандартном в секционированной по H3 геоиндексу базе данных объемом 100GB.
Найдем top15 мест по застройке а Северной Америке и общую протяженность дорог, а также их тип и покрытие. Не буду перегружать публикацию логами программ, сфокусируемся на данных! Вы можете легко повторить все запросы самостоятельно на своем компьютере или ноутбуке.
Статистика
Мы живем в удивительном мире, когда современный ноутбук работает производительнее многих суперкомпьютеров 20 летней давности и доступные накопители позволяют хранить терабайты данных с малым временем доступа. К тому же с каждым годом становится доступно все больше открытых данных — географических, экономических. Появляются новые специализированные базы данных и движки для работы с большими данными. Новые средства которые дают возможность легко получать ответы на вопросы.
Как говорил Марк Твен «существуют три вида лжи: ложь, наглая ложь и статистика». Не будем верить доступным данным статистики, а пересчитаем все самостоятельно на основе открытых данных.
Загрузка Северной Америки в PostgreSQL15
Собираем openstreetmap‑h3, для этого нужны maven, git, JDK11+
git clone https://github.com/igor-suhorukov/openstreetmap_h3.git
cd openstreetmap_h3
git checkout dev/postgresql15
mvn install
Собираем docker образ с PostgreSQL 15.1, PostGIS 3.3.2, H3 4.1.1:
cd postgis_docker-master
docker build -t postgres15_postgis .
Скачиваем Америку с сайта Geofabrik:
wget https://download.geofabrik.de/north-america-latest.osm.pbf
Объем исходных данных OpenStreetMap 13,0 GB, которые мы превращаем из north‑america‑latest.osm.pbf в tsv данные и набор скриптов для загрузки в PostgreSQL:
java -jar target/osm-to-pgsnapshot-schema-ng-1.0-SNAPSHOT.jar -columnar_storage -source_pbf ~/dev/map/north-america/north-america-latest.osm.pbf
Создаем новый контейнер и загружаем в него данные:
docker run --name postgis15-north-america-citus --memory=12g --memory-swap=12g --memory-swappiness 0 --shm-size=1g -v /home/acc/dev/map/database/north-america:/var/lib/postgresql/data -v /home/acc/dev/map/north-america/north-america-latest_loc_ways:/input -e POSTGRES_PASSWORD=osmworld -d -p 5432:5432 postgres15_postgis:latest -c checkpoint_timeout='15 min' -c checkpoint_completion_target=0.9 -c shared_buffers='4096 MB' -c wal_buffers=-1 -c bgwriter_delay=200ms -c bgwriter_lru_maxpages=100 -c bgwriter_lru_multiplier=2.0 -c bgwriter_flush_after=0 -c max_wal_size='32768 MB' -c min_wal_size='16384 MB'
База данных с географией Северной Америки
Подключаемся к базе данных и проверим версии компонент:
psql -h 172.17.0.1 -p 5432 -U postgres -d osmworld
osmworld=# select version();
version
-----------------------------------------------------------------------------------------------------------------------------
PostgreSQL 15.1 (Debian 15.1-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
(1 row)
osmworld=# \dx
List of installed extensions
Name | Version | Schema | Description
----------------+---------+------------+------------------------------------------------------------
citus | 11.1-1 | pg_catalog | Citus distributed database
citus_columnar | 11.1-1 | pg_catalog | Citus Columnar extension
h3 | 4.1.1 | public | H3 bindings for PostgreSQL
hstore | 1.8 | public | data type for storing sets of (key, value) pairs
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
postgis | 3.3.2 | public | PostGIS geometry and geography spatial types and functions
(6 rows)
osmworld=# :dba
Time: 1,738 ms
Time: 0,212 ms
Time: 0,122 ms
Time: 0,247 ms
Menu:
0 – Node & current DB information: master/replica, lag, DB size, tmp files, etc.
1 – Databases: size, stats
q – Quit
Type your choice and press <Enter>:
0
Time: 0,872 ms
metric | value
-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------
Postgres Version | PostgreSQL 15.1 (Debian 15.1-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
Config file | /var/lib/postgresql/data/postgresql.conf
Role | Master
Replicas |
Started At | 2023-02-15 09:37:17+00
Uptime | 00:01:06
Checkpoints | 9
Forced Checkpoints | 88.9%
Checkpoint MB/sec | 0.020285
--------------------------------- | ----------------------------------------------------------------------------------------
Database Name | osmworld
Database Size | 100 GB
Stats Since |
Stats Age |
Installed Extensions | citus 11.1-1, citus_columnar 11.1-1, h3 4.1.1, hstore 1.8, plpgsql 1.0 +
| postgis 3.3.2
Cache Effectiveness | 41.82%
Successful Commits | 100.00%
Conflicts | 0
Temp Files: total size | 3771 MB
Temp Files: total number of files | 98
Temp Files: avg file size | 38 MB
Deadlocks | 0
(22 rows)
Time: 21,103 ms
Таблицы по которым мы будем запускать запросы в колоночном хранилище citus_columnar хранятся в PostgreSQL базе, которая занимает 100 GB.
Плотность застройки
Теперь мы можем посчитать сколько зданий в таблице ways в каждом из шестигранников сетки разбиения H3 на уровне 3 и выбрать из них только 15 в порядке уменьшения числа строений:
osmworld=# select h3_3, count(*) from ways where building group by 1 order by 2 desc limit 15;
h3_3 | count
-------+---------
10768 | 2608290
10657 | 2031406
10920 | 1620451
10660 | 1396225
10772 | 1224476
17601 | 1197694
11163 | 1168809
10803 | 1108671
9928 | 1091346
10800 | 1089511
10288 | 1039033
10656 | 980499
10661 | 973984
10480 | 928448
9828 | 909524
(15 rows)
Time: 3974,699 ms (00:03,975)
Визуализируем эти регионы с помощью запроса в QGIS:
select buildings.*,h3b.bounds,row_number() OVER ( order by count desc) as rownum
from h3_3_bounds_complex h3b
inner join
(select h3_3, count(*) from ways where building group by 1 order by 2 desc limit 15) buildings
on h3b.id=buildings.h3_3
Для сравнения тот же самый запрос на классическом (heap) хранилище PostgreSQL:
docker start postgis15-north-america
osmworld=# select h3_3, count(*) from ways where building group by 1 order by 2 desc limit 15;
h3_3 | count
-------+---------
10768 | 2608290
10657 | 2031406
10920 | 1620451
10660 | 1396225
10772 | 1224476
17601 | 1197694
11163 | 1168809
10803 | 1108671
9928 | 1091346
10800 | 1089511
10288 | 1039033
10656 | 980499
10661 | 973984
10480 | 928448
9828 | 909524
(15 rows)
Time: 42153,407 ms (00:42,153)
Этот запрос выполнился в 10.6 раз дольше чем на Citus column (42,153с heap VS 3,975с column).
Дороги Северной Америки
Общая длина дорог и троп:
osmworld=# select sum(ST_Length(linestring::geography))
osmworld-# from ways
osmworld-# where tags->'highway' is not null
osmworld-# and tags->'highway' not in ('platform','bus_stop','corridor','rest_area');
sum
--------------------
17333069670.373722
(1 row)
Time: 236019,990 ms (03:56,020)
Длина только тех, для которых указан тип покрытия:
osmworld=# select sum(ST_Length(linestring::geography))
osmworld-# from ways
osmworld-# where tags->'highway' is not null
osmworld-# and tags->'highway' not in ('platform','bus_stop','corridor','rest_area')
osmworld-# and tags->'surface' is not null;
sum
-------------------
4683910752.668413
(1 row)
Time: 84941,031 ms (01:24,941)
Оценим полноту данных по покрытию:
osmworld=# select count(tags->'surface')*100.0/count(*) form from ways
where tags->'highway' is not null
and tags->'highway' not in ('platform','bus_stop','corridor','rest_area');
form
---------------------
17.8903148327659968
(1 row)
Time: 15601,571 ms (00:15,602)
Теперь просуммируем по типу покрытия:
osmworld=# select
tags->'surface' "surface_type",
sum(ST_Length(linestring::geography))
from ways
where tags->'highway' is not null
and tags->'highway' not in ('platform','bus_stop','corridor','rest_area')
and tags->'surface' is not null
group by 1
having count(*) >=100
order by 2 desc;
surface_type | sum
-----------------------+--------------------
unpaved | 1652815720.1065524
asphalt | 1364860501.5095317
gravel | 508458110.63075835
paved | 417214264.78016436
dirt | 298434798.3305051
ground | 186407920.22584632
concrete | 163305537.72818062
compacted | 29695112.501213416
sand | 10358279.6686242
grass | 8177577.5513973655
concrete:plates | 7839326.0808026455
fine_gravel | 7070308.215675858
paving_stones | 4528857.6939902995
earth | 4047844.559239158
ice | 3251766.8227435704
pebblestone | 3044145.111581855
wood | 1548257.2810464564
cobblestone | 1537007.58652311
limerock | 1154768.9652535582
dirt/sand | 1122131.6047778637
trail | 957280.1821749548
crushed_limestone | 693230.4216405117
concrete:lanes | 550729.2561993373
soil | 486167.0521078333
mud | 481869.20646625035
brick | 405033.45128156105
bricks | 375971.1124591282
chipseal | 363933.36915447767
sett | 248202.94349638248
natural | 235102.6922085221
woodchips | 160545.90482571782
rock | 146208.27722591715
unhewn_cobblestone | 125749.92425415723
metal | 88785.57955673145
spur | 54000.13141806118
cobblestone:flattened | 51647.857174154095
bark | 32652.962135521146
mulch | 27545.921618327953
boardwalk | 27291.09042737315
cement | 26397.24288501879
stone | 25544.130645372174
grass_paver | 22737.854763573207
block | 13035.364332975803
metal_grid | 8508.7689744505
2 | 8200.875450534988
stepping_stones | 1905.2749432306568
(46 rows)
Теперь посмотрим протяженность по типу дорог:
osmworld=# select tags->'highway',sum(ST_Length(linestring::geography))
from ways where tags->'highway' is not null
and tags->'highway' not in ('platform','bus_stop','corridor','rest_area')
group by 1 having count(*)>=100 order by 2 desc;
?column? | sum
----------------+--------------------
residential | 5645591764.076551
service | 2971654450.570504
track | 2457547483.583801
unclassified | 1993885988.1285813
tertiary | 1214043395.8814895
secondary | 723958953.0845761
footway | 632639912.4949341
path | 480816819.3575947
primary | 469162054.7166547
motorway | 245362469.24192086
trunk | 239323368.6696571
cycleway | 100250842.26426062
motorway_link | 70930030.73010331
proposed | 13177426.45433327
construction | 12253141.298817866
trunk_link | 10567863.175455065
bridleway | 9684141.014057217
living_street | 8846280.895166134
primary_link | 7444718.182813775
pedestrian | 6924058.676602626
secondary_link | 5057131.034404312
road | 4315063.417226655
raceway | 3479146.9071076848
tertiary_link | 2315092.220026257
steps | 1590123.0661222872
services | 803185.248279694
abandoned | 679751.4909001294
busway | 234694.90633171005
bus_guideway | 130270.53462602737
planned | 129935.32424801859
razed | 101886.62926516314
escape | 75061.51276658909
disused | 29283.81533118899
elevator | 8043.809559098002
(34 rows)
Time: 252662,933 ms (04:12,663)
И добавим к типу дорог тип покрытия:
osmworld=# select tags->'highway' "road_type",
tags->'surface' "surface_type",
sum(ST_Length(linestring::geography))
from ways
where tags->'highway' is not null
and tags->'highway' not in ('platform','bus_stop','corridor','rest_area')
group by 1,2
having count(*)>=100
order by 3 desc;
road_type | surface_type | sum
----------------+--------------------+--------------------
residential | | 4763401026.858094
service | | 2646528071.9827824
track | | 1884625080.1819654
unclassified | | 803621442.5929096
tertiary | | 710555856.4372112
unclassified | unpaved | 705905327.6811218
footway | | 471736761.945697
secondary | | 421890532.64897823
track | unpaved | 343763333.596261
residential | asphalt | 333411585.3559667
residential | unpaved | 299735764.42184454
path | | 289098741.5865223
primary | | 244156319.24732155
unclassified | gravel | 243598138.31110144
tertiary | asphalt | 240733173.70222318
secondary | asphalt | 215401222.95500344
primary | asphalt | 170428859.68408427
service | unpaved | 146554062.94818687
motorway | | 137914050.71618488
trunk | | 129236710.00592434
track | dirt | 125562066.74714226
residential | gravel | 110258472.83744836
tertiary | unpaved | 100908889.53088643
service | asphalt | 93346831.40959103
trunk | asphalt | 89758448.38001442
residential | paved | 87999243.86922555
tertiary | paved | 87994213.52129921
path | ground | 82002271.23108393
motorway | asphalt | 81019470.89036791
footway | concrete | 79210367.51960273
unclassified | dirt | 67817273.36151944
unclassified | asphalt | 61762007.44361189
unclassified | paved | 57112015.35820832
tertiary | gravel | 51756606.24016952
secondary | paved | 49833719.879313916
motorway_link | | 46416693.82958645
path | dirt | 45621263.32209663
track | ground | 42852401.54191421
primary | paved | 42449956.38505393
track | gravel | 38496421.88388152
unclassified | ground | 36441972.3942225
cycleway | | 34811115.38976194
service | gravel | 32493147.550596934
cycleway | asphalt | 27113351.132957958
path | unpaved | 24397178.109620415
service | paved | 22499920.406084005
footway | paved | 21128165.24793853
residential | dirt | 18140805.01287318
motorway_link | asphalt | 17697463.3352245
residential | concrete | 17180996.330276847
motorway | concrete | 15797143.405233588
secondary | unpaved | 14951004.396679036
trunk | paved | 14544248.496826058
footway | asphalt | 14139380.466019733
service | dirt | 13533635.975871304
footway | dirt | 12475554.942645315
proposed | | 12412404.479500988
secondary | gravel | 12359859.326103551
footway | ground | 12179598.43185987
cycleway | paved | 11692894.243439678
construction | | 10434301.517878689
unclassified | compacted | 10083340.114492217
motorway | paved | 9739514.320030514
path | asphalt | 9414713.962064302
tertiary | dirt | 9052189.009797093
service | concrete | 8954778.624278365
secondary | concrete | 7238263.248977672
path | gravel | 7127529.505746644
footway | unpaved | 7121128.04537417
trunk_link | | 7100005.578315217
living_street | | 6957202.813900431
cycleway | concrete | 6418397.632759386
path | paved | 6364598.297245062
residential | compacted | 5912938.710068744
track | sand | 5608795.294502438
trunk | concrete | 5273502.003184203
tertiary | concrete | 5029174.945935459
primary_link | | 4850982.357941081
path | concrete | 4845785.159585622
primary | concrete | 4769072.452942328
pedestrian | | 4727580.457758072
bridleway | | 4683993.889887575
cycleway | unpaved | 4592254.488169263
cycleway | gravel | 4531796.28164687
motorway_link | concrete | 4446552.844258176
track | compacted | 3882946.5630481234
tertiary | compacted | 3768274.047507852
primary | gravel | 3699044.781700628
track | grass | 3593391.0202003038
footway | concrete:plates | 3591011.286780505
cycleway | dirt | 3545659.5238580364
service | ground | 3437765.4926561713
secondary_link | | 3414984.794106794
footway | gravel | 3383808.3633199693
road | | 3356383.4854103657
residential | ground | 2956457.0084883217
primary | unpaved | 2847185.76046211
trunk_link | asphalt | 2775679.113175762
cycleway | fine_gravel | 2446477.540956408
raceway | | 2411263.7490123133
track | pebblestone | 2301870.9579834472
tertiary | ground | 2260195.753934444
motorway_link | paved | 2144888.2806652286
primary_link | asphalt | 2134589.9168418245
path | earth | 2040922.4883732798
cycleway | ground | 1970167.8353412757
bridleway | ground | 1967466.2354609983
path | grass | 1888070.7409965922
path | compacted | 1857097.471348198
residential | paving_stones | 1814454.1311404312
footway | grass | 1731987.8252963582
unclassified | sand | 1691170.1008224054
track | paved | 1632302.4668008054
cycleway | compacted | 1616176.9569416267
tertiary_link | | 1612537.7967704032
bridleway | dirt | 1609471.513948336
service | compacted | 1607442.4257461077
footway | paving_stones | 1415560.3667816524
path | sand | 1350888.8938942542
secondary_link | asphalt | 1329023.0169268274
path | fine_gravel | 1281473.8216985897
unclassified | concrete | 1221896.2071398764
steps | | 1184717.256174309
track | limerock | 1129378.424354146
track | asphalt | 1075047.282542879
residential | cobblestone | 1059485.2912852596
pedestrian | concrete | 1032715.6747134975
track | earth | 887940.2426770492
motorway | concrete:plates | 887772.985242092
path | trail | 883190.683327884
unclassified | fine_gravel | 861872.3240972031
living_street | asphalt | 861745.8339908258
services | | 798963.5122002938
residential | concrete:plates | 781482.2986809855
secondary | concrete:plates | 750952.7214043038
construction | asphalt | 726776.6693312767
cycleway | crushed_limestone | 685798.6089688728
residential | fine_gravel | 679792.8561554619
footway | fine_gravel | 673063.1444234059
abandoned | | 660868.6176068272
footway | wood | 613236.7794218957
footway | sand | 576903.3580167836
construction | paved | 570144.5593899674
path | wood | 566661.8641079792
bridleway | unpaved | 545455.7255129513
footway | compacted | 533918.300248029
service | fine_gravel | 524744.6615275827
secondary | ice | 522710.2378628283
tertiary_link | asphalt | 520411.8219238426
service | concrete:plates | 478497.79336747277
residential | sand | 449229.43782958493
living_street | unpaved | 419139.16090518294
primary | concrete:plates | 412410.0601491582
proposed | asphalt | 409837.9017696265
track | dirt/sand | 408159.62457694276
footway | earth | 398114.2568012427
track | fine_gravel | 396033.7962820694
raceway | dirt | 384412.85082210996
footway | concrete:lanes | 384388.78014350444
road | dirt | 375608.21000385896
bridleway | gravel | 351706.6890854066
raceway | asphalt | 338814.6551858863
pedestrian | paving_stones | 330745.75517430564
service | grass | 330241.696258488
road | unpaved | 326967.0915144114
trunk_link | paved | 326698.20477597584
service | sand | 325567.8481155458
trunk_link | concrete | 321293.93015355075
pedestrian | asphalt | 306435.4369459363
tertiary | concrete:plates | 304447.7109953402
pedestrian | paved | 291670.5994772637
track | concrete | 288702.54363131255
unclassified | dirt/sand | 282958.4598390193
track | soil | 280367.2842426119
service | paving_stones | 253113.35890887617
construction | concrete | 250489.66635970082
residential | earth | 243368.67611399104
residential | bricks | 241547.18157778349
primary_link | paved | 233362.83494628928
track | mud | 222623.162350262
path | natural | 222525.11418556486
tertiary | paving_stones | 221661.8326535929
motorway_link | concrete:plates | 220084.27158910522
living_street | concrete | 211784.926229045
unclassified | grass | 207202.7872336678
steps | concrete | 204075.57897368207
primary_link | concrete | 192420.4034805249
unclassified | pebblestone | 185529.188543652
unclassified | earth | 185284.6129128161
path | dirt/sand | 178323.15887339736
cycleway | wood | 177585.0612189861
living_street | paved | 176779.42574736488
residential | brick | 175813.97652501083
secondary_link | concrete | 170566.33634487086
unclassified | cobblestone | 168035.4812049392
bridleway | grass | 166927.06816627685
residential | grass | 145007.91263839617
tertiary | cobblestone | 144531.42837198608
busway | | 141668.00141975118
proposed | concrete | 135256.43971835688
bridleway | compacted | 134367.6730410877
residential | sett | 134159.89625658424
raceway | paved | 123668.95187402441
planned | | 121862.77791955674
secondary_link | paved | 121253.34000382005
service | pebblestone | 114028.31557654691
service | earth | 112700.86070646881
path | mud | 110942.38114480482
footway | brick | 110034.66372621732
construction | unpaved | 105318.89300274091
residential | chipseal | 104757.43908833718
unclassified | paving_stones | 104080.85461469444
razed | | 98493.19564664886
footway | woodchips | 97849.09078415699
raceway | unpaved | 95637.53003178755
bridleway | sand | 91964.97424098915
trunk | concrete:plates | 89707.81293471971
unclassified | chipseal | 87646.31337049662
living_street | paving_stones | 86956.00904801363
path | pebblestone | 86065.84995453423
proposed | paved | 84174.64638228346
footway | pebblestone | 84094.7337710366
cycleway | grass | 80871.43961649334
bus_guideway | | 80059.3065879965
residential | pebblestone | 78676.32827696331
cycleway | concrete:plates | 78626.97730968334
path | paving_stones | 77547.23236472643
secondary | paving_stones | 76915.90335693996
residential | soil | 74775.50249977992
cycleway | paving_stones | 74162.84040374875
path | concrete:plates | 73522.71543854626
path | rock | 72564.14805588275
service | concrete:lanes | 71742.76509436533
footway | bricks | 70658.46439321125
bridleway | earth | 68365.0746144508
busway | asphalt | 67189.06572572011
tertiary_link | paved | 65320.49597644599
unclassified | concrete:plates | 65246.51136772131
residential | unhewn_cobblestone | 62209.080716995595
service | soil | 57900.53748149729
service | brick | 57445.63695545244
service | dirt/sand | 55324.03395016277
footway | dirt/sand | 54507.746362286554
pedestrian | wood | 54095.63523217174
path | woodchips | 53331.943702748395
path | spur | 52892.086996842205
steps | paved | 52506.80292003064
steps | wood | 46461.755843003
residential | dirt/sand | 44724.94194470337
tertiary_link | concrete | 43962.57398137904
living_street | gravel | 40862.191687342194
tertiary_link | unpaved | 40323.036217485154
footway | cobblestone | 39606.18577173825
primary | paving_stones | 39191.029812534376
pedestrian | unpaved | 38294.86108637042
escape | | 38059.76110339022
trunk_link | concrete:plates | 37474.92274911355
bus_guideway | asphalt | 34199.652828803846
service | cobblestone | 33720.36809304341
pedestrian | gravel | 30344.666352008073
footway | metal | 26149.36463939565
footway | unhewn_cobblestone | 26105.202815754776
residential | concrete:lanes | 25981.44764468979
primary_link | concrete:plates | 25205.712215486255
track | wood | 25177.403482617865
tertiary | bricks | 24087.396407763354
path | bark | 23419.850321512553
footway | sett | 20372.797974850975
service | sett | 19287.991708956688
footway | boardwalk | 18912.766098181168
service | wood | 18522.987330308424
busway | concrete | 18334.605504341
tertiary_link | gravel | 16821.764628381225
steps | paving_stones | 16168.314285169055
secondary_link | concrete:plates | 14340.732436440501
steps | dirt | 13881.373525668309
steps | ground | 13678.596643850293
residential | wood | 13554.642019149022
unclassified | wood | 13290.616084666595
pedestrian | sett | 12923.641279906136
pedestrian | cobblestone | 12706.879040066673
pedestrian | concrete:plates | 12697.754248647872
tertiary | wood | 11502.550585919225
pedestrian | brick | 11333.743133012355
living_street | cobblestone | 10926.338677026815
steps | unpaved | 10707.201476784405
path | metal | 10678.05085322325
steps | asphalt | 9955.642433659
steps | metal | 9485.310731598558
footway | stone | 8536.746047905674
service | bricks | 8414.061977404393
elevator | | 8043.809559098003
steps | gravel | 7077.323945817867
pedestrian | metal | 5018.339976670147
cycleway | metal | 4132.195446674829
steps | stone | 3131.918694257478
steps | rock | 2040.101130895399
steps | concrete:plates | 1700.1674751379323
(298 rows)
Openstreetmap H3 и почему именно PostgreSQL
В этой публикации я постарался сфокусировать внимание на обработке данных. Если же вас заинтересовала тема подготовки данных, их загрузки в PostgreSQL и вы хотите узнать больше о моем проекте openstreetmap_h3, секционировании геоданных — рекомендую почитать «Как поместить весь мир в обычный ноутбук: PostgreSQL и OpenStreetMap» и статьи по ссылкам из секции «Продолжение истории».
PostgreSQL/PostGIS по стабильности, функционалу работы с геоданными превосходит другие доступные решения с открытым исходным кодом. Я загружал данные из OSM в HeavyDB, Spark. И вопрос не только в производительности баз данных, но и в поддерживаемых функциях и зрелости экосистемы, в доступных программах для визуализации, IDE, модулях расширения, драйверах для вашего языка программирования. Как пример, расширение Citus для PostgreSQL позволило ускорить запрос подсчета зданий в 10 раз без каких‑либо изменений схемы данных и запроса.
Кто‑то предпочитает использовать Clickhouse, Elasticsearch и вы можете выбрать любой удобный вам инструмент для обработки ваших данных. Утилита Openstreetmap H3 умеет сохранять данные в формате Apache Arrow — универсальном для средств обработки Больших Данных. Режим активируется параметром -result_in_arrow
благодаря чему есть свобода выбора чем именно обрабатывать данные OSM.
Выводы
Максимальная плотность застройки в Северной Америке по данным OpenStreetMap в 1-Нью‑Йорк, 2-Лос‑Анджелес и 3-Вашингтон, получается что большинство локации из top15 у побережья океана.
Общая протяженность дорог 17 333 069 км при этом только 17.89% от общего числа дорог Америки в OSM имеют информацию о типе покрытия. На первом месте по суммарной протяженности «улицы и переулки, которые проходят вокруг и между жилых зон» 5 645 591 км (32.57% от общей протяженности), на втором месте дороги для «проезда по прилегающей территории» 2 971 654 км, на третьем месте «Дороги сельскохозяйственного назначения, лесотехнические и лесозаготовительные дороги, не ведущие к жилым или промышленным объектам, стихийно возникшие проезды.» 2 457 547 км