Today I will discover America to you based on OpenStreetMap data in PostgreSQL15/PostGIS and my project openstreetmap_h3. Let's run the query and compare its execution time on the Citus column store in PostgreSQL and on the standard 100GB database partitioned by H3 geoindex.
We will find the top15 buildable locations in North America and the total length of roads, as well as their type and surface. I will not overload the publication with program logs, let's focus on the data! You can easily repeat all requests yourself on your laptop/computer.
Statistics
We live in an amazing world where the modern laptop is running the maker of many supercomputers 20 years ago and the available storage drives allow you to store terabytes of data with fast access. In addition, every year more and more open data becomes available geographical, economic. New specialized databases and Big Data movements are emerging. New tools that make it easy to get answers to questions.
As Mark Twain said, “there are three types of lies: Lies, damned lies, and statistics” We will not believe the available statistics, but will recalculate everything on our own based on open data.
North American geodata loading into PostgreSQL15
We build openstreetmap-h3, for this we need maven, git, JDK11+
git clone https://github.com/igor-suhorukov/openstreetmap_h3.git cd openstreetmap_h3 git checkout dev/postgresql15 mvn install
Building a docker image with PostgreSQL 15.1, PostGIS 3.3.2, H3 4.1.1:
cd postgis_docker-master docker build -t postgres15_postgis .
Download America osm.PBF data from the Geofabrik website:
wget https://download.geofabrik.de/north-america-latest.osm.pbf
The volume of initial OpenStreetMap data is about 13.0 GB, which we turn from north-america-latest.osm.pbf into TSV format data and a set of scripts for loading into 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
Create a new docker container and load data into it:
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'
North America geo database
Connect to the database and check the component versions:
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 ccc | 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
The tables on which we will run queries in the citus_columnar column store are stored in the PostgreSQL database, which consume 100 GB of storage space.
Building density
Now we can count how many buildings in the "ways" table in each of the hexagons of the H3 partition grid at level 3 and select only 15 of them in decreasing order of the number of buildings:
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)
We visualize these regions using a query in 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




For comparison, the same query on the classic (heap) PostgreSQL storage:
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)
This query took 10.6 times longer to complete than on a Citus column (42,153sec heap VS 3,975sec column).
Roads of North America
Total length of roads and trails:
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)
The length of only roads with defined coating type:
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)
Let's evaluate the coverage data of surface type:
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)
Now let's summarize the coating characteristics:
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)
Let's see the length by road type:
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)
And add the surface type to the road type:
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 and why PostgreSQL
In this post, I tried to focus on data processing. If you are interested in the topic of data preparation, loading them into PostgreSQL and you want to learn more about my openstreetmap_h3 project, geodata partitioning - I recommend reading "How to put the whole world in a regular laptop: PostgreSQL and OpenStreetMap" and articles on links from the section "See also".
PostgreSQL/PostGIS is superior to other available open source solutions in terms of stability and geodata functionality. I have been loading data from OSM into HeavyDB, Spark. And the question is not only about database performance, but also about the supported functions and maturity of the ecosystem, available visualization programs, IDEs, extension modules, drivers for your programming language. As an example, the Citus extension for PostgreSQL made it possible to speed up the building count query by 10 times without any changes to the data schema and query.
Someone prefers to use Clickhouse, Elasticsearch and you can choose any tool that is convenient for you to process your data. The Openstreetmap H3 utility can save data in the Apache Arrow format - universal for Big Data processing tools. The mode is activated by the -result_in_arrow parameter, so there is a freedom to choose how to process OSM data.
Summary
The maximum building density in North America according to OpenStreetMap is 1 - New York, 2 - Los Angeles and 3 - WashingtonDC, it turns out that most of the top15 locations are near the ocean.
The total length of roads is 17,333,069 km, while only 17.89% of the total number of roads in America in OSM have information about the surface type. In first place in terms of total length "residential" 5,645,591 km (32.57% of the total length), in second place are roads for "service" 2,971,654 km, in third place "track" 2,457,547 km