Как в Северной Америке с дорогами и плотностью застройки? Работаем с 100Гб OSM данных в PostgreSQL

от автора

Сегодня открою вам Америку на основе данных 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.html

Объем исходных данных 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 км

Эти же расчеты доступны для РФ.


ссылка на оригинал статьи https://habr.com/ru/post/717126/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *