kopia lustrzana https://github.com/onthegomap/planetiler
Porównaj commity
603 Commity
Autor | SHA1 | Data |
---|---|---|
Michael Barry | 8f9b750789 | |
dependabot[bot] | e6e2f467d5 | |
Mike Barry | eea8455156 | |
dependabot[bot] | ff024a098a | |
Peter Hanecak | a5f3cf46d7 | |
Michael Barry | 1cb3050f39 | |
dependabot[bot] | a169dcf021 | |
dependabot[bot] | d68e83135d | |
Michael Barry | ef1702ec73 | |
Peter Hanecak | 85324e7f65 | |
dependabot[bot] | 12558b99a8 | |
dependabot[bot] | b41e1f2f3b | |
dependabot[bot] | bbd197b525 | |
dependabot[bot] | ade89c0739 | |
dependabot[bot] | 6f6a4dd6ed | |
dependabot[bot] | 6b9c996df9 | |
Michael Barry | 978c64f0c6 | |
dependabot[bot] | ed373ff3d3 | |
dependabot[bot] | 32f941f1b1 | |
dependabot[bot] | ef6fc85691 | |
Michael Barry | f69882addb | |
dependabot[bot] | 6c41c388f4 | |
dependabot[bot] | 689abb5ad7 | |
dependabot[bot] | da9d03c85d | |
dependabot[bot] | 1871e230ac | |
dependabot[bot] | f1a9be3192 | |
dependabot[bot] | 01786f553a | |
dependabot[bot] | 568092dc32 | |
zstadler | 696f63671c | |
dependabot[bot] | 2cb1a99025 | |
dependabot[bot] | 4920b34447 | |
dependabot[bot] | 3a8e7c4420 | |
dependabot[bot] | d1eec2f4a3 | |
dependabot[bot] | 99b848f1de | |
dependabot[bot] | 7c01366b01 | |
dependabot[bot] | 641f0e01a4 | |
dependabot[bot] | 2303334124 | |
dependabot[bot] | 96202644ac | |
dependabot[bot] | 6c6ee791e3 | |
dependabot[bot] | 7dd0f85bb1 | |
Michael Barry | c0fef5b6b4 | |
dependabot[bot] | c4682500eb | |
dependabot[bot] | e7c7e08f9e | |
dependabot[bot] | fe5526026b | |
dependabot[bot] | fa34992d53 | |
Michael Barry | 8396991fda | |
Michael Barry | 9f0f513dd7 | |
Peter Hanecak | 40e64a2fd3 | |
Peter Hanecak | d703b626ad | |
dependabot[bot] | e9a2bcc647 | |
Michael Barry | f7a3b62170 | |
Michael Barry | 7c03592358 | |
dependabot[bot] | f97b5f9cb9 | |
Michael Barry | 384f84f51a | |
dependabot[bot] | 54394aa01d | |
Oliver Wipfli | 389a14462b | |
dependabot[bot] | 07680f4199 | |
dependabot[bot] | a6fee0ce6c | |
dependabot[bot] | 4d52507baa | |
Michael Barry | fa7bffb04f | |
dependabot[bot] | 6331934d6f | |
Michael Barry | 92fa59ef20 | |
Michael Barry | 328e1b4d53 | |
dependabot[bot] | 08990007a9 | |
dependabot[bot] | 85f644d380 | |
Michael Barry | 31ae80d047 | |
Brandon Liu | 67d530a526 | |
dependabot[bot] | fdb9ea6e02 | |
Brandon Liu | 0cb2645639 | |
dependabot[bot] | 7492f6982b | |
Michael Barry | bf24ef3961 | |
Michael Barry | 5a7757435d | |
dependabot[bot] | 902651fda8 | |
Michael Barry | 14b217d6f6 | |
Michael Barry | 062528b1ee | |
dependabot[bot] | 36977d5388 | |
dependabot[bot] | 8cb42bd435 | |
dependabot[bot] | 43e39ef1ea | |
Michael Barry | 0dc2ee82e1 | |
Michael Barry | 96eae6110b | |
dependabot[bot] | 076d2acbee | |
dependabot[bot] | 8e1eae8804 | |
Björn Bilger | df804879ef | |
dependabot[bot] | d2b267aa2e | |
cmahnke | f692124168 | |
Björn Bilger | c480b35f1c | |
dependabot[bot] | 389ccab8e1 | |
Brandon Liu | a233e683bd | |
dependabot[bot] | 3dea746ff0 | |
dependabot[bot] | 8affe1e3e8 | |
dependabot[bot] | 8fcc6139e6 | |
Michael Barry | 3b48682f69 | |
dependabot[bot] | e2aacfe75e | |
dependabot[bot] | d59251deff | |
dependabot[bot] | 401adf45ef | |
Michael Barry | a78e6284a8 | |
dependabot[bot] | 289bbc6b1f | |
dependabot[bot] | d3d5ed8f0f | |
dependabot[bot] | 1963bf1451 | |
Michael Barry | cbb092a1f7 | |
dependabot[bot] | 3d10501558 | |
dependabot[bot] | 1b6b3d6380 | |
dependabot[bot] | d98d5d6ae1 | |
dependabot[bot] | c53fdea788 | |
dependabot[bot] | 1c45474bbb | |
Michael Barry | fc53c36439 | |
dependabot[bot] | 1ac5b69b92 | |
dependabot[bot] | 1326edf560 | |
dependabot[bot] | f68351c377 | |
Michael Barry | 40bf33e887 | |
dependabot[bot] | 4efc2bbd41 | |
dependabot[bot] | ed4c320e49 | |
dependabot[bot] | 20c4a6f890 | |
dependabot[bot] | dc04a62d81 | |
dependabot[bot] | 05011ee15d | |
dependabot[bot] | 34f29eeda7 | |
Mike Barry | 699277b17f | |
dependabot[bot] | 6209f4d36e | |
Michael Barry | 1df1bf04e4 | |
dependabot[bot] | c22d379734 | |
dependabot[bot] | c9f61df4cb | |
dependabot[bot] | fdee80d395 | |
dependabot[bot] | 9995df9a3a | |
Michael Barry | ae7261246f | |
dependabot[bot] | a2083eb2f0 | |
Michael Barry | ec6430dc49 | |
dependabot[bot] | c4036f317a | |
dependabot[bot] | 58c26f5e4e | |
dependabot[bot] | d9dd9d5daf | |
dependabot[bot] | 67757075cc | |
Michael Barry | 517851435d | |
dependabot[bot] | 65935461e3 | |
dependabot[bot] | c19419808d | |
dependabot[bot] | 2eb4dd2955 | |
dependabot[bot] | 48050ed495 | |
Michael Barry | 44f22b27c5 | |
dependabot[bot] | bf7294970e | |
dependabot[bot] | 8b5af48e43 | |
Michael Barry | a94ac0ddd8 | |
dependabot[bot] | 834d4587f1 | |
Michael Barry | 9f960022b8 | |
Michael Barry | 1be2fca45f | |
dependabot[bot] | 01114cb12c | |
Michael Barry | 2bb05a0797 | |
Michael Barry | a0cd4fa864 | |
Michael Barry | b108f88453 | |
dependabot[bot] | b23d7ea7f5 | |
dependabot[bot] | b800cb6836 | |
dependabot[bot] | a50b06a38b | |
dependabot[bot] | d53f7fc485 | |
dependabot[bot] | 46f67a7c06 | |
dependabot[bot] | ebd90722a8 | |
dependabot[bot] | 015f418405 | |
dependabot[bot] | f858a462d1 | |
dependabot[bot] | b5df50d995 | |
dependabot[bot] | aa6a3a94eb | |
dependabot[bot] | 076ac3e2f1 | |
dependabot[bot] | 0f488c0712 | |
dependabot[bot] | 19c883c651 | |
Michael Barry | 79ba9d925f | |
Michael Barry | 10fede8634 | |
dependabot[bot] | 2b18ab1f70 | |
dependabot[bot] | a1ef17db5b | |
Michael Barry | e7e18d5f17 | |
Michael Barry | 1b53493ac7 | |
Michael Barry | d43a9e9159 | |
dependabot[bot] | 6f84ef1096 | |
Michael Barry | 2f86ea12ae | |
dependabot[bot] | f556af241b | |
Michael Barry | 0a241e17e1 | |
Michael Barry | 1f23b55274 | |
dependabot[bot] | 27dc73a7fe | |
dependabot[bot] | 2ead531cd1 | |
dependabot[bot] | 4e5eac4a50 | |
dependabot[bot] | e473c429c4 | |
dependabot[bot] | e37ea609bc | |
dependabot[bot] | 8ca76428e9 | |
dependabot[bot] | 4dbf6cc3b2 | |
dependabot[bot] | a38c4fb882 | |
dependabot[bot] | 9647de2ef9 | |
dependabot[bot] | 3f302e3c7e | |
dependabot[bot] | 8e42bad77b | |
dependabot[bot] | 1ee801dfa7 | |
dependabot[bot] | ac820e8dd9 | |
dependabot[bot] | 9c6aab863f | |
Björn Bilger | db796e1720 | |
dependabot[bot] | a8e432dfd1 | |
dependabot[bot] | 0483183b0a | |
dependabot[bot] | 7e78292450 | |
dependabot[bot] | ca2334ca02 | |
John Levermore | ed707e6979 | |
Björn Bilger | a1c33dc5d5 | |
dependabot[bot] | 5ef73ac755 | |
dependabot[bot] | d1b8e9ef8d | |
dependabot[bot] | 04d350d2ca | |
dependabot[bot] | 5e7159da6d | |
dependabot[bot] | a6dd61e87e | |
dependabot[bot] | 7527a1fb85 | |
dependabot[bot] | 0c6a90af56 | |
dependabot[bot] | e3eb621510 | |
Oliver Wipfli | 68c2d7f417 | |
dependabot[bot] | 4c1503e9f2 | |
dependabot[bot] | 1a14391d42 | |
Mikael Gueck | 04239ff564 | |
John Levermore | a4ea44f182 | |
dependabot[bot] | fe922cac53 | |
dependabot[bot] | c876ca9edd | |
dependabot[bot] | db6d175507 | |
dependabot[bot] | d42e20f938 | |
dependabot[bot] | 3d2f165332 | |
dependabot[bot] | a398af094c | |
dependabot[bot] | c8f98afadf | |
dependabot[bot] | c7a31d6136 | |
dependabot[bot] | 814221e047 | |
dependabot[bot] | 957ad61fd9 | |
dependabot[bot] | 38277d894b | |
dependabot[bot] | 1316e44105 | |
dependabot[bot] | 2d70c0754a | |
Michael Barry | a48a9c8391 | |
dependabot[bot] | 6203387b59 | |
dependabot[bot] | 9e70b30977 | |
dependabot[bot] | 7b792ce8b3 | |
dependabot[bot] | ded3098d78 | |
dependabot[bot] | 90188fb971 | |
dependabot[bot] | 20648a993c | |
Erik Price | cced1920d4 | |
dependabot[bot] | 1afb8ed293 | |
dependabot[bot] | 9d7da567c8 | |
dependabot[bot] | f8c0d46c2d | |
dependabot[bot] | 390bd3389f | |
dependabot[bot] | d14ee9a33f | |
dependabot[bot] | 7c36d1dcfa | |
dependabot[bot] | 59df133444 | |
dependabot[bot] | 723969a4e7 | |
dependabot[bot] | 049e566333 | |
dependabot[bot] | 90f8a9a132 | |
dependabot[bot] | 12a4aff33a | |
dependabot[bot] | 3742eefac8 | |
dependabot[bot] | 951cc3ff2b | |
dependabot[bot] | 38522fec03 | |
dependabot[bot] | ef6bfd558a | |
dependabot[bot] | 3d0bf09afc | |
dependabot[bot] | 2dfd8d8f6d | |
dependabot[bot] | e0f27c49c1 | |
dependabot[bot] | f9a63a35f5 | |
dependabot[bot] | a31a0e2cb5 | |
dependabot[bot] | 8c1fc4cc7e | |
dependabot[bot] | 78bb0eb4dd | |
dependabot[bot] | 72031645a0 | |
dependabot[bot] | a62d467c8f | |
dependabot[bot] | a59f291d94 | |
Michael Barry | bf86516fab | |
Michael Barry | 8d0e06c667 | |
dependabot[bot] | e0285d2e1c | |
dependabot[bot] | eba244bdb0 | |
dependabot[bot] | 6e6bee76a6 | |
Erik Price | 2450c9d9f7 | |
dependabot[bot] | 9b76c849e0 | |
dependabot[bot] | fce555f1e3 | |
Michael Barry | 8fc2ad7b73 | |
Michael Barry | 738e181657 | |
dependabot[bot] | fba875f968 | |
dependabot[bot] | 5be4640b04 | |
dependabot[bot] | db0ab02263 | |
dependabot[bot] | c5609b121b | |
dependabot[bot] | edf9326778 | |
dependabot[bot] | b01975bd43 | |
Michael Barry | 72f86c8b63 | |
Mike Barry | 5b0a3ba636 | |
Michael Barry | 72ea82cd50 | |
dependabot[bot] | e77aaa2816 | |
dependabot[bot] | 4f8f85e2dc | |
Michael Barry | 0712fcda2c | |
dependabot[bot] | 0be891fb1b | |
dependabot[bot] | 35f37ed757 | |
dependabot[bot] | 15d0e4f37c | |
dependabot[bot] | 5aa120095f | |
Mike Barry | 13f658fe1a | |
dependabot[bot] | ce19929aef | |
Michael Barry | 509795401e | |
dependabot[bot] | 65f620d663 | |
dependabot[bot] | dff0c077e5 | |
Michael Barry | b5d6aa7737 | |
Michael Barry | 97231d18ef | |
Michael Barry | 74db638dbc | |
dependabot[bot] | 9945ad406e | |
dependabot[bot] | 86e84e66a9 | |
Michael Barry | c5d6daf671 | |
Brandon Liu | 93af11bb26 | |
dependabot[bot] | 32954603cc | |
dependabot[bot] | fcec07f11b | |
dependabot[bot] | db0af42b84 | |
Brandon Liu | d5b404d8e2 | |
dependabot[bot] | 68b04f5295 | |
dependabot[bot] | 322fdca70e | |
dependabot[bot] | aa362d9fd8 | |
dependabot[bot] | 2a213df169 | |
Michael Barry | 1375ee7abb | |
Michael Barry | f4d07ea141 | |
dependabot[bot] | 5c8b8e1bb0 | |
dependabot[bot] | afc2470eb5 | |
dependabot[bot] | 771b774672 | |
dependabot[bot] | b872eb2bd8 | |
dependabot[bot] | 08dc1e679b | |
dependabot[bot] | 756f17e45e | |
dependabot[bot] | 6ba568158f | |
dependabot[bot] | c3d9eed898 | |
dependabot[bot] | 8eb0f38467 | |
Michael Barry | 9c318e45b0 | |
dependabot[bot] | af5cd7bfd8 | |
dependabot[bot] | f5b86345ea | |
dependabot[bot] | 2b121f175e | |
dependabot[bot] | 61a93df374 | |
Brandon Liu | 9bf62d5644 | |
dependabot[bot] | 7cb9b5f670 | |
Michael Barry | d5336efcae | |
Michael Barry | db3e8228ae | |
dependabot[bot] | 07b1f78034 | |
Michael Barry | 55fddca832 | |
Michael Barry | 9a704e773e | |
dependabot[bot] | 6ed0e3cc86 | |
dependabot[bot] | 24fe16a174 | |
dependabot[bot] | 7d2adb4ef3 | |
dependabot[bot] | 7fb1ec8a63 | |
Michael Barry | 78129905e5 | |
dependabot[bot] | 553fdd708c | |
dependabot[bot] | 8d1e94ab39 | |
Brandon Liu | 88daeb4d0b | |
dependabot[bot] | def8625d0a | |
dependabot[bot] | febd3e9c27 | |
Brandon Liu | 9ce9d1f5b2 | |
Michael Barry | 723f44e236 | |
Erik Price | 4f43f1127a | |
Brandon Liu | f772180fb7 | |
Erik Price | a0f8c67c78 | |
dependabot[bot] | ae1317c341 | |
Brandon Liu | b97d9d0e79 | |
dependabot[bot] | 4ea87224af | |
Brandon Liu | 1afb5de820 | |
dependabot[bot] | 42e2e19390 | |
dependabot[bot] | 7ea365e5b1 | |
Brandon Liu | 09fd4ba2ba | |
dependabot[bot] | 0eb5a534a9 | |
dependabot[bot] | 3df0e668fa | |
Peter Hanecak | 4a622a8ef0 | |
Oliver Wipfli | 9fbf952239 | |
dependabot[bot] | f8ba1aa3fb | |
dependabot[bot] | 6284e35063 | |
dependabot[bot] | 9e4af5b485 | |
dependabot[bot] | 5b4ac8076f | |
dependabot[bot] | 640ce50794 | |
dependabot[bot] | 67d5a4bed0 | |
Michael Barry | ea17fcd8b1 | |
dependabot[bot] | 867e447a10 | |
dependabot[bot] | aa69f509e2 | |
Michael Barry | 0125e1814a | |
Erik Price | ef24e91f0b | |
Michael Barry | aea309e094 | |
Michael Barry | dad2073f61 | |
dependabot[bot] | 89de82244e | |
Erik Price | 184f950051 | |
Michael Barry | 7adf46819a | |
dependabot[bot] | a1bc1f4fd5 | |
Oliver Wipfli | 71d0450f03 | |
dependabot[bot] | 2ed6ac8630 | |
dependabot[bot] | cb082a0566 | |
Erik Price | ea8589bd6f | |
dependabot[bot] | e9f78d6471 | |
dependabot[bot] | 29dc7993c5 | |
dependabot[bot] | 271e681b1a | |
dependabot[bot] | 7d6fd66b9f | |
dependabot[bot] | 440e5d10fc | |
dependabot[bot] | fe911e4b49 | |
dependabot[bot] | 9f6167bfff | |
dependabot[bot] | c08925fee1 | |
Michael Barry | 926bc9210b | |
Oliver Wipfli | 2dc4bc660c | |
dependabot[bot] | 966ee898fd | |
Michael Barry | b8506d9812 | |
dependabot[bot] | cd938d50ff | |
Erik Price | 9e4eb45baa | |
Erik Price | 762d052b10 | |
ttomasz | 6a893a4787 | |
Michael Barry | 7a3db3dcf8 | |
dependabot[bot] | 2340516842 | |
dependabot[bot] | c391a44512 | |
dependabot[bot] | 3a434a4cd7 | |
dependabot[bot] | 0d4396e0bf | |
Erik Price | ccf098115e | |
Erik Price | 7f6032b641 | |
dependabot[bot] | 9ead458f7f | |
dependabot[bot] | c73c835533 | |
dependabot[bot] | 199faf72f2 | |
dependabot[bot] | 201fb96539 | |
dependabot[bot] | 22c6fd1927 | |
Peter Hanecak | 9b5eaf474d | |
dependabot[bot] | 87df84c318 | |
dependabot[bot] | 0489a290f5 | |
dependabot[bot] | 4bc532c31e | |
dependabot[bot] | 0c4d0d2817 | |
dependabot[bot] | f02120e7b0 | |
dependabot[bot] | 6b9175eaa1 | |
dependabot[bot] | d71a1c4d85 | |
dependabot[bot] | 4a82c66f8c | |
dependabot[bot] | f81c059eaf | |
dependabot[bot] | 05c3420694 | |
Michael Barry | 0eb148ee3c | |
dependabot[bot] | 83148052b0 | |
dependabot[bot] | cb376ef95a | |
dependabot[bot] | 521f8a6081 | |
dependabot[bot] | 7a5faf353d | |
dependabot[bot] | 23450e90e0 | |
dependabot[bot] | 26cd0e6a7e | |
dependabot[bot] | 08c82644a1 | |
Michael Barry | 44ba8e3de6 | |
Michael Barry | 87bf116349 | |
Michael Barry | 02dec9701b | |
Michael Barry | 5296d1772e | |
dependabot[bot] | b934f4ee89 | |
Michael Barry | e74faec4a6 | |
Michael Barry | a90646dff3 | |
dependabot[bot] | 321e24bab0 | |
dependabot[bot] | 38b0be31ce | |
dependabot[bot] | 9e8248e282 | |
dependabot[bot] | 149bde212f | |
dependabot[bot] | e03136e891 | |
dependabot[bot] | d5820ba0f7 | |
dependabot[bot] | 93c95f7b18 | |
dependabot[bot] | 40810b357f | |
dependabot[bot] | 18368fac7f | |
dependabot[bot] | be1e63dcea | |
dependabot[bot] | 3bfab48bcc | |
dependabot[bot] | 45dd2a798e | |
dependabot[bot] | a0393dc878 | |
dependabot[bot] | bfc04e4be1 | |
dependabot[bot] | 93ec5113ba | |
dependabot[bot] | 251720399e | |
dependabot[bot] | 57be5e1bf5 | |
Michael Barry | 9e0eec93c8 | |
Michael Barry | 4cc139a603 | |
dependabot[bot] | 21467c51ec | |
dependabot[bot] | 9648ea83a7 | |
Michael Barry | 619ac83ed8 | |
Michael Barry | 93fe75782e | |
Michael Barry | ffbffb577b | |
Michael Barry | 7fa51c1c02 | |
Adam Laža | 88c7f5650f | |
dependabot[bot] | 232834e735 | |
Michael Barry | 8a8db0005d | |
dependabot[bot] | 7109450265 | |
dependabot[bot] | c14be447c3 | |
dependabot[bot] | 9be2e7c69a | |
Michael Barry | 621a8ed759 | |
dependabot[bot] | a6a8c245b8 | |
dependabot[bot] | 0a60a1f3a3 | |
Brandon Liu | a50c43835d | |
Mike Barry | aa40e083c5 | |
farfromrefuge | 7818634774 | |
Michael Barry | d1d68cf753 | |
dependabot[bot] | 89b05f7039 | |
Michael Barry | 0e6394036c | |
Michael Barry | c6ad30cc9a | |
dependabot[bot] | 4b7a6018c9 | |
dependabot[bot] | 7c93afb421 | |
dependabot[bot] | cec6a42310 | |
dependabot[bot] | def9a44545 | |
dependabot[bot] | b62f19439f | |
dependabot[bot] | 850d826143 | |
dependabot[bot] | f519f2f100 | |
dependabot[bot] | c79f9a1fc6 | |
dependabot[bot] | ad567b192a | |
dependabot[bot] | 549b4afcbc | |
Michael Barry | 52432b815b | |
farfromrefuge | 76c7880d6b | |
Brian Sperlongano | 3fd094ddae | |
dependabot[bot] | c58696ed69 | |
Brian Sperlongano | e2f7cc2bfa | |
dependabot[bot] | df6c803ad6 | |
dependabot[bot] | 0f7ce4a0ad | |
farfromrefuge | b9d91e47cf | |
Brandon Liu | c9682d5bee | |
dependabot[bot] | c2aed9e52d | |
Oliver Wipfli | c5558bff8a | |
Oliver Wipfli | 78b25c7f16 | |
dependabot[bot] | 0f7745953f | |
dependabot[bot] | ccf16889c0 | |
dependabot[bot] | 82e144d6b2 | |
Michael Barry | 6300b47897 | |
dependabot[bot] | 96eb5cd024 | |
dependabot[bot] | fb389e8d27 | |
Brian Sperlongano | da12fef79f | |
Michael Barry | 74b7474c46 | |
Mike Barry | f2050ec4bc | |
Mike Barry | 83ed0556dc | |
Michael Barry | bed2220e83 | |
Michael Barry | b0f634bcaf | |
dependabot[bot] | c39c667f02 | |
Michael Barry | 4ba36655d4 | |
Michael Barry | 85a50cf70c | |
Mike Barry | a2ff797267 | |
dependabot[bot] | 2947968d9a | |
Michael Barry | 2ccef9f7f6 | |
Björn Bilger | 97642fc096 | |
Michael Barry | f93e5221f8 | |
dependabot[bot] | 27cf19cca4 | |
Brian Sperlongano | 9cf7f318fe | |
Michael Barry | f7fd3e90a7 | |
Michael Barry | 4ecc96e9d9 | |
Michael Barry | 99c0f8ae9c | |
Björn Bilger | f5206b3a73 | |
Michael Barry | 6873b989d6 | |
dependabot[bot] | 2cf36c61c8 | |
Michael Barry | dab37f572e | |
dependabot[bot] | 6b4eca3a78 | |
Michael Barry | b1e6848979 | |
dependabot[bot] | 1a55d138e7 | |
Michael Barry | a8bec7a56d | |
Michael Barry | 9062e6b79b | |
Michael Barry | 726e6d0107 | |
Michael Barry | 3589fc61f3 | |
dependabot[bot] | b109bd0ee6 | |
Michael Barry | 01b52f9812 | |
Brian Sperlongano | 891537e2bc | |
Michael Barry | 186af36c42 | |
Brian Sperlongano | ffb157414e | |
dependabot[bot] | 59a48e1620 | |
Michael Barry | c1cac1d1d0 | |
Michael Barry | b04f4cde0b | |
Michael Barry | 2db49fc76f | |
dependabot[bot] | 4c67e10ed5 | |
Michael Barry | 29a50f59e4 | |
Michael Barry | 5341d4d712 | |
dependabot[bot] | ae92610f24 | |
dependabot[bot] | 8f9c1fabe0 | |
dependabot[bot] | 6c4f22f2d9 | |
dependabot[bot] | b67189e2dd | |
Michael Barry | 48c443135a | |
Mike Barry | 3332d27b16 | |
Michael Barry | afe1f08a75 | |
Michael Barry | ad7502c601 | |
Michael Barry | 422c6c0fcb | |
dependabot[bot] | 2742bef48d | |
dependabot[bot] | d0bb275469 | |
dependabot[bot] | 6a7c679141 | |
Michael Barry | 5cfb05a03b | |
dependabot[bot] | 36ab288526 | |
dependabot[bot] | c9f55327fa | |
dependabot[bot] | 1b54b427e1 | |
dependabot[bot] | 94b8cb3e8e | |
dependabot[bot] | ac3f27c03a | |
dependabot[bot] | 91076f5a6c | |
dependabot[bot] | d2faf27af1 | |
Mike Barry | 3ca78328a2 | |
Michael Barry | 4983bbc04e | |
Mike Barry | 827da1912a | |
dependabot[bot] | 33931ed7f0 | |
dependabot[bot] | 1c76cdc96d | |
Yuri Astrakhan | bc66bbd352 | |
Mike Barry | 96b6f200c6 | |
Mike Barry | 11cb4ade2e | |
Michael Barry | fb5fe8252f | |
Michael Barry | 2a8ac32350 | |
Robin | 34f2be75cd | |
Mike Barry | 0f084f4028 | |
Mike Barry | 724c451f5c | |
Michael Barry | e20b41c88d | |
SomeoneElseOSM | 4c6d5e6aa7 | |
Michael Barry | 313a695abb | |
Michael Barry | bf081692ce | |
Mike Barry | ba7b861a8f | |
Oliver Wipfli | 1cfcca2e20 | |
Oliver Wipfli | 332e631507 | |
Michael Barry | 0a064797fb | |
dependabot[bot] | 1c27d833b2 | |
Mike Barry | f9c2434725 | |
Mike Barry | 628c937c9a | |
Michael Barry | cce51668f2 | |
Michael Barry | bce75230f2 | |
dependabot[bot] | 04da2864a6 | |
dependabot[bot] | 5f2733a7fb | |
Michael Barry | 385ffa9a50 | |
Michael Barry | 1ce2b5f76c | |
Mike Barry | e5acfbd17c | |
Oliver Wipfli | 4c9c24f1aa | |
Mike Barry | 3767cc4719 | |
Michael Barry | e93ff79a01 | |
Michael Barry | f051178b46 | |
Mike Barry | 0ddba6e9a7 | |
Michael Barry | 20c7a05caa | |
dependabot[bot] | 27bfb0f819 | |
Michael Barry | 8a6997f9dc | |
dependabot[bot] | 1f75ad2667 | |
Michael Barry | 2f05f942b2 | |
dependabot[bot] | 7e8596b0e1 | |
dependabot[bot] | 4ad4d952a6 | |
dependabot[bot] | 2017e84475 | |
Michael Barry | 714c636e12 | |
Oliver Wipfli | 0f2c2e9c76 | |
Michael Barry | 0d727c4302 | |
dependabot[bot] | aaaaa2f20b | |
Mike Barry | e7e5cd88c4 | |
Michael Barry | 209361eb7e | |
Mike Barry | 0357f4ba8f |
|
@ -1,8 +1,9 @@
|
|||
---
|
||||
|
||||
name: Bug report
|
||||
about: Create a report to help improve Planetiler
|
||||
title: "[BUG] "
|
||||
labels: ''
|
||||
labels: ["bug"]
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
@ -18,7 +19,8 @@ Steps to reproduce the behavior:
|
|||
3. See error
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
A clear and concise description of what you expected to happen. For map data issues, plase include OSM element IDs and
|
||||
the vector tile features you expect in the output to make help reproduce the issue in tests.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem (include tile IDs or latitude/longitude for visual issues
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
---
|
||||
|
||||
name: Feature request
|
||||
about: Suggest an idea for Planetiler
|
||||
title: "[FEATURE] "
|
||||
|
|
|
@ -12,7 +12,7 @@ runs:
|
|||
- name: Get Date
|
||||
id: get-data
|
||||
run: |
|
||||
echo "::set-output name=hash::${{ hashFiles('**/Planetiler.java', '**/Downloader.java', '**/Geofabrik.java', '**/BasemapMain.java') }}"
|
||||
echo "::set-output name=hash::${{ hashFiles('**/Planetiler.java', '**/Downloader.java', '**/Geofabrik.java', '**/OpenMapTilesMain.java') }}"
|
||||
echo "::set-output name=date::$(date -u "+%Y-%m-%d")"
|
||||
shell: bash
|
||||
working-directory: ${{ inputs.basedir }}
|
||||
|
|
|
@ -3,34 +3,36 @@
|
|||
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: maven
|
||||
directory: "/"
|
||||
open-pull-requests-limit: 1
|
||||
schedule:
|
||||
interval: daily
|
||||
time: "04:30"
|
||||
timezone: America/New_York
|
||||
labels:
|
||||
- dependencies
|
||||
ignore:
|
||||
- dependency-name: "com.graphhopper:graphhopper-reader-osm"
|
||||
- package-ecosystem: maven
|
||||
directory: "/planetiler-examples"
|
||||
open-pull-requests-limit: 1
|
||||
schedule:
|
||||
interval: daily
|
||||
time: "04:30"
|
||||
timezone: America/New_York
|
||||
labels:
|
||||
- dependencies
|
||||
ignore:
|
||||
- dependency-name: "com.onthegomap.planetiler:*"
|
||||
- package-ecosystem: github-actions
|
||||
directory: "/"
|
||||
open-pull-requests-limit: 1
|
||||
schedule:
|
||||
interval: daily
|
||||
time: "04:30"
|
||||
timezone: America/New_York
|
||||
labels:
|
||||
- dependencies
|
||||
- package-ecosystem: maven
|
||||
directory: "/"
|
||||
open-pull-requests-limit: 1
|
||||
schedule:
|
||||
interval: daily
|
||||
time: "04:25"
|
||||
timezone: America/New_York
|
||||
labels:
|
||||
- dependencies
|
||||
ignore:
|
||||
- dependency-name: "com.google.protobuf:protobuf-java"
|
||||
versions: [ "3.23.3" ]
|
||||
- package-ecosystem: maven
|
||||
# workaround for non-standard pom.xml filename (https://github.com/dependabot/dependabot-core/issues/4425)
|
||||
directory: "/.github/planetiler-examples-dependabot"
|
||||
open-pull-requests-limit: 1
|
||||
schedule:
|
||||
interval: daily
|
||||
time: "04:30"
|
||||
timezone: America/New_York
|
||||
labels:
|
||||
- dependencies
|
||||
ignore:
|
||||
- dependency-name: "com.onthegomap.planetiler:*"
|
||||
- package-ecosystem: github-actions
|
||||
directory: "/"
|
||||
open-pull-requests-limit: 1
|
||||
schedule:
|
||||
interval: daily
|
||||
time: "04:30"
|
||||
timezone: America/New_York
|
||||
labels:
|
||||
- dependencies
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
This is just a workaround for https://github.com/dependabot/dependabot-core/issues/4425 so that
|
||||
dependabot can update planetiler-examples/standalone.pom.xml without referring directly to a pom.xml with a
|
||||
non-standard name.
|
||||
-->
|
||||
<project
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
|
||||
>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.onthegomap.planetiler</groupId>
|
||||
<artifactId>planetiler-examples-parent-for-dependabot</artifactId>
|
||||
<version>HEAD</version>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
<modules>
|
||||
<module>../../planetiler-examples/standalone.pom.xml</module>
|
||||
</modules>
|
||||
</project>
|
|
@ -12,9 +12,12 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
# don't need to check planetiler-openmaptiles
|
||||
submodules: false
|
||||
- name: Run link check
|
||||
uses: gaurav-nelson/github-action-markdown-link-check@v1
|
||||
uses: gaurav-nelson/github-action-markdown-link-check@1.0.13
|
||||
with:
|
||||
use-quiet-mode: 'no'
|
||||
use-verbose-mode: 'yes'
|
||||
|
|
|
@ -3,5 +3,8 @@
|
|||
{
|
||||
"pattern": "^http://localhost.*$"
|
||||
}
|
||||
]
|
||||
],
|
||||
"retryOn429": true,
|
||||
"retryCount": 5,
|
||||
"fallbackRetryDelay": "30s"
|
||||
}
|
||||
|
|
|
@ -8,53 +8,60 @@ on:
|
|||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
# TODO: add format/checkstyle
|
||||
# When spotless:apply fails, the error message is a bit cryptic, so try to make it obvious that
|
||||
# is the problem by putting the check into a standalone job
|
||||
lint:
|
||||
name: Check formatting
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 15
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
- name: Set up JDK 21
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: 21
|
||||
distribution: 'temurin'
|
||||
cache: 'maven'
|
||||
- name: Ensure code formatted with mvn spotless:apply
|
||||
run: ./mvnw -DskipTests --batch-mode -no-transfer-progress spotless:check
|
||||
|
||||
build:
|
||||
name: Java ${{ matrix.jdk }} / ${{ matrix.os }} ${{ matrix.args }}
|
||||
# Wait until after we check that you ran mvn spotless:apply, otherwise will fail with a cryptic error message
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ ubuntu-latest, macos-latest, windows-latest ]
|
||||
jdk: [ 17 ]
|
||||
jdk: [ 21 ]
|
||||
include:
|
||||
- os: ubuntu-latest
|
||||
jdk: 16
|
||||
- os: ubuntu-latest
|
||||
jdk: 17
|
||||
args: "-DargLine='-Duser.language=fr -Duser.country=FR'"
|
||||
- os: ubuntu-latest
|
||||
jdk: 21
|
||||
args: "-DargLine='-Duser.language=fr -Duser.country=FR'"
|
||||
- os: ubuntu-latest
|
||||
jdk: 21
|
||||
args: ""
|
||||
runs-on: ${{ matrix.os }}
|
||||
timeout-minutes: 15
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Set up JDK ${{ matrix.jdk }}
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
java-version: ${{ matrix.jdk }}
|
||||
distribution: 'temurin'
|
||||
cache: 'maven'
|
||||
- name: Build with mvnw (linux/mac)
|
||||
if: ${{ !contains(matrix.os, 'windows') }}
|
||||
run: ./mvnw ${{matrix.args}} --batch-mode -no-transfer-progress package jib:buildTar --file pom.xml
|
||||
- name: Build with mvnw.cmd (windows)
|
||||
if: ${{ contains(matrix.os, 'windows') }}
|
||||
run: mvnw.cmd ${{matrix.args}} --batch-mode -no-transfer-progress package jib:buildTar --file pom.xml
|
||||
shell: cmd
|
||||
|
||||
regenerate:
|
||||
name: Regenerate
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 15
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
java-version: 17
|
||||
distribution: 'temurin'
|
||||
cache: 'maven'
|
||||
- run: ./scripts/regenerate-openmaptiles.sh
|
||||
- run: ./mvnw -DskipTests --batch-mode -no-transfer-progress clean install -pl planetiler-basemap -am
|
||||
- run: ./mvnw --batch-mode -no-transfer-progress test -pl planetiler-basemap
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
- name: Set up JDK ${{ matrix.jdk }}
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: ${{ matrix.jdk }}
|
||||
distribution: 'temurin'
|
||||
cache: 'maven'
|
||||
# Skip spotless since that gets checked in a separate task
|
||||
- name: Build with mvnw (linux/mac)
|
||||
if: ${{ !contains(matrix.os, 'windows') }}
|
||||
run: ./mvnw ${{matrix.args}} -Dspotless.check.skip --batch-mode -no-transfer-progress package verify jib:buildTar --file pom.xml
|
||||
- name: Build with mvnw.cmd (windows)
|
||||
if: ${{ contains(matrix.os, 'windows') }}
|
||||
run: mvnw.cmd ${{matrix.args}} -Dspotless.check.skip --batch-mode -no-transfer-progress package verify jib:buildTar --file pom.xml
|
||||
shell: cmd
|
||||
|
||||
examples:
|
||||
name: Example project
|
||||
|
@ -62,50 +69,85 @@ jobs:
|
|||
timeout-minutes: 15
|
||||
continue-on-error: true
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
java-version: 17
|
||||
distribution: 'temurin'
|
||||
- name: Build and test
|
||||
run: mvn --batch-mode -no-transfer-progress package --file pom.xml
|
||||
working-directory: planetiler-examples
|
||||
- name: Find jar
|
||||
run: mv target/*with-deps.jar ./run.jar
|
||||
working-directory: planetiler-examples
|
||||
- name: Run
|
||||
run: java -jar run.jar --osm-path=../planetiler-core/src/test/resources/monaco-latest.osm.pbf --mbtiles=data/out.mbtiles
|
||||
working-directory: planetiler-examples
|
||||
- name: Verify
|
||||
run: java -cp run.jar com.onthegomap.planetiler.mbtiles.Verify data/out.mbtiles
|
||||
working-directory: planetiler-examples
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
- name: Set up JDK 21
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: 21
|
||||
distribution: 'temurin'
|
||||
- name: Build and test
|
||||
run: mvn --batch-mode -no-transfer-progress package --file standalone.pom.xml
|
||||
working-directory: planetiler-examples
|
||||
- name: Find jar
|
||||
run: mv target/*with-deps.jar ./run.jar
|
||||
working-directory: planetiler-examples
|
||||
- name: Run
|
||||
run: java -jar run.jar --osm-path=../planetiler-core/src/test/resources/monaco-latest.osm.pbf --output=data/out.mbtiles
|
||||
working-directory: planetiler-examples
|
||||
- name: Verify
|
||||
run: java -cp run.jar com.onthegomap.planetiler.mbtiles.Verify data/out.mbtiles
|
||||
working-directory: planetiler-examples
|
||||
|
||||
run:
|
||||
name: Build / Run
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 15
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Cache data/sources
|
||||
uses: ./.github/cache-sources-action
|
||||
- name: Set up JDK
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
java-version: 17
|
||||
distribution: 'temurin'
|
||||
cache: 'maven'
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
- name: Cache data/sources
|
||||
uses: ./.github/cache-sources-action
|
||||
- name: Set up JDK
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: 21
|
||||
distribution: 'temurin'
|
||||
cache: 'maven'
|
||||
|
||||
- name: Build this branch
|
||||
run: ./mvnw -DskipTests -Dimage.version=CI_ONLY --batch-mode -no-transfer-progress package jib:dockerBuild --file pom.xml
|
||||
- name: Build this branch
|
||||
run: ./mvnw -DskipTests -Dimage.version=CI_ONLY --batch-mode -no-transfer-progress package jib:dockerBuild --file pom.xml
|
||||
|
||||
- name: Download data (java)
|
||||
run: java -jar planetiler-dist/target/*with-deps.jar --only-download --area=monaco
|
||||
- name: 'Upload artifact'
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: planetiler-build
|
||||
path: planetiler-dist/target/*with-deps.jar
|
||||
|
||||
- name: Download wikidata (java)
|
||||
run: java -jar planetiler-dist/target/*with-deps.jar --only-fetch-wikidata --area=monaco
|
||||
- name: Download data (java)
|
||||
run: java -jar planetiler-dist/target/*with-deps.jar --only-download --area=monaco
|
||||
|
||||
- name: Verify build
|
||||
run: ./scripts/test-release.sh CI_ONLY
|
||||
env:
|
||||
SKIP_EXAMPLE_PROJECT: true
|
||||
- name: Download wikidata (java)
|
||||
run: java -jar planetiler-dist/target/*with-deps.jar --only-fetch-wikidata --area=monaco
|
||||
|
||||
- name: Verify build
|
||||
run: ./scripts/test-release.sh CI_ONLY
|
||||
env:
|
||||
SKIP_EXAMPLE_PROJECT: true
|
||||
|
||||
quickstart:
|
||||
name: Quickstart script
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 15
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
- name: Cache data/sources
|
||||
uses: ./.github/cache-sources-action
|
||||
- name: Set up JDK
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: 21
|
||||
distribution: 'temurin'
|
||||
cache: 'maven'
|
||||
|
||||
- name: quickstart.sh --build
|
||||
run: rm -rf data/output.mbtiles data/tmp && ./quickstart.sh monaco --build && ./scripts/check-monaco.sh data/output.mbtiles
|
||||
- name: quickstart.sh --jar
|
||||
run: rm -rf data/output.mbtiles data/tmp && ./quickstart.sh monaco --jar && ./scripts/check-monaco.sh data/output.mbtiles
|
||||
# run docker last since it creates temp dirs with root user
|
||||
- name: quickstart.sh --docker
|
||||
run: rm -rf data/output.mbtiles data/tmp && ./quickstart.sh monaco --docker && ./scripts/check-monaco.sh data/output.mbtiles
|
||||
|
|
|
@ -22,71 +22,73 @@ jobs:
|
|||
timeout-minutes: 20
|
||||
continue-on-error: true
|
||||
steps:
|
||||
- name: 'Cancel previous runs'
|
||||
uses: styfle/cancel-workflow-action@0.9.1
|
||||
with:
|
||||
access_token: ${{ github.token }}
|
||||
- name: 'Checkout branch'
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
path: branch
|
||||
- name: 'Checkout base'
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
path: base
|
||||
ref: ${{ github.event.pull_request.base.sha }}
|
||||
- name: Cache data/sources
|
||||
uses: ./branch/.github/cache-sources-action
|
||||
with:
|
||||
basedir: branch
|
||||
- name: Set up JDK
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
java-version: 17
|
||||
distribution: 'temurin'
|
||||
cache: 'maven'
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: '14'
|
||||
- run: npm install -g strip-ansi-cli@3.0.2
|
||||
- name: 'Cancel previous runs'
|
||||
uses: styfle/cancel-workflow-action@0.12.1
|
||||
with:
|
||||
access_token: ${{ github.token }}
|
||||
- name: 'Checkout branch'
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
path: branch
|
||||
submodules: true
|
||||
- name: 'Checkout base'
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
path: base
|
||||
ref: ${{ github.event.pull_request.base.sha }}
|
||||
submodules: true
|
||||
- name: Cache data/sources
|
||||
uses: ./branch/.github/cache-sources-action
|
||||
with:
|
||||
basedir: branch
|
||||
- name: Set up JDK
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: 21
|
||||
distribution: 'temurin'
|
||||
cache: 'maven'
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '14'
|
||||
- run: npm install -g strip-ansi-cli@3.0.2
|
||||
|
||||
- name: 'Build branch'
|
||||
run: ./scripts/build.sh
|
||||
working-directory: branch
|
||||
- name: 'Build base'
|
||||
run: ./scripts/build.sh
|
||||
working-directory: base
|
||||
- name: 'Build branch'
|
||||
run: ./scripts/build.sh
|
||||
working-directory: branch
|
||||
- name: 'Build base'
|
||||
run: ./scripts/build.sh
|
||||
working-directory: base
|
||||
|
||||
- name: 'Download data'
|
||||
run: |
|
||||
set -eo pipefail
|
||||
cp base/planetiler-dist/target/*with-deps.jar run.jar && java -jar run.jar --only-download --area="${{ env.AREA }}"
|
||||
cp branch/planetiler-dist/target/*with-deps.jar run.jar && java -jar run.jar --only-download --area="${{ env.AREA }}"
|
||||
- name: 'Download data'
|
||||
run: |
|
||||
set -eo pipefail
|
||||
cp base/planetiler-dist/target/*with-deps.jar run.jar && java -jar run.jar --only-download --area="${{ env.AREA }}"
|
||||
cp branch/planetiler-dist/target/*with-deps.jar run.jar && java -jar run.jar --only-download --area="${{ env.AREA }}"
|
||||
|
||||
- name: 'Store build info'
|
||||
run: |
|
||||
mkdir build-info
|
||||
echo "${{ github.event.pull_request.base.sha }}" > build-info/base_sha
|
||||
echo "${{ github.sha }}" > build-info/branch_sha
|
||||
echo "${{ github.event.number }}" > build-info/pull_request_number
|
||||
- name: 'Store build info'
|
||||
run: |
|
||||
mkdir build-info
|
||||
echo "${{ github.event.pull_request.base.sha }}" > build-info/base_sha
|
||||
echo "${{ github.sha }}" > build-info/branch_sha
|
||||
echo "${{ github.event.number }}" > build-info/pull_request_number
|
||||
|
||||
- name: 'Run branch'
|
||||
run: |
|
||||
rm -f data/out.mbtiles
|
||||
cp branch/planetiler-dist/target/*with-deps.jar run.jar
|
||||
java -Xms${{ env.RAM }} -Xmx${{ env.RAM }} -jar run.jar --area="${{ env.AREA }}" "${{ env.BOUNDS_ARG }}" --mbtiles=data/out.mbtiles 2>&1 | tee log
|
||||
ls -alh run.jar | tee -a log
|
||||
cat log | strip-ansi > build-info/branchlogs.txt
|
||||
- name: 'Run base'
|
||||
run: |
|
||||
rm -f data/out.mbtiles
|
||||
cp base/planetiler-dist/target/*with-deps.jar run.jar
|
||||
java -Xms${{ env.RAM }} -Xmx${{ env.RAM }} -jar run.jar --area="${{ env.AREA }}" "${{ env.BOUNDS_ARG }}" --mbtiles=data/out.mbtiles 2>&1 | tee log
|
||||
ls -alh run.jar | tee -a log
|
||||
cat log | strip-ansi > build-info/baselogs.txt
|
||||
- name: 'Run branch'
|
||||
run: |
|
||||
rm -rf data/out.mbtiles data/tmp
|
||||
cp branch/planetiler-dist/target/*with-deps.jar run.jar
|
||||
java -Xms${{ env.RAM }} -Xmx${{ env.RAM }} -jar run.jar --area="${{ env.AREA }}" "${{ env.BOUNDS_ARG }}" --output=data/out.mbtiles --keep-unzipped 2>&1 | tee log
|
||||
ls -alh run.jar | tee -a log
|
||||
cat log | strip-ansi > build-info/branchlogs.txt
|
||||
- name: 'Run base'
|
||||
run: |
|
||||
rm -rf data/out.mbtiles data/tmp
|
||||
cp base/planetiler-dist/target/*with-deps.jar run.jar
|
||||
java -Xms${{ env.RAM }} -Xmx${{ env.RAM }} -jar run.jar --area="${{ env.AREA }}" "${{ env.BOUNDS_ARG }}" --output=data/out.mbtiles --keep-unzipped 2>&1 | tee log
|
||||
ls -alh run.jar | tee -a log
|
||||
cat log | strip-ansi > build-info/baselogs.txt
|
||||
|
||||
- name: 'Upload build-info'
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: build-info
|
||||
path: ./build-info
|
||||
- name: 'Upload build-info'
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: build-info
|
||||
path: ./build-info
|
||||
|
|
|
@ -9,72 +9,74 @@ on:
|
|||
image_tags:
|
||||
description: 'Extra docker image tags ("latest,test")'
|
||||
required: true
|
||||
default: 'latest'
|
||||
default: 'latest,release'
|
||||
jobs:
|
||||
publish:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
timeout-minutes: 20
|
||||
permissions:
|
||||
contents: write
|
||||
packages: write
|
||||
steps:
|
||||
- name: Ensure version does not start with 'v'
|
||||
uses: actions/github-script@v6
|
||||
with:
|
||||
github-token: ${{ github.token }}
|
||||
script: |
|
||||
version = context.payload.inputs.version;
|
||||
if (/^v/.test(version)) throw new Error("Bad version number: " + version)
|
||||
- uses: actions/checkout@v2
|
||||
- name: Cache data/sources
|
||||
uses: ./.github/cache-sources-action
|
||||
- uses: actions/setup-java@v2
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'temurin'
|
||||
cache: 'maven'
|
||||
server-id: ossrh
|
||||
server-username: MAVEN_USERNAME
|
||||
server-password: MAVEN_PASSWORD
|
||||
- name: Ensure version does not start with 'v'
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
github-token: ${{ github.token }}
|
||||
script: |
|
||||
version = context.payload.inputs.version;
|
||||
if (/^v/.test(version)) throw new Error("Bad version number: " + version)
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
- name: Cache data/sources
|
||||
uses: ./.github/cache-sources-action
|
||||
- uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: '21'
|
||||
distribution: 'temurin'
|
||||
cache: 'maven'
|
||||
server-id: ossrh
|
||||
server-username: MAVEN_USERNAME
|
||||
server-password: MAVEN_PASSWORD
|
||||
|
||||
- name: Check tag does not exist yet
|
||||
run: if git rev-list "v${{ github.event.inputs.version }}"; then echo "Tag already exists. Aborting the release process."; exit 1; fi
|
||||
- name: Check tag does not exist yet
|
||||
run: if git rev-list "v${{ github.event.inputs.version }}"; then echo "Tag already exists. Aborting the release process."; exit 1; fi
|
||||
|
||||
- run: ./scripts/set-versions.sh "${{ github.event.inputs.version }}"
|
||||
- run: ./scripts/build-release.sh
|
||||
- run: ./scripts/test-release.sh "${{ github.event.inputs.version }}"
|
||||
- name: Create tag
|
||||
uses: actions/github-script@v6
|
||||
with:
|
||||
github-token: ${{ github.token }}
|
||||
script: |
|
||||
github.rest.git.createRef({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
ref: "refs/tags/v${{ github.event.inputs.version }}",
|
||||
sha: context.sha
|
||||
})
|
||||
- run: mv planetiler-dist/target/*with-deps.jar planetiler.jar
|
||||
- run: sha256sum planetiler.jar > planetiler.jar.sha256
|
||||
- run: md5sum planetiler.jar > planetiler.jar.md5
|
||||
- name: Install GPG Private Key
|
||||
run: |
|
||||
echo -n "${{ secrets.OSSRH_GPG_SECRET_KEY }}" | base64 --decode | gpg --batch --import
|
||||
- name: Create Release
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
fail_on_unmatched_files: true
|
||||
tag_name: v${{ github.event.inputs.version }}
|
||||
draft: true
|
||||
files: |
|
||||
planetiler.jar*
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
- run: ./scripts/push-release.sh ${{ github.event.inputs.version }}
|
||||
env:
|
||||
GITHUB_ACTOR: ${{ github.actor }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
IMAGE_TAGS: ${{ github.event.inputs.image_tags }}
|
||||
MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
|
||||
MAVEN_PASSWORD: ${{ secrets.OSSRH_PASSWORD }}
|
||||
OSSRH_GPG_SECRET_KEY_PASSWORD: ${{ secrets.OSSRH_GPG_SECRET_KEY_PASSWORD }}
|
||||
- run: ./scripts/set-versions.sh "${{ github.event.inputs.version }}"
|
||||
- run: ./scripts/build-release.sh
|
||||
- run: ./scripts/test-release.sh "${{ github.event.inputs.version }}"
|
||||
- name: Create tag
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
github-token: ${{ github.token }}
|
||||
script: |
|
||||
github.rest.git.createRef({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
ref: "refs/tags/v${{ github.event.inputs.version }}",
|
||||
sha: context.sha
|
||||
})
|
||||
- run: mv planetiler-dist/target/*with-deps.jar planetiler.jar
|
||||
- run: sha256sum planetiler.jar > planetiler.jar.sha256
|
||||
- run: md5sum planetiler.jar > planetiler.jar.md5
|
||||
- name: Install GPG Private Key
|
||||
run: |
|
||||
echo -n "${{ secrets.OSSRH_GPG_SECRET_KEY }}" | base64 --decode | gpg --batch --import
|
||||
- name: Create Release
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
fail_on_unmatched_files: true
|
||||
tag_name: v${{ github.event.inputs.version }}
|
||||
draft: true
|
||||
files: |
|
||||
planetiler.jar*
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
- run: ./scripts/push-release.sh ${{ github.event.inputs.version }}
|
||||
env:
|
||||
GITHUB_ACTOR: ${{ github.actor }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
IMAGE_TAGS: ${{ github.event.inputs.image_tags }}
|
||||
MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
|
||||
MAVEN_PASSWORD: ${{ secrets.OSSRH_PASSWORD }}
|
||||
OSSRH_GPG_SECRET_KEY_PASSWORD: ${{ secrets.OSSRH_GPG_SECRET_KEY_PASSWORD }}
|
||||
|
|
|
@ -16,33 +16,42 @@ on:
|
|||
jobs:
|
||||
snapshot:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
timeout-minutes: 20
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Cache data/sources
|
||||
uses: ./.github/cache-sources-action
|
||||
- name: Set up JDK
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
java-version: 17
|
||||
distribution: 'temurin'
|
||||
cache: 'maven'
|
||||
server-id: ossrh
|
||||
server-username: MAVEN_USERNAME
|
||||
server-password: MAVEN_PASSWORD
|
||||
- run: ./scripts/build-release.sh
|
||||
- run: ./scripts/test-release.sh
|
||||
- name: Install GPG Private Key
|
||||
run: |
|
||||
echo -n "${{ secrets.OSSRH_GPG_SECRET_KEY }}" | base64 --decode | gpg --batch --import
|
||||
- run: ./scripts/push-release.sh
|
||||
env:
|
||||
GITHUB_ACTOR: ${{ github.actor }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
IMAGE_TAGS: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.image_tags || 'latest,snapshot' }}
|
||||
MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
|
||||
MAVEN_PASSWORD: ${{ secrets.OSSRH_PASSWORD }}
|
||||
OSSRH_GPG_SECRET_KEY_PASSWORD: ${{ secrets.OSSRH_GPG_SECRET_KEY_PASSWORD }}
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
- name: Cache data/sources
|
||||
uses: ./.github/cache-sources-action
|
||||
- name: Set up JDK
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: 21
|
||||
distribution: 'temurin'
|
||||
cache: 'maven'
|
||||
server-id: ossrh
|
||||
server-username: MAVEN_USERNAME
|
||||
server-password: MAVEN_PASSWORD
|
||||
- run: ./scripts/build-release.sh
|
||||
- run: ./scripts/test-release.sh
|
||||
- run: sha256sum planetiler-dist/target/*with-deps.jar
|
||||
- run: md5sum planetiler-dist/target/*with-deps.jar
|
||||
- name: 'Upload artifact'
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: planetiler-build
|
||||
path: planetiler-dist/target/*with-deps.jar
|
||||
- name: Install GPG Private Key
|
||||
run: |
|
||||
echo -n "${{ secrets.OSSRH_GPG_SECRET_KEY }}" | base64 --decode | gpg --batch --import
|
||||
- run: ./scripts/push-release.sh
|
||||
env:
|
||||
GITHUB_ACTOR: ${{ github.actor }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
IMAGE_TAGS: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.image_tags || 'latest,snapshot' }}
|
||||
MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
|
||||
MAVEN_PASSWORD: ${{ secrets.OSSRH_PASSWORD }}
|
||||
OSSRH_GPG_SECRET_KEY_PASSWORD: ${{ secrets.OSSRH_GPG_SECRET_KEY_PASSWORD }}
|
||||
|
|
|
@ -0,0 +1,80 @@
|
|||
# This workflow will build a Java project with Maven
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
|
||||
|
||||
name: Analyze
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
sonar:
|
||||
name: Analyze with Sonar
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 15
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
# Disabling shallow clone is recommended for improving relevancy of reporting
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- name: Set up JDK 21
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: 21
|
||||
distribution: 'temurin'
|
||||
cache: 'maven'
|
||||
- name: Cache SonarCloud packages
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.sonar/cache
|
||||
key: ${{ runner.os }}-sonar
|
||||
restore-keys: ${{ runner.os }}-sonar
|
||||
- name: Analyze with SonarCloud
|
||||
run: |
|
||||
mvn -Dspotless.check.skip -Pcoverage -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar
|
||||
env:
|
||||
# Needed to get some information about the pull request, if any
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
# Read-only user, use this token to link SonarLint to SonarCloud as well
|
||||
SONAR_TOKEN: c2cfe8bd7368ced07e84a620b7c2487846e220eb
|
||||
- name: Wait for SonarCloud API to update...
|
||||
run: "sleep 10"
|
||||
- name: Upload annotations on PRs
|
||||
if: ${{ github.event_name == 'pull_request' }}
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
github-token: ${{ github.token }}
|
||||
script: |
|
||||
const pr = context.payload.pull_request.number;
|
||||
const url = `https://sonarcloud.io/api/issues/search?pullRequest=${pr}&s=FILE_LINE&resolved=false&sinceLeakPeriod=true&ps=100&facets=severities%2Ctypes&componentKeys=onthegomap_planetiler&organization=onthegomap&additionalFields=_all`;
|
||||
console.log("Fetching " + url);
|
||||
const response = await github.request(url);
|
||||
console.log("Got " + JSON.stringify(response.data));
|
||||
response.data.issues.forEach(issue => {
|
||||
try {
|
||||
if (issue.severity === 'INFO') return;
|
||||
const textRange = issue.textRange;
|
||||
const rule = encodeURIComponent(issue.rule);
|
||||
const message = [
|
||||
issue.message,
|
||||
'',
|
||||
`rule: ${issue.rule} (https://sonarcloud.io/organizations/onthegomap/rules?open=${rule}&rule_key=${rule})`,
|
||||
`issue url: https://sonarcloud.io/project/issues?pullRequest=${pr}&open=${encodeURIComponent(issue.key)}&id=onthegomap_planetiler`
|
||||
].join('\n');
|
||||
const args = {
|
||||
title: `${issue.severity} ${issue.type}`,
|
||||
file: issue.component.replace(/^[^:]*:/, ''),
|
||||
startLine: textRange.startLine,
|
||||
endLine: textRange.endLine,
|
||||
startColumn: textRange.startOffset,
|
||||
endColumn: textRange.endOffset
|
||||
};
|
||||
core.warning(message, args);
|
||||
console.log(args);
|
||||
} catch (e) {
|
||||
core.error(`Unable to parse sonar issue: ${JSON.stringify(issue)}`);
|
||||
}
|
||||
});
|
|
@ -7,7 +7,7 @@ on:
|
|||
workflow_run:
|
||||
workflows: [ "Performance" ]
|
||||
types:
|
||||
- completed
|
||||
- completed
|
||||
|
||||
jobs:
|
||||
updatepr:
|
||||
|
@ -16,74 +16,61 @@ jobs:
|
|||
if: ${{ github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' }}
|
||||
timeout-minutes: 5
|
||||
steps:
|
||||
# report status back to pull request
|
||||
- uses: haya14busa/action-workflow_run-status@v1
|
||||
- uses: actions/checkout@v2
|
||||
- name: 'Download branch build info'
|
||||
uses: dawidd6/action-download-artifact@v2
|
||||
with:
|
||||
workflow: ${{ github.event.workflow_run.workflow_id }}
|
||||
run_id: ${{ github.event.workflow_run.id }}
|
||||
name: build-info
|
||||
path: build-info
|
||||
repo: onthegomap/planetiler
|
||||
- name: 'Get build info'
|
||||
id: build_info
|
||||
run: echo "::set-output name=pr_number::$(cat build-info/pull_request_number)"
|
||||
- name: 'Build comment-body'
|
||||
run: |
|
||||
cat build-info/branchlogs.txt | sed -n '/^.*Tile stats/,$p' > branchsummary.txt
|
||||
cat build-info/branchlogs.txt | sed -n '/^.*Exception in thread/,$p' >> branchsummary.txt
|
||||
cat build-info/baselogs.txt | sed -n '/^.*Tile stats:/,$p' > basesummary.txt
|
||||
cat build-info/baselogs.txt | sed -n '/^.*Exception in thread/,$p' >> basesummary.txt
|
||||
# report status back to pull request
|
||||
- uses: haya14busa/action-workflow_run-status@v1
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
- name: 'Download branch build info'
|
||||
uses: dawidd6/action-download-artifact@v3
|
||||
with:
|
||||
workflow: ${{ github.event.workflow_run.workflow_id }}
|
||||
run_id: ${{ github.event.workflow_run.id }}
|
||||
name: build-info
|
||||
path: build-info
|
||||
- name: 'Get build info'
|
||||
id: build_info
|
||||
run: echo "::set-output name=pr_number::$(cat build-info/pull_request_number)"
|
||||
- name: 'Build comment-body'
|
||||
run: |
|
||||
cat build-info/branchlogs.txt | sed -n '/^.*Tile stats/,/\tfeatures\t/p' > branchsummary.txt
|
||||
cat build-info/branchlogs.txt | sed -n '/^.*Exception in thread/,$p' >> branchsummary.txt
|
||||
cat build-info/baselogs.txt | sed -n '/^.*Tile stats/,/\tfeatures\t/p' > basesummary.txt
|
||||
cat build-info/baselogs.txt | sed -n '/^.*Exception in thread/,$p' >> basesummary.txt
|
||||
|
||||
cat << EOF > comment-body.txt
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Base $(cat build-info/base_sha)</th>
|
||||
<th>This Branch $(cat build-info/branch_sha)</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tr>
|
||||
<td>
|
||||
cat << EOF > comment-body.txt
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>This Branch $(cat build-info/branch_sha)</th>
|
||||
<th>Base $(cat build-info/base_sha)</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
\`\`\`
|
||||
$(cat basesummary.txt)
|
||||
\`\`\`
|
||||
</td>
|
||||
<td>
|
||||
\`\`\`
|
||||
$(cat branchsummary.txt)
|
||||
\`\`\`
|
||||
</td>
|
||||
<td>
|
||||
|
||||
\`\`\`
|
||||
$(cat build-info/branchlogs.txt | sed -n '/^.*Tile stats:/,$p')
|
||||
\`\`\`
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
\`\`\`
|
||||
$(cat basesummary.txt)
|
||||
\`\`\`
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
https://github.com/onthegomap/planetiler/actions/runs/${{ github.event.workflow_run.id }}
|
||||
Full logs: https://github.com/onthegomap/planetiler/actions/runs/${{ github.event.workflow_run.id }}
|
||||
EOF
|
||||
|
||||
<details><summary>ℹ️ <strong>Base Logs $(cat build-info/base_sha)</strong></summary>
|
||||
- name: 'Dump comment body'
|
||||
run: cat comment-body.txt
|
||||
|
||||
\`\`\`
|
||||
$(cat build-info/baselogs.txt)
|
||||
\`\`\`
|
||||
</details>
|
||||
|
||||
<details><summary>ℹ️ <strong>This Branch Logs $(cat build-info/branch_sha)</strong></summary>
|
||||
|
||||
\`\`\`
|
||||
$(cat build-info/branchlogs.txt)
|
||||
\`\`\`
|
||||
</details>
|
||||
EOF
|
||||
|
||||
- name: 'Dump comment body'
|
||||
run: cat comment-body.txt
|
||||
|
||||
- uses: marocchino/sticky-pull-request-comment@v2
|
||||
with:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
path: comment-body.txt
|
||||
header: performance-tests
|
||||
number: ${{ steps.build_info.outputs.pr_number }}
|
||||
- uses: marocchino/sticky-pull-request-comment@v2
|
||||
with:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
path: comment-body.txt
|
||||
header: performance-tests
|
||||
number: ${{ steps.build_info.outputs.pr_number }}
|
||||
|
|
|
@ -1,16 +1,27 @@
|
|||
.DS_Store
|
||||
|
||||
target/
|
||||
.flattened-pom.xml
|
||||
*.jar
|
||||
!.mvn/wrapper/*.jar
|
||||
*.log
|
||||
|
||||
# idea
|
||||
*/.idea
|
||||
.idea/*
|
||||
*.iml
|
||||
!.idea/codeStyles
|
||||
!.idea/vcs.xml
|
||||
!.idea/eclipseCodeFormatter.xml
|
||||
!.idea/jsonSchemas.xml
|
||||
|
||||
# eclipse
|
||||
.classpath
|
||||
.project
|
||||
.settings
|
||||
bin/
|
||||
|
||||
TODO
|
||||
|
||||
data/
|
||||
*-unzipped/
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[submodule "planetiler-openmaptiles"]
|
||||
path = planetiler-openmaptiles
|
||||
url = https://github.com/openmaptiles/planetiler-openmaptiles.git
|
||||
branch = main
|
|
@ -114,6 +114,9 @@
|
|||
<XML>
|
||||
<option name="XML_ALIGN_ATTRIBUTES" value="false" />
|
||||
</XML>
|
||||
<yaml>
|
||||
<option name="INDENT_SEQUENCE_VALUE" value="false" />
|
||||
</yaml>
|
||||
<codeStyleSettings language="CSS">
|
||||
<indentOptions>
|
||||
<option name="INDENT_SIZE" value="2" />
|
||||
|
@ -265,6 +268,7 @@
|
|||
</indentOptions>
|
||||
</codeStyleSettings>
|
||||
<codeStyleSettings language="XML">
|
||||
<option name="RIGHT_MARGIN" value="120" />
|
||||
<indentOptions>
|
||||
<option name="INDENT_SIZE" value="2" />
|
||||
<option name="CONTINUATION_INDENT_SIZE" value="2" />
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="EclipseCodeFormatterProjectSettings">
|
||||
<option name="projectSpecificProfile">
|
||||
<ProjectSpecificProfile>
|
||||
<option name="formatter" value="ECLIPSE" />
|
||||
<option name="importOrder" value="#;" />
|
||||
<option name="pathToConfigFileJava" value="$PROJECT_DIR$/eclipse-formatter.xml" />
|
||||
<option name="selectedJavaProfile" value="Planetiler" />
|
||||
</ProjectSpecificProfile>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
|
@ -0,0 +1,45 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="JsonSchemaMappingsProjectConfiguration">
|
||||
<state>
|
||||
<map>
|
||||
<entry key="JSON Schema version 7">
|
||||
<value>
|
||||
<SchemaInfo>
|
||||
<option name="name" value="JSON Schema version 7" />
|
||||
<option name="relativePathToSchema" value="http://json-schema.org/draft-07/schema" />
|
||||
<option name="schemaVersion" value="JSON Schema version 7" />
|
||||
<option name="applicationDefined" value="true" />
|
||||
<option name="patterns">
|
||||
<list>
|
||||
<Item>
|
||||
<option name="path" value="planetiler.schema.yml" />
|
||||
</Item>
|
||||
</list>
|
||||
</option>
|
||||
</SchemaInfo>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="Planetiler">
|
||||
<value>
|
||||
<SchemaInfo>
|
||||
<option name="generatedName" value="New Schema" />
|
||||
<option name="name" value="Planetiler" />
|
||||
<option name="relativePathToSchema" value="planetiler-custommap/planetiler.schema.json" />
|
||||
<option name="schemaVersion" value="JSON Schema version 7" />
|
||||
<option name="patterns">
|
||||
<list>
|
||||
<Item>
|
||||
<option name="directory" value="true" />
|
||||
<option name="path" value="planetiler-custommap" />
|
||||
<option name="mappingKind" value="Directory" />
|
||||
</Item>
|
||||
</list>
|
||||
</option>
|
||||
</SchemaInfo>
|
||||
</value>
|
||||
</entry>
|
||||
</map>
|
||||
</state>
|
||||
</component>
|
||||
</project>
|
|
@ -2,5 +2,6 @@
|
|||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
<mapping directory="$PROJECT_DIR$/planetiler-openmaptiles" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
|
@ -0,0 +1,5 @@
|
|||
--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
|
||||
--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
|
||||
--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED
|
||||
--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED
|
||||
--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"java.format.settings.url": "eclipse-formatter.xml",
|
||||
"java.format.settings.profile": "Planetiler",
|
||||
"java.completion.importOrder": ["#", ""],
|
||||
"java.sources.organizeImports.staticStarThreshold": 5,
|
||||
"java.sources.organizeImports.starThreshold": 999,
|
||||
"java.saveActions.organizeImports": true,
|
||||
"yaml.schemas": {
|
||||
"./planetiler-custommap/planetiler.schema.json": "planetiler-custommap/**/*.yml"
|
||||
}
|
||||
}
|
|
@ -4,12 +4,13 @@
|
|||
|
||||
Planetiler builds a map in 3 phases:
|
||||
|
||||
1. [Process Input Files](#1-process-input-files) according to
|
||||
the [Profile](planetiler-core/src/main/java/com/onthegomap/planetiler/Profile.java) and write rendered tile features
|
||||
to intermediate files on disk
|
||||
1. [Process Input Files](#1-process-input-files) according to the [Profile](#profiles) and write vector tile features to
|
||||
intermediate files on disk
|
||||
2. [Sort Features](#2-sort-features) by tile ID
|
||||
3. [Emit Vector Tiles](#3-emit-vector-tiles) by iterating through sorted features to group by tile ID, encoding, and
|
||||
writing to the output MBTiles file
|
||||
writing to the output tile archive
|
||||
|
||||
User-defined [profiles](#profiles) customize the behavior of each part of this pipeline.
|
||||
|
||||
## 1) Process Input Files
|
||||
|
||||
|
@ -28,7 +29,8 @@ from each input source:
|
|||
- nodes: store node latitude/longitude locations in-memory or on disk
|
||||
using [LongLongMap](planetiler-core/src/main/java/com/onthegomap/planetiler/collection/LongLongMap.java)
|
||||
- ways: nothing
|
||||
- relations: call `preprocessOsmRelation` on the profile and store information returned for each relation of
|
||||
- relations: call `preprocessOsmRelation` on the [profile](#profiles) and store information returned for each
|
||||
relation of
|
||||
interest, along with relation member IDs in-memory using
|
||||
a [LongLongMultimap](planetiler-core/src/main/java/com/onthegomap/planetiler/collection/LongLongMultimap.java).
|
||||
- pass 2:
|
||||
|
@ -46,11 +48,9 @@ from each input source:
|
|||
then emit a polygon source feature with the reconstructed geometry if successful
|
||||
|
||||
Then, for each [SourceFeature](planetiler-core/src/main/java/com/onthegomap/planetiler/reader/SourceFeature.java),
|
||||
render vector tile features according to
|
||||
the [Profile](planetiler-core/src/main/java/com/onthegomap/planetiler/Profile.java) in a worker thread (default 1 per
|
||||
core):
|
||||
generate vector tile features according to the [profile](#profiles) in a worker thread (default 1 per core):
|
||||
|
||||
- Call `processFeature` method on the profile for each source feature
|
||||
- Call `processFeature` method on the [profile](#profiles) for each source feature
|
||||
- For every vector tile feature added to
|
||||
the [FeatureCollector](planetiler-core/src/main/java/com/onthegomap/planetiler/FeatureCollector.java):
|
||||
- Call [FeatureRenderer#accept](planetiler-core/src/main/java/com/onthegomap/planetiler/render/FeatureRenderer.java)
|
||||
|
@ -96,7 +96,8 @@ of the intermediate features using a worker thread per core:
|
|||
|
||||
## 3) Emit Vector Tiles
|
||||
|
||||
[MbtilesWriter](planetiler-core/src/main/java/com/onthegomap/planetiler/mbtiles/MbtilesWriter.java) is the main driver.
|
||||
[TileArchiveWriter](planetiler-core/src/main/java/com/onthegomap/planetiler/archive/TileArchiveWriter.java) is the main
|
||||
driver.
|
||||
First, a single-threaded reader reads features from disk:
|
||||
|
||||
- [ExternalMergeSort](planetiler-core/src/main/java/com/onthegomap/planetiler/collection/ExternalMergeSort.java) emits
|
||||
|
@ -104,7 +105,8 @@ First, a single-threaded reader reads features from disk:
|
|||
- [FeatureGroup](planetiler-core/src/main/java/com/onthegomap/planetiler/collection/FeatureGroup.java) collects
|
||||
consecutive features in the same tile into a `TileFeatures` instance, dropping features in the same group over the
|
||||
grouping limit to limit point label density
|
||||
- Then [MbtilesWriter](planetiler-core/src/main/java/com/onthegomap/planetiler/mbtiles/MbtilesWriter.java) groups tiles
|
||||
- Then [TileArchiveWriter](planetiler-core/src/main/java/com/onthegomap/planetiler/archive/TileArchiveWriter.java)
|
||||
groups tiles
|
||||
into variable-sized batches for workers to process (complex tiles get their own batch to ensure workers stay busy
|
||||
while the writer thread waits for finished tiles in order)
|
||||
|
||||
|
@ -116,8 +118,23 @@ Then, process tile batches in worker threads (default 1 per core):
|
|||
- gzip each encoded tile
|
||||
- Pass the batch of encoded vector tiles to the writer thread
|
||||
|
||||
Finally, a single-threaded writer writes encoded vector tiles to the output MBTiles file:
|
||||
Finally, a single-threaded writer writes encoded vector tiles to the output archive format:
|
||||
|
||||
- Create the largest prepared statement supported by SQLite (999 parameters)
|
||||
- For MBTiles, create the largest prepared statement supported by SQLite (999 parameters)
|
||||
- Iterate through finished vector tile batches until the prepared statement is full, flush to disk, then repeat
|
||||
- Then flush any remaining tiles at the end
|
||||
|
||||
## Profiles
|
||||
|
||||
To customize the behavior of this pipeline, custom profiles implement
|
||||
the [Profile](planetiler-core/src/main/java/com/onthegomap/planetiler/Profile.java) interface to override:
|
||||
|
||||
- what vector tile features to generate from an input feature
|
||||
- what information from OpenStreetMap relations we need to save for later use
|
||||
- how to post-process vector features grouped into a tile before emitting
|
||||
|
||||
A Java project can implement this interface and add arbitrarily complex processing when overriding the methods.
|
||||
The [custommap](planetiler-custommap) project defines
|
||||
a [ConfiguredProfile](planetiler-custommap/src/main/java/com/onthegomap/planetiler/custommap/ConfiguredProfile.java)
|
||||
implementation that loads instructions from a YAML config file to dynamically control how schemas are generated without
|
||||
needing to write or compile Java code.
|
||||
|
|
115
CONTRIBUTING.md
115
CONTRIBUTING.md
|
@ -1,39 +1,96 @@
|
|||
# Contributing to Planetiler
|
||||
|
||||
Pull requests are welcome! To set up your development environment:
|
||||
|
||||
- Fork the repo
|
||||
- [Install Java 16 or later](https://adoptium.net/installation.html)
|
||||
- Build and run the tests ([mvnw](https://github.com/takari/maven-wrapper) automatically downloads maven the first time
|
||||
you run it):
|
||||
- on max/linux: `./mvnw clean test`
|
||||
- on windows: `mvnw.cmd clean test`
|
||||
- or if you already have maven installed globally on your machine: `mvn clean test`
|
||||
|
||||
To edit the code:
|
||||
|
||||
- [Install IntelliJ IDE](https://www.jetbrains.com/help/idea/installation-guide.html)
|
||||
- In IntelliJ, click `Open`, navigate to the the `pom.xml` file in the local copy of this repo, and `Open`
|
||||
then `Open as Project`
|
||||
- If IntelliJ asks (and you trust the code) then click `Trust Project`
|
||||
- If any java source files show "Cannot resolve symbol..." errors for Planetiler classes, you might need to
|
||||
select: `File -> Invalidate Caches... -> Just Restart`.
|
||||
- If you see a "Project JDK is not defined" error, then choose `Setup SDK` and point IntelliJ at the Java 16 or later
|
||||
installed on your system
|
||||
- Recommended: Under `Preferences -> Tools -> Actions on Save` select `Reformat code` and `Optimize imports` to
|
||||
automatically format code on save.
|
||||
- To verify everything works correctly, right click on `planetiler-core/src/test/java` folder and
|
||||
click `Run 'All Tests'`
|
||||
|
||||
Any pull request should:
|
||||
Pull requests are welcome! Any pull request should:
|
||||
|
||||
- Include at least one unit test to verify the change in behavior
|
||||
- Include an end-to-end test
|
||||
in [PlanetilerTests.java](planetiler-core/src/test/java/com/onthegomap/planetiler/PlanetilerTests.java)
|
||||
to verify any major new user-facing features work
|
||||
- Use IntelliJ's auto-formatting for modified files (this should get enabled automatically)
|
||||
- Be free of IntelliJ warnings for modified files
|
||||
- Format the change `./mvnw spotless:apply` and test with `./mvnw verify` before pushing
|
||||
|
||||
To set up your local development environment:
|
||||
|
||||
- Fork the repo [setup submodules](README.md#git-submodules)
|
||||
- Install Java 21 or later. You can download Java manually from [Adoptium](https://adoptium.net/installation.html) or
|
||||
use:
|
||||
- [Windows installer](https://adoptium.net/installation.html#windows-msi)
|
||||
- [macOS installer](https://adoptium.net/installation.html#macos-pkg) (or `brew install --cask temurin`,
|
||||
or `port install openjdk21-temurin`)
|
||||
- [Linux installer](https://adoptium.net/installation/linux/) (or `apt-get install openjdk-21-jdk`)
|
||||
- If you update from an older version of java on Ubuntu, run `sudo update-alternatives --config java` after installing the new jdk.
|
||||
- Build and run the tests ([mvnw](https://github.com/takari/maven-wrapper) automatically downloads maven the first time
|
||||
you run it):
|
||||
- on mac/linux: `./mvnw clean test`
|
||||
- on windows: `mvnw.cmd clean test`
|
||||
- or if you already have maven installed globally on your machine: `mvn clean test`
|
||||
- to run just one test e.g. `GeoUtilsTest`: `./mvnw -pl planetiler-core -Dtest=GeoUtilsTest test`
|
||||
- to run benchmarks e.g. `BenchmarkTileCoord`:
|
||||
|
||||
```sh
|
||||
./scripts/build.sh
|
||||
java -cp planetiler-dist/target/planetiler-dist-*-with-deps.jar com.onthegomap.planetiler.benchmarks.BenchmarkTileCoord
|
||||
```
|
||||
|
||||
GitHub Workflows will run regression tests on any pull request.
|
||||
|
||||
TODO: Set up checkstyle and an auto-formatter to enforce standards, so you can use any IDE.
|
||||
## IDE Setup
|
||||
|
||||
You can use any text editor as long as you format the code and test before pushing. A good IDE will make things a lot
|
||||
easier though.
|
||||
|
||||
### IntelliJ IDEA (recommended)
|
||||
|
||||
- [Install IntelliJ IDEA](https://www.jetbrains.com/help/idea/installation-guide.html)
|
||||
- Install
|
||||
the [Adapter for Eclipse Code Formatter plugin](https://plugins.jetbrains.com/plugin/6546-adapter-for-eclipse-code-formatter)
|
||||
- In IntelliJ, click `Open`, navigate to the the `pom.xml` file in the local copy of this repo, and `Open`
|
||||
then `Open as Project`
|
||||
- If IntelliJ asks (and you trust the code) then click `Trust Project`
|
||||
- Under `Preferences -> Tools -> Actions on Save` (or `File -> Settings -> Tools -> Actions on Save` on Linux)
|
||||
select `Reformat code` and `Optimize imports` to automatically format code on save.
|
||||
- To verify everything works correctly, right click on `planetiler-core/src/test/java` folder and
|
||||
click `Run 'All Tests'`
|
||||
|
||||
Troubleshooting:
|
||||
|
||||
- If any java source files show "Cannot resolve symbol..." errors for Planetiler classes, you might need to
|
||||
select: `File -> Invalidate Caches... -> Just Restart`.
|
||||
- If you see a "Project JDK is not defined" error, then choose `Setup SDK` and point IntelliJ at the Java 21 or later
|
||||
installed on your system
|
||||
|
||||
### Visual Studio Code
|
||||
|
||||
- Install the [Extension Pack for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack)
|
||||
- In VSCode, click `File -> Open` and navigate to Planetiler directory
|
||||
- If VSCode asks (and you trust the code) then click `Yes I trust the authors`
|
||||
- To verify everything works correctly, go to the `Testing` tab and click `Run Tests`
|
||||
|
||||
Learn more about using VSCode with Java [here](https://code.visualstudio.com/docs/languages/java).
|
||||
|
||||
### Eclipse
|
||||
|
||||
- In [Eclipse for Java Developers](https://www.eclipse.org/downloads/packages/), click `File -> Import ...`
|
||||
then `Maven -> Existing Maven Projects`, navigate to Planetiler directory, and click `Finish`
|
||||
- Under `Eclipse -> Preferences...`:
|
||||
- Under `Java -> Code Style -> Formatter` and choose `Import...`
|
||||
choose [`eclipse-formatter.xml`](eclipse-formatter.xml) from the root of this project. Then choose `Planetiler` as
|
||||
the Active profile.
|
||||
- Under `Java -> Editor -> Save Actions` check `Perform selected actions on save`, `Format source code`
|
||||
, `Format all lines` and `Organize imports`
|
||||
- Under `Java -> Code Style -> Organize Imports` change the `number of static imports needed for .*` to 5, then remove
|
||||
the groups and add 2 new groups:
|
||||
- `New Static...` and `*`
|
||||
- `New...` and `*`
|
||||
- To verify everything works correctly, right click on `planetiler-core/src/test/java` folder and
|
||||
click `Run As -> JUnit Test`
|
||||
|
||||
## SonarLint Plugin Setup (optional, but recommended)
|
||||
|
||||
Planetiler uses [SonarCloud](https://sonarcloud.io/project/overview?id=onthegomap_planetiler) to statically analyze pull
|
||||
requests to catch common bugs and security vulnerabilities. To preview Sonar warnings in VS Code, IntelliJ, or Eclipse:
|
||||
|
||||
- Follow the directions on [sonarlint.org](https://www.sonarlint.org/) to install the plugin for your IDE
|
||||
- Then to synchronize your local configuration with the one used in SonarCloud,
|
||||
enable connected mode for your IDE using "SonarCloud"
|
||||
connection type and the shared read-only API token used in GitHub CI: `c2cfe8bd7368ced07e84a620b7c2487846e220eb`
|
||||
|
||||
|
|
47
NOTICE.md
47
NOTICE.md
|
@ -20,6 +20,15 @@ The `planetiler-core` module includes the following software:
|
|||
- org.xerial:sqlite-jdbc (Apache license)
|
||||
- com.ibm.icu:icu4j ([ICU license](https://github.com/unicode-org/icu/blob/main/icu4c/LICENSE))
|
||||
- com.google.guava:guava (Apache license)
|
||||
- com.google.protobuf:protobuf-java (BSD 3-Clause License)
|
||||
- com.carrotsearch:hppc (Apache license)
|
||||
- com.github.jnr:jnr-ffi (Apache license)
|
||||
- org.roaringbitmap:RoaringBitmap (Apache license)
|
||||
- org.projectnessie.cel:cel-tools (Apache license)
|
||||
- mil.nga.geopackage:geopackage (MIT license)
|
||||
- org.snakeyaml:snakeyaml-engine (Apache license)
|
||||
- org.commonmark:commonmark (BSD 2-clause license)
|
||||
- org.tukaani:xz (public domain)
|
||||
- Adapted code:
|
||||
- `DouglasPeuckerSimplifier` from [JTS](https://github.com/locationtech/jts) (EDL)
|
||||
- `OsmMultipolygon` from [imposm3](https://github.com/omniscale/imposm3) (Apache license)
|
||||
|
@ -27,16 +36,19 @@ The `planetiler-core` module includes the following software:
|
|||
- `VectorTileEncoder`
|
||||
from [java-vector-tile](https://github.com/ElectronicChartCentre/java-vector-tile) (Apache license)
|
||||
- `Imposm3Parsers` from [imposm3](https://github.com/omniscale/imposm3) (Apache license)
|
||||
|
||||
Additionally, the `planetiler-basemap` module is based on [OpenMapTiles](https://github.com/openmaptiles/openmaptiles):
|
||||
|
||||
- Maven Dependencies:
|
||||
- org.yaml:snakeyaml (Apache license)
|
||||
- org.commonmark:commonmark (BSD 2-clause license)
|
||||
- Code adapted from OpenMapTiles (BSD 3-Clause License):
|
||||
- `generated` package generated from OpenMapTiles
|
||||
- All code in `layers` package ported from OpenMapTiles
|
||||
- `LanguageUtils` ported from OpenMapTiles
|
||||
- `PbfDecoder` from [osmosis](https://github.com/openstreetmap/osmosis) (Public Domain)
|
||||
- `PbfFieldDecoder` from [osmosis](https://github.com/openstreetmap/osmosis) (Public Domain)
|
||||
- `Madvise` from [uppend](https://github.com/upserve/uppend/) (MIT License)
|
||||
- `ArrayLongMinHeap` implementations from [graphhopper](https://github.com/graphhopper/graphhopper) (Apache license)
|
||||
- `Hilbert` implementation
|
||||
from [github.com/rawrunprotected/hilbert_curves](https://github.com/rawrunprotected/hilbert_curves) (Public Domain)
|
||||
- `osmformat.proto` and `fileformat.proto` (generates `Osmformat.java` and `Fileformat.java`)
|
||||
from [openstreetmap/OSM-binary](https://github.com/openstreetmap/OSM-binary/tree/master/osmpbf) (MIT License)
|
||||
- `VarInt` from [Bazel](https://github.com/bazelbuild/bazel) (Apache license)
|
||||
- `SeekableInMemoryByteChannel`
|
||||
from [Apache Commons compress](https://commons.apache.org/proper/commons-compress/apidocs/org/apache/commons/compress/utils/SeekableInMemoryByteChannel.html) (
|
||||
Apache License)
|
||||
- [`planetiler-openmaptiles`](https://github.com/openmaptiles/planetiler-openmaptiles) submodule (BSD 3-Clause License)
|
||||
- Schema
|
||||
- The cartography and visual design features of the map tile schema are licensed
|
||||
under [CC-BY 4.0](http://creativecommons.org/licenses/by/4.0/). Products or services using maps derived from
|
||||
|
@ -46,10 +58,11 @@ Additionally, the `planetiler-basemap` module is based on [OpenMapTiles](https:/
|
|||
|
||||
## Data
|
||||
|
||||
|source | license | used as default | included in repo |
|
||||
|-------|---------|-----------------|------------------|
|
||||
| OpenStreetMap (OSM) data | [ODBL](https://www.openstreetmap.org/copyright) | yes | yes
|
||||
| Natural Earth | [public domain](https://www.naturalearthdata.com/about/terms-of-use/) | yes | yes
|
||||
| OSM Lakelines | [MIT](https://github.com/lukasmartinelli/osm-lakelines), data from OSM [ODBL](https://www.openstreetmap.org/copyright) | yes | no
|
||||
| OSM Water Polygons | [acknowledgement](https://osmdata.openstreetmap.de/info/license.html), data from OSM [ODBL](https://www.openstreetmap.org/copyright) | yes | yes
|
||||
| Wikidata name translations | [CCO](https://www.wikidata.org/wiki/Wikidata:Licensing) | no | no
|
||||
| source | license | used as default | included in repo |
|
||||
|----------------------------|--------------------------------------------------------------------------------------------------------------------------------------|-----------------|------------------|
|
||||
| OpenStreetMap (OSM) data | [ODBL](https://www.openstreetmap.org/copyright) | yes | yes |
|
||||
| Natural Earth | [public domain](https://www.naturalearthdata.com/about/terms-of-use/) | yes | yes |
|
||||
| OSM Lakelines | [MIT](https://github.com/lukasmartinelli/osm-lakelines), data from OSM [ODBL](https://www.openstreetmap.org/copyright) | yes | no |
|
||||
| OSM Water Polygons | [acknowledgement](https://osmdata.openstreetmap.de/info/license.html), data from OSM [ODBL](https://www.openstreetmap.org/copyright) | yes | yes |
|
||||
| Wikidata name translations | [CCO](https://www.wikidata.org/wiki/Wikidata:Licensing) | no | no |
|
||||
|
||||
|
|
79
PLANET.md
79
PLANET.md
|
@ -1,9 +1,11 @@
|
|||
# Generating a Map of the World
|
||||
|
||||
To generate a map of the world using the built-in [basemap profile](planetiler-basemap), you will need a machine with
|
||||
Java 16 or later installed and at least 10x as much disk space and 1.5x as much RAM as the `planet.osm.pbf` file you
|
||||
start from. All testing has been done using Digital Ocean droplets with dedicated
|
||||
vCPUs ([referral link](https://m.do.co/c/a947e99aab25)) and OpenJDK 17 installed through `apt`. Planetiler splits work
|
||||
To generate a map of the world using the
|
||||
built-in [OpenMapTiles profile](https://github.com/openmaptiles/planetiler-openmaptiles), you will need a
|
||||
machine with
|
||||
Java 21 or later installed and at least 10x as much disk space and at least 0.5x as much RAM as the `planet.osm.pbf`
|
||||
file you start from. All testing has been done using Digital Ocean droplets with dedicated
|
||||
vCPUs ([referral link](https://m.do.co/c/a947e99aab25)) and OpenJDK 21 installed through `apt`. Planetiler splits work
|
||||
among available CPUs so the more you have, the less time it takes.
|
||||
|
||||
### 1) Choose the Data Source
|
||||
|
@ -15,10 +17,18 @@ First decide where to get the `planet.osm.pbf` file:
|
|||
- Or a [Daylight Distribution](https://daylightmap.org/) snapshot from Facebook that includes extra quality/consistency
|
||||
checks, and add-ons like ML-detected roads and buildings. Combine add-ons and re-number
|
||||
using [osmium-tool](https://osmcode.org/osmium-tool/):
|
||||
|
||||
```bash
|
||||
osmium apply-changes daylight.osm.pbf admin.osc.bz2 <buildings.osc.bz2, ...> -o everything.osm.pbf
|
||||
osmium renumber everything.osm.pbf -o planet.osm.pbf
|
||||
```
|
||||
- If you would like to update your `planet.osm.pbf` file to the latest changes from OpenStreetMap, you can
|
||||
use [pyosmium-up-to-date](https://docs.osmcode.org/pyosmium/latest/tools_uptodate.html):
|
||||
|
||||
```bash
|
||||
pyosmium-up-to-date --size 20000 -v planet.osm.pbf
|
||||
```
|
||||
|
||||
NOTE: you need at least `admin.osc.bz2` for the `boundary` layer to show. This takes about 2.5 hours and needs as much
|
||||
RAM as the `planet.osm.pbf` size.
|
||||
|
||||
|
@ -26,27 +36,45 @@ First decide where to get the `planet.osm.pbf` file:
|
|||
|
||||
Download the [latest release](https://github.com/onthegomap/planetiler/releases/latest) of `planetiler.jar`.
|
||||
|
||||
Then run `java -Xms100g -Xmx100g -jar planetiler.jar` (replacing `100g` with 1.5x the `planet.osm.pbf` size)
|
||||
with these options:
|
||||
If your system has at least 1.5x as much memory as the input OSM file size, run this command to store node location
|
||||
cache in-memory:
|
||||
|
||||
- `--bounds=world` to set bounding box to the entire planet
|
||||
- `--nodemap-type=sparsearray` to store node locations in a sparse array instead of a sorted table - `sortedtable` is
|
||||
more efficient when there are large gaps in ID spaces (i.e. extracts) and `sparsearray` is more efficient with no/few
|
||||
ID gaps (planet, or renumbered extracts).
|
||||
- `--nodemap-storage=ram` to store all node locations in RAM instead of a memory-mapped file - when using `ram` give the
|
||||
JVM 1.5x the input file size instead of 0.5x when using `mmap`
|
||||
- `--download` to fetch [other data sources](NOTICE.md#data) automatically
|
||||
- One of these to point planetiler at your data source:
|
||||
- `--osm-path=path/to/planet.osm.pbf` to point Planetiler at a file you downloaded
|
||||
- `--osm-url=http://url/of/planet.osm.pbf` to download automatically
|
||||
- `--osm-url=s3:211011` to download a specific snapshot from the AWS Registry of Open Data or `--osm-url=s3:latest` to
|
||||
download the latest snapshot
|
||||
- `--area=planet` to use the file in `./data/sources/planet.osm.pbf` or download the latest snapshot from AWS S3
|
||||
mirror if missing.
|
||||
```bash
|
||||
java -Xmx110g \
|
||||
`# return unused heap memory to the OS` \
|
||||
-XX:MaxHeapFreeRatio=40 \
|
||||
-jar planetiler.jar \
|
||||
`# Download the latest planet.osm.pbf from s3://osm-pds bucket` \
|
||||
--area=planet --bounds=planet --download \
|
||||
`# Accelerate the download by fetching the 10 1GB chunks at a time in parallel` \
|
||||
--download-threads=10 --download-chunk-size-mb=1000 \
|
||||
`# Also download name translations from wikidata` \
|
||||
--fetch-wikidata \
|
||||
--output=output.mbtiles \
|
||||
`# Store temporary node locations in memory` \
|
||||
--nodemap-type=array --storage=ram
|
||||
```
|
||||
|
||||
If your system has less than 1.5x as much memory as the input OSM file size, run this command to store node location
|
||||
cache in a temporary memory-mapped file by setting `--storage=mmap` and `-Xmx20g` to reduce the JVM's memory usage.
|
||||
|
||||
```bash
|
||||
java -Xmx20g \
|
||||
-jar planetiler.jar \
|
||||
`# Download the latest planet.osm.pbf from s3://osm-pds bucket` \
|
||||
--area=planet --bounds=planet --download \
|
||||
`# Accelerate the download by fetching the 10 1GB chunks at a time in parallel` \
|
||||
--download-threads=10 --download-chunk-size-mb=1000 \
|
||||
`# Also download name translations from wikidata` \
|
||||
--fetch-wikidata \
|
||||
--output=output.mbtiles \
|
||||
`# Store temporary node locations at fixed positions in a memory-mapped file` \
|
||||
--nodemap-type=array --storage=mmap
|
||||
```
|
||||
|
||||
Run with `--help` to see all available arguments.
|
||||
|
||||
NOTE: The default basemap profile merges nearby buildings at zoom-level 13 (for example,
|
||||
NOTE: The default OpenMapTiles profile merges nearby buildings at zoom-level 13 (for example,
|
||||
see [Boston](https://onthegomap.github.io/planetiler-demo/#13.08/42.35474/-71.06597)). This adds about 14 CPU hours (~50
|
||||
minutes with 16 CPUs) to planet generation time and can be disabled using `--building-merge-z13=false`.
|
||||
|
||||
|
@ -56,10 +84,10 @@ To generate the tiles shown on https://onthegomap.github.io/planetiler-demo/ I u
|
|||
S3 snapshot, then ran Planetiler on a Digital Ocean Memory-Optimized droplet with 16 CPUs, 128GB RAM, and 1.17TB disk
|
||||
running Ubuntu 21.04 x64 in the nyc3 location.
|
||||
|
||||
First, I installed java 17 jre and screen:
|
||||
First, I installed java 21 jre and screen:
|
||||
|
||||
```bash
|
||||
apt-get update && apt-get install -y openjdk-17-jre-headless screen
|
||||
apt-get update && apt-get install -y openjdk-21-jre-headless screen
|
||||
```
|
||||
|
||||
Then I added a script `runworld.sh` to run with 100GB of RAM:
|
||||
|
@ -67,8 +95,7 @@ Then I added a script `runworld.sh` to run with 100GB of RAM:
|
|||
```bash
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
java -Xmx100g -Xms100g \
|
||||
-XX:OnOutOfMemoryError="kill -9 %p" \
|
||||
java -Xmx100g \
|
||||
-jar planetiler.jar \
|
||||
`# Download the latest planet.osm.pbf from s3://osm-pds bucket` \
|
||||
--area=planet --bounds=world --download \
|
||||
|
@ -76,7 +103,7 @@ java -Xmx100g -Xms100g \
|
|||
--download-threads=10 --download-chunk-size-mb=1000 \
|
||||
`# Also download name translations from wikidata` \
|
||||
--fetch-wikidata \
|
||||
--mbtiles=output.mbtiles \
|
||||
--output=output.mbtiles \
|
||||
--nodemap-type=sparsearray --nodemap-storage=ram 2>&1 | tee logs.txt
|
||||
```
|
||||
|
||||
|
|
197
README.md
197
README.md
|
@ -8,32 +8,34 @@ or database.
|
|||
|
||||
Vector tiles contain raw point, line, and polygon geometries that clients like [MapLibre](https://github.com/maplibre)
|
||||
can use to render custom maps in the browser, native apps, or on a server. Planetiler packages tiles into
|
||||
an [MBTiles](https://github.com/mapbox/mbtiles-spec/blob/master/1.3/spec.md) (sqlite) file that can be served using
|
||||
tools like [TileServer GL](https://github.com/maptiler/tileserver-gl) or even
|
||||
[queried directly from the browser](https://github.com/phiresky/sql.js-httpvfs).
|
||||
an [MBTiles](https://github.com/mapbox/mbtiles-spec/blob/master/1.3/spec.md) (sqlite)
|
||||
or [PMTiles](https://github.com/protomaps/PMTiles) file that can be served using tools
|
||||
like [TileServer GL](https://github.com/maptiler/tileserver-gl) or [Martin](https://github.com/maplibre/martin) or
|
||||
even [queried directly from the browser](https://github.com/protomaps/PMTiles/tree/main/js).
|
||||
See [awesome-vector-tiles](https://github.com/mapbox/awesome-vector-tiles) for more projects that work with data in this
|
||||
format.
|
||||
|
||||
Planetiler works by mapping input elements to rendered tile features, flattening them into a big list, then sorting by
|
||||
Planetiler works by mapping input elements to vector tile features, flattening them into a big list, then sorting by
|
||||
tile ID to group into tiles. See [ARCHITECTURE.md](ARCHITECTURE.md) for more details or
|
||||
this [blog post](https://medium.com/@onthegomap/dc419f3af75d?source=friends_link&sk=fb71eaa0e2b26775a9d98c81750ec10b)
|
||||
for more of the backstory.
|
||||
|
||||
## Demo
|
||||
|
||||
See the [live demo](https://onthegomap.github.io/planetiler-demo/) of vector tiles created by Planetiler.
|
||||
See the [live demo](https://onthegomap.github.io/planetiler-demo/) of vector tiles created by Planetiler and hosted by
|
||||
the [OpenStreetMap Americana Project](https://github.com/ZeLonewolf/openstreetmap-americana/).
|
||||
|
||||
[![Planetiler Demo Screenshot](./diagrams/demo.png)](https://onthegomap.github.io/planetiler-demo/)
|
||||
Style [© OpenMapTiles](https://www.openmaptiles.org/)
|
||||
· Data [© OpenStreetMap contributors](https://www.openstreetmap.org/copyright)
|
||||
[© OpenMapTiles](https://www.openmaptiles.org/) [© OpenStreetMap contributors](https://www.openstreetmap.org/copyright)
|
||||
|
||||
## Usage
|
||||
|
||||
To generate a map of an area using the [basemap profile](planetiler-basemap), you will need:
|
||||
To generate a map of an area using the [OpenMapTiles profile](https://github.com/openmaptiles/planetiler-openmaptiles),
|
||||
you will need:
|
||||
|
||||
- [Java 16+](https://adoptium.net/installation.html) or [Docker](https://docs.docker.com/get-docker/)
|
||||
- Java 21+ (see [CONTRIBUTING.md](CONTRIBUTING.md)) or [Docker](https://docs.docker.com/get-docker/)
|
||||
- at least 1GB of free disk space plus 5-10x the size of the `.osm.pbf` file
|
||||
- at least 1.5x as much free RAM as the input `.osm.pbf` file size
|
||||
- at least 0.5x as much free RAM as the input `.osm.pbf` file size
|
||||
|
||||
#### To build the map:
|
||||
|
||||
|
@ -52,7 +54,8 @@ Or using Docker:
|
|||
docker run -e JAVA_TOOL_OPTIONS="-Xmx1g" -v "$(pwd)/data":/data ghcr.io/onthegomap/planetiler:latest --download --area=monaco
|
||||
```
|
||||
|
||||
:warning: This starts off by downloading about 1GB of [data sources](NOTICE.md#data) required by the basemap profile
|
||||
:warning: This starts off by downloading about 1GB of [data sources](NOTICE.md#data) required by the OpenMapTiles
|
||||
profile
|
||||
including ~750MB for [ocean polygons](https://osmdata.openstreetmap.de/data/water-polygons.html) and ~240MB
|
||||
for [Natural Earth Data](https://www.naturalearthdata.com/).
|
||||
|
||||
|
@ -85,7 +88,7 @@ Using [Node.js](https://nodejs.org/en/download/):
|
|||
|
||||
```bash
|
||||
npm install -g tileserver-gl-light
|
||||
tileserver-gl-light --mbtiles data/output.mbtiles
|
||||
tileserver-gl-light data/output.mbtiles
|
||||
```
|
||||
|
||||
Or using [Docker](https://docs.docker.com/get-docker/):
|
||||
|
@ -98,6 +101,8 @@ Then open http://localhost:8080 to view tiles.
|
|||
|
||||
Some common arguments:
|
||||
|
||||
- `--output` tells planetiler where to write output to, and what format to write it in. For
|
||||
example `--output=australia.pmtiles` creates a pmtiles archive named `australia.pmtiles`.
|
||||
- `--download` downloads input sources automatically and `--only-download` exits after downloading
|
||||
- `--area=monaco` downloads a `.osm.pbf` extract from [Geofabrik](https://download.geofabrik.de/)
|
||||
- `--osm-path=path/to/file.osm.pbf` points Planetiler at an existing OSM extract on disk
|
||||
|
@ -106,35 +111,86 @@ Some common arguments:
|
|||
- `--force` overwrites the output file
|
||||
- `--help` shows all of the options and exits
|
||||
|
||||
### Git submodules
|
||||
|
||||
Planetiler has a submodule dependency
|
||||
on [planetiler-openmaptiles](https://github.com/openmaptiles/planetiler-openmaptiles). Add `--recurse-submodules`
|
||||
to `git clone`, `git pull`, or `git checkout` commands to also update submodule dependencies.
|
||||
|
||||
To clone the repo with submodules:
|
||||
|
||||
```bash
|
||||
git clone --recurse-submodules https://github.com/onthegomap/planetiler.git
|
||||
```
|
||||
|
||||
If you already pulled the repo, you can initialize submodules with:
|
||||
|
||||
```bash
|
||||
git submodule update --init
|
||||
```
|
||||
|
||||
To force git to always update submodules (recommended), run this command in your local repo:
|
||||
|
||||
```bash
|
||||
git config --local submodule.recurse true
|
||||
```
|
||||
|
||||
Learn more about working with submodules [here](https://git-scm.com/book/en/v2/Git-Tools-Submodules).
|
||||
|
||||
## Generating a Map of the World
|
||||
|
||||
See [PLANET.md](PLANET.md).
|
||||
|
||||
## Creating a Custom Map
|
||||
## Generating Custom Vector Tiles
|
||||
|
||||
See the [planetiler-examples](planetiler-examples) project.
|
||||
If you want to customize the OpenMapTiles schema or generate an mbtiles file with OpenMapTiles + extra layers, then
|
||||
fork https://github.com/openmaptiles/planetiler-openmaptiles make changes there, and run directly from that repo. It
|
||||
is a standalone Java project with a dependency on Planetiler.
|
||||
|
||||
If you want to generate a separate mbtiles file with overlay layers or a full custom basemap, then:
|
||||
|
||||
- For simple schemas, run a recent planetiler jar or docker image with a custom schema defined in a yaml
|
||||
configuration file. See [planetiler-custommap](planetiler-custommap) for details.
|
||||
- For complex schemas (or if you prefer working in Java), create a new Java project
|
||||
that [depends on Planetiler](#use-as-a-library). See the [planetiler-examples](planetiler-examples) project for a
|
||||
working example.
|
||||
|
||||
If you want to customize how planetiler works internally, then fork this project, build from source, and
|
||||
consider [contributing](#contributing) your change back for others to use!
|
||||
|
||||
## Benchmarks
|
||||
|
||||
Some example runtimes (excluding downloading resources):
|
||||
Some example runtimes for the OpenMapTiles profile (excluding downloading resources):
|
||||
|
||||
| Input | Profile | Machine | Time | mbtiles size | Logs |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| s3://osm-pds/2021/planet-211011.osm.pbf (65GB) | Basemap | DO 16cpu 128GB | 3h9m cpu:42h1m avg:13.3 | 99GB | [logs](planet-logs/v0.1.0-planet-do-16cpu-128gb.txt), [VisualVM Profile](planet-logs/v0.1.0-planet-do-16cpu-128gb.nps) |
|
||||
| [Daylight Distribution v1.6](https://daylightmap.org/2021/09/29/daylight-v16-released.html) with ML buildings and admin boundaries (67GB) | Basemap | DO 16cpu 128GB | 3h13m cpu:43h40m avg:13.5 | 101GB | [logs](planet-logs/v0.1.0-daylight-do-16cpu-128gb.txt) |
|
||||
| s3://osm-pds/2021/planet-211011.osm.pbf (65GB) | Basemap (without z13 building merge) | Linode 50cpu 128GB | 1h9m cpu:24h36m avg:21.2 | 97GB | [logs](planet-logs/v0.1.0-planet-linode-50cpu-128gb.txt), [VisualVM Profile](planet-logs/v0.1.0-planet-linode-50cpu-128gb.nps) |
|
||||
| s3://osm-pds/2021/planet-211011.osm.pbf (65GB) | Basemap (without z13 building merge) | c5ad.16xlarge (64cpu/128GB) | 59m cpu:27h6m avg:27.4 | 97GB | [logs](planet-logs/v0.1.0-planet-c5ad-64cpu-128gb.txt) |
|
||||
| Input | Version | Machine | Time | output size | Logs |
|
||||
|------------------------------------------------|---------|---------------------------------|---------------------------|--------------|----------------------------------------------------------------------------------------------------------------|
|
||||
| s3://osm-pds/2024/planet-240115.osm.pbf (69GB) | 0.7.0 | c3d-standard-180 (180cpu/720GB) | 22m cpu:44h34m avg:120 | 69GB pmtiles | [logs](planet-logs/v0.7.0-planet-c3d-standard-180.txt) |
|
||||
| s3://osm-pds/2024/planet-240108.osm.pbf (73GB) | 0.7.0 | c7gd.16xlarge (64cpu/128GB) | 42m cpu:42m28s avg:52 | 69GB pmtiles | [logs](planet-logs/v0.7.0-planet-c7gd-128gb.txt) |
|
||||
| s3://osm-pds/2022/planet-220530.osm.pbf (69GB) | 0.5.0 | c6gd.16xlarge (64cpu/128GB) | 53m cpu:41h58m avg:47.1 | 79GB mbtiles | [logs](planet-logs/v0.5.0-planet-c6gd-128gb.txt), [VisualVM Profile](planet-logs/v0.5.0-planet-c6gd-128gb.nps) |
|
||||
| s3://osm-pds/2022/planet-220530.osm.pbf (69GB) | 0.5.0 | c6gd.8xlarge (32cpu/64GB) | 1h27m cpu:37h55m avg:26.1 | 79GB mbtiles | [logs](planet-logs/v0.5.0-planet-c6gd-64gb.txt) |
|
||||
| s3://osm-pds/2022/planet-220530.osm.pbf (69GB) | 0.5.0 | c6gd.4xlarge (16cpu/32GB) | 2h38m cpu:34h3m avg:12.9 | 79GB mbtiles | [logs](planet-logs/v0.5.0-planet-c6gd-32gb.txt) |
|
||||
|
||||
Merging nearby buildings at z13 is very expensive, when run with `--building-merge-z13=false`:
|
||||
|
||||
| Input | Version | Machine | Time | output size | Logs |
|
||||
|------------------------------------------------|---------|---------------------------------|--------------------------|--------------|------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| s3://osm-pds/2024/planet-240115.osm.pbf (69GB) | 0.7.0 | c3d-standard-180 (180cpu/720GB) | 16m cpu:27h45m avg:104 | 69GB pmtiles | [logs](planet-logs/v0.7.0-planet-c3d-standard-180-no-z13-building-merge.txt) |
|
||||
| s3://osm-pds/2024/planet-240108.osm.pbf (73GB) | 0.7.0 | c7gd.16xlarge (64cpu/128GB) | 29m cpu:23h57 avg:50 | 69GB pmtiles | [logs](planet-logs/v0.7.0-planet-c7gd-128gb-no-z13-building-merge.txt) |
|
||||
| s3://osm-pds/2024/planet-240108.osm.pbf (73GB) | 0.7.0 | c7gd.2xlarge (8cpu/16GB) | 3h35m cpu:19h45 avg:5.5 | 69GB pmtiles | [logs](planet-logs/v0.7.0-planet-c7gd-16gb-no-z13-building-merge.txt) |
|
||||
| s3://osm-pds/2024/planet-240108.osm.pbf (73GB) | 0.7.0 | im4gn.large (2cpu/8GB) | 18h18m cpu:28h6m avg:1.5 | 69GB pmtiles | [logs](planet-logs/v0.7.0-planet-im4gn-8gb-no-z13-building-merge.txt) |
|
||||
| s3://osm-pds/2022/planet-220530.osm.pbf (69GB) | 0.5.0 | c6gd.16xlarge (64cpu/128GB) | 39m cpu:27h4m avg:42.1 | 79GB mbtiles | [logs](planet-logs/v0.5.0-planet-c6gd-128gb-no-z13-building-merge.txt), [VisualVM Profile](planet-logs/v0.5.0-planet-c6gd-128gb-no-z13-building-merge.nps) |
|
||||
|
||||
## Alternatives
|
||||
|
||||
Some other tools that generate vector tiles from OpenStreetMap data:
|
||||
|
||||
- [OpenMapTiles](https://github.com/openmaptiles/openmaptiles) is the reference implementation of
|
||||
the [OpenMapTiles schema](https://openmaptiles.org/schema/) that the [basemap profile](planetiler-basemap) is based
|
||||
on. It uses an intermediate postgres database and operates in two modes:
|
||||
the [OpenMapTiles schema](https://openmaptiles.org/schema/) that
|
||||
the [OpenMapTiles profile](https://github.com/openmaptiles/planetiler-openmaptiles)
|
||||
is based on. It uses an intermediate postgres database and operates in two modes:
|
||||
1. Import data into database (~1 day) then serve vector tiles directly from the database. Tile serving is slower and
|
||||
requires bigger machines, but lets you easily incorporate realtime updates
|
||||
2. Import data into database (~1 day) then prerender every tile for the planet into an mbtiles file which
|
||||
2. Import data into database (~1 day) then pregenerate every tile for the planet into an mbtiles file which
|
||||
takes [over 100 days](https://github.com/openmaptiles/openmaptiles/issues/654#issuecomment-724606293)
|
||||
or a cluster of machines, but then tiles can be served faster on smaller machines
|
||||
- [Tilemaker](https://github.com/systemed/tilemaker) uses a similar approach to Planetiler (no intermediate database),
|
||||
|
@ -154,13 +210,17 @@ download regularly-updated tilesets.
|
|||
|
||||
- Supports [Natural Earth](https://www.naturalearthdata.com/),
|
||||
OpenStreetMap [.osm.pbf](https://wiki.openstreetmap.org/wiki/PBF_Format),
|
||||
[`geopackage`](https://www.geopackage.org/),
|
||||
and [Esri Shapefiles](https://en.wikipedia.org/wiki/Shapefile) data sources
|
||||
- Writes to [MBTiles](https://github.com/mapbox/mbtiles-spec/blob/master/1.3/spec.md) or
|
||||
or [PMTiles](https://github.com/protomaps/PMTiles) output.
|
||||
- Java-based [Profile API](planetiler-core/src/main/java/com/onthegomap/planetiler/Profile.java) to customize how source
|
||||
elements map to vector tile features, and post-process generated tiles
|
||||
using [JTS geometry utilities](https://github.com/locationtech/jts)
|
||||
- [YAML config file format](planetiler-custommap) that lets you create custom schemas without writing Java code
|
||||
- Merge nearby lines or polygons with the same tags before emitting vector tiles
|
||||
- Automatically fixes self-intersecting polygons
|
||||
- Built-in basemap profile based on [OpenMapTiles](https://openmaptiles.org/) v3.13
|
||||
- Built-in OpenMapTiles profile based on [OpenMapTiles](https://openmaptiles.org/) v3.13.1
|
||||
- Optionally download additional name translations for elements from Wikidata
|
||||
- Export real-time stats to a [prometheus push gateway](https://github.com/prometheus/pushgateway) using
|
||||
`--pushgateway=http://user:password@ip` argument (and a [grafana dashboard](grafana.json) for viewing)
|
||||
|
@ -178,30 +238,56 @@ download regularly-updated tilesets.
|
|||
finished ([boundary layer example](https://github.com/onthegomap/planetiler/blob/9e9cf7c413027ffb3ab5c7436d11418935ae3f6a/planetiler-basemap/src/main/java/com/onthegomap/planetiler/basemap/layers/Boundary.java#L294))
|
||||
- Planetiler only does full imports from `.osm.pbf` snapshots, there is no way to incorporate real-time updates.
|
||||
|
||||
## Roadmap
|
||||
## Use as a library
|
||||
|
||||
- [x] Enough `planetiler-core` functionality to support basemap profile based on OpenMapTiles
|
||||
- [ ] Basemap profile based on OpenMapTiles v3.13
|
||||
- [x] Port all layers
|
||||
- [x] Download name translations from wikidata
|
||||
- [x] Merge buildings at z13
|
||||
- [x] `adm0_l`/`adm0_r` boundary labels
|
||||
- [ ] Abbreviate road names to improve visibility
|
||||
- [ ] Poi layer `agg_stop` tag
|
||||
- [ ] Get `planetiler-core` into Maven Central
|
||||
- [ ] Remove geotools dependency for reading shapefiles (not in Maven Central)
|
||||
- [ ] Remove graphhopper dependency for reading OSM files, and
|
||||
use [LocationsOnWays](https://blog.jochentopf.com/2016-04-20-node-locations-on-ways.html) to skip node location
|
||||
storage when present and reduce memory requirement by 70%.
|
||||
- [ ] "Sparse mode" to only store node and relation data for elements used by a profile
|
||||
- [ ] Support zoom levels higher than 14
|
||||
- [ ] Handle nodes and relations in relations (only ways handled now)
|
||||
- [ ] Lake centerline support in `planetiler-core`
|
||||
- [ ] Improve line merging to combine nearby parallel roads
|
||||
- [ ] Basemap schema improvements for [onthegomap.com](https://onthegomap.com)
|
||||
- [ ] Accept other kinds of data sources
|
||||
- [ ] Extract reusable utilities for complex schemas from `planetiler-basemap` to `planetiler-core`
|
||||
- [ ] Other schemas
|
||||
Planetiler can be used as a maven-style dependency in a Java project using the settings below:
|
||||
|
||||
### Maven
|
||||
|
||||
Add this repository block to your `pom.xml`:
|
||||
|
||||
```xml
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>osgeo</id>
|
||||
<name>OSGeo Release Repository</name>
|
||||
<url>https://repo.osgeo.org/repository/release/</url>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
<releases>
|
||||
<enabled>true</enabled>
|
||||
</releases>
|
||||
</repository>
|
||||
</repositories>
|
||||
```
|
||||
|
||||
Then add the following dependency:
|
||||
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>com.onthegomap.planetiler</groupId>
|
||||
<artifactId>planetiler-core</artifactId>
|
||||
<version>${planetiler.version}</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
### Gradle
|
||||
|
||||
Set up your repositories block::
|
||||
|
||||
```groovy
|
||||
mavenCentral()
|
||||
maven {
|
||||
url "https://repo.osgeo.org/repository/release/"
|
||||
}
|
||||
```
|
||||
|
||||
Set up your dependencies block:
|
||||
|
||||
```groovy
|
||||
implementation 'com.onthegomap.planetiler:planetiler-core:<version>'
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
|
@ -210,7 +296,7 @@ Pull requests are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
|
|||
## Support
|
||||
|
||||
For general questions, check out the #planetiler channel on [OSM-US Slack](https://osmus.slack.com/) (get an
|
||||
invite [here](https://osmus-slack.herokuapp.com/)), or start
|
||||
invite [here](https://slack.openstreetmap.us/)), or start
|
||||
a [GitHub discussion](https://github.com/onthegomap/planetiler/discussions).
|
||||
|
||||
Found a bug or have a feature request? Open a [GitHub issue](https://github.com/onthegomap/planetiler/issues) to report.
|
||||
|
@ -224,9 +310,10 @@ Planetiler is made possible by these awesome open source projects:
|
|||
|
||||
- [OpenMapTiles](https://openmaptiles.org/) for the [schema](https://openmaptiles.org/schema/)
|
||||
and [reference implementation](https://github.com/openmaptiles/openmaptiles)
|
||||
that the [basemap profile](planetiler-basemap/src/main/java/com/onthegomap/planetiler/basemap/layers)
|
||||
that
|
||||
the [openmaptiles profile](https://github.com/openmaptiles/planetiler-openmaptiles/tree/main/src/main/java/org/openmaptiles/layers)
|
||||
is based on
|
||||
- [Graphhopper](https://www.graphhopper.com/) for utilities to process OpenStreetMap data in Java
|
||||
- [Graphhopper](https://www.graphhopper.com/) for basis of utilities to process OpenStreetMap data in Java
|
||||
- [JTS Topology Suite](https://github.com/locationtech/jts) for working with vector geometries
|
||||
- [Geotools](https://github.com/geotools/geotools) for shapefile processing
|
||||
- [SQLite JDBC Driver](https://github.com/xerial/sqlite-jdbc) for reading Natural Earth data and writing MBTiles files
|
||||
|
@ -239,6 +326,14 @@ Planetiler is made possible by these awesome open source projects:
|
|||
- [imposm3](https://github.com/omniscale/imposm3) for the basis
|
||||
of [OSM multipolygon processing](planetiler-core/src/main/java/com/onthegomap/planetiler/reader/osm/OsmMultipolygon.java)
|
||||
and [tag parsing utilities](planetiler-core/src/main/java/com/onthegomap/planetiler/util/Imposm3Parsers.java)
|
||||
- [HPPC](http://labs.carrotsearch.com/) for high-performance primitive Java collections
|
||||
- [Osmosis](https://wiki.openstreetmap.org/wiki/Osmosis) for Java utilities to parse OpenStreetMap data
|
||||
- [JNR-FFI](https://github.com/jnr/jnr-ffi) for utilities to access low-level system utilities to improve memory-mapped
|
||||
file performance.
|
||||
- [cel-java](https://github.com/projectnessie/cel-java) for the Java implementation of
|
||||
Google's [Common Expression Language](https://github.com/google/cel-spec) that powers dynamic expressions embedded in
|
||||
schema config files.
|
||||
- [PMTiles](https://github.com/protomaps/PMTiles) optimized tile storage format
|
||||
|
||||
See [NOTICE.md](NOTICE.md) for a full list and license details.
|
||||
|
||||
|
|
|
@ -80,7 +80,7 @@
|
|||
# mbtiles_version=0.1
|
||||
# mbtiles_type=baselayer OR overlay
|
||||
|
||||
################# Basemap profile config #################
|
||||
################# OpenMapTiles profile config #################
|
||||
|
||||
# Set the input file name and automatically determine the https://download.geofabrik.de/ download URL for a region by name:
|
||||
# area=monaco
|
||||
|
@ -119,6 +119,10 @@
|
|||
# osm_path=path/to/monaco.osm.pbf
|
||||
# osm_url=https://url/for/monaco.osm.pbf
|
||||
|
||||
# To delete an input file before writing the output file (and reduce peak disk requirements):
|
||||
# free_osm_after_read: true
|
||||
# free_natural_earth_after_read: true
|
||||
|
||||
#### Layer-specific overrides:
|
||||
|
||||
#### "boundary" layer
|
||||
|
|
|
@ -0,0 +1,480 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<profiles version="21">
|
||||
<profile kind="CodeFormatterProfile" name="Planetiler" version="21">
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment" value="common_lines"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters"
|
||||
value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration"
|
||||
value="preserve_positions"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.align_with_spaces" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="1"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_before_code_block" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations"
|
||||
value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="20"/>
|
||||
<setting
|
||||
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_record_components" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments"
|
||||
value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_logical_operator" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line" value="one_line_never"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_record_declaration"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments"
|
||||
value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method" value="1"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line" value="one_line_if_empty"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause" value="common_lines"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference"
|
||||
value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line" value="one_line_if_empty"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.wrap_before_shift_operator" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header"
|
||||
value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_code_block" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_parameters" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_loops" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation" value="preserve_positions"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_enum_constant" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.text_block_indentation" value="2"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_module_statements" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line" value="one_line_never"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_annotations" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.wrap_before_assertion_message_operator" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines" value="2147483647"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="84"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_not_operator" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration"
|
||||
value="preserve_positions"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_arguments" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_package" value="49"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header"
|
||||
value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_record_header" value="true"/>
|
||||
<setting
|
||||
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.indent_tag_description" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_record_constructor" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_string_concatenation" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_shift_operator" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration"
|
||||
value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_shift_operator" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration"
|
||||
value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_record_components" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.wrap_before_additive_operator" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_record_declaration"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_relational_operator" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_logical_operator" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation" value="preserve_positions"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_record_declaration"
|
||||
value="preserve_positions"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement" value="common_lines"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="17"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="-1"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_method_body" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement" value="common_lines"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="2"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration"
|
||||
value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="120"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_method_body_on_one_line" value="one_line_if_empty"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line" value="one_line_never"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line" value="one_line_if_empty"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_additive_operator" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations"
|
||||
value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_constructor"
|
||||
value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_relational_operator" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_record_declaration_on_one_line" value="one_line_if_empty"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_lambda_body" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments"
|
||||
value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter" value="48"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_relational_operator" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="2"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_additive_operator" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_record_declaration" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_after_code_block" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_type" value="49"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable" value="49"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_additive_operator" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field" value="1"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.wrap_before_conditional_operator" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_shift_operator" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause" value="separate_lines_if_wrapped"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_code_block_on_one_line" value="one_line_never"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws"
|
||||
value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_record_components" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="2"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_record_declaration"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.wrap_before_assignment_operator" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters"
|
||||
value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters"
|
||||
value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line" value="one_line_never"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_method" value="49"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_record_constructor_on_one_line" value="one_line_if_empty"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_declaration"
|
||||
value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assertion_message" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration"
|
||||
value="do not insert"/>
|
||||
<setting
|
||||
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_logical_operator" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_record_declaration" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.wrap_before_relational_operator" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="20"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.wrap_before_logical_operator" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_statement_group_in_switch" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration"
|
||||
value="preserve_positions"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line" value="one_line_never"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration"
|
||||
value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters"
|
||||
value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_code_block" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.wrap_before_string_concatenation" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
|
||||
</profile>
|
||||
</profiles>
|
|
@ -0,0 +1,176 @@
|
|||
Layer Stats
|
||||
===========
|
||||
|
||||
This page describes how to generate and analyze layer stats data to find ways to optimize tile size.
|
||||
|
||||
### Generating Layer Stats
|
||||
|
||||
Run planetiler with `--output-layerstats` to generate an extra `<output>.layerstats.tsv.gz` file with a row for each
|
||||
layer in each tile that can be used to analyze tile sizes. You can also get stats for an existing archive by running:
|
||||
|
||||
```bash
|
||||
java -jar planetiler.jar stats --input=<path to mbtiles or pmtiles file> --output=layerstats.tsv.gz
|
||||
```
|
||||
|
||||
The output is a gzipped tsv with a row per layer on each tile and the following columns:
|
||||
|
||||
| column | description |
|
||||
|---------------------|-------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| z | tile zoom |
|
||||
| x | tile x |
|
||||
| y | tile y |
|
||||
| hilbert | tile hilbert ID (defines [pmtiles](https://protomaps.com/docs/pmtiles) order) |
|
||||
| archived_tile_bytes | stored tile size (usually gzipped) |
|
||||
| layer | layer name |
|
||||
| layer_bytes | encoded size of this layer on this tile |
|
||||
| layer_features | number of features in this layer |
|
||||
| layer_geometries | number of geometries in features in this layer, including inside multipoint/multipolygons/multilinestring features |
|
||||
| layer_attr_bytes | encoded size of the [attribute key/value pairs](https://github.com/mapbox/vector-tile-spec/tree/master/2.1#44-feature-attributes) in this layer |
|
||||
| layer_attr_keys | number of distinct attribute keys in this layer on this tile |
|
||||
| layer_attr_values | number of distinct attribute values in this layer on this tile |
|
||||
|
||||
### Analyzing Layer Stats
|
||||
|
||||
Load a layer stats file in [duckdb](https://duckdb.org/):
|
||||
|
||||
```sql
|
||||
CREATE TABLE layerstats AS SELECT * FROM 'output.pmtiles.layerstats.tsv.gz';
|
||||
```
|
||||
|
||||
Then get the biggest layers:
|
||||
|
||||
```sql
|
||||
SELECT * FROM layerstats ORDER BY layer_bytes DESC LIMIT 2;
|
||||
```
|
||||
|
||||
| z | x | y | hilbert | archived_tile_bytes | layer | layer_bytes | layer_features | layer_geometries | layer_attr_bytes | layer_attr_keys | layer_attr_values |
|
||||
|----|-------|------|-----------|---------------------|-------------|-------------|----------------|------------------|------------------|-----------------|-------------------|
|
||||
| 14 | 13722 | 7013 | 305278258 | 1260526 | housenumber | 2412589 | 108390 | 108390 | 30764 | 1 | 3021 |
|
||||
| 14 | 13723 | 7014 | 305278256 | 1059752 | housenumber | 1850041 | 83038 | 83038 | 26022 | 1 | 2542 |
|
||||
|
||||
To get a table of biggest layers by zoom:
|
||||
|
||||
```sql
|
||||
PIVOT (
|
||||
SELECT z, layer, (max(layer_bytes)/1000)::int size FROM layerstats GROUP BY z, layer ORDER BY z ASC
|
||||
) ON printf('%2d', z) USING sum(size);
|
||||
-- duckdb sorts columns lexicographically, so left-pad the zoom so 2 comes before 10
|
||||
```
|
||||
|
||||
| layer | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
|
||||
|---------------------|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|------|
|
||||
| boundary | 10 | 75 | 85 | 53 | 44 | 25 | 18 | 15 | 15 | 29 | 24 | 18 | 32 | 18 | 10 |
|
||||
| landcover | 2 | 1 | 8 | 5 | 3 | 31 | 18 | 584 | 599 | 435 | 294 | 175 | 166 | 111 | 334 |
|
||||
| place | 116 | 314 | 833 | 830 | 525 | 270 | 165 | 80 | 51 | 54 | 63 | 70 | 50 | 122 | 221 |
|
||||
| water | 8 | 4 | 11 | 9 | 15 | 13 | 89 | 114 | 126 | 109 | 133 | 94 | 167 | 116 | 91 |
|
||||
| water_name | 7 | 19 | 25 | 15 | 11 | 6 | 6 | 4 | 3 | 6 | 5 | 4 | 4 | 4 | 29 |
|
||||
| waterway | | | | 1 | 4 | 2 | 18 | 13 | 10 | 28 | 20 | 16 | 60 | 66 | 73 |
|
||||
| park | | | | | 54 | 135 | 89 | 76 | 72 | 82 | 90 | 56 | 48 | 19 | 50 |
|
||||
| landuse | | | | | 3 | 2 | 33 | 67 | 95 | 107 | 177 | 132 | 66 | 313 | 109 |
|
||||
| transportation | | | | | 384 | 425 | 259 | 240 | 287 | 284 | 165 | 95 | 313 | 187 | 133 |
|
||||
| transportation_name | | | | | | | 32 | 20 | 18 | 13 | 30 | 18 | 65 | 59 | 169 |
|
||||
| mountain_peak | | | | | | | | 13 | 13 | 12 | 15 | 12 | 12 | 317 | 235 |
|
||||
| aerodrome_label | | | | | | | | | 5 | 4 | 5 | 4 | 4 | 4 | 4 |
|
||||
| aeroway | | | | | | | | | | | 16 | 26 | 35 | 31 | 18 |
|
||||
| poi | | | | | | | | | | | | | 35 | 18 | 811 |
|
||||
| building | | | | | | | | | | | | | | 94 | 1761 |
|
||||
| housenumber | | | | | | | | | | | | | | | 2412 |
|
||||
|
||||
To get biggest tiles:
|
||||
|
||||
```sql
|
||||
CREATE TABLE tilestats AS SELECT
|
||||
z, x, y,
|
||||
any_value(archived_tile_bytes) gzipped,
|
||||
sum(layer_bytes) raw
|
||||
FROM layerstats GROUP BY z, x, y;
|
||||
|
||||
SELECT
|
||||
z, x, y,
|
||||
format_bytes(gzipped::int) gzipped,
|
||||
format_bytes(raw::int) raw,
|
||||
FROM tilestats ORDER BY gzipped DESC LIMIT 2;
|
||||
```
|
||||
|
||||
NOTE: this group by uses a lot of memory so you need to be running in file-backed
|
||||
mode `duckdb analysis.duckdb` (not in-memory mode)
|
||||
|
||||
| z | x | y | gzipped | raw |
|
||||
|----|------|------|---------|------|
|
||||
| 13 | 2286 | 3211 | 9KB | 12KB |
|
||||
| 13 | 2340 | 2961 | 9KB | 12KB |
|
||||
|
||||
To make it easier to look at these tiles on a map, you can define following macros that convert z/x/y coordinates to
|
||||
lat/lons:
|
||||
|
||||
```sql
|
||||
CREATE MACRO lon(z, x) AS (x/2**z) * 360 - 180;
|
||||
CREATE MACRO lat_n(z, y) AS pi() - 2 * pi() * y/2**z;
|
||||
CREATE MACRO lat(z, y) AS degrees(atan(0.5*(exp(lat_n(z, y)) - exp(-lat_n(z, y)))));
|
||||
CREATE MACRO debug_url(z, x, y) as concat(
|
||||
'https://protomaps.github.io/PMTiles/#map=',
|
||||
z + 0.5, '/',
|
||||
round(lat(z, y + 0.5), 5), '/',
|
||||
round(lon(z, x + 0.5), 5)
|
||||
);
|
||||
|
||||
SELECT z, x, y, debug_url(z, x, y), layer, format_bytes(layer_bytes) size
|
||||
FROM layerstats ORDER BY layer_bytes DESC LIMIT 2;
|
||||
```
|
||||
|
||||
| z | x | y | debug_url(z, x, y) | layer | size |
|
||||
|----|-------|------|------------------------------------------------------------------|-------------|-------|
|
||||
| 14 | 13722 | 7013 | https://protomaps.github.io/PMTiles/#map=14.5/25.05575/121.51978 | housenumber | 2.4MB |
|
||||
| 14 | 13723 | 7014 | https://protomaps.github.io/PMTiles/#map=14.5/25.03584/121.54175 | housenumber | 1.8MB |
|
||||
|
||||
Drag and drop your pmtiles archive to the pmtiles debugger to see the large tiles on a map. You can also switch to the
|
||||
"inspect" tab to inspect an individual tile.
|
||||
|
||||
#### Computing Weighted Average Tile Sizes
|
||||
|
||||
If you compute a straight average tile size, it will be dominated by ocean tiles that no one looks at. You can compute a
|
||||
weighted average based on actual usage by joining with a `z, x, y, loads` tile source. For
|
||||
convenience, [top_osm_tiles.tsv.gz](top_osm_tiles.tsv.gz) has the top 1 million tiles from 90 days
|
||||
of [OSM tile logs](https://planet.openstreetmap.org/tile_logs/) from summer 2023.
|
||||
|
||||
You can load these sample weights using duckdb's [httpfs module](https://duckdb.org/docs/extensions/httpfs.html):
|
||||
|
||||
```sql
|
||||
INSTALL httpfs;
|
||||
CREATE TABLE weights AS SELECT z, x, y, loads FROM 'https://raw.githubusercontent.com/onthegomap/planetiler/main/layerstats/top_osm_tiles.tsv.gz';
|
||||
```
|
||||
|
||||
Then compute the weighted average tile size:
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
format_bytes((sum(gzipped * loads) / sum(loads))::int) gzipped_avg,
|
||||
format_bytes((sum(raw * loads) / sum(loads))::int) raw_avg,
|
||||
FROM tilestats JOIN weights USING (z, x, y);
|
||||
```
|
||||
|
||||
| gzipped_avg | raw_avg |
|
||||
|-------------|---------|
|
||||
| 81KB | 132KB |
|
||||
|
||||
If you are working with an extract, then the low-zoom tiles will dominate, so you can make the weighted average respect
|
||||
the per-zoom weights that appear globally:
|
||||
|
||||
```sql
|
||||
WITH zoom_weights AS (
|
||||
SELECT z, sum(loads) loads FROM weights GROUP BY z
|
||||
),
|
||||
zoom_avgs AS (
|
||||
SELECT
|
||||
z,
|
||||
sum(gzipped * loads) / sum(loads) gzipped,
|
||||
sum(raw * loads) / sum(loads) raw,
|
||||
FROM tilestats JOIN weights USING (z, x, y)
|
||||
GROUP BY z
|
||||
)
|
||||
SELECT
|
||||
format_bytes((sum(gzipped * loads) / sum(loads))::int) gzipped_avg,
|
||||
format_bytes((sum(raw * loads) / sum(loads))::int) raw_avg,
|
||||
FROM zoom_avgs JOIN zoom_weights USING (z);
|
||||
```
|
||||
|
Plik binarny nie jest wyświetlany.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Plik binarny nie jest wyświetlany.
File diff suppressed because one or more lines are too long
Plik binarny nie jest wyświetlany.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,637 @@
|
|||
0:00:00 DEB - argument: config=null (path to config file)
|
||||
0:00:00 DEB - argument: download_dir=data/sources (download directory)
|
||||
0:00:00 DEB - argument: area=planet (name of the extract to download if osm_url/osm_path not specified (i.e. 'monaco' 'rhode island' 'australia' or 'planet'))
|
||||
0:00:00 INF - argument: stats=use in-memory stats
|
||||
0:00:00 DEB - argument: madvise=true (default value for whether to use linux madvise(random) to improve memory-mapped read performance for temporary storage)
|
||||
0:00:00 DEB - argument: storage=ram (default storage type for temporary data, one of [ram, mmap, direct])
|
||||
0:00:00 DEB - argument: threads=180 (num threads)
|
||||
0:00:00 DEB - argument: write_threads=6 (number of threads to use when writing temp features)
|
||||
0:00:00 DEB - argument: process_threads=174 (number of threads to use when processing input features)
|
||||
0:00:00 DEB - argument: bounds=Env[-180.0 : 180.0, -85.0511287798066 : 85.0511287798066] (bounds)
|
||||
0:00:00 DEB - argument: polygon=null (a .poly file that limits output to tiles intersecting the shape)
|
||||
0:00:00 DEB - argument: minzoom=0 (minimum zoom level)
|
||||
0:00:00 DEB - argument: maxzoom=14 (maximum zoom level up to 15)
|
||||
0:00:00 DEB - argument: render_maxzoom=14 (maximum rendering zoom level up to 15)
|
||||
0:00:00 DEB - argument: tmpdir=data/tmp (temp directory)
|
||||
0:00:00 DEB - argument: feature_read_threads=2 (number of threads to use when reading features at tile write time)
|
||||
0:00:00 DEB - argument: tile_write_threads=1 (number of threads used to write tiles - only supported by [files, csv, tsv, proto, pbf, json])
|
||||
0:00:00 DEB - argument: loginterval=10 seconds (time between logs)
|
||||
0:00:00 DEB - argument: force=false (overwriting output file and ignore disk/RAM warnings)
|
||||
0:00:00 DEB - argument: append=false (append to the output file - only supported by [files, csv, tsv, proto, pbf, json])
|
||||
0:00:00 DEB - argument: gzip_temp=false (gzip temporary feature storage (uses more CPU, but less disk space))
|
||||
0:00:00 DEB - argument: mmap_temp=true (use memory-mapped IO for temp feature files)
|
||||
0:00:00 DEB - argument: sort_max_readers=6 (maximum number of concurrent read threads to use when sorting chunks)
|
||||
0:00:00 DEB - argument: sort_max_writers=6 (maximum number of concurrent write threads to use when sorting chunks)
|
||||
0:00:00 DEB - argument: nodemap_type=array (type of node location map, one of [noop, sortedtable, sparsearray, array])
|
||||
0:00:00 DEB - argument: nodemap_storage=ram (storage for node location map, one of [ram, mmap, direct])
|
||||
0:00:00 DEB - argument: nodemap_madvise=true (use linux madvise(random) for node locations)
|
||||
0:00:00 DEB - argument: multipolygon_geometry_storage=ram (storage for multipolygon geometries, one of [ram, mmap, direct])
|
||||
0:00:00 DEB - argument: multipolygon_geometry_madvise=true (use linux madvise(random) for temporary multipolygon geometry storage)
|
||||
0:00:00 DEB - argument: http_user_agent=Planetiler downloader (https://github.com/onthegomap/planetiler) (User-Agent header to set when downloading files over HTTP)
|
||||
0:00:00 DEB - argument: http_timeout=30 seconds (Timeout to use when downloading files over HTTP)
|
||||
0:00:00 DEB - argument: http_retries=1 (Retries to use when downloading files over HTTP)
|
||||
0:00:00 DEB - argument: download_chunk_size_mb=100 (Size of file chunks to download in parallel in megabytes)
|
||||
0:00:00 DEB - argument: download_threads=1 (Number of parallel threads to use when downloading each file)
|
||||
0:00:00 DEB - argument: download_max_bandwidth= (Maximum bandwidth to consume when downloading files in units mb/s, mbps, kbps, etc.)
|
||||
0:00:00 DEB - argument: min_feature_size_at_max_zoom=0.0625 (Default value for the minimum size in tile pixels of features to emit at the maximum zoom level to allow for overzooming)
|
||||
0:00:00 DEB - argument: min_feature_size=1.0 (Default value for the minimum size in tile pixels of features to emit below the maximum zoom level)
|
||||
0:00:00 DEB - argument: simplify_tolerance_at_max_zoom=0.0625 (Default value for the tile pixel tolerance to use when simplifying features at the maximum zoom level to allow for overzooming)
|
||||
0:00:00 DEB - argument: simplify_tolerance=0.1 (Default value for the tile pixel tolerance to use when simplifying features below the maximum zoom level)
|
||||
0:00:00 DEB - argument: osm_lazy_reads=false (Read OSM blocks from disk in worker threads)
|
||||
0:00:00 DEB - argument: skip_filled_tiles=false (Skip writing tiles containing only polygon fills to the output)
|
||||
0:00:00 DEB - argument: tile_warning_size_mb=1.0 (Maximum size in megabytes of a tile to emit a warning about)
|
||||
0:00:00 DEB - argument: color=null (Color the terminal output)
|
||||
0:00:00 DEB - argument: keep_unzipped=false (keep unzipped sources by default after reading)
|
||||
0:00:00 DEB - argument: tile_compression=gzip (the tile compression, one of [none, gzip])
|
||||
0:00:00 DEB - argument: output_layerstats=false (output a tsv.gz file for each tile/layer size)
|
||||
0:00:00 DEB - argument: debug_url=https://onthegomap.github.io/planetiler-demo/#{z}/{lat}/{lon} (debug url to use for displaying tiles with {z} {lat} {lon} placeholders)
|
||||
0:00:00 DEB - argument: tile_weights=data/tile_weights.tsv.gz (tsv.gz file with columns z,x,y,loads to generate weighted average tile size stat)
|
||||
0:00:00 DEB - argument: max_point_buffer=Infinity (Max tile pixels to include points outside tile bounds. Set to a lower value to reduce tile size for clients that handle label collisions across tiles (most web and native clients). NOTE: Do not reduce if you need to support raster tile rendering)
|
||||
0:00:00 DEB - argument: log_jts_exceptions=false (Emit verbose details to debug JTS geometry errors)
|
||||
0:00:00 DEB - argument: only_download=false (download source data then exit)
|
||||
0:00:00 DEB - argument: download=false (download sources)
|
||||
0:00:00 DEB - argument: download_osm_tile_weights=false (download OSM tile weights file)
|
||||
0:00:00 DEB - argument: temp_nodes=data/tmp/node.db (temp node db location)
|
||||
0:00:00 DEB - argument: temp_multipolygons=data/tmp/multipolygon.db (temp multipolygon db location)
|
||||
0:00:00 DEB - argument: temp_features=data/tmp/feature.db (temp feature db location)
|
||||
0:00:00 DEB - argument: osm_parse_node_bounds=false (parse bounds from OSM nodes instead of header)
|
||||
0:00:00 DEB - argument: only_fetch_wikidata=false (fetch wikidata translations then quit)
|
||||
0:00:00 DEB - argument: fetch_wikidata=false (fetch wikidata translations then continue)
|
||||
0:00:00 DEB - argument: use_wikidata=true (use wikidata translations)
|
||||
0:00:00 DEB - argument: wikidata_cache=data/sources/wikidata_names.json (wikidata cache file)
|
||||
0:00:00 DEB - argument: lake_centerlines_path=data/sources/lake_centerline.shp.zip (lake_centerlines shapefile path)
|
||||
0:00:00 DEB - argument: free_lake_centerlines_after_read=false (delete lake_centerlines input file after reading to make space for output (reduces peak disk usage))
|
||||
0:00:00 DEB - argument: water_polygons_path=data/sources/water-polygons-split-3857.zip (water_polygons shapefile path)
|
||||
0:00:00 DEB - argument: free_water_polygons_after_read=false (delete water_polygons input file after reading to make space for output (reduces peak disk usage))
|
||||
0:00:00 DEB - argument: natural_earth_path=data/sources/natural_earth_vector.sqlite.zip (natural_earth sqlite db path)
|
||||
0:00:00 DEB - argument: free_natural_earth_after_read=false (delete natural_earth input file after reading to make space for output (reduces peak disk usage))
|
||||
0:00:00 DEB - argument: natural_earth_keep_unzipped=false (keep unzipped natural_earth after reading)
|
||||
0:00:00 DEB - argument: osm_path=data/sources/planet.osm.pbf (osm OSM input file path)
|
||||
0:00:00 DEB - argument: free_osm_after_read=false (delete osm input file after reading to make space for output (reduces peak disk usage))
|
||||
0:00:00 DEB - argument: output=planet.pmtiles (output tile archive path)
|
||||
0:00:00 DEB - argument: version=false (show version then exit)
|
||||
0:00:00 INF - Planetiler build git hash: 328e1b4d536dd7da38a192e56f4014a18c23a63b
|
||||
0:00:00 INF - Planetiler build version: 0.7-SNAPSHOT
|
||||
0:00:00 INF - Planetiler build timestamp: 2024-01-21T12:08:38.997Z
|
||||
0:00:00 DEB - argument: transliterate=true (attempt to transliterate latin names)
|
||||
0:00:00 DEB - argument: languages=am,ar,az,be,bg,bn,br,bs,ca,co,cs,cy,da,de,el,en,eo,es,et,eu,fa,fi,fr,fy,ga,gd,he,hi,hr,hu,hy,id,is,it,ja,ja_kana,ja_rm,ja-Latn,ja-Hira,ka,kk,kn,ko,ko-Latn,ku,la,lb,lt,lv,mk,mt,ml,nl,no,oc,pa,pnb,pl,pt,rm,ro,ru,sk,sl,sq,sr,sr-Latn,sv,ta,te,th,tr,uk,ur,vi,zh,zh-Hant,zh-Hans (languages to use)
|
||||
0:00:00 DEB - argument: only_layers= (Include only certain layers)
|
||||
0:00:00 DEB - argument: exclude_layers= (Exclude certain layers)
|
||||
0:00:00 DEB - argument: boundary_country_names=true (boundary layer: add left/right codes of neighboring countries)
|
||||
0:00:00 DEB - argument: boundary_osm_only=false (boundary layer: only use OSM, even at low zoom levels)
|
||||
0:00:00 DEB - argument: transportation_z13_paths=false (transportation(_name) layer: show all paths on z13)
|
||||
0:00:00 DEB - argument: building_merge_z13=false (building layer: merge nearby buildings at z13)
|
||||
0:00:00 DEB - argument: transportation_name_brunnel=false (transportation_name layer: set to false to omit brunnel and help merge long highways)
|
||||
0:00:00 DEB - argument: transportation_name_size_for_shield=false (transportation_name layer: allow road names on shorter segments (ie. they will have a shield))
|
||||
0:00:00 DEB - argument: transportation_name_limit_merge=false (transportation_name layer: limit merge so we don't combine different relations to help merge long highways)
|
||||
0:00:00 DEB - argument: transportation_name_minor_refs=false (transportation_name layer: include name and refs from minor road networks if not present on a way)
|
||||
0:00:00 DEB - argument: help=false (show arguments then exit)
|
||||
0:00:00 DEB - argument: layer_stats=/data/planet.pmtiles.layerstats.tsv.gz (layer stats output path)
|
||||
0:00:00 INF - Building OpenMapTilesProfile profile into file:///data/planet.pmtiles in these phases:
|
||||
0:00:00 INF - lake_centerlines: Process features in data/sources/lake_centerline.shp.zip
|
||||
0:00:00 INF - water_polygons: Process features in data/sources/water-polygons-split-3857.zip
|
||||
0:00:00 INF - natural_earth: Process features in data/sources/natural_earth_vector.sqlite.zip
|
||||
0:00:00 INF - osm_pass1: Pre-process OpenStreetMap input (store node locations then relation members)
|
||||
0:00:00 INF - osm_pass2: Process OpenStreetMap nodes, ways, then relations
|
||||
0:00:00 INF - sort: Sort rendered features by tile ID
|
||||
0:00:00 INF - archive: Encode each tile and write to TileArchiveConfig[format=PMTILES, scheme=FILE, uri=file:///data/planet.pmtiles, options={}]
|
||||
0:00:00 INF - no wikidata translations found, run with --fetch-wikidata to download
|
||||
0:00:00 DEB - ✓ 260G storage on /data (tmpfs) requested for read phase disk, 457G available
|
||||
0:00:00 DEB - - 260G used for temporary feature storage
|
||||
0:00:00 DEB - ✓ 390G storage on /data (tmpfs) requested for write phase disk, 457G available
|
||||
0:00:00 DEB - - 260G used for temporary feature storage
|
||||
0:00:00 DEB - - 130G used for archive output
|
||||
0:00:00 DEB - ✓ 124G JVM heap requested for read phase, 214G available
|
||||
0:00:00 DEB - - 88G used for array node location cache (switch to sparsearray to reduce size)
|
||||
0:00:00 DEB - - 11G used for multipolygon way geometries
|
||||
0:00:00 DEB - - 23G used for temporary profile storage
|
||||
0:00:00 DEB - ✓ 0 temporary files and 545G of free memory for OS to cache them
|
||||
0:00:00 DEB - argument: archive_name=OpenMapTiles ('name' attribute for tileset metadata)
|
||||
0:00:00 DEB - argument: archive_description=A tileset showcasing all layers in OpenMapTiles. https://openmaptiles.org ('description' attribute for tileset metadata)
|
||||
0:00:00 DEB - argument: archive_attribution=<a href="https://www.openmaptiles.org/" target="_blank">© OpenMapTiles</a> <a href="https://www.openstreetmap.org/copyright" target="_blank">© OpenStreetMap contributors</a> ('attribution' attribute for tileset metadata)
|
||||
0:00:00 DEB - argument: archive_version=3.14.0 ('version' attribute for tileset metadata)
|
||||
0:00:00 DEB - argument: archive_type=baselayer ('type' attribute for tileset metadata)
|
||||
0:00:00 DEB - argument: archive_format=pbf ('format' attribute for tileset metadata)
|
||||
0:00:00 INF - Using merge sort feature map, chunk size=2000mb max workers=180
|
||||
0:00:00 INF [lake_centerlines] -
|
||||
0:00:00 INF [lake_centerlines] - Starting...
|
||||
0:00:02 INF [lake_centerlines] - read: [ 59k 100% 34k/s ] write: [ 0 0/s ] 0
|
||||
cpus: 2.1 gc: 1% heap: 334M/214G direct: 262k postGC: 193M
|
||||
-> (0/4) -> read( -%) -> (0/1.1k) -> process( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%) -> (0/230k) -> write( -% -% -% -% -% -%)
|
||||
0:00:02 INF [lake_centerlines] - Finished in 2s cpu:8s avg:3.3
|
||||
0:00:02 INF [lake_centerlines] - read 2x(18% 0.4s done:2s)
|
||||
0:00:02 INF [lake_centerlines] - process 174x(0% 0s wait:2s)
|
||||
0:00:02 INF [lake_centerlines] - write 6x(0% 0s wait:2s)
|
||||
0:00:02 INF [water_polygons] -
|
||||
0:00:02 INF [water_polygons] - Starting...
|
||||
0:00:12 INF [water_polygons] - read: [ 5.5k 38% 549/s ] write: [ 32M 3.2M/s ] 12G
|
||||
cpus: 92.3 gc: 7% heap: 9.8G/214G direct: 54M postGC: 4.1G
|
||||
-> (0/4) -> read(93%) -> (0/1.1k) -> process(47% 60% 45% 54% 36% 40% 51% 49% 44% 41% 63% 42% 40% 38% 31% 55% 60% 65% 62% 47% 47% 47% 42% 42% 60% 77% 45% 28% 48% 30% 28% 52% 54% 58% 66% 39% 41% 35% 43% 64% 44% 46% 41% 65% 58% 88% 56% 32% 73% 62% 32% 64% 46% 61% 54% 55% 42% 59% 43% 28% 56% 47% 36% 57% 49% 65% 53% 63% 25% 29% 42% 51% 71% 37% 35% 36% 41% 38% 76% 43% 41% 54% 47% 58% 40% 72% 69% 49% 43% 49% 86% 46% 54% 56% 67% 29% 52% 54% 51% 54% 52% 50% 43% 38% 58% 40% 45% 33% 49% 41% 36% 53% 60% 45% 35% 60% 45% 47% 26% 58% 58% 42% 48% 51% 27% 52% 46% 52% 43% 56% 29% 43% 57% 32% 51% 37% 40% 77% 36% 38% 56% 77% 59% 43% 68% 48% 33% 40% 49% 38% 35% 51% 33% 40% 45% 41% 51% 69% 69% 46% 41% 90% 53% 30% 52% 62% 31% 26% 40% 70% 30% 30% 46% 34%) -> (88k/230k) -> write(27% 27% 27% 27% 26% 26%)
|
||||
0:00:22 INF [water_polygons] - read: [ 9.8k 68% 429/s ] write: [ 113M 8M/s ] 12G
|
||||
cpus: 30.8 gc: 1% heap: 38G/214G direct: 54M postGC: 2.1G
|
||||
-> (0/4) -> read(13%) -> (1k/1.1k) -> process( 7% 33% 4% 7% 5% 7% 50% 59% 4% 51% 8% 11% 31% 6% 5% 16% 5% 53% 10% 21% 18% 4% 12% 11% 8% 18% 15% 15% 11% 7% 5% 12% 14% 17% 12% 5% 8% 15% 14% 30% 4% 5% 15% 15% 5% 33% 11% 7% 22% 14% 7% 16% 14% 4% 4% 10% 3% 13% 7% 22% 11% 14% 14% 3% 7% 35% 3% 18% 7% 4% 7% 15% 5% 6% 11% 10% 7% 19% 31% 16% 8% 9% 20% 5% 9% 6% 9% 9% 6% 15% 4% 19% 5% 7% 6% 4% 10% 10% 10% 4% 4% 8% 5% 9% 31% 25% 6% 12% 23% 4% 9% 9% 7% 20% 11% 7% 9% 10% 7% 39% 7% 41% 8% 20% 7% 6% 10% 8% 9% 6% 9% 12% 3% 5% 27% 6% 10% 5% 22% 5% 87% 4% 12% 18% 14% 13% 6% 52% 7% 3% 5% 29% 26% 13% 11% 62% 7% 11% 21% 49% 6% 23% 21% 6% 5% 16% 10% 4% 11% 7% 9% 38% 6% 18%) -> (224k/230k) -> write(90% 90% 90% 90% 90% 90%)
|
||||
0:00:33 INF [water_polygons] - read: [ 13k 93% 365/s ] write: [ 197M 8.3M/s ] 17G
|
||||
cpus: 9.6 gc: 0% heap: 52G/214G direct: 54M postGC: 2G
|
||||
-> (0/4) -> read( 0%) -> (1k/1.1k) -> process( 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 12% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 3% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 3% 2% 2% 2%) -> (225k/230k) -> write(100% 100% 100% 100% 100% 100%)
|
||||
0:00:36 INF [water_polygons] - read: [ 14k 100% 319/s ] write: [ 222M 7.9M/s ] 10G
|
||||
cpus: 9.2 gc: 0% heap: 36G/214G direct: 54M postGC: 2G
|
||||
-> (0/4) -> read( -%) -> (0/1.1k) -> process( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%) -> (0/230k) -> write( -% -% -% -% -% -%)
|
||||
0:00:36 INF [water_polygons] - Finished in 33s cpu:22m40s avg:40.8
|
||||
0:00:36 INF [water_polygons] - read 2x(16% 5s wait:9s done:18s)
|
||||
0:00:36 INF [water_polygons] - process 174x(20% 7s wait:26s)
|
||||
0:00:36 INF [water_polygons] - write 6x(74% 25s wait:8s)
|
||||
0:00:36 INF [natural_earth] -
|
||||
0:00:36 INF [natural_earth] - Starting...
|
||||
0:00:36 INF [natural_earth] - unzipping /data/data/sources/natural_earth_vector.sqlite.zip to data/tmp/%2Fnatural_earth_vector.sqlite%2Fpackages%2Fnatural_earth_vector.sqlite
|
||||
0:00:39 INF [natural_earth] - unzipping /data/data/sources/natural_earth_vector.sqlite.zip to data/tmp/%2Fnatural_earth_vector.sqlite%2Fpackages%2Fnatural_earth_vector.sqlite
|
||||
0:00:49 INF [natural_earth] - read: [ 288k 83% 28k/s ] write: [ 0 0/s ] 22G
|
||||
cpus: 1.9 gc: 0% heap: 43G/214G direct: 54M postGC: 2G
|
||||
-> (0/4) -> read(63%) -> (1/1.1k) -> process( 0% 0% 1% 1% 0% 1% 0% 0% 1% 1% 1% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 1% 0% 1% 0% 1% 0% 1% 0% 0% 0% 0% 1% 0% 0% 1% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 1% 0% 1% 0% 0% 0% 0% 0% 0% 1% 0% 0% 1% 9% 0% 0% 1% 0% 0% 0% 0% 1% 0% 1% 0% 1% 0% 1% 0% 0% 0% 0% 0% 0% 1% 0% 0% 0% 1% 0% 1% 0% 0% 0% 0% 0% 0% 1% 1% 0% 1% 0% 1% 0% 1% 0% 0% 0% 0% 0% 1% 1% 0% 0% 0% 0% 0% 0% 1% 0% 0% 1% 0% 0% 1% 0% 0% 0% 0% 0% 0% 1% 1% 0% 0% 0% 1% 0% 0% 1% 1% 0% 0% 0% 0% 0% 0% 0% 0% 0% 1% 1% 0% 0% 0% 1% 0% 0% 0% 0% 0% 0% 0% 0% 1% 0% 1% 1% 0% 0% 0% 1% 0% 0% 1% 0%) -> (27k/230k) -> write( 0% 0% 0% 0% 0% 0%)
|
||||
0:00:51 INF [natural_earth] - read: [ 349k 100% 38k/s ] write: [ 33k 21k/s ] 10G
|
||||
cpus: 1.5 gc: 0% heap: 44G/214G direct: 54M postGC: 2G
|
||||
-> (0/4) -> read( -%) -> (0/1.1k) -> process( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%) -> (0/230k) -> write( -% -% -% -% -% -%)
|
||||
0:00:51 INF [natural_earth] - Finished in 15s cpu:25s avg:1.7
|
||||
0:00:51 INF [natural_earth] - read 2x(24% 4s wait:2s done:9s)
|
||||
0:00:51 INF [natural_earth] - process 174x(0% 0.1s wait:12s done:3s)
|
||||
0:00:51 INF [natural_earth] - write 6x(0% 0s wait:12s done:3s)
|
||||
0:00:51 INF [osm_pass1] -
|
||||
0:00:51 INF [osm_pass1] - Starting...
|
||||
0:01:01 INF [osm_pass1] - nodes: [ 2.3B 233M/s ] 25G ways: [ 0 0/s ] rels: [ 0 0/s ] blocks: [ 9.2k 924/s ]
|
||||
cpus: 101.1 gc: 9% heap: 47G/214G direct: 57M postGC: 28G hppc: 1k
|
||||
read(79%) -> (68/538) -> process(49% 49% 50% 51% 52% 46% 51% 56% 52% 49% 54% 54% 50% 53% 50% 51% 49% 55% 54% 54% 52% 51% 53% 53% 53% 54% 51% 53% 53% 52% 52% 51% 52% 53% 51% 50% 52% 48% 51% 53% 52% 51% 51% 50% 52% 52% 51% 53% 48% 51% 52% 52% 53% 57% 53% 52% 49% 50% 52% 51% 49% 51% 47% 53% 53% 51% 53% 56% 52% 49% 53% 52% 48% 48% 52% 49% 50% 51% 49% 51% 53% 49% 51% 52% 51% 52% 52% 53% 52% 49% 53% 53% 52% 51% 48% 50% 51% 49% 51% 49% 49% 49% 53% 52% 53% 50% 52% 52% 52% 50% 52% 50% 48% 49% 55% 47% 51% 52% 51% 50% 48% 51% 52% 52% 49% 48% 52% 50% 49% 52% 53% 52% 50% 50% 51% 54% 52% 53% 52% 48% 50% 50% 52% 53% 55% 51% 50% 47% 50% 53% 47% 50% 51% 53% 50% 51% 51% 51% 51% 50% 48% 51% 52% 53% 47% 48% 50% 49% 48% 48% 52% 53% 47% 50% 54% 47% 50% 50% 50%)
|
||||
0:01:11 INF [osm_pass1] - nodes: [ 5.6B 332M/s ] 59G ways: [ 0 0/s ] rels: [ 0 0/s ] blocks: [ 18k 965/s ]
|
||||
cpus: 103.3 gc: 12% heap: 107G/214G direct: 57M postGC: 62G hppc: 1k
|
||||
read(87%) -> (0/538) -> process(48% 50% 50% 47% 48% 49% 49% 52% 49% 49% 52% 49% 50% 50% 49% 50% 53% 52% 51% 50% 52% 49% 51% 53% 47% 49% 52% 50% 48% 48% 51% 51% 49% 52% 47% 51% 50% 50% 50% 48% 51% 49% 51% 54% 47% 51% 46% 48% 50% 49% 46% 49% 51% 50% 51% 52% 49% 52% 46% 50% 47% 48% 49% 49% 50% 53% 50% 49% 47% 55% 49% 49% 50% 51% 50% 50% 46% 52% 53% 47% 50% 51% 52% 50% 54% 49% 52% 50% 51% 50% 47% 50% 50% 52% 52% 48% 50% 50% 53% 48% 48% 47% 50% 51% 48% 46% 54% 52% 51% 49% 49% 49% 50% 49% 51% 51% 52% 49% 49% 48% 53% 49% 50% 49% 50% 51% 49% 51% 47% 52% 49% 52% 51% 53% 51% 51% 50% 54% 51% 47% 47% 50% 52% 50% 52% 52% 49% 50% 52% 50% 47% 48% 51% 53% 48% 52% 52% 51% 52% 54% 46% 49% 53% 49% 54% 48% 54% 48% 46% 48% 53% 49% 47% 54% 51% 51% 50% 49% 48%)
|
||||
0:01:21 INF [osm_pass1:process] - Finished nodes: 8,876,780,887 (299M/s) in 30s cpu:51m38s gc:3s avg:104.6
|
||||
0:01:21 INF [osm_pass1] - nodes: [ 8.8B 319M/s ] 92G ways: [ 114k 11k/s ] rels: [ 0 0/s ] blocks: [ 27k 900/s ]
|
||||
cpus: 111.4 gc: 12% heap: 143G/214G direct: 57M postGC: 95G hppc: 1k
|
||||
read(85%) -> (359/538) -> process(51% 50% 54% 48% 54% 55% 51% 53% 51% 53% 50% 51% 51% 50% 51% 57% 52% 54% 53% 54% 51% 50% 50% 52% 50% 54% 51% 56% 49% 57% 54% 54% 53% 47% 49% 53% 53% 55% 51% 53% 52% 54% 51% 52% 47% 52% 47% 51% 55% 48% 49% 49% 56% 53% 54% 53% 49% 51% 53% 49% 51% 50% 54% 51% 54% 54% 53% 49% 47% 49% 49% 49% 54% 54% 49% 50% 53% 51% 56% 52% 50% 52% 51% 48% 54% 51% 54% 39% 49% 50% 50% 51% 49% 56% 54% 51% 54% 33% 53% 54% 51% 37% 41% 52% 52% 50% 53% 53% 50% 53% 52% 48% 50% 53% 54% 46% 55% 54% 55% 53% 50% 53% 49% 48% 51% 48% 54% 53% 51% 51% 55% 51% 53% 52% 51% 48% 51% 50% 50% 50% 52% 53% 51% 49% 49% 52% 50% 48% 50% 53% 50% 48% 52% 53% 50% 51% 50% 53% 51% 49% 51% 52% 52% 55% 54% 51% 52% 50% 51% 49% 57% 49% 52% 56% 53% 54% 54% 52% 45%)
|
||||
0:01:31 INF [osm_pass1] - nodes: [ 8.8B 0/s ] 92G ways: [ 687M 68M/s ] rels: [ 0 0/s ] blocks: [ 38k 1k/s ]
|
||||
cpus: 140 gc: 5% heap: 102G/214G direct: 58M postGC: 97G hppc: 1k
|
||||
read(88%) -> (1/538) -> process(67% 66% 71% 72% 69% 71% 71% 68% 73% 69% 68% 71% 69% 69% 69% 71% 72% 68% 72% 68% 73% 69% 72% 70% 71% 71% 71% 70% 70% 68% 68% 71% 71% 70% 70% 67% 73% 71% 74% 68% 67% 70% 69% 68% 71% 70% 69% 70% 70% 73% 71% 71% 68% 72% 71% 70% 68% 67% 72% 71% 72% 72% 72% 69% 70% 74% 69% 68% 72% 69% 65% 69% 69% 69% 69% 71% 69% 72% 68% 73% 68% 72% 72% 71% 68% 71% 68% 69% 68% 70% 70% 68% 73% 66% 69% 68% 71% 73% 71% 70% 68% 71% 70% 71% 69% 73% 69% 67% 71% 75% 70% 73% 72% 68% 72% 73% 70% 69% 72% 70% 71% 69% 72% 69% 66% 72% 71% 70% 69% 70% 69% 71% 67% 66% 68% 67% 72% 74% 71% 68% 73% 70% 71% 71% 71% 70% 70% 73% 73% 68% 68% 72% 69% 67% 67% 75% 71% 71% 70% 68% 68% 72% 69% 71% 69% 71% 72% 69% 69% 70% 74% 71% 67% 70% 68% 69% 69% 68% 69%)
|
||||
0:01:35 INF [osm_pass1:process] - Finished ways: 993,607,585 (69M/s) in 14s cpu:33m21s avg:139.6
|
||||
0:01:41 INF [osm_pass1] - nodes: [ 8.8B 0/s ] 92G ways: [ 993M 30M/s ] rels: [ 4.4M 439k/s ] blocks: [ 42k 436/s ]
|
||||
cpus: 69 gc: 6% heap: 102G/214G direct: 54M postGC: 100G hppc: 322M
|
||||
read( -%) -> (130/538) -> process(31% 33% 32% 33% 32% 33% 33% 34% 30% 32% 32% 32% 32% 34% 32% 35% 33% 32% 32% 31% 31% 35% 32% 34% 33% 34% 32% 33% 33% 32% 35% 33% 34% 34% 31% 34% 33% 33% 32% 37% 34% 33% 33% 35% 33% 35% 35% 32% 30% 32% 35% 33% 34% 33% 34% 33% 35% 31% 32% 30% 33% 32% 30% 34% 34% 34% 33% 34% 35% 33% 32% 32% 32% 35% 33% 32% 33% 32% 35% 33% 31% 31% 29% 33% 33% 35% 32% 32% 33% 32% 33% 33% 36% 33% 31% 33% 33% 30% 33% 32% 31% 30% 33% 32% 34% 33% 34% 33% 32% 32% 32% 37% 33% 35% 32% 32% 33% 34% 32% 34% 32% 32% 31% 33% 30% 32% 34% 31% 31% 34% 33% 32% 34% 33% 35% 35% 33% 32% 32% 36% 33% 37% 33% 35% 34% 30% 30% 34% 35% 34% 33% 34% 32% 33% 33% 33% 31% 33% 34% 33% 30% 35% 30% 32% 32% 34% 33% 32% 31% 34% 34% 31% 32% 34% 31% 35% 35% 33% 31%)
|
||||
0:01:49 INF [osm_pass1:process] - Finished relations: 11,749,466 (834k/s) in 14s cpu:4m35s avg:19.5
|
||||
0:01:49 INF [osm_pass1] - nodes: [ 8.8B 0/s ] 92G ways: [ 993M 0/s ] rels: [ 11M 920k/s ] blocks: [ 43k 38/s ]
|
||||
cpus: 16.1 gc: 5% heap: 106G/214G direct: 54M postGC: 100G hppc: 708M
|
||||
read( -%) -> (0/538) -> process( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%)
|
||||
0:01:49 DEB [osm_pass1] - Processed 43,182 blocks:
|
||||
0:01:49 DEB [osm_pass1] - nodes: 8,876,780,887 (299M/s) in 30s cpu:51m38s gc:3s avg:104.6
|
||||
0:01:49 DEB [osm_pass1] - ways: 993,607,585 (69M/s) in 14s cpu:33m21s avg:139.6
|
||||
0:01:49 DEB [osm_pass1] - relations: 11,749,466 (834k/s) in 14s cpu:4m35s avg:19.5
|
||||
0:01:49 INF [osm_pass1] - Finished in 58s cpu:1h29m56s gc:5s avg:92.8
|
||||
0:01:49 INF [osm_pass1] - read 1x(65% 38s wait:2s done:14s)
|
||||
0:01:49 INF [osm_pass1] - process 179x(44% 26s block:16s wait:12s done:1s)
|
||||
0:01:49 INF [osm_pass2] -
|
||||
0:01:49 INF [osm_pass2] - Starting...
|
||||
0:02:00 INF [osm_pass2] - nodes: [ 793M 9% 78M/s ] 92G ways: [ 0 0% 0/s ] rels: [ 0 0% 0/s ] features: [ 281M 5.7M/s ] 22G blocks: [ 3.6k 8% 352/s ]
|
||||
cpus: 96.4 gc: 12% heap: 134G/214G direct: 57M postGC: 101G relInfo: 708M mpGeoms: 297
|
||||
read(38%) -> (88/262) -> process(47% 49% 50% 49% 45% 53% 56% 52% 43% 49% 51% 42% 47% 50% 42% 45% 45% 45% 54% 53% 45% 43% 51% 51% 43% 45% 44% 44% 63% 45% 47% 46% 46% 48% 44% 47% 48% 48% 52% 50% 48% 47% 49% 49% 61% 51% 47% 50% 50% 52% 49% 44% 50% 48% 49% 51% 45% 49% 46% 49% 51% 48% 47% 45% 49% 48% 44% 45% 42% 47% 41% 48% 48% 45% 46% 41% 50% 46% 45% 47% 41% 44% 43% 46% 37% 47% 49% 44% 40% 52% 50% 46% 50% 45% 45% 47% 48% 47% 45% 49% 46% 45% 46% 47% 46% 46% 49% 45% 47% 41% 52% 48% 45% 46% 38% 39% 41% 41% 47% 39% 43% 46% 49% 47% 42% 50% 44% 47% 51% 43% 48% 51% 54% 46% 46% 46% 44% 48% 44% 38% 44% 42% 48% 45% 48% 41% 44% 52% 44% 51% 44% 49% 47% 49% 43% 49% 46% 58% 41% 39% 46% 43% 47% 40% 43% 46% 46% 45% 42% 44% 47% 45% 45% 51%) -> (97k/230k) -> write(43% 43% 43% 43% 42% 43%)
|
||||
0:02:11 INF [osm_pass2] - nodes: [ 2.2B 26% 138M/s ] 92G ways: [ 0 0% 0/s ] rels: [ 0 0% 0/s ] features: [ 350M 6.4M/s ] 30G blocks: [ 9.3k 22% 519/s ]
|
||||
cpus: 111.5 gc: 11% heap: 118G/214G direct: 57M postGC: 100G relInfo: 708M mpGeoms: 297
|
||||
read(64%) -> (47/262) -> process(56% 56% 58% 50% 58% 55% 46% 57% 60% 54% 51% 48% 55% 56% 61% 44% 55% 50% 51% 49% 61% 61% 56% 61% 58% 47% 51% 51% 64% 53% 49% 62% 51% 50% 56% 56% 54% 55% 59% 52% 60% 51% 41% 56% 60% 62% 55% 50% 55% 51% 51% 58% 53% 61% 54% 48% 61% 52% 54% 51% 55% 59% 48% 55% 51% 50% 57% 56% 59% 49% 57% 46% 50% 57% 58% 63% 51% 50% 52% 54% 55% 58% 51% 48% 52% 59% 65% 55% 57% 52% 54% 54% 59% 53% 52% 57% 56% 58% 54% 58% 49% 51% 59% 41% 48% 59% 52% 53% 55% 52% 50% 49% 58% 57% 54% 46% 59% 59% 55% 55% 60% 61% 54% 56% 49% 57% 61% 53% 56% 57% 46% 48% 56% 53% 49% 32% 63% 61% 58% 58% 58% 56% 58% 57% 59% 55% 53% 59% 59% 56% 51% 55% 57% 55% 50% 49% 61% 57% 56% 50% 55% 56% 50% 48% 56% 56% 59% 52% 49% 51% 52% 50% 57% 52%) -> (93k/230k) -> write(70% 71% 71% 70% 70% 70%)
|
||||
0:02:21 INF [osm_pass2] - nodes: [ 4.2B 47% 168M/s ] 92G ways: [ 0 0% 0/s ] rels: [ 0 0% 0/s ] features: [ 413M 5.5M/s ] 38G blocks: [ 14k 34% 494/s ]
|
||||
cpus: 118.9 gc: 4% heap: 106G/214G direct: 57M postGC: 100G relInfo: 708M mpGeoms: 297
|
||||
read(77%) -> (78/262) -> process(59% 59% 66% 59% 57% 66% 66% 59% 43% 55% 58% 67% 68% 55% 54% 53% 49% 60% 62% 60% 62% 59% 58% 53% 61% 66% 60% 60% 57% 60% 58% 57% 65% 49% 59% 58% 63% 64% 62% 63% 58% 75% 74% 58% 49% 55% 67% 63% 61% 60% 65% 59% 54% 63% 56% 59% 54% 60% 63% 59% 54% 57% 64% 31% 53% 59% 63% 57% 57% 62% 56% 66% 62% 60% 58% 63% 62% 69% 63% 62% 53% 52% 65% 58% 53% 62% 46% 59% 55% 62% 68% 55% 60% 64% 64% 58% 58% 59% 63% 59% 68% 61% 57% 57% 55% 57% 56% 67% 65% 57% 47% 65% 67% 65% 58% 64% 60% 55% 64% 61% 53% 54% 60% 58% 74% 60% 63% 51% 59% 60% 72% 57% 59% 62% 63% 67% 50% 61% 59% 58% 60% 58% 64% 61% 54% 63% 57% 58% 62% 54% 59% 56% 72% 58% 57% 66% 53% 64% 58% 60% 53% 62% 69% 65% 55% 64% 58% 61% 64% 60% 57% 70% 60% 57%) -> (154k/230k) -> write(64% 66% 64% 63% 63% 65%)
|
||||
0:02:33 INF [osm_pass2] - nodes: [ 6B 68% 175M/s ] 92G ways: [ 0 0% 0/s ] rels: [ 0 0% 0/s ] features: [ 466M 5M/s ] 46G blocks: [ 20k 47% 503/s ]
|
||||
cpus: 136.7 gc: 3% heap: 111G/214G direct: 57M postGC: 99G relInfo: 708M mpGeoms: 297
|
||||
read(87%) -> (0/262) -> process(67% 72% 63% 73% 71% 71% 62% 76% 66% 73% 72% 75% 64% 76% 61% 79% 73% 70% 74% 65% 65% 77% 74% 74% 70% 67% 66% 72% 65% 65% 66% 71% 68% 81% 67% 80% 72% 71% 71% 71% 64% 63% 72% 68% 65% 77% 73% 74% 70% 76% 74% 68% 72% 62% 77% 69% 68% 70% 70% 68% 64% 64% 66% 75% 69% 75% 66% 69% 69% 66% 75% 69% 69% 74% 75% 74% 76% 65% 81% 74% 72% 63% 67% 72% 77% 66% 63% 69% 74% 73% 66% 70% 69% 71% 70% 74% 64% 66% 63% 75% 63% 76% 66% 70% 72% 66% 61% 72% 74% 78% 65% 72% 78% 74% 80% 74% 66% 68% 79% 75% 70% 72% 71% 68% 74% 75% 66% 69% 76% 72% 75% 67% 71% 70% 71% 70% 64% 66% 75% 68% 77% 68% 65% 68% 70% 77% 56% 64% 69% 69% 68% 66% 60% 65% 69% 79% 65% 72% 81% 68% 74% 70% 72% 74% 59% 74% 65% 70% 73% 55% 61% 72% 68% 79%) -> (96k/230k) -> write(68% 68% 68% 68% 68% 69%)
|
||||
0:02:43 INF [osm_pass2] - nodes: [ 8B 90% 179M/s ] 92G ways: [ 0 0% 0/s ] rels: [ 0 0% 0/s ] features: [ 525M 5.3M/s ] 46G blocks: [ 25k 59% 493/s ]
|
||||
cpus: 148.4 gc: 3% heap: 177G/214G direct: 57M postGC: 99G relInfo: 708M mpGeoms: 297
|
||||
read(88%) -> (88/262) -> process(75% 81% 70% 64% 79% 81% 75% 72% 69% 67% 65% 71% 75% 74% 75% 77% 75% 81% 78% 67% 72% 83% 77% 79% 70% 72% 79% 73% 71% 63% 73% 67% 75% 80% 71% 55% 77% 72% 68% 74% 70% 72% 78% 69% 83% 75% 76% 76% 79% 80% 81% 80% 82% 77% 82% 82% 76% 74% 75% 75% 71% 75% 74% 72% 80% 79% 79% 80% 74% 79% 86% 79% 70% 65% 74% 84% 80% 78% 72% 73% 76% 76% 77% 72% 74% 81% 81% 78% 77% 79% 74% 69% 75% 73% 76% 78% 67% 77% 74% 78% 76% 77% 78% 83% 71% 75% 70% 78% 79% 78% 73% 78% 83% 65% 67% 72% 68% 83% 72% 72% 67% 74% 78% 80% 80% 73% 77% 74% 72% 80% 82% 72% 81% 78% 81% 80% 73% 76% 74% 76% 76% 76% 77% 77% 76% 79% 79% 71% 63% 70% 79% 76% 69% 84% 79% 74% 70% 77% 75% 76% 70% 77% 74% 80% 81% 76% 77% 74% 76% 80% 78% 77% 72% 75%) -> (91k/230k) -> write(78% 78% 78% 78% 79% 79%)
|
||||
0:02:48 DEB [osm_pass2:process] - Sorting long long multimap...
|
||||
0:02:48 INF [osm_pass2:process] - Finished nodes: 8,876,780,887 (149M/s) in 59s cpu:2h1m37s gc:4s avg:123.1
|
||||
0:02:53 INF [osm_pass2] - nodes: [ 8.8B 100% 81M/s ] 92G ways: [ 0 0% 0/s ] rels: [ 0 0% 0/s ] features: [ 555M 2.7M/s ] 54G blocks: [ 27k 65% 239/s ]
|
||||
cpus: 78.9 gc: 2% heap: 101G/214G direct: 57M postGC: 101G relInfo: 708M mpGeoms: 1M
|
||||
read(39%) -> (88/262) -> process(32% 38% 37% 36% 36% 29% 34% 35% 35% 35% 37% 33% 32% 32% 36% 38% 35% 34% 32% 30% 29% 31% 35% 32% 28% 39% 36% 31% 36% 36% 35% 34% 36% 32% 24% 37% 40% 38% 38% 31% 38% 32% 38% 35% 36% 31% 32% 35% 32% 33% 32% 31% 32% 37% 34% 37% 30% 36% 37% 33% 35% 33% 38% 30% 33% 30% 34% 30% 31% 36% 34% 37% 40% 35% 32% 30% 36% 27% 37% 30% 39% 38% 33% 30% 31% 38% 37% 36% 36% 32% 34% 28% 31% 37% 31% 30% 35% 41% 34% 39% 35% 35% 34% 33% 38% 35% 35% 30% 37% 33% 39% 33% 35% 41% 32% 29% 35% 35% 37% 32% 34% 33% 35% 32% 38% 34% 31% 36% 39% 35% 26% 36% 33% 28% 29% 36% 35% 38% 28% 36% 42% 36% 31% 33% 28% 24% 40% 31% 33% 32% 34% 39% 37% 30% 81% 35% 37% 32% 37% 32% 23% 33% 25% 34% 36% 34% 29% 34% 37% 29% 36% 37% 36% 34%) -> (84k/230k) -> write(37% 37% 35% 37% 35% 37%)
|
||||
0:02:54 DEB [osm_pass2:process] - Sorted long long multimap 6s cpu:1m59s avg:18.6
|
||||
0:03:03 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 10M 1% 1M/s ] rels: [ 0 0% 0/s ] features: [ 622M 6.5M/s ] 62G blocks: [ 28k 65% 17/s ]
|
||||
cpus: 86.4 gc: 2% heap: 124G/214G direct: 57M postGC: 101G relInfo: 573M mpGeoms: 120M
|
||||
read( 1%) -> (88/262) -> process(46% 46% 44% 44% 46% 46% 32% 48% 47% 47% 45% 36% 45% 45% 47% 38% 37% 45% 46% 43% 39% 45% 41% 45% 45% 44% 45% 47% 41% 48% 47% 42% 45% 42% 43% 46% 46% 41% 36% 47% 44% 33% 39% 49% 47% 43% 43% 44% 44% 44% 37% 45% 42% 47% 42% 44% 44% 48% 45% 48% 45% 46% 40% 45% 40% 48% 46% 45% 48% 46% 43% 49% 46% 45% 46% 42% 43% 42% 43% 44% 44% 42% 41% 38% 45% 46% 41% 41% 44% 47% 44% 47% 42% 43% 43% 43% 43% 46% 46% 47% 45% 44% 42% 49% 47% 43% 45% 46% 42% 48% 41% 43% 42% 49% 46% 47% 38% 45% 48% 48% 44% 47% 40% 46% 45% 44% 47% 37% 43% 44% 45% 45% 47% 48% 35% 43% 47% 47% 48% 45% 47% 43% 47% 47% 47% 40% 43% 48% 44% 46% 47% 42% 42% 46% 55% 47% 46% 44% 42% 43% 44% 47% 46% 45% 38% 36% 42% 35% 46% 43% 41% 46% 44% 47%) -> (193k/230k) -> write(56% 58% 57% 57% 57% 57%)
|
||||
0:03:13 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 28M 3% 1.7M/s ] rels: [ 0 0% 0/s ] features: [ 710M 8.7M/s ] 69G blocks: [ 28k 66% 38/s ]
|
||||
cpus: 118.6 gc: 5% heap: 120G/214G direct: 58M postGC: 102G relInfo: 573M mpGeoms: 530M
|
||||
read( 4%) -> (88/262) -> process(57% 61% 58% 54% 59% 57% 58% 59% 60% 63% 50% 59% 54% 55% 60% 58% 60% 56% 58% 55% 69% 56% 57% 59% 65% 66% 55% 62% 53% 58% 59% 57% 60% 65% 60% 55% 58% 56% 54% 56% 58% 64% 51% 56% 59% 56% 58% 59% 56% 58% 60% 60% 68% 53% 58% 57% 54% 56% 60% 58% 58% 53% 59% 58% 62% 63% 58% 57% 59% 60% 55% 53% 61% 59% 60% 67% 58% 61% 62% 65% 59% 58% 63% 61% 56% 60% 59% 63% 55% 59% 56% 59% 60% 54% 58% 57% 63% 64% 55% 59% 59% 61% 66% 64% 56% 57% 61% 58% 52% 58% 55% 64% 56% 62% 56% 57% 62% 66% 57% 61% 59% 60% 64% 64% 58% 60% 61% 57% 58% 61% 64% 64% 57% 56% 61% 61% 60% 63% 55% 61% 57% 58% 59% 62% 58% 56% 57% 54% 58% 54% 52% 56% 61% 52% 57% 58% 56% 57% 58% 59% 59% 60% 61% 62% 66% 67% 61% 57% 61% 53% 56% 59% 58% 61%) -> (151k/230k) -> write(90% 90% 90% 91% 91% 90%)
|
||||
0:03:24 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 52M 5% 2.3M/s ] rels: [ 0 0% 0/s ] features: [ 774M 6.3M/s ] 71G blocks: [ 29k 67% 44/s ]
|
||||
cpus: 160.3 gc: 7% heap: 102G/214G direct: 58M postGC: 139G relInfo: 573M mpGeoms: 899M
|
||||
read( 8%) -> (88/262) -> process(80% 76% 80% 79% 81% 83% 83% 80% 79% 84% 82% 79% 81% 81% 78% 85% 83% 79% 85% 80% 76% 78% 80% 79% 80% 77% 82% 84% 80% 84% 81% 79% 83% 88% 76% 80% 80% 84% 85% 81% 77% 85% 83% 79% 79% 85% 85% 78% 78% 83% 89% 83% 82% 81% 83% 84% 83% 82% 81% 83% 77% 82% 80% 83% 82% 80% 79% 84% 80% 84% 79% 79% 85% 84% 82% 84% 83% 85% 88% 78% 83% 83% 87% 81% 81% 82% 78% 85% 86% 82% 81% 82% 80% 83% 83% 82% 82% 87% 79% 80% 80% 82% 87% 88% 84% 83% 86% 82% 79% 82% 81% 83% 83% 81% 84% 79% 80% 88% 83% 80% 86% 81% 77% 89% 83% 80% 81% 83% 82% 78% 80% 81% 81% 82% 80% 80% 80% 81% 83% 79% 83% 79% 78% 79% 82% 84% 82% 83% 81% 78% 81% 84% 83% 83% 80% 78% 80% 86% 80% 84% 79% 83% 81% 85% 82% 81% 84% 77% 83% 85% 78% 83% 83% 80%) -> (82k/230k) -> write(78% 78% 79% 77% 78% 79%)
|
||||
0:03:34 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 75M 8% 2.2M/s ] rels: [ 0 0% 0/s ] features: [ 836M 6M/s ] 77G blocks: [ 29k 68% 40/s ]
|
||||
cpus: 160.4 gc: 5% heap: 196G/214G direct: 58M postGC: 136G relInfo: 573M mpGeoms: 1.2G
|
||||
read( 7%) -> (88/262) -> process(84% 86% 86% 86% 85% 86% 84% 86% 85% 86% 83% 83% 81% 81% 86% 83% 83% 82% 74% 84% 83% 83% 86% 88% 85% 80% 79% 81% 82% 82% 84% 84% 83% 84% 87% 85% 87% 84% 84% 83% 86% 85% 83% 86% 84% 83% 84% 84% 87% 83% 81% 81% 84% 83% 81% 83% 86% 86% 74% 81% 83% 84% 84% 83% 85% 82% 86% 83% 83% 86% 82% 86% 87% 85% 84% 86% 84% 86% 80% 83% 86% 86% 79% 83% 84% 84% 85% 83% 85% 79% 82% 79% 81% 81% 82% 86% 85% 82% 83% 83% 84% 83% 81% 78% 85% 80% 84% 83% 78% 85% 82% 82% 81% 86% 84% 87% 82% 81% 84% 86% 79% 79% 79% 81% 85% 84% 84% 82% 76% 85% 83% 79% 84% 83% 87% 86% 83% 84% 87% 82% 80% 83% 84% 79% 83% 79% 82% 86% 81% 86% 80% 83% 84% 85% 84% 81% 86% 84% 86% 86% 78% 83% 81% 84% 85% 86% 85% 81% 86% 83% 86% 78% 76% 81%) -> (127k/230k) -> write(72% 75% 73% 73% 73% 74%)
|
||||
0:03:44 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 103M 10% 2.6M/s ] rels: [ 0 0% 0/s ] features: [ 909M 7.1M/s ] 84G blocks: [ 29k 69% 47/s ]
|
||||
cpus: 158.3 gc: 6% heap: 195G/214G direct: 58M postGC: 102G relInfo: 573M mpGeoms: 1.6G
|
||||
read( 7%) -> (88/262) -> process(85% 83% 83% 83% 83% 82% 85% 83% 86% 80% 84% 84% 83% 86% 85% 83% 81% 80% 85% 84% 81% 86% 83% 84% 81% 83% 83% 84% 84% 84% 82% 84% 81% 83% 81% 84% 82% 84% 83% 81% 82% 82% 81% 83% 82% 84% 84% 83% 83% 80% 84% 84% 82% 83% 81% 84% 83% 82% 85% 85% 82% 83% 82% 83% 80% 82% 85% 82% 86% 81% 81% 80% 85% 84% 84% 85% 81% 83% 84% 83% 84% 80% 84% 85% 80% 82% 84% 85% 82% 82% 84% 82% 81% 82% 83% 83% 82% 83% 83% 84% 86% 81% 83% 82% 83% 84% 79% 82% 82% 83% 81% 85% 82% 82% 85% 83% 82% 81% 83% 81% 83% 81% 83% 79% 81% 84% 83% 81% 86% 80% 79% 83% 82% 82% 83% 84% 81% 83% 82% 82% 84% 76% 85% 81% 82% 85% 83% 84% 82% 83% 82% 82% 80% 82% 82% 83% 81% 83% 83% 81% 85% 81% 83% 84% 82% 84% 83% 80% 85% 82% 82% 83% 84% 78%) -> (118k/230k) -> write(87% 86% 86% 87% 86% 86%)
|
||||
0:03:54 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 131M 13% 2.7M/s ] rels: [ 0 0% 0/s ] features: [ 985M 7.4M/s ] 91G blocks: [ 30k 70% 43/s ]
|
||||
cpus: 154.1 gc: 6% heap: 171G/214G direct: 58M postGC: 102G relInfo: 573M mpGeoms: 1.9G
|
||||
read( 7%) -> (88/262) -> process(82% 82% 83% 81% 79% 82% 83% 85% 79% 77% 79% 78% 81% 82% 82% 81% 81% 79% 80% 82% 79% 82% 83% 82% 79% 81% 80% 83% 82% 81% 80% 74% 80% 80% 80% 79% 82% 79% 80% 81% 81% 82% 81% 82% 78% 80% 81% 80% 81% 80% 81% 80% 78% 81% 82% 81% 81% 81% 80% 79% 79% 81% 79% 81% 79% 82% 80% 82% 82% 80% 81% 81% 81% 78% 80% 83% 82% 81% 78% 81% 80% 81% 79% 78% 80% 81% 80% 78% 79% 81% 82% 81% 82% 80% 81% 79% 81% 80% 82% 82% 81% 82% 82% 79% 81% 82% 80% 80% 81% 78% 81% 78% 81% 81% 82% 78% 81% 82% 82% 79% 78% 81% 80% 76% 81% 81% 80% 83% 80% 85% 81% 81% 80% 79% 81% 78% 79% 80% 79% 79% 81% 82% 80% 79% 81% 80% 80% 82% 80% 80% 81% 80% 81% 80% 78% 82% 79% 76% 81% 81% 80% 82% 79% 81% 79% 81% 82% 82% 81% 81% 81% 81% 77% 82%) -> (96k/230k) -> write(89% 88% 89% 89% 90% 90%)
|
||||
0:04:04 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 158M 16% 2.7M/s ] rels: [ 0 0% 0/s ] features: [ 1B 6.9M/s ] 96G blocks: [ 30k 71% 43/s ]
|
||||
cpus: 160.5 gc: 6% heap: 179G/214G direct: 58M postGC: 103G relInfo: 573M mpGeoms: 2.2G
|
||||
read( 7%) -> (88/262) -> process(85% 83% 85% 85% 83% 84% 83% 84% 83% 83% 83% 81% 81% 81% 82% 82% 84% 83% 86% 82% 83% 85% 84% 83% 83% 83% 84% 83% 82% 82% 84% 85% 81% 84% 83% 84% 84% 82% 82% 83% 85% 83% 85% 82% 82% 82% 81% 83% 83% 83% 83% 83% 83% 83% 82% 81% 84% 82% 84% 85% 82% 84% 82% 82% 84% 84% 83% 83% 85% 82% 82% 82% 83% 84% 83% 83% 83% 84% 83% 81% 82% 82% 85% 81% 82% 83% 82% 83% 84% 83% 82% 83% 82% 83% 81% 85% 81% 81% 80% 82% 82% 83% 83% 82% 82% 84% 83% 82% 85% 81% 83% 84% 84% 84% 85% 82% 82% 85% 85% 80% 82% 84% 83% 81% 84% 83% 80% 83% 80% 81% 79% 83% 82% 81% 82% 80% 83% 84% 85% 82% 84% 82% 84% 84% 81% 84% 84% 83% 86% 83% 85% 84% 83% 85% 83% 85% 83% 85% 84% 85% 81% 82% 83% 83% 85% 82% 83% 83% 81% 84% 85% 81% 84% 81%) -> (142k/230k) -> write(86% 85% 86% 86% 85% 85%)
|
||||
0:04:14 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 187M 19% 2.8M/s ] rels: [ 0 0% 0/s ] features: [ 1.1B 7M/s ] 99G blocks: [ 31k 72% 43/s ]
|
||||
cpus: 159.6 gc: 6% heap: 106G/214G direct: 58M postGC: 103G relInfo: 573M mpGeoms: 2.5G
|
||||
read( 7%) -> (88/262) -> process(84% 80% 82% 85% 81% 84% 83% 83% 84% 84% 82% 85% 83% 84% 81% 84% 84% 82% 81% 84% 82% 84% 83% 83% 84% 84% 81% 83% 82% 84% 84% 82% 86% 82% 87% 84% 81% 84% 83% 83% 81% 82% 84% 83% 79% 85% 84% 86% 81% 85% 82% 85% 83% 84% 82% 82% 82% 84% 81% 82% 84% 83% 84% 85% 84% 83% 84% 84% 84% 82% 83% 82% 85% 84% 83% 84% 83% 82% 82% 83% 84% 82% 82% 82% 84% 81% 84% 81% 85% 82% 81% 83% 84% 83% 83% 86% 86% 82% 82% 83% 83% 85% 83% 85% 83% 82% 81% 84% 85% 84% 83% 83% 84% 81% 82% 82% 83% 79% 80% 83% 82% 83% 84% 81% 83% 84% 83% 83% 82% 83% 82% 86% 81% 82% 83% 82% 84% 84% 85% 83% 81% 83% 81% 81% 82% 85% 82% 82% 87% 82% 84% 81% 83% 83% 83% 82% 84% 83% 81% 81% 83% 83% 82% 82% 82% 82% 83% 81% 79% 83% 84% 82% 83% 84%) -> (93k/230k) -> write(87% 88% 88% 88% 89% 87%)
|
||||
0:04:25 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 217M 22% 3M/s ] rels: [ 0 0% 0/s ] features: [ 1.1B 6.2M/s ] 106G blocks: [ 31k 74% 51/s ]
|
||||
cpus: 162.2 gc: 6% heap: 177G/214G direct: 58M postGC: 104G relInfo: 573M mpGeoms: 2.9G
|
||||
read( 9%) -> (88/262) -> process(84% 82% 85% 83% 83% 85% 86% 82% 86% 82% 83% 84% 85% 84% 86% 83% 84% 86% 85% 82% 82% 84% 85% 84% 85% 84% 81% 83% 82% 84% 84% 82% 85% 84% 86% 83% 86% 83% 82% 84% 85% 82% 84% 79% 86% 82% 83% 87% 84% 84% 83% 85% 84% 85% 84% 84% 86% 84% 84% 83% 85% 85% 83% 84% 86% 84% 86% 85% 83% 84% 82% 83% 83% 86% 83% 85% 85% 85% 84% 82% 85% 83% 79% 86% 84% 83% 82% 84% 85% 80% 86% 84% 77% 84% 82% 84% 84% 82% 85% 84% 83% 84% 84% 86% 83% 83% 84% 84% 83% 83% 85% 81% 82% 82% 81% 86% 85% 83% 85% 84% 84% 83% 83% 83% 79% 84% 83% 84% 84% 84% 81% 85% 85% 84% 81% 82% 83% 83% 84% 83% 85% 81% 84% 84% 80% 83% 84% 86% 82% 83% 84% 83% 84% 84% 85% 80% 85% 86% 85% 85% 82% 83% 85% 86% 82% 84% 85% 86% 84% 83% 84% 85% 84% 83%) -> (142k/230k) -> write(83% 84% 83% 83% 83% 83%)
|
||||
0:04:35 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 246M 25% 2.8M/s ] rels: [ 0 0% 0/s ] features: [ 1.2B 6.6M/s ] 110G blocks: [ 32k 75% 44/s ]
|
||||
cpus: 166.1 gc: 6% heap: 126G/214G direct: 58M postGC: 104G relInfo: 573M mpGeoms: 3.3G
|
||||
read( 7%) -> (88/262) -> process(85% 84% 88% 85% 85% 87% 87% 87% 88% 86% 85% 86% 86% 88% 85% 86% 87% 86% 84% 88% 86% 87% 86% 86% 85% 85% 87% 86% 86% 87% 87% 86% 85% 87% 84% 87% 86% 87% 86% 85% 87% 84% 88% 86% 88% 86% 85% 87% 86% 83% 86% 86% 87% 85% 86% 88% 86% 86% 85% 87% 86% 85% 86% 84% 86% 86% 87% 85% 87% 86% 88% 84% 85% 86% 84% 87% 87% 88% 86% 86% 85% 88% 85% 87% 86% 84% 85% 85% 85% 86% 83% 86% 87% 87% 87% 84% 87% 84% 86% 86% 87% 87% 86% 85% 89% 86% 85% 86% 88% 86% 86% 85% 86% 86% 87% 85% 85% 86% 88% 85% 86% 85% 86% 86% 84% 88% 86% 85% 87% 85% 85% 88% 87% 84% 84% 87% 85% 84% 86% 86% 85% 85% 86% 85% 87% 87% 86% 87% 86% 87% 85% 87% 86% 84% 86% 85% 88% 86% 85% 86% 86% 86% 85% 86% 86% 85% 86% 87% 86% 88% 85% 86% 88% 87%) -> (96k/230k) -> write(84% 85% 83% 83% 84% 83%)
|
||||
0:04:45 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 278M 28% 3M/s ] rels: [ 0 0% 0/s ] features: [ 1.3B 6.3M/s ] 114G blocks: [ 32k 76% 46/s ]
|
||||
cpus: 157.5 gc: 6% heap: 177G/214G direct: 58M postGC: 139G relInfo: 573M mpGeoms: 3.7G
|
||||
read( 7%) -> (88/262) -> process(80% 83% 81% 84% 85% 83% 82% 80% 82% 72% 81% 83% 84% 81% 82% 81% 78% 80% 80% 83% 81% 83% 82% 83% 85% 84% 81% 87% 76% 82% 82% 83% 82% 82% 84% 85% 81% 79% 86% 73% 82% 81% 84% 85% 84% 85% 83% 78% 84% 81% 80% 82% 84% 79% 76% 81% 79% 87% 84% 78% 84% 80% 81% 83% 82% 82% 82% 77% 76% 84% 80% 77% 78% 81% 74% 84% 84% 85% 83% 83% 79% 85% 81% 83% 84% 83% 83% 81% 82% 82% 83% 75% 83% 84% 81% 86% 84% 79% 82% 80% 83% 86% 83% 83% 84% 73% 79% 81% 83% 78% 74% 74% 84% 73% 81% 83% 80% 81% 82% 82% 85% 83% 83% 84% 81% 84% 74% 83% 81% 79% 83% 85% 83% 86% 81% 85% 79% 81% 76% 79% 81% 80% 83% 84% 83% 84% 81% 83% 82% 82% 84% 80% 76% 83% 83% 86% 78% 82% 83% 80% 78% 77% 79% 80% 86% 74% 81% 85% 83% 77% 84% 79% 83% 82%) -> (135k/230k) -> write(79% 79% 80% 79% 80% 79%)
|
||||
0:04:55 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 308M 31% 3M/s ] rels: [ 0 0% 0/s ] features: [ 1.3B 6.5M/s ] 120G blocks: [ 33k 77% 44/s ]
|
||||
cpus: 162.5 gc: 6% heap: 118G/214G direct: 58M postGC: 104G relInfo: 573M mpGeoms: 4G
|
||||
read( 7%) -> (88/262) -> process(86% 84% 84% 82% 82% 84% 84% 83% 85% 86% 85% 84% 83% 84% 86% 82% 82% 83% 84% 83% 85% 83% 79% 84% 84% 83% 84% 82% 84% 85% 82% 83% 85% 85% 84% 87% 84% 82% 87% 81% 86% 85% 79% 82% 84% 85% 82% 81% 83% 87% 84% 82% 86% 84% 84% 85% 85% 84% 82% 85% 86% 86% 85% 83% 84% 86% 84% 83% 82% 85% 86% 82% 84% 85% 85% 82% 84% 84% 79% 83% 86% 85% 84% 82% 84% 82% 85% 84% 81% 84% 85% 82% 85% 82% 84% 85% 86% 84% 85% 84% 86% 80% 83% 83% 83% 83% 85% 84% 82% 84% 87% 82% 82% 82% 84% 84% 84% 86% 85% 83% 84% 82% 84% 84% 83% 86% 82% 84% 86% 84% 85% 84% 82% 82% 84% 85% 84% 85% 83% 82% 84% 83% 84% 84% 80% 85% 82% 83% 83% 84% 83% 86% 85% 81% 82% 86% 83% 84% 84% 84% 83% 83% 83% 84% 82% 85% 84% 84% 82% 83% 83% 82% 82% 83%) -> (91k/230k) -> write(82% 84% 82% 83% 83% 84%)
|
||||
0:05:05 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 342M 34% 3.2M/s ] rels: [ 0 0% 0/s ] features: [ 1.4B 6.4M/s ] 124G blocks: [ 33k 78% 49/s ]
|
||||
cpus: 164.7 gc: 6% heap: 105G/214G direct: 58M postGC: 105G relInfo: 573M mpGeoms: 4.4G
|
||||
read( 8%) -> (88/262) -> process(82% 85% 86% 85% 86% 84% 86% 85% 86% 83% 83% 84% 88% 86% 84% 86% 86% 85% 88% 82% 87% 86% 85% 86% 86% 82% 86% 87% 86% 84% 84% 83% 85% 86% 86% 86% 84% 86% 84% 85% 85% 87% 85% 84% 88% 86% 87% 84% 86% 86% 85% 83% 88% 85% 83% 83% 86% 86% 88% 84% 87% 84% 84% 87% 85% 85% 89% 87% 86% 84% 88% 86% 86% 85% 85% 88% 83% 86% 85% 85% 85% 86% 86% 84% 84% 88% 83% 87% 86% 85% 86% 79% 85% 87% 86% 87% 86% 85% 85% 87% 87% 85% 86% 86% 87% 85% 87% 85% 85% 85% 83% 86% 84% 84% 82% 84% 86% 82% 88% 87% 85% 86% 86% 86% 85% 86% 84% 85% 87% 88% 87% 87% 85% 86% 86% 86% 86% 84% 84% 84% 88% 82% 86% 87% 84% 84% 86% 87% 87% 83% 84% 85% 86% 85% 87% 84% 85% 85% 84% 86% 85% 84% 86% 86% 87% 84% 87% 86% 86% 85% 88% 85% 86% 86%) -> (144k/230k) -> write(83% 83% 82% 83% 83% 80%)
|
||||
0:05:15 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 374M 38% 3.2M/s ] rels: [ 0 0% 0/s ] features: [ 1.5B 6.2M/s ] 128G blocks: [ 34k 79% 49/s ]
|
||||
cpus: 164.3 gc: 6% heap: 178G/214G direct: 58M postGC: 107G relInfo: 573M mpGeoms: 4.8G
|
||||
read( 7%) -> (88/262) -> process(85% 85% 85% 85% 85% 86% 85% 86% 86% 87% 85% 86% 86% 86% 85% 87% 85% 84% 86% 84% 86% 84% 87% 85% 85% 84% 87% 86% 85% 86% 85% 87% 84% 86% 87% 87% 85% 85% 86% 86% 85% 86% 85% 86% 86% 86% 85% 85% 87% 85% 85% 87% 86% 86% 84% 85% 87% 80% 85% 86% 84% 85% 84% 84% 84% 85% 83% 85% 85% 86% 86% 85% 87% 85% 84% 83% 85% 86% 86% 86% 85% 87% 86% 85% 84% 84% 84% 85% 85% 84% 86% 86% 79% 86% 85% 84% 85% 85% 86% 86% 85% 86% 86% 85% 85% 84% 84% 86% 85% 86% 86% 84% 86% 86% 84% 85% 86% 85% 86% 84% 86% 87% 86% 84% 86% 83% 84% 86% 84% 85% 86% 86% 85% 85% 85% 86% 87% 86% 84% 85% 87% 77% 84% 86% 84% 87% 85% 86% 81% 82% 85% 85% 83% 85% 85% 86% 85% 86% 87% 85% 82% 84% 86% 85% 84% 85% 79% 84% 85% 87% 86% 85% 84% 83%) -> (135k/230k) -> write(82% 83% 81% 81% 80% 80%)
|
||||
0:05:25 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 410M 41% 3.5M/s ] rels: [ 0 0% 0/s ] features: [ 1.5B 6.4M/s ] 131G blocks: [ 34k 80% 46/s ]
|
||||
cpus: 168 gc: 6% heap: 106G/214G direct: 58M postGC: 105G relInfo: 573M mpGeoms: 5.1G
|
||||
read( 6%) -> (88/262) -> process(87% 90% 86% 88% 88% 89% 89% 89% 86% 88% 87% 87% 89% 87% 88% 87% 86% 88% 87% 88% 88% 89% 90% 86% 89% 88% 88% 89% 88% 86% 90% 87% 89% 88% 87% 89% 86% 89% 88% 90% 86% 89% 87% 89% 85% 88% 86% 89% 89% 89% 88% 89% 89% 88% 88% 88% 87% 87% 89% 86% 84% 87% 86% 90% 87% 89% 89% 87% 88% 87% 88% 89% 86% 88% 89% 89% 85% 89% 87% 88% 89% 88% 84% 88% 87% 88% 86% 89% 86% 89% 89% 87% 90% 89% 89% 89% 89% 88% 86% 89% 88% 86% 89% 88% 88% 89% 87% 87% 88% 86% 89% 89% 88% 87% 89% 88% 89% 88% 90% 89% 88% 88% 89% 87% 89% 88% 87% 88% 88% 88% 88% 87% 89% 89% 89% 86% 88% 87% 86% 88% 88% 86% 87% 86% 88% 89% 84% 89% 86% 86% 85% 88% 87% 86% 89% 87% 87% 88% 87% 87% 88% 88% 87% 87% 87% 89% 88% 87% 87% 88% 89% 87% 88% 90%) -> (139k/230k) -> write(86% 85% 84% 85% 84% 86%)
|
||||
0:05:35 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 446M 45% 3.5M/s ] rels: [ 0 0% 0/s ] features: [ 1.6B 6.5M/s ] 138G blocks: [ 35k 81% 48/s ]
|
||||
cpus: 166.9 gc: 6% heap: 109G/214G direct: 58M postGC: 106G relInfo: 573M mpGeoms: 5.4G
|
||||
read( 6%) -> (88/262) -> process(89% 86% 87% 87% 87% 86% 88% 86% 87% 87% 88% 88% 86% 85% 88% 88% 88% 87% 87% 86% 90% 86% 90% 88% 88% 88% 84% 85% 87% 86% 88% 87% 86% 86% 87% 88% 86% 85% 89% 84% 86% 86% 86% 86% 87% 86% 86% 87% 87% 88% 89% 86% 88% 88% 89% 87% 87% 87% 85% 89% 88% 88% 86% 88% 86% 89% 86% 89% 86% 87% 86% 88% 88% 87% 87% 86% 89% 88% 86% 87% 87% 88% 88% 85% 89% 87% 87% 86% 86% 87% 87% 87% 86% 87% 87% 88% 88% 85% 90% 88% 85% 85% 87% 87% 88% 88% 88% 86% 87% 87% 85% 88% 88% 86% 86% 85% 88% 86% 85% 88% 84% 87% 85% 86% 87% 87% 88% 87% 85% 88% 87% 86% 86% 85% 84% 87% 88% 87% 86% 85% 89% 86% 85% 85% 85% 86% 88% 85% 86% 86% 88% 86% 86% 86% 87% 87% 86% 84% 87% 87% 86% 87% 87% 86% 85% 88% 87% 89% 87% 86% 87% 82% 87% 88%) -> (143k/230k) -> write(83% 83% 83% 84% 84% 82%)
|
||||
0:05:46 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 484M 49% 3.7M/s ] rels: [ 0 0% 0/s ] features: [ 1.7B 6.6M/s ] 141G blocks: [ 35k 82% 51/s ]
|
||||
cpus: 166.8 gc: 6% heap: 122G/214G direct: 58M postGC: 106G relInfo: 573M mpGeoms: 5.6G
|
||||
read( 7%) -> (88/262) -> process(86% 86% 87% 86% 88% 88% 87% 87% 87% 86% 84% 86% 85% 84% 87% 86% 87% 85% 87% 88% 87% 89% 88% 86% 87% 87% 91% 86% 88% 88% 86% 87% 88% 88% 86% 87% 86% 89% 86% 87% 88% 85% 89% 88% 87% 88% 87% 88% 88% 86% 88% 88% 87% 85% 87% 89% 84% 87% 88% 87% 87% 88% 84% 86% 85% 88% 88% 87% 87% 88% 87% 86% 86% 86% 86% 88% 87% 89% 87% 88% 87% 86% 87% 87% 86% 87% 83% 86% 85% 88% 86% 88% 88% 88% 87% 87% 85% 88% 86% 85% 90% 87% 87% 87% 87% 85% 86% 86% 85% 85% 87% 88% 86% 88% 88% 90% 86% 89% 89% 87% 84% 88% 88% 87% 86% 88% 88% 86% 85% 87% 85% 86% 87% 85% 87% 89% 88% 87% 88% 89% 86% 89% 87% 88% 88% 89% 87% 86% 87% 88% 89% 89% 86% 87% 87% 86% 86% 85% 87% 88% 88% 87% 87% 85% 89% 88% 87% 88% 87% 87% 83% 85% 88% 87%) -> (128k/230k) -> write(83% 82% 82% 83% 83% 81%)
|
||||
0:05:56 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 522M 53% 3.7M/s ] rels: [ 0 0% 0/s ] features: [ 1.7B 6.5M/s ] 144G blocks: [ 36k 84% 49/s ]
|
||||
cpus: 165.1 gc: 6% heap: 133G/214G direct: 58M postGC: 106G relInfo: 573M mpGeoms: 5.9G
|
||||
read( 6%) -> (88/262) -> process(87% 86% 85% 87% 80% 87% 85% 87% 85% 86% 85% 86% 85% 87% 87% 86% 88% 87% 85% 86% 87% 86% 86% 85% 85% 88% 85% 88% 87% 87% 88% 87% 88% 85% 87% 86% 89% 88% 85% 85% 86% 83% 85% 84% 86% 85% 86% 85% 86% 88% 86% 85% 86% 87% 84% 87% 88% 86% 85% 86% 86% 86% 86% 86% 84% 87% 87% 85% 87% 84% 87% 87% 85% 83% 87% 86% 86% 85% 89% 87% 86% 85% 87% 85% 86% 85% 87% 86% 87% 85% 86% 85% 84% 86% 85% 87% 86% 83% 87% 87% 86% 86% 86% 87% 87% 86% 87% 88% 82% 85% 86% 87% 85% 86% 85% 87% 85% 86% 87% 85% 88% 85% 85% 87% 85% 87% 85% 85% 87% 87% 85% 84% 86% 85% 86% 89% 85% 85% 87% 86% 87% 86% 84% 85% 86% 86% 84% 85% 86% 84% 86% 87% 85% 86% 83% 82% 84% 87% 86% 85% 85% 87% 86% 85% 85% 84% 83% 88% 85% 88% 89% 86% 84% 84%) -> (155k/230k) -> write(84% 85% 87% 85% 87% 86%)
|
||||
0:06:06 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 556M 56% 3.3M/s ] rels: [ 0 0% 0/s ] features: [ 1.8B 6.6M/s ] 151G blocks: [ 36k 85% 47/s ]
|
||||
cpus: 167.1 gc: 6% heap: 144G/214G direct: 58M postGC: 140G relInfo: 573M mpGeoms: 6.2G
|
||||
read( 6%) -> (88/262) -> process(84% 88% 87% 86% 89% 87% 86% 87% 89% 89% 87% 90% 88% 88% 88% 86% 87% 88% 87% 87% 88% 85% 87% 88% 88% 86% 86% 85% 87% 87% 87% 87% 86% 88% 88% 87% 88% 84% 87% 86% 87% 86% 88% 86% 86% 87% 85% 87% 88% 87% 87% 87% 85% 88% 86% 87% 89% 87% 89% 88% 89% 86% 85% 85% 86% 88% 85% 88% 89% 87% 86% 86% 87% 86% 86% 86% 89% 86% 89% 87% 86% 88% 87% 88% 88% 86% 87% 89% 88% 88% 85% 87% 88% 87% 87% 86% 87% 87% 89% 86% 87% 90% 85% 86% 88% 86% 88% 85% 88% 89% 87% 87% 87% 87% 86% 88% 87% 87% 86% 88% 87% 88% 85% 86% 87% 85% 87% 86% 89% 86% 87% 83% 86% 87% 87% 87% 88% 88% 85% 84% 87% 87% 87% 85% 87% 87% 86% 85% 88% 87% 87% 87% 86% 86% 85% 87% 86% 88% 88% 89% 87% 86% 87% 87% 87% 89% 84% 87% 87% 85% 87% 86% 88% 87%) -> (96k/230k) -> write(83% 85% 83% 84% 85% 84%)
|
||||
0:06:16 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 591M 60% 3.4M/s ] rels: [ 0 0% 0/s ] features: [ 1.9B 6.7M/s ] 154G blocks: [ 37k 86% 49/s ]
|
||||
cpus: 166.8 gc: 6% heap: 157G/214G direct: 58M postGC: 107G relInfo: 573M mpGeoms: 6.6G
|
||||
read( 6%) -> (88/262) -> process(89% 89% 88% 86% 88% 88% 88% 89% 89% 87% 89% 89% 87% 88% 87% 87% 88% 87% 88% 88% 87% 89% 87% 88% 87% 86% 88% 88% 86% 87% 87% 86% 88% 89% 88% 87% 87% 89% 87% 88% 86% 88% 88% 87% 87% 89% 89% 87% 89% 89% 87% 87% 87% 88% 87% 88% 87% 86% 88% 87% 88% 88% 86% 89% 86% 86% 87% 87% 87% 87% 86% 88% 87% 86% 87% 85% 87% 87% 88% 88% 87% 86% 88% 86% 87% 88% 87% 88% 86% 88% 87% 86% 89% 85% 88% 86% 88% 89% 88% 87% 86% 88% 89% 86% 88% 88% 87% 88% 88% 88% 87% 88% 89% 88% 89% 84% 88% 88% 87% 86% 88% 89% 87% 86% 86% 87% 87% 88% 85% 88% 87% 88% 88% 88% 89% 86% 86% 86% 87% 87% 87% 85% 87% 86% 85% 85% 89% 87% 86% 89% 87% 86% 87% 87% 87% 87% 87% 86% 87% 85% 87% 86% 88% 87% 88% 86% 88% 87% 87% 88% 88% 86% 87% 87%) -> (138k/230k) -> write(85% 84% 83% 84% 85% 83%)
|
||||
0:06:26 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 625M 63% 3.3M/s ] rels: [ 0 0% 0/s ] features: [ 1.9B 6.7M/s ] 158G blocks: [ 37k 87% 47/s ]
|
||||
cpus: 163.3 gc: 6% heap: 147G/214G direct: 58M postGC: 138G relInfo: 573M mpGeoms: 7G
|
||||
read( 6%) -> (88/262) -> process(78% 84% 84% 84% 84% 87% 87% 85% 84% 82% 83% 86% 85% 85% 84% 83% 85% 86% 81% 83% 86% 85% 84% 87% 86% 82% 86% 87% 85% 85% 88% 84% 86% 82% 87% 84% 86% 87% 83% 83% 84% 85% 84% 85% 82% 86% 83% 85% 85% 86% 86% 84% 80% 87% 86% 87% 84% 73% 86% 87% 86% 85% 87% 82% 85% 85% 82% 86% 86% 84% 88% 86% 83% 88% 84% 82% 77% 86% 87% 83% 85% 85% 84% 86% 86% 86% 87% 86% 85% 84% 86% 83% 84% 86% 87% 85% 86% 86% 86% 85% 84% 87% 86% 89% 82% 84% 83% 86% 86% 85% 84% 84% 85% 79% 84% 83% 86% 85% 86% 86% 84% 84% 84% 86% 83% 82% 85% 84% 86% 85% 80% 85% 84% 87% 84% 86% 84% 85% 85% 83% 86% 85% 84% 84% 86% 82% 84% 84% 84% 84% 84% 86% 85% 87% 87% 81% 84% 86% 84% 84% 88% 85% 86% 85% 81% 85% 85% 85% 85% 87% 85% 85% 85% 82%) -> (105k/230k) -> write(85% 84% 82% 83% 83% 82%)
|
||||
0:06:36 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 660M 66% 3.4M/s ] rels: [ 0 0% 0/s ] features: [ 2B 6.5M/s ] 164G blocks: [ 38k 88% 49/s ]
|
||||
cpus: 163.2 gc: 6% heap: 136G/214G direct: 58M postGC: 108G relInfo: 573M mpGeoms: 7.4G
|
||||
read( 6%) -> (88/262) -> process(85% 84% 82% 83% 84% 83% 84% 84% 83% 84% 85% 85% 86% 83% 84% 86% 85% 86% 84% 82% 84% 85% 85% 84% 84% 81% 85% 82% 82% 85% 87% 84% 82% 88% 85% 86% 85% 84% 82% 85% 84% 84% 84% 85% 81% 84% 87% 83% 83% 84% 84% 88% 86% 82% 85% 83% 83% 84% 84% 84% 84% 84% 85% 86% 81% 86% 83% 85% 85% 84% 83% 85% 81% 85% 87% 83% 82% 85% 84% 85% 84% 83% 82% 84% 85% 83% 85% 85% 85% 85% 84% 84% 85% 82% 86% 85% 86% 84% 84% 81% 83% 85% 85% 85% 84% 79% 90% 83% 78% 83% 84% 79% 86% 85% 87% 84% 83% 85% 84% 85% 84% 83% 86% 84% 82% 84% 83% 85% 84% 85% 84% 82% 82% 88% 83% 84% 80% 84% 81% 85% 86% 86% 84% 85% 86% 80% 82% 85% 85% 81% 81% 83% 85% 85% 85% 77% 83% 83% 86% 87% 85% 83% 89% 84% 78% 78% 84% 87% 81% 84% 83% 83% 87% 85%) -> (106k/230k) -> write(79% 80% 78% 78% 79% 81%)
|
||||
0:06:46 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 697M 70% 3.6M/s ] rels: [ 0 0% 0/s ] features: [ 2.1B 6.7M/s ] 168G blocks: [ 38k 89% 49/s ]
|
||||
cpus: 167.4 gc: 6% heap: 176G/214G direct: 58M postGC: 108G relInfo: 573M mpGeoms: 7.7G
|
||||
read( 6%) -> (88/262) -> process(87% 87% 86% 86% 88% 87% 89% 86% 90% 88% 89% 87% 89% 88% 88% 88% 87% 87% 88% 86% 88% 88% 87% 88% 85% 89% 85% 86% 88% 88% 87% 85% 87% 87% 88% 86% 87% 86% 88% 88% 86% 87% 88% 85% 86% 87% 86% 85% 87% 88% 87% 88% 88% 88% 88% 86% 84% 87% 87% 85% 85% 85% 87% 89% 86% 87% 86% 87% 87% 87% 88% 87% 87% 88% 88% 89% 87% 87% 88% 86% 86% 84% 88% 86% 86% 86% 87% 88% 87% 91% 89% 87% 83% 87% 91% 87% 87% 85% 86% 87% 87% 88% 87% 87% 88% 89% 88% 88% 85% 88% 88% 87% 89% 88% 85% 88% 87% 88% 85% 86% 90% 86% 86% 86% 85% 82% 89% 87% 88% 86% 87% 90% 85% 87% 88% 86% 87% 87% 89% 88% 91% 87% 87% 86% 87% 88% 87% 88% 85% 87% 88% 88% 87% 86% 83% 89% 89% 88% 88% 87% 87% 87% 87% 87% 88% 88% 86% 89% 87% 88% 85% 88% 88% 88%) -> (96k/230k) -> write(84% 85% 84% 85% 85% 84%)
|
||||
0:06:56 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 734M 74% 3.7M/s ] rels: [ 0 0% 0/s ] features: [ 2.1B 6.7M/s ] 171G blocks: [ 39k 91% 52/s ]
|
||||
cpus: 167.5 gc: 6% heap: 121G/214G direct: 58M postGC: 108G relInfo: 573M mpGeoms: 8G
|
||||
read( 6%) -> (88/262) -> process(87% 87% 89% 84% 87% 90% 87% 88% 89% 87% 88% 87% 86% 86% 87% 86% 89% 89% 89% 90% 87% 88% 87% 88% 88% 89% 89% 87% 86% 88% 88% 89% 87% 86% 88% 88% 88% 90% 86% 90% 88% 88% 88% 89% 87% 85% 90% 87% 84% 87% 89% 88% 86% 89% 88% 88% 88% 86% 88% 87% 88% 87% 86% 86% 89% 88% 88% 86% 89% 87% 89% 89% 89% 86% 84% 87% 87% 88% 88% 90% 85% 89% 88% 89% 86% 87% 89% 88% 88% 86% 89% 88% 87% 84% 88% 90% 87% 86% 88% 89% 88% 89% 88% 88% 88% 90% 88% 86% 87% 88% 87% 87% 88% 88% 86% 90% 86% 88% 87% 88% 87% 88% 87% 87% 88% 88% 86% 87% 88% 90% 88% 87% 85% 87% 87% 87% 89% 87% 87% 87% 89% 87% 88% 86% 87% 87% 86% 89% 88% 89% 88% 88% 89% 88% 86% 87% 87% 88% 89% 87% 88% 88% 87% 87% 89% 89% 88% 87% 86% 85% 88% 87% 89% 87%) -> (157k/230k) -> write(84% 84% 85% 85% 84% 85%)
|
||||
0:07:06 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 772M 78% 3.7M/s ] rels: [ 0 0% 0/s ] features: [ 2.2B 6.5M/s ] 178G blocks: [ 39k 92% 51/s ]
|
||||
cpus: 166 gc: 5% heap: 146G/214G direct: 58M postGC: 139G relInfo: 573M mpGeoms: 8.3G
|
||||
read( 6%) -> (88/262) -> process(86% 84% 86% 84% 88% 88% 87% 87% 86% 88% 87% 87% 86% 87% 86% 85% 87% 87% 86% 86% 86% 87% 86% 86% 86% 85% 87% 87% 87% 85% 86% 86% 86% 87% 87% 85% 87% 87% 86% 86% 87% 87% 87% 87% 86% 89% 87% 87% 87% 86% 86% 89% 87% 87% 85% 88% 86% 86% 87% 85% 85% 87% 85% 85% 85% 86% 87% 87% 86% 85% 88% 86% 87% 87% 87% 87% 86% 88% 86% 85% 87% 85% 85% 86% 87% 87% 83% 85% 86% 87% 84% 87% 87% 84% 84% 87% 86% 85% 84% 86% 87% 86% 86% 85% 87% 86% 87% 87% 88% 85% 87% 88% 88% 87% 88% 85% 87% 87% 87% 87% 85% 85% 87% 86% 85% 87% 87% 85% 88% 86% 86% 86% 86% 87% 85% 86% 85% 87% 87% 88% 85% 85% 86% 88% 83% 86% 85% 86% 87% 86% 85% 87% 84% 84% 86% 87% 86% 86% 87% 88% 86% 85% 87% 85% 87% 86% 87% 86% 87% 88% 86% 87% 86% 85%) -> (121k/230k) -> write(82% 83% 82% 81% 82% 82%)
|
||||
0:07:16 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 810M 82% 3.6M/s ] rels: [ 0 0% 0/s ] features: [ 2.3B 6.3M/s ] 179G blocks: [ 40k 93% 51/s ]
|
||||
cpus: 169.8 gc: 6% heap: 115G/214G direct: 58M postGC: 109G relInfo: 573M mpGeoms: 8.6G
|
||||
read( 6%) -> (88/262) -> process(89% 87% 88% 90% 89% 88% 89% 89% 88% 88% 91% 89% 88% 88% 89% 88% 89% 90% 89% 87% 89% 89% 89% 89% 89% 89% 89% 89% 90% 89% 88% 90% 88% 86% 88% 88% 88% 88% 86% 90% 89% 87% 88% 89% 88% 91% 90% 89% 89% 88% 86% 87% 89% 90% 87% 87% 89% 89% 87% 89% 90% 88% 88% 88% 90% 87% 89% 88% 90% 89% 88% 88% 87% 89% 89% 88% 88% 89% 90% 89% 87% 87% 90% 88% 90% 88% 88% 90% 87% 89% 88% 88% 89% 86% 88% 90% 86% 89% 88% 88% 90% 90% 89% 89% 88% 88% 87% 89% 88% 87% 89% 89% 88% 89% 89% 89% 89% 89% 88% 87% 89% 89% 88% 90% 89% 88% 89% 86% 89% 88% 88% 88% 90% 88% 89% 88% 89% 88% 88% 89% 89% 87% 89% 87% 89% 89% 89% 87% 89% 88% 89% 88% 89% 89% 91% 88% 89% 87% 87% 88% 87% 90% 89% 85% 88% 89% 90% 89% 90% 88% 89% 89% 89% 89%) -> (98k/230k) -> write(83% 83% 81% 82% 83% 80%)
|
||||
0:07:27 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 846M 85% 3.5M/s ] rels: [ 0 0% 0/s ] features: [ 2.3B 6M/s ] 184G blocks: [ 40k 94% 48/s ]
|
||||
cpus: 163.3 gc: 6% heap: 142G/214G direct: 58M postGC: 110G relInfo: 573M mpGeoms: 9.3G
|
||||
read( 6%) -> (88/262) -> process(85% 86% 86% 86% 87% 86% 86% 86% 87% 86% 85% 85% 86% 87% 85% 86% 86% 87% 85% 88% 86% 85% 86% 85% 87% 86% 86% 85% 86% 86% 87% 87% 86% 86% 85% 86% 86% 85% 87% 86% 86% 86% 87% 85% 85% 85% 85% 84% 86% 85% 86% 85% 86% 85% 84% 86% 86% 86% 84% 83% 84% 87% 86% 85% 87% 87% 86% 84% 85% 87% 86% 85% 85% 86% 85% 86% 84% 87% 85% 85% 87% 86% 85% 85% 85% 85% 83% 87% 84% 85% 85% 87% 86% 87% 85% 85% 85% 86% 85% 86% 84% 85% 87% 86% 86% 86% 83% 85% 86% 84% 85% 85% 86% 85% 85% 84% 87% 86% 86% 84% 84% 84% 85% 86% 86% 86% 86% 85% 86% 84% 85% 86% 86% 87% 85% 84% 86% 87% 86% 87% 86% 85% 86% 87% 86% 86% 87% 85% 86% 85% 86% 87% 84% 86% 83% 85% 86% 87% 84% 85% 86% 86% 85% 85% 86% 86% 86% 83% 85% 84% 82% 86% 84% 86%) -> (136k/230k) -> write(78% 78% 79% 78% 80% 78%)
|
||||
0:07:37 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 882M 89% 3.6M/s ] rels: [ 0 0% 0/s ] features: [ 2.4B 6.2M/s ] 190G blocks: [ 41k 95% 49/s ]
|
||||
cpus: 165.4 gc: 5% heap: 198G/214G direct: 58M postGC: 138G relInfo: 573M mpGeoms: 9.6G
|
||||
read( 6%) -> (88/262) -> process(85% 84% 86% 86% 86% 86% 84% 86% 87% 88% 85% 87% 89% 86% 87% 84% 87% 85% 87% 86% 86% 86% 88% 84% 86% 85% 86% 87% 85% 86% 87% 83% 86% 85% 86% 86% 84% 87% 85% 86% 84% 85% 87% 86% 87% 87% 86% 85% 86% 84% 86% 87% 85% 87% 87% 87% 86% 86% 87% 89% 86% 87% 84% 84% 85% 87% 87% 85% 88% 88% 85% 87% 88% 87% 87% 86% 85% 85% 84% 87% 85% 86% 86% 86% 86% 87% 86% 85% 85% 88% 86% 87% 86% 85% 84% 85% 86% 86% 85% 86% 86% 86% 85% 84% 84% 84% 85% 87% 87% 85% 87% 87% 86% 85% 86% 86% 86% 83% 87% 87% 87% 86% 85% 86% 87% 84% 87% 88% 88% 86% 87% 87% 87% 87% 85% 86% 85% 86% 85% 85% 85% 86% 86% 84% 87% 88% 86% 89% 87% 84% 86% 87% 88% 87% 86% 85% 86% 86% 84% 84% 85% 86% 84% 86% 86% 85% 89% 86% 86% 85% 85% 86% 87% 86%) -> (88k/230k) -> write(78% 78% 78% 79% 78% 78%)
|
||||
0:07:47 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 918M 92% 3.5M/s ] rels: [ 0 0% 0/s ] features: [ 2.5B 6M/s ] 191G blocks: [ 41k 96% 50/s ]
|
||||
cpus: 167.8 gc: 6% heap: 198G/214G direct: 58M postGC: 152G relInfo: 573M mpGeoms: 10G
|
||||
read( 6%) -> (88/262) -> process(88% 87% 88% 89% 89% 87% 83% 89% 88% 90% 85% 88% 88% 87% 88% 89% 88% 89% 88% 88% 84% 88% 88% 91% 87% 88% 87% 88% 85% 89% 85% 87% 88% 89% 89% 86% 87% 88% 89% 89% 89% 85% 85% 87% 88% 88% 90% 88% 87% 88% 85% 87% 88% 88% 86% 88% 86% 85% 89% 91% 90% 89% 87% 83% 90% 88% 86% 89% 87% 89% 87% 90% 87% 84% 88% 87% 88% 84% 87% 87% 84% 89% 89% 87% 90% 87% 89% 86% 88% 87% 88% 86% 89% 87% 88% 82% 89% 83% 86% 88% 86% 88% 88% 87% 86% 86% 88% 81% 89% 85% 90% 86% 89% 87% 87% 89% 86% 88% 86% 89% 87% 88% 88% 87% 87% 87% 89% 87% 85% 86% 86% 86% 85% 87% 87% 85% 85% 87% 87% 88% 88% 88% 89% 89% 86% 89% 87% 88% 85% 84% 85% 88% 87% 86% 86% 88% 86% 88% 86% 87% 89% 86% 88% 88% 89% 90% 88% 87% 87% 87% 88% 88% 87% 89%) -> (93k/230k) -> write(77% 79% 78% 77% 78% 77%)
|
||||
0:07:57 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 953M 96% 3.4M/s ] rels: [ 0 0% 0/s ] features: [ 2.5B 5.9M/s ] 198G blocks: [ 42k 98% 48/s ]
|
||||
cpus: 168.7 gc: 6% heap: 191G/214G direct: 58M postGC: 150G relInfo: 573M mpGeoms: 10G
|
||||
read( 6%) -> (88/262) -> process(86% 89% 90% 89% 88% 88% 88% 91% 89% 90% 88% 90% 89% 90% 89% 86% 90% 88% 89% 88% 90% 87% 88% 89% 89% 89% 89% 88% 87% 90% 89% 89% 86% 89% 89% 87% 89% 90% 88% 89% 88% 89% 90% 88% 89% 90% 86% 89% 90% 88% 90% 89% 88% 91% 89% 89% 90% 90% 88% 87% 87% 88% 87% 88% 88% 88% 90% 88% 88% 87% 90% 89% 88% 90% 88% 88% 89% 88% 91% 89% 87% 86% 88% 88% 88% 88% 88% 88% 88% 87% 89% 88% 88% 87% 89% 90% 90% 88% 87% 89% 90% 88% 89% 89% 88% 91% 90% 86% 84% 88% 87% 89% 88% 88% 90% 88% 89% 86% 89% 86% 89% 88% 87% 89% 89% 90% 89% 88% 87% 88% 87% 89% 90% 88% 90% 90% 90% 89% 88% 87% 89% 89% 89% 90% 90% 87% 90% 90% 87% 89% 89% 88% 88% 90% 89% 88% 89% 91% 88% 88% 87% 89% 90% 88% 89% 88% 87% 89% 88% 90% 89% 89% 88% 88%) -> (92k/230k) -> write(78% 78% 79% 77% 78% 78%)
|
||||
0:08:07 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 987M 99% 3.3M/s ] rels: [ 0 0% 0/s ] features: [ 2.6B 5.8M/s ] 199G blocks: [ 42k 99% 47/s ]
|
||||
cpus: 164.2 gc: 6% heap: 187G/214G direct: 58M postGC: 146G relInfo: 573M mpGeoms: 10G
|
||||
read( 6%) -> (88/262) -> process(86% 88% 87% 86% 86% 87% 85% 87% 76% 91% 85% 86% 86% 84% 85% 85% 88% 88% 85% 88% 87% 90% 82% 85% 82% 89% 87% 82% 86% 84% 86% 83% 86% 84% 80% 82% 82% 86% 87% 82% 86% 85% 86% 89% 89% 87% 89% 87% 89% 86% 87% 88% 82% 87% 80% 88% 89% 85% 88% 77% 87% 80% 87% 86% 83% 83% 85% 86% 86% 89% 85% 86% 85% 86% 83% 86% 87% 86% 87% 86% 88% 85% 85% 87% 85% 86% 90% 86% 85% 85% 85% 85% 86% 81% 87% 87% 85% 88% 85% 85% 78% 86% 87% 88% 85% 86% 87% 84% 87% 84% 83% 87% 84% 87% 85% 84% 87% 88% 86% 88% 87% 89% 82% 87% 73% 88% 88% 84% 87% 83% 85% 86% 85% 87% 86% 87% 84% 89% 86% 87% 86% 78% 86% 86% 83% 88% 87% 87% 81% 88% 81% 86% 81% 88% 84% 87% 87% 86% 83% 85% 87% 87% 86% 85% 86% 84% 86% 80% 87% 84% 90% 88% 84% 88%) -> (95k/230k) -> write(73% 73% 73% 72% 73% 73%)
|
||||
0:08:11 INF [osm_pass2:process] - Finished ways: 993,607,585 (3M/s) in 5m23s cpu:14h4m53s gc:18s avg:156.8
|
||||
0:08:17 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 993M 100% 620k/s ] rels: [ 712k 6% 70k/s ] features: [ 2.6B 1.6M/s ] 201G blocks: [ 42k 99% 17/s ]
|
||||
cpus: 131.3 gc: 5% heap: 153G/214G direct: 58M postGC: 144G relInfo: 573M mpGeoms: 10G
|
||||
read( 1%) -> (88/262) -> process(76% 81% 75% 75% 60% 92% 79% 78% 75% 74% 66% 58% 88% 73% 74% 62% 53% 78% 69% 77% 80% 90% 67% 71% 85% 76% 72% 79% 59% 68% 68% 67% 75% 70% 63% 80% 75% 81% 76% 90% 79% 72% 62% 59% 68% 56% 76% 76% 72% 56% 79% 60% 71% 57% 63% 74% 69% 74% 62% 80% 59% 64% 60% 56% 67% 73% 76% 73% 59% 59% 52% 78% 77% 84% 76% 66% 88% 72% 70% 55% 78% 59% 69% 72% 63% 81% 73% 71% 67% 60% 70% 74% 66% 74% 69% 82% 74% 54% 55% 62% 59% 77% 74% 75% 70% 79% 61% 57% 53% 74% 71% 78% 78% 58% 57% 60% 54% 63% 76% 71% 62% 72% 72% 85% 73% 57% 70% 81% 71% 63% 80% 84% 75% 76% 71% 57% 70% 69% 55% 77% 62% 79% 78% 65% 64% 57% 65% 76% 66% 72% 76% 64% 61% 74% 62% 60% 79% 60% 78% 76% 61% 74% 54% 61% 72% 68% 57% 68% 75% 81% 72% 73% 56% 74%) -> (86k/230k) -> write(18% 18% 19% 18% 19% 17%)
|
||||
0:08:27 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 993M 100% 0/s ] rels: [ 1.8M 16% 111k/s ] features: [ 2.6B 744k/s ] 204G blocks: [ 42k 99% <1/s ]
|
||||
cpus: 168.7 gc: 5% heap: 115G/214G direct: 58M postGC: 112G relInfo: 573M mpGeoms: 10G
|
||||
read( 0%) -> (88/262) -> process(92% 94% 92% 92% 93% 94% 94% 92% 94% 91% 92% 94% 94% 92% 93% 93% 93% 92% 93% 93% 94% 91% 92% 90% 90% 93% 94% 92% 93% 93% 92% 92% 93% 91% 94% 93% 94% 92% 93% 92% 93% 92% 93% 94% 94% 91% 92% 93% 94% 93% 94% 92% 91% 93% 92% 93% 92% 91% 92% 93% 92% 91% 92% 93% 91% 93% 93% 94% 94% 93% 94% 93% 93% 93% 93% 94% 93% 92% 93% 94% 93% 92% 93% 91% 93% 94% 91% 92% 92% 93% 93% 92% 94% 93% 92% 92% 93% 92% 92% 92% 92% 93% 92% 91% 92% 93% 94% 92% 93% 93% 92% 92% 92% 93% 90% 93% 93% 93% 93% 93% 91% 93% 94% 93% 93% 92% 93% 94% 93% 94% 94% 92% 91% 92% 94% 93% 91% 93% 92% 93% 92% 94% 93% 92% 92% 91% 94% 92% 93% 94% 93% 92% 93% 94% 92% 93% 93% 92% 93% 94% 91% 92% 93% 94% 93% 94% 92% 93% 93% 93% 94% 93% 93% 92%) -> (91k/230k) -> write( 9% 11% 9% 10% 9% 11%)
|
||||
0:08:37 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 993M 100% 0/s ] rels: [ 3M 26% 115k/s ] features: [ 2.6B 751k/s ] 204G blocks: [ 42k 99% <1/s ]
|
||||
cpus: 171.4 gc: 2% heap: 190G/214G direct: 58M postGC: 112G relInfo: 573M mpGeoms: 10G
|
||||
read( 0%) -> (88/262) -> process(95% 96% 93% 97% 95% 97% 97% 95% 95% 96% 96% 95% 96% 95% 96% 96% 96% 95% 97% 97% 95% 95% 96% 95% 94% 97% 97% 97% 97% 93% 96% 96% 95% 97% 96% 94% 94% 96% 95% 96% 97% 96% 94% 97% 94% 96% 96% 96% 95% 96% 97% 96% 96% 95% 96% 96% 93% 95% 94% 95% 95% 95% 96% 96% 96% 94% 95% 95% 97% 96% 95% 96% 95% 96% 95% 95% 96% 93% 95% 95% 96% 97% 97% 95% 96% 94% 96% 96% 97% 96% 95% 95% 97% 95% 96% 97% 95% 96% 97% 96% 95% 96% 96% 95% 96% 95% 96% 95% 97% 95% 94% 95% 96% 96% 96% 96% 94% 96% 95% 96% 96% 96% 95% 96% 96% 96% 96% 97% 95% 96% 96% 95% 97% 96% 95% 95% 97% 97% 96% 95% 96% 96% 96% 94% 96% 96% 95% 96% 96% 95% 96% 96% 96% 97% 95% 93% 96% 97% 96% 96% 95% 96% 96% 96% 97% 96% 94% 93% 96% 97% 96% 97% 96% 97%) -> (138k/230k) -> write(10% 10% 10% 10% 10% 10%)
|
||||
0:08:47 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 993M 100% 0/s ] rels: [ 4.2M 36% 119k/s ] features: [ 2.6B 1.1M/s ] 204G blocks: [ 42k 99% 3/s ]
|
||||
cpus: 170.8 gc: 2% heap: 182G/214G direct: 58M postGC: 145G relInfo: 573M mpGeoms: 10G
|
||||
read( 0%) -> (88/262) -> process(96% 95% 95% 93% 95% 94% 95% 94% 95% 96% 95% 94% 95% 95% 95% 95% 93% 95% 94% 94% 96% 96% 93% 94% 95% 95% 96% 95% 96% 94% 95% 95% 94% 96% 94% 96% 94% 96% 95% 94% 95% 95% 96% 96% 95% 95% 96% 95% 94% 96% 96% 94% 95% 93% 95% 94% 95% 96% 95% 95% 96% 94% 95% 95% 95% 95% 96% 94% 96% 94% 95% 96% 96% 96% 95% 95% 95% 95% 94% 96% 96% 96% 94% 93% 95% 93% 95% 96% 95% 96% 95% 95% 96% 95% 96% 95% 94% 94% 96% 94% 95% 96% 94% 94% 96% 95% 95% 95% 94% 94% 95% 95% 95% 96% 94% 96% 95% 93% 94% 96% 95% 95% 95% 96% 96% 95% 95% 96% 93% 95% 96% 95% 96% 95% 96% 95% 96% 96% 94% 95% 93% 94% 95% 95% 94% 94% 94% 95% 94% 94% 95% 95% 95% 95% 96% 95% 94% 96% 96% 94% 95% 96% 95% 95% 94% 94% 95% 95% 95% 95% 96% 94% 96% 96%) -> (104k/230k) -> write(11% 11% 11% 11% 11% 11%)
|
||||
0:08:58 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 993M 100% 0/s ] rels: [ 5.4M 46% 120k/s ] features: [ 2.6B 1.3M/s ] 208G blocks: [ 42k 99% 5/s ]
|
||||
cpus: 169.5 gc: 3% heap: 178G/214G direct: 58M postGC: 112G relInfo: 573M mpGeoms: 10G
|
||||
read( 1%) -> (88/262) -> process(95% 95% 95% 95% 95% 94% 95% 94% 94% 95% 95% 95% 95% 95% 95% 94% 95% 94% 94% 94% 94% 95% 93% 94% 94% 94% 95% 95% 96% 95% 94% 95% 93% 94% 94% 93% 95% 93% 92% 95% 96% 95% 96% 94% 93% 95% 96% 93% 95% 94% 94% 94% 93% 95% 94% 94% 96% 95% 93% 93% 96% 94% 96% 94% 95% 93% 93% 94% 96% 96% 95% 95% 95% 94% 95% 95% 93% 95% 96% 95% 95% 94% 95% 94% 95% 95% 95% 95% 92% 94% 92% 93% 94% 95% 96% 93% 95% 93% 95% 94% 93% 94% 95% 95% 95% 94% 95% 94% 94% 95% 95% 94% 95% 94% 95% 94% 95% 96% 95% 95% 94% 95% 94% 95% 93% 93% 96% 95% 95% 95% 94% 94% 95% 94% 94% 95% 94% 95% 95% 94% 95% 94% 96% 93% 95% 93% 94% 93% 93% 95% 95% 94% 96% 95% 95% 94% 93% 95% 93% 94% 94% 93% 95% 94% 95% 93% 95% 94% 95% 92% 95% 96% 93% 94%) -> (86k/230k) -> write(15% 12% 15% 12% 12% 12%)
|
||||
0:09:08 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 993M 100% 0/s ] rels: [ 6.6M 57% 124k/s ] features: [ 2.6B 1.2M/s ] 212G blocks: [ 42k 99% 3/s ]
|
||||
cpus: 169.3 gc: 3% heap: 164G/214G direct: 54M postGC: 112G relInfo: 573M mpGeoms: 10G
|
||||
read( -%) -> (59/262) -> process(94% 95% 95% 94% 93% 95% 94% 91% 95% 95% 92% 95% 95% 95% 93% 95% 93% 96% 94% 96% 96% 95% 94% 95% 94% 94% 95% 94% 95% 96% 95% 94% 93% 94% 94% 95% 93% 94% 94% 92% 96% 93% 95% 95% 96% 94% 94% 93% 95% 95% 95% 92% 94% 94% 94% 94% 94% 95% 94% 94% 93% 94% 95% 95% 95% 94% 94% 95% 95% 91% 95% 93% 96% 94% 95% 93% 94% 94% 94% 93% 96% 94% 95% 91% 95% 94% 93% 92% 95% 92% 95% 93% 94% 94% 94% 94% 94% 95% 94% 95% 91% 94% 95% 92% 95% 95% 94% 94% 94% 93% 95% 94% 92% 94% 95% 95% 95% 94% 95% 94% 93% 90% 94% 95% 93% 93% 94% 95% 93% 94% 94% 94% 93% 94% 91% 94% 95% 95% 93% 92% 93% 93% 93% 95% 94% 92% 94% 96% 92% 92% 94% 94% 96% 94% 94% 95% 94% 94% 92% 93% 93% 94% 94% 94% 94% 91% 92% 93% 95% 95% 93% 94% 93% 95%) -> (94k/230k) -> write(11% 14% 11% 13% 14% 11%)
|
||||
0:09:18 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 993M 100% 0/s ] rels: [ 8M 69% 135k/s ] features: [ 2.7B 1.5M/s ] 214G blocks: [ 42k 100% 4/s ]
|
||||
cpus: 170.6 gc: 3% heap: 154G/214G direct: 54M postGC: 148G relInfo: 573M mpGeoms: 10G
|
||||
read( -%) -> (14/262) -> process(95% 95% 94% 94% 95% 93% 95% 94% 95% 95% 94% 94% 95% 93% 95% 94% 94% 94% 95% 96% 95% 94% 93% 95% 95% 96% 95% 96% 95% 95% 95% 95% 94% 95% 95% 93% 96% 94% 96% 95% 95% 95% 95% 96% 93% 93% 95% 96% 94% 95% 95% 94% 93% 95% 93% 95% 94% 94% 94% 93% 95% 94% 94% 93% 94% 96% 95% 94% 93% 94% 93% 92% 95% 94% 95% 96% 96% 95% 95% 95% 95% 94% 95% 95% 94% 95% 93% 94% 94% 95% 94% 93% 95% 95% 94% 94% 93% 93% 95% 94% 95% 95% 96% 95% 95% 95% 94% 95% 96% 94% 95% 96% 95% 96% 95% 94% 95% 93% 94% 93% 94% 94% 95% 93% 94% 96% 94% 95% 94% 95% 93% 94% 95% 95% 94% 95% 92% 94% 95% 94% 95% 95% 95% 95% 95% 95% 96% 94% 94% 95% 94% 94% 94% 93% 94% 94% 94% 95% 94% 94% 95% 94% 93% 94% 96% 92% 94% 95% 94% 95% 95% 94% 94% 95%) -> (80k/230k) -> write(15% 16% 16% 16% 16% 17%)
|
||||
0:09:28 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 993M 100% 0/s ] rels: [ 9.4M 80% 138k/s ] features: [ 2.7B 806k/s ] 214G blocks: [ 43k 100% 2/s ]
|
||||
cpus: 170.3 gc: 3% heap: 152G/214G direct: 54M postGC: 112G relInfo: 573M mpGeoms: 10G
|
||||
read( -%) -> (0/262) -> process(96% 96% 96% 95% 94% 95% 96% 95% 96% 95% 96% 95% 96% 94% 95% 95% 96% 96% 96% 96% 96% 95% 96% 94% 96% 96% 95% 95% 96% 95% 94% 95% 96% 96% 95% 96% 95% 96% 96% 95% 95% 94% 96% 95% 96% 95% 95% 95% 96% 95% 96% 95% 95% 94% 95% 95% 96% 95% 96% 94% 95% 95% 94% 96% 96% 94% 94% 95% 94% 96% 96% 95% 95% 95% 96% 96% 96% 96% 95% 95% 94% 95% 96% 95% 96% 95% 95% 94% 95% 94% 96% 94% 94% 95% 94% 96% 95% 93% 95% 96% 95% 95% 95% 93% 94% 96% 96% 95% 95% 95% 96% 96% 95% 95% 96% 96% 95% 95% 93% 95% 94% 96% 95% 94% 95% 95% 96% 96% 95% 96% 94% 96% 96% 95% 95% 94% 97% 96% 95% 94% 96% 95% 95% 96% 95% 95% 95% 96% 95% 96% 96% 96% 94% 94% 95% 96% 96% 95% 96% 95% 95% 96% 95% 96% 96% 94% 96% 95% 94% 96% 95% 95% 95% 94%) -> (86k/230k) -> write( 9% 10% 10% 9% 10% 9%)
|
||||
0:09:38 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 993M 100% 0/s ] rels: [ 10M 92% 139k/s ] features: [ 2.7B 766k/s ] 217G blocks: [ 43k 100% 6/s ]
|
||||
cpus: 170.7 gc: 2% heap: 138G/214G direct: 54M postGC: 111G relInfo: 573M mpGeoms: 10G
|
||||
read( -%) -> (0/262) -> process(97% 95% 95% 94% 96% 96% 96% 95% 96% 96% 97% 95% 95% 96% 96% 96% 96% 94% 95% 95% 95% 95% 96% 95% 95% 96% 96% 96% 95% 96% 96% 94% 96% 96% 95% 95% 97% 96% 96% 94% 95% 96% 96% 95% 96% 96% 95% 96% 97% 94% 95% 96% 95% 96% 96% 95% 95% 96% 96% 95% 96% 96% 96% 96% 96% 95% 95% 95% 95% 96% 95% 96% 95% 94% 96% 95% 94% 92% 94% 96% 95% 94% 96% 94% 97% 96% 95% 95% 95% 95% 95% 93% 96% 97% 95% 94% 95% 95% 94% 94% 96% 94% 95% 95% 95% 96% 94% 95% 97% 96% 97% 96% 96% 96% 96% 96% 96% 96% 96% 96% 96% 95% 96% 94% 97% 95% 95% 96% 96% 96% 92% 96% 95% 95% 92% 96% 95% 95% 96% 95% 97% 96% 95% 95% 96% 96% 95% 96% 96% 96% 96% 96% 96% 95% 96% 95% 95% 94% 95% 96% 96% 95% 95% 93% 97% 96% 96% 93% 95% 95% 96% 96% 95% 94%) -> (92k/230k) -> write(13% 10% 14% 10% 10% 9%)
|
||||
0:09:47 INF [osm_pass2:process] - Finished relations: 11,749,466 (122k/s) in 1m36s cpu:4h27m5s gc:3s avg:166.8
|
||||
0:09:48 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 993M 100% 0/s ] rels: [ 11M 100% 88k/s ] features: [ 2.7B 463k/s ] 219G blocks: [ 43k 100% 9/s ]
|
||||
cpus: 127.3 gc: 1% heap: 182G/214G direct: 54M postGC: 110G relInfo: 573M mpGeoms: 10G
|
||||
read( -%) -> (0/262) -> process( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% 80% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%) -> (88k/230k) -> write( 6% 6% 6% 6% 9% 6%)
|
||||
0:09:49 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 993M 100% 0/s ] rels: [ 11M 100% <1/s ] features: [ 2.7B 60k/s ] 212G blocks: [ 43k 100% 0/s ]
|
||||
cpus: 1.1 gc: 0% heap: 184G/214G direct: 54M postGC: 110G relInfo: 573M mpGeoms: 10G
|
||||
read( -%) -> (0/262) -> process( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%) -> (0/230k) -> write( -% -% -% -% -% -%)
|
||||
0:09:49 DEB [osm_pass2] - Processed 43,182 blocks:
|
||||
0:09:49 DEB [osm_pass2] - nodes: 8,876,780,887 (149M/s) in 59s cpu:2h1m37s gc:4s avg:123.1
|
||||
0:09:49 DEB [osm_pass2] - ways: 993,607,585 (3M/s) in 5m23s cpu:14h4m53s gc:18s avg:156.8
|
||||
0:09:49 DEB [osm_pass2] - relations: 11,749,466 (122k/s) in 1m36s cpu:4h27m5s gc:3s avg:166.8
|
||||
0:09:49 INF [osm_pass2] - Finished in 8m1s cpu:20h33m34s gc:25s avg:154
|
||||
0:09:49 INF [osm_pass2] - read 1x(13% 1m2s wait:6m2s done:51s)
|
||||
0:09:49 INF [osm_pass2] - process 174x(81% 6m28s block:14s wait:26s done:2s)
|
||||
0:09:49 INF [osm_pass2] - write 6x(64% 5m6s wait:2m17s)
|
||||
0:09:49 INF [boundaries] -
|
||||
0:09:49 INF [boundaries] - Starting...
|
||||
0:09:49 INF [boundaries] - Creating polygons for 218 boundaries
|
||||
0:09:54 INF [boundaries] - Finished creating 218 country polygons
|
||||
0:09:55 WAR [boundaries] - no left or right country for border between OSM country relations: [51477] around https://www.openstreetmap.org/#map=10/54.19118/7.52130
|
||||
0:09:55 WAR [boundaries] - no left or right country for border between OSM country relations: [51477] around https://www.openstreetmap.org/#map=10/54.61356/12.41358
|
||||
0:09:57 WAR [boundaries] - no left or right country for border between OSM country relations: [51477] around https://www.openstreetmap.org/#map=10/50.01340/6.13601
|
||||
0:09:57 WAR [boundaries] - no left or right country for border between OSM country relations: [51477] around https://www.openstreetmap.org/#map=10/49.77642/6.51023
|
||||
0:09:58 WAR [boundaries] - no left or right country for border between OSM country relations: [51477, 16239] around https://www.openstreetmap.org/#map=10/47.38554/10.16937
|
||||
0:09:58 WAR [boundaries] - no left or right country for border between OSM country relations: [51477, 16239] around https://www.openstreetmap.org/#map=10/47.67866/12.16969
|
||||
0:09:58 WAR [boundaries] - no left or right country for border between OSM country relations: [51477] around https://www.openstreetmap.org/#map=10/53.42387/6.88641
|
||||
0:09:58 INF [boundaries] - Finished in 9s cpu:11s avg:1.3
|
||||
0:09:58 INF [agg_stop] -
|
||||
0:09:58 INF [agg_stop] - Starting...
|
||||
0:09:58 INF [agg_stop] - Processing 28687 agg_stop sets
|
||||
0:09:58 INF [agg_stop] - Finished in 0.3s cpu:0.7s avg:2.6
|
||||
0:09:58 INF - Deleting node.db to make room for output file
|
||||
0:09:58 INF [sort] -
|
||||
0:09:58 INF [sort] - Starting...
|
||||
0:09:58 INF [sort] - Grouped 198 chunks into 179
|
||||
0:10:09 INF [sort] - chunks: [ 7 / 179 4% ] 217G
|
||||
cpus: 50.5 gc: 12% heap: 61G/214G direct: 54M postGC: 61G
|
||||
-> (137/215) -> worker(18% 19% 19% 18% 18% 18% 19% 16% 16% 17% 8% 17% 17% 5% 5% 5% 5% 2% 5% 5% 5% 5% 2% 3% 1% 5% 5% 0% 4% 1% 0% 0% 0% 0% 0%)
|
||||
0:10:19 INF [sort] - chunks: [ 33 / 179 18% ] 213G
|
||||
cpus: 20.8 gc: 5% heap: 39G/214G direct: 54M postGC: 39G
|
||||
-> (111/215) -> worker( 2% 4% 1% 1% 1% 0% 0% 0% 1% 0% 7% 0% 0% 11% 13% 13% 13% 12% 12% 13% 11% 11% 12% 13% 13% 13% 12% 15% 11% 15% 19% 18% 15% 15% 4%)
|
||||
0:10:30 INF [sort] - chunks: [ 45 / 179 25% ] 215G
|
||||
cpus: 27.7 gc: 7% heap: 62G/214G direct: 54M postGC: 62G
|
||||
-> (99/215) -> worker(15% 12% 11% 15% 15% 16% 17% 15% 17% 16% 2% 16% 16% 14% 12% 3% 3% 0% 0% 11% 2% 0% 0% 0% 0% 3% 0% 0% 1% 0% 0% 0% 0% 0% 12%)
|
||||
0:10:41 INF [sort] - chunks: [ 62 / 179 35% ] 214G
|
||||
cpus: 26 gc: 4% heap: 39G/214G direct: 54M postGC: 33G
|
||||
-> (82/215) -> worker( 0% 1% 0% 0% 0% 0% 0% 0% 0% 0% 2% 0% 0% 0% 0% 13% 13% 16% 16% 0% 15% 14% 14% 17% 17% 13% 15% 15% 15% 16% 3% 4% 4% 3% 0%)
|
||||
0:10:54 INF [sort] - chunks: [ 73 / 179 41% ] 217G
|
||||
cpus: 27.2 gc: 5% heap: 35G/214G direct: 54M postGC: 35G
|
||||
-> (71/215) -> worker(14% 15% 15% 15% 16% 16% 15% 1% 2% 13% 14% 3% 16% 10% 0% 0% 0% 0% 0% 3% 0% 0% 0% 0% 0% 0% 0% 0% 0% 1% 12% 11% 11% 13% 11%)
|
||||
0:11:04 INF [sort] - chunks: [ 92 / 179 51% ] 214G
|
||||
cpus: 26.4 gc: 5% heap: 20G/214G direct: 54M postGC: 20G
|
||||
-> (52/215) -> worker( 0% 0% 0% 0% 0% 0% 0% 14% 15% 0% 0% 14% 0% 0% 18% 19% 18% 19% 18% 14% 19% 2% 18% 3% 3% 18% 15% 1% 18% 1% 0% 0% 0% 0% 0%)
|
||||
0:11:15 INF [sort] - chunks: [ 108 / 179 60% ] 216G
|
||||
cpus: 32.5 gc: 7% heap: 59G/214G direct: 54M postGC: 59G
|
||||
-> (36/215) -> worker(16% 13% 11% 16% 17% 17% 3% 0% 2% 17% 16% 1% 17% 3% 0% 0% 0% 0% 0% 2% 0% 14% 0% 11% 14% 0% 0% 14% 0% 14% 16% 13% 17% 16% 16%)
|
||||
0:11:26 INF [sort] - chunks: [ 122 / 179 68% ] 216G
|
||||
cpus: 27.7 gc: 5% heap: 38G/214G direct: 54M postGC: 38G
|
||||
-> (22/215) -> worker( 0% 0% 0% 0% 0% 0% 14% 16% 15% 0% 0% 12% 0% 14% 13% 16% 18% 11% 8% 13% 14% 2% 4% 0% 1% 16% 17% 0% 17% 3% 0% 0% 0% 0% 0%)
|
||||
0:11:37 INF [sort] - chunks: [ 144 / 179 80% ] 215G
|
||||
cpus: 32.6 gc: 6% heap: 25G/214G direct: 54M postGC: 25G
|
||||
-> (0/215) -> worker(16% 18% 18% 12% -72% 5% 0% 0% 2% 5% 14% 0% -% -% 0% 0% 0% 0% 0% 2% 0% 13% 14% 18% 17% 0% 0% 12% 0% 15% 18% 15% 19% 15% 15%)
|
||||
0:11:47 INF [sort] - chunks: [ 162 / 179 91% ] 214G
|
||||
cpus: 33.3 gc: 8% heap: 65G/214G direct: 54M postGC: 65G
|
||||
-> (0/215) -> worker( 0% 0% 0% 0% -% -% -% -% -% -% 0% -% -% -% -% -% -% 17% -% -% -% 5% -62% 1% 3% -% -% 4% -% -66% 1% 0% 0% 4% 0%)
|
||||
0:11:54 INF [sort] - chunks: [ 179 / 179 100% ] 212G
|
||||
cpus: 32.7 gc: 5% heap: 37G/214G direct: 54M postGC: 36G
|
||||
-> (0/215) -> worker( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%)
|
||||
0:11:54 INF [sort] - Finished in 1m56s cpu:58m44s gc:7s avg:30.5
|
||||
0:11:54 INF [sort] - worker 35x(8% 9s wait:1m18s done:7s)
|
||||
0:11:54 INF - read:680s write:352s sort:56s
|
||||
0:11:54 INF [archive] -
|
||||
0:11:54 INF [archive] - Starting...
|
||||
0:11:56 INF [archive:write] - Starting z0
|
||||
0:11:56 INF [archive:write] - Finished z0 in 0s cpu:0s avg:8.8, now starting z1
|
||||
0:11:56 INF [archive:write] - Finished z1 in 0s cpu:1s avg:237.3, now starting z2
|
||||
0:11:56 INF [archive:write] - Finished z2 in 0s cpu:5s avg:182.8, now starting z3
|
||||
0:11:56 INF [archive:write] - Finished z3 in 0.1s cpu:9s avg:109.2, now starting z4
|
||||
0:11:57 INF [archive:write] - Finished z4 in 0.8s cpu:2m5s avg:152.4, now starting z5
|
||||
0:11:57 INF [archive:write] - Finished z5 in 0s cpu:6s avg:194.1, now starting z6
|
||||
0:12:00 INF [archive:write] - Finished z6 in 3s cpu:8m24s avg:165.9, now starting z7
|
||||
0:12:05 INF [archive] - features: [ 54M 2% 5.4M/s ] 212G tiles: [ 16k 1.6k/s ] 154M
|
||||
cpus: 157.6 gc: 14% heap: 48G/214G direct: 54M postGC: 47G
|
||||
read(79% 78%) -> merge(82%) -> (0/10k) -> encode(81% 79% 82% 81% 78% 79% 80% 78% 79% 79% 80% 78% 76% 79% 80% 77% 83% 78% 79% 78% 82% 80% 79% 80% 80% 77% 79% 83% 81% 76% 80% 80% 79% 78% 81% 79% 80% 79% 79% 80% 79% 79% 79% 79% 77% 78% 80% 79% 76% 78% 78% 79% 78% 76% 78% 81% 79% 79% 79% 81% 78% 78% 78% 79% 83% 80% 79% 77% 80% 79% 79% 79% 78% 78% 77% 78% 79% 78% 80% 77% 78% 76% 77% 78% 77% 79% 79% 78% 78% 80% 76% 80% 76% 78% 79% 78% 79% 80% 78% 78% 75% 78% 75% 80% 76% 80% 78% 79% 78% 78% 79% 77% 79% 76% 75% 79% 79% 76% 77% 79% 77% 76% 78% 80% 76% 78% 76% 79% 77% 78% 77% 76% 78% 79% 81% 77% 77% 77% 77% 77% 79% 79% 76% 73% 78% 77% 79% 78% 78% 80% 82% 78% 78% 76% 79% 79% 78% 77% 77% 79% 80% 77% 77% 82% 78% 78% 76% 79% 77% 76% 76% 76% 77% 77% 80% 80% 79% 78%) -> (1.6k/10k) -> write( 2%)
|
||||
last tile: 7/64/42 (z7 85%) https://onthegomap.github.io/planetiler-demo/#7.5/51.60962/1.40625
|
||||
0:12:05 INF [archive:write] - Finished z7 in 5s cpu:12m3s avg:156.9, now starting z8
|
||||
0:12:11 INF [archive:write] - Finished z8 in 6s cpu:16m25s avg:154, now starting z9
|
||||
0:12:15 INF [archive] - features: [ 115M 4% 6M/s ] 212G tiles: [ 253k 23k/s ] 1.1G
|
||||
cpus: 144.2 gc: 8% heap: 59G/214G direct: 54M postGC: 47G
|
||||
read(91% 91%) -> merge(87%) -> (110/10k) -> encode(74% 73% 76% 76% 68% 76% 74% 73% 78% 75% 71% 73% 67% 70% 73% 70% 70% 73% 71% 71% 77% 76% 74% 75% 83% 73% 76% 72% 75% 71% 74% 77% 77% 73% 74% 77% 74% 74% 72% 78% 77% 79% 74% 79% 76% 81% 73% 74% 73% 74% 72% 73% 75% 73% 83% 72% 69% 70% 81% 79% 76% 74% 78% 80% 78% 75% 85% 72% 76% 76% 74% 72% 75% 77% 76% 75% 75% 78% 75% 73% 70% 69% 78% 78% 72% 74% 73% 73% 76% 77% 81% 79% 86% 76% 70% 75% 71% 75% 76% 74% 74% 76% 79% 73% 79% 78% 72% 77% 69% 74% 77% 77% 76% 78% 75% 77% 71% 74% 77% 73% 75% 76% 73% 81% 72% 81% 76% 74% 78% 74% 77% 74% 77% 72% 72% 74% 74% 76% 75% 72% 69% 78% 76% 73% 78% 81% 77% 76% 75% 75% 76% 75% 73% 75% 77% 77% 73% 71% 75% 75% 77% 76% 77% 77% 75% 81% 75% 69% 74% 73% 76% 72% 75% 78% 78% 76% 75% 69%) -> (688/10k) -> write(11%)
|
||||
last tile: 9/266/171 (z9 85%) https://onthegomap.github.io/planetiler-demo/#9.5/50.9579/7.38281
|
||||
0:12:18 INF [archive:write] - Finished z9 in 7s cpu:16m11s avg:147.1, now starting z10
|
||||
0:12:25 INF [archive] - features: [ 181M 7% 6.4M/s ] 212G tiles: [ 495k 23k/s ] 1.6G
|
||||
cpus: 132.9 gc: 7% heap: 96G/214G direct: 54M postGC: 55G
|
||||
read(78% 80%) -> merge(86%) -> (46/10k) -> encode(67% 70% 69% 66% 73% 73% 70% 68% 68% 66% 66% 74% 66% 70% 72% 66% 67% 69% 68% 67% 69% 66% 71% 71% 70% 69% 68% 69% 68% 70% 68% 70% 72% 70% 68% 72% 67% 70% 65% 67% 69% 68% 69% 72% 69% 67% 76% 70% 67% 67% 68% 71% 67% 65% 68% 67% 69% 69% 68% 67% 68% 67% 69% 70% 68% 67% 71% 65% 66% 67% 66% 70% 72% 65% 68% 70% 68% 67% 69% 92% 72% 68% 64% 72% 67% 70% 67% 92% 68% 68% 75% 67% 69% 66% 68% 68% 71% 64% 66% 71% 66% 65% 70% 65% 67% 69% 88% 69% 67% 69% 70% 70% 70% 68% 69% 72% 74% 70% 70% 69% 66% 71% 65% 63% 71% 69% 67% 75% 68% 68% 65% 64% 71% 70% 70% 70% 66% 69% 69% 71% 68% 67% 74% 69% 72% 70% 65% 66% 65% 68% 67% 70% 70% 69% 66% 69% 72% 69% 70% 69% 70% 67% 70% 72% 67% 70% 68% 65% 70% 72% 65% 72% 64% 71% 65% 70% 70% 70%) -> (6k/10k) -> write( 6%)
|
||||
last tile: 10/172/399 (z10 20%) https://onthegomap.github.io/planetiler-demo/#10.5/36.73875/-119.35547
|
||||
0:12:33 INF [archive:write] - Finished z10 in 15s cpu:23m6s gc:1s avg:92.2, now starting z11
|
||||
0:12:35 INF [archive] - features: [ 245M 9% 6.3M/s ] 212G tiles: [ 3.6M 307k/s ] 4.2G
|
||||
cpus: 74.1 gc: 8% heap: 31G/214G direct: 54M postGC: 19G
|
||||
read(60% 56%) -> merge(70%) -> (0/10k) -> encode(37% 36% 35% 35% 36% 30% 40% 38% 35% 37% 39% 34% 31% 35% 37% 28% 34% 35% 40% 37% 37% 33% 37% 36% 33% 31% 33% 34% 34% 34% 34% 30% 32% 32% 29% 32% 52% 35% 33% 39% 40% 33% 36% 33% 35% 32% 31% 34% 32% 34% 39% 34% 34% 39% 36% 38% 37% 33% 32% 32% 35% 35% 32% 30% 34% 32% 35% 35% 31% 36% 33% 36% 35% 31% 32% 39% 38% 34% 35% 71% 30% 31% 35% 32% 32% 36% 31% 38% 35% 34% 33% 34% 28% 33% 31% 31% 34% 37% 33% 35% 42% 30% 36% 32% 32% 30% 32% 33% 31% 33% 36% 31% 32% 30% 34% 31% 36% 33% 59% 35% 33% 31% 36% 32% 35% 37% 30% 39% 30% 35% 38% 29% 32% 36% 32% 31% 35% 29% 35% 34% 36% 36% 35% 38% 33% 31% 31% 41% 38% 32% 50% 32% 34% 53% 33% 32% 51% 38% 34% 33% 33% 38% 33% 34% 33% 35% 37% 29% 30% 33% 31% 34% 32% 37% 31% 37% 41% 34%) -> (2.9k/10k) -> write(29%)
|
||||
last tile: 11/1730/648 (z11 78%) https://onthegomap.github.io/planetiler-demo/#11.5/54.92711/124.18945
|
||||
0:12:39 INF [archive:write] - Finished z11 in 7s cpu:8m23s avg:75.7, now starting z12
|
||||
0:12:45 INF [archive] - features: [ 318M 12% 7.2M/s ] 212G tiles: [ 7.3M 371k/s ] 7.5G
|
||||
cpus: 59.8 gc: 2% heap: 69G/214G direct: 54M postGC: 15G
|
||||
read(60% 60%) -> merge(71%) -> (0/10k) -> encode(28% 32% 33% 31% 28% 38% 35% 28% 35% 32% 31% 29% 28% 30% 30% 34% 33% 30% 34% 26% 35% 33% 36% 31% 27% 32% 32% 38% 31% 42% 30% 33% 31% 27% 33% 30% 30% 32% 33% 32% 35% 31% 26% 31% 33% 31% 34% 39% 31% 26% 32% 35% 40% 31% 25% 37% 29% 35% 34% 27% 28% 33% 31% 29% 39% 33% 31% 30% 28% 22% 35% 35% 35% 35% 30% 35% 30% 30% 30% 24% 31% 36% 32% 31% 27% 30% 26% 28% 37% 31% 31% 25% 29% 32% 34% 30% 27% 29% 32% 25% 33% 36% 27% 24% 28% 33% 36% 31% 31% 28% 33% 30% 29% 33% 35% 31% 36% 30% 30% 36% 29% 35% 33% 33% 33% 25% 35% 30% 29% 36% 32% 31% 30% 27% 31% 32% 32% 32% 36% 32% 24% 32% 32% 23% 36% 35% 33% 36% 32% 34% 33% 31% 32% 28% 22% 15% 27% 38% 28% 25% 27% 31% 36% 33% 32% 27% 35% 24% 33% 32% 33% 29% 29% 31% 31% 28% 29% 31%) -> (282/10k) -> write(35%)
|
||||
last tile: 12/1087/1691 (z12 18%) https://onthegomap.github.io/planetiler-demo/#12.5/29.87875/-84.41895
|
||||
0:12:55 INF [archive] - features: [ 430M 16% 11M/s ] 212G tiles: [ 14M 726k/s ] 10G
|
||||
cpus: 71.1 gc: 5% heap: 60G/214G direct: 54M postGC: 17G
|
||||
read(93% 94%) -> merge(95%) -> (0/10k) -> encode(36% 34% 37% 37% 33% 38% 35% 35% 38% 38% 37% 35% 32% 33% 36% 32% 39% 36% 35% 41% 41% 36% 33% 43% 35% 34% 43% 37% 35% 34% 37% 33% 37% 36% 36% 34% 36% 34% 36% 39% 39% 34% 35% 33% 37% 36% 35% 35% 35% 36% 35% 36% 33% 37% 38% 35% 35% 34% 38% 40% 37% 34% 37% 37% 33% 36% 37% 37% 34% 41% 33% 37% 32% 38% 32% 34% 34% 34% 37% 31% 37% 33% 34% 35% 40% 33% 38% 34% 33% 34% 35% 35% 33% 33% 36% 36% 40% 32% 33% 33% 35% 35% 35% 32% 35% 41% 34% 34% 35% 33% 36% 34% 43% 32% 38% 36% 34% 35% 34% 34% 36% 35% 34% 36% 43% 37% 34% 35% 37% 34% 35% 37% 37% 33% 34% 32% 36% 33% 36% 39% 33% 36% 40% 33% 37% 33% 36% 36% 34% 37% 36% 32% 38% 32% 35% 36% 37% 37% 32% 38% 36% 40% 37% 35% 38% 36% 35% 34% 35% 36% 37% 35% 29% 39% 36% 34% 34% 34%) -> (74/10k) -> write(44%)
|
||||
last tile: 12/2948/1928 (z12 81%) https://onthegomap.github.io/planetiler-demo/#12.5/10.44459/79.14551
|
||||
0:13:05 INF [archive] - features: [ 536M 20% 10M/s ] 212G tiles: [ 15M 65k/s ] 13G
|
||||
cpus: 72.5 gc: 3% heap: 68G/214G direct: 54M postGC: 17G
|
||||
read(94% 95%) -> merge(96%) -> (0/10k) -> encode(38% 35% 37% 40% 36% 37% 38% 35% 39% 36% 35% 33% 39% 38% 38% 39% 35% 37% 38% 38% 40% 36% 38% 36% 39% 38% 36% 36% 41% 39% 35% 35% 41% 37% 37% 34% 38% 37% 40% 35% 37% 35% 39% 38% 38% 39% 41% 36% 36% 39% 38% 33% 38% 38% 36% 38% 37% 37% 39% 39% 36% 36% 36% 41% 38% 39% 38% 33% 41% 37% 37% 41% 37% 40% 38% 36% 36% 38% 36% 37% 36% 37% 37% 38% 37% 39% 38% 40% 39% 35% 35% 37% 39% 35% 35% 37% 35% 37% 38% 36% 37% 40% 35% 38% 38% 33% 37% 34% 36% 34% 36% 40% 40% 36% 39% 35% 39% 41% 33% 34% 39% 39% 36% 36% 36% 36% 41% 39% 38% 44% 34% 38% 36% 40% 38% 44% 35% 37% 39% 40% 37% 38% 40% 36% 36% 39% 34% 36% 34% 36% 38% 39% 36% 38% 38% 37% 38% 37% 35% 35% 34% 39% 41% 40% 38% 36% 40% 38% 39% 37% 39% 36% 35% 37% 38% 38% 39% 37%) -> (727/10k) -> write(23%)
|
||||
last tile: 12/2204/1107 (z12 85%) https://onthegomap.github.io/planetiler-demo/#12.5/63.41119/13.75488
|
||||
0:13:07 INF [archive:write] - Finished z12 in 28s cpu:30m41s avg:66.8, now starting z13
|
||||
0:13:15 INF [archive] - features: [ 651M 24% 11M/s ] 212G tiles: [ 30M 1.4M/s ] 16G
|
||||
cpus: 68.2 gc: 4% heap: 35G/214G direct: 54M postGC: 20G
|
||||
read(90% 82%) -> merge(95%) -> (0/10k) -> encode(36% 36% 34% 33% 32% 33% 36% 33% 34% 36% 31% 32% 34% 33% 34% 34% 33% 35% 35% 33% 34% 32% 34% 33% 33% 34% 34% 34% 34% 35% 35% 35% 34% 33% 34% 33% 31% 35% 35% 35% 32% 33% 36% 32% 34% 34% 34% 34% 32% 31% 33% 35% 33% 30% 33% 36% 35% 32% 36% 33% 32% 30% 30% 35% 35% 36% 33% 33% 35% 35% 36% 31% 34% 31% 35% 35% 35% 35% 33% 32% 34% 32% 31% 34% 33% 32% 32% 36% 37% 35% 32% 35% 35% 32% 37% 35% 33% 34% 36% 37% 34% 34% 35% 32% 35% 36% 31% 36% 33% 34% 32% 36% 34% 34% 33% 36% 34% 37% 33% 34% 32% 32% 31% 34% 37% 33% 31% 36% 38% 34% 38% 35% 33% 32% 34% 32% 31% 32% 34% 34% 34% 34% 35% 35% 34% 32% 34% 37% 34% 33% 33% 34% 38% 33% 34% 38% 35% 33% 36% 33% 35% 35% 34% 34% 35% 35% 36% 32% 32% 33% 35% 34% 32% 38% 34% 33% 37% 36%) -> (153/10k) -> write(68%)
|
||||
last tile: 13/1558/3084 (z13 20%) https://onthegomap.github.io/planetiler-demo/#13.5/40.56389/-111.51123
|
||||
0:13:25 INF [archive] - features: [ 770M 28% 11M/s ] 212G tiles: [ 55M 2.4M/s ] 20G
|
||||
cpus: 64.8 gc: 4% heap: 22G/214G direct: 54M postGC: 21G
|
||||
read(87% 73%) -> merge(94%) -> (48/10k) -> encode(29% 34% 34% 29% 33% 34% 30% 33% 31% 33% 31% 33% 34% 31% 31% 32% 34% 31% 31% 33% 33% 31% 35% 32% 32% 33% 32% 33% 34% 34% 33% 33% 31% 33% 32% 31% 34% 33% 32% 30% 33% 32% 32% 32% 30% 30% 32% 30% 34% 31% 35% 31% 30% 33% 31% 30% 33% 31% 31% 33% 33% 34% 31% 32% 33% 33% 33% 32% 33% 29% 31% 32% 31% 30% 34% 37% 31% 32% 35% 29% 33% 33% 31% 30% 33% 31% 37% 31% 32% 31% 33% 32% 33% 29% 33% 31% 30% 33% 32% 33% 29% 31% 34% 32% 33% 29% 29% 35% 30% 36% 31% 33% 33% 32% 31% 29% 31% 35% 32% 35% 36% 30% 36% 32% 30% 33% 34% 34% 33% 33% 34% 31% 32% 32% 29% 30% 30% 31% 30% 35% 30% 32% 32% 31% 32% 30% 31% 33% 34% 31% 32% 33% 32% 31% 31% 33% 33% 33% 31% 33% 35% 32% 34% 33% 31% 33% 34% 30% 35% 33% 35% 34% 30% 33% 30% 33% 32% 35%) -> (632/10k) -> write(80%)
|
||||
last tile: 13/7305/3101 (z13 76%) https://onthegomap.github.io/planetiler-demo/#13.5/39.99395/141.04248
|
||||
0:13:35 INF [archive] - features: [ 887M 33% 11M/s ] 212G tiles: [ 59M 472k/s ] 24G
|
||||
cpus: 71.2 gc: 4% heap: 80G/214G direct: 54M postGC: 21G
|
||||
read(86% 92%) -> merge(94%) -> (0/10k) -> encode(36% 37% 36% 36% 33% 34% 36% 38% 33% 36% 36% 39% 35% 36% 36% 36% 35% 35% 34% 40% 33% 36% 36% 39% 36% 35% 34% 35% 34% 37% 35% 36% 35% 38% 32% 39% 37% 36% 36% 33% 34% 34% 38% 33% 33% 34% 36% 36% 38% 36% 38% 37% 37% 35% 35% 35% 34% 35% 31% 41% 33% 37% 36% 39% 36% 36% 33% 36% 37% 34% 37% 35% 36% 36% 33% 34% 36% 35% 37% 33% 35% 36% 39% 38% 37% 38% 36% 35% 37% 36% 34% 37% 36% 37% 34% 35% 33% 35% 35% 39% 33% 36% 33% 34% 40% 35% 35% 40% 36% 35% 39% 37% 33% 39% 35% 36% 34% 40% 37% 37% 39% 35% 33% 39% 38% 39% 35% 36% 36% 37% 35% 39% 34% 35% 36% 34% 36% 35% 38% 34% 33% 39% 34% 37% 35% 34% 35% 40% 34% 35% 34% 33% 35% 36% 40% 36% 36% 39% 39% 33% 36% 36% 36% 34% 33% 37% 33% 38% 35% 35% 34% 37% 33% 35% 37% 34% 37% 35%) -> (360/10k) -> write(68%)
|
||||
last tile: 13/4531/2966 (z13 85%) https://onthegomap.github.io/planetiler-demo/#13.5/44.38669/19.13818
|
||||
0:13:45 INF [archive] - features: [ 992M 36% 10M/s ] 212G tiles: [ 61M 128k/s ] 28G
|
||||
cpus: 61.1 gc: 2% heap: 85G/214G direct: 54M postGC: 22G
|
||||
read(94% 94%) -> merge(97%) -> (4.8k/10k) -> encode(33% 27% 28% 28% 33% 33% 26% 34% 29% 33% 33% 34% 33% 28% 31% 32% 29% 31% 29% 32% 30% 31% 31% 32% 30% 31% 31% 34% 32% 31% 27% 30% 34% 30% 32% 33% 32% 31% 29% 30% 30% 29% 32% 34% 33% 33% 28% 31% 32% 36% 33% 32% 26% 31% 32% 30% 32% 35% 33% 33% 32% 30% 34% 30% 32% 32% 30% 35% 33% 30% 29% 28% 28% 29% 33% 36% 31% 29% 31% 30% 28% 29% 28% 35% 32% 30% 33% 33% 34% 30% 32% 31% 31% 30% 30% 34% 31% 33% 33% 32% 29% 33% 31% 33% 32% 31% 29% 28% 33% 29% 31% 34% 30% 37% 31% 31% 29% 28% 35% 34% 31% 32% 33% 30% 31% 30% 33% 37% 31% 34% 32% 32% 31% 31% 30% 31% 29% 29% 31% 30% 32% 33% 33% 31% 32% 29% 34% 32% 33% 26% 29% 32% 28% 31% 30% 34% 34% 32% 35% 32% 32% 32% 33% 29% 28% 31% 29% 32% 32% 33% 32% 29% 31% 32% 33% 30% 28% 32%) -> (6.2k/10k) -> write(38%)
|
||||
last tile: 13/5910/2723 (z13 87%) https://onthegomap.github.io/planetiler-demo/#13.5/51.52241/79.73877
|
||||
0:13:47 INF [archive:write] - Finished z13 in 40s cpu:43m55s gc:1s avg:65.2, now starting z14
|
||||
0:13:55 INF [archive] - features: [ 1.1B 41% 11M/s ] 212G tiles: [ 101M 4M/s ] 30G
|
||||
cpus: 46.2 gc: 3% heap: 50G/214G direct: 54M postGC: 23G
|
||||
read(50% 68%) -> merge(75%) -> (2.1k/10k) -> encode(22% 23% 20% 23% 22% 23% 21% 23% 22% 23% 22% 24% 21% 23% 23% 21% 22% 23% 22% 21% 22% 21% 23% 25% 23% 21% 24% 23% 22% 21% 23% 24% 23% 23% 24% 22% 24% 23% 23% 24% 25% 23% 21% 22% 24% 23% 22% 24% 23% 24% 22% 23% 21% 21% 23% 21% 22% 22% 22% 24% 23% 23% 22% 23% 22% 22% 23% 23% 22% 23% 21% 24% 22% 23% 22% 24% 22% 22% 22% 22% 23% 22% 23% 21% 22% 23% 22% 21% 23% 22% 23% 23% 23% 22% 22% 21% 23% 23% 23% 23% 21% 23% 22% 23% 22% 23% 23% 22% 23% 21% 20% 23% 23% 20% 23% 22% 24% 22% 22% 23% 22% 23% 22% 24% 23% 24% 24% 23% 21% 20% 24% 22% 22% 23% 23% 22% 22% 22% 22% 22% 22% 22% 20% 24% 22% 24% 22% 23% 24% 22% 22% 24% 21% 24% 21% 22% 23% 23% 25% 23% 21% 24% 24% 23% 23% 24% 22% 22% 22% 22% 23% 21% 23% 23% 23% 22% 22% 23%) -> (4.3k/10k) -> write(86%)
|
||||
last tile: 14/5260/5642 (z14 13%) https://onthegomap.github.io/planetiler-demo/#14.5/48.77067/-64.41284
|
||||
0:14:05 INF [archive] - features: [ 1.2B 46% 15M/s ] 212G tiles: [ 113M 1.2M/s ] 34G
|
||||
cpus: 44.1 gc: 2% heap: 48G/214G direct: 54M postGC: 21G
|
||||
read(90% 97%) -> merge(98%) -> (0/10k) -> encode(23% 19% 22% 23% 22% 20% 21% 22% 23% 22% 21% 22% 19% 21% 21% 23% 23% 22% 24% 19% 21% 23% 22% 23% 22% 22% 22% 22% 21% 22% 20% 23% 22% 20% 23% 22% 22% 22% 22% 21% 19% 22% 22% 23% 23% 20% 23% 21% 22% 21% 24% 23% 24% 22% 21% 23% 21% 22% 22% 22% 22% 20% 23% 21% 21% 21% 22% 25% 24% 23% 24% 21% 22% 23% 23% 23% 23% 21% 20% 23% 22% 21% 22% 24% 20% 22% 21% 22% 23% 20% 21% 23% 21% 20% 20% 21% 21% 22% 22% 25% 23% 21% 23% 20% 22% 22% 22% 22% 25% 21% 23% 23% 22% 22% 22% 19% 24% 23% 22% 23% 22% 22% 22% 21% 21% 22% 20% 23% 23% 24% 21% 21% 20% 23% 22% 21% 22% 23% 23% 22% 20% 20% 24% 21% 20% 22% 21% 22% 20% 21% 23% 22% 23% 22% 20% 22% 22% 23% 21% 23% 21% 22% 23% 21% 23% 23% 24% 21% 21% 21% 21% 22% 19% 24% 21% 22% 21% 20%) -> (93/10k) -> write(47%)
|
||||
last tile: 14/4665/6267 (z14 18%) https://onthegomap.github.io/planetiler-demo/#14.5/38.89958/-77.48657
|
||||
0:14:16 INF [archive] - features: [ 1.4B 51% 13M/s ] 212G tiles: [ 118M 510k/s ] 37G
|
||||
cpus: 47.8 gc: 2% heap: 27G/214G direct: 54M postGC: 22G
|
||||
read(96% 93%) -> merge(98%) -> (0/10k) -> encode(23% 22% 22% 25% 23% 24% 25% 27% 25% 26% 24% 23% 23% 24% 24% 25% 23% 23% 23% 25% 21% 25% 23% 27% 23% 22% 23% 24% 22% 25% 23% 23% 24% 25% 24% 22% 24% 24% 25% 23% 26% 23% 25% 26% 26% 23% 23% 23% 24% 22% 22% 24% 24% 24% 22% 25% 25% 22% 25% 22% 25% 27% 24% 26% 22% 25% 24% 23% 23% 26% 24% 24% 22% 26% 24% 24% 21% 23% 23% 25% 24% 23% 25% 24% 21% 24% 24% 25% 23% 24% 25% 27% 21% 22% 23% 23% 23% 23% 24% 25% 21% 25% 25% 25% 23% 24% 26% 23% 25% 22% 24% 25% 24% 25% 22% 23% 26% 24% 22% 23% 20% 26% 23% 27% 24% 25% 23% 23% 23% 25% 22% 25% 27% 23% 22% 22% 23% 25% 25% 25% 23% 23% 23% 23% 25% 22% 24% 24% 24% 27% 23% 25% 23% 25% 24% 24% 23% 26% 23% 23% 24% 25% 27% 23% 24% 22% 23% 24% 23% 27% 23% 25% 24% 25% 24% 27% 25% 24%) -> (298/10k) -> write(42%)
|
||||
last tile: 14/3448/7072 (z14 20%) https://onthegomap.github.io/planetiler-demo/#14.5/23.87579/-104.22729
|
||||
0:14:26 INF [archive] - features: [ 1.5B 56% 11M/s ] 212G tiles: [ 156M 3.7M/s ] 40G
|
||||
cpus: 43.6 gc: 3% heap: 84G/214G direct: 54M postGC: 27G
|
||||
read(61% 60%) -> merge(81%) -> (0/10k) -> encode(21% 20% 22% 20% 22% 22% 19% 21% 22% 22% 21% 22% 21% 20% 22% 20% 22% 21% 23% 21% 20% 24% 20% 23% 23% 20% 22% 21% 20% 23% 22% 23% 22% 20% 21% 18% 20% 20% 21% 22% 19% 19% 22% 21% 22% 22% 22% 22% 21% 22% 21% 22% 21% 21% 19% 21% 24% 20% 22% 21% 20% 19% 19% 19% 21% 20% 19% 21% 21% 22% 23% 21% 21% 21% 21% 22% 21% 20% 22% 22% 23% 24% 22% 21% 21% 23% 22% 23% 22% 21% 21% 20% 20% 20% 22% 20% 19% 22% 21% 20% 20% 22% 23% 22% 22% 19% 21% 19% 20% 22% 22% 20% 23% 22% 20% 21% 20% 21% 22% 21% 21% 21% 22% 20% 24% 19% 21% 22% 20% 20% 20% 21% 20% 21% 17% 21% 21% 22% 21% 21% 22% 23% 21% 21% 20% 20% 21% 23% 22% 22% 22% 21% 22% 20% 19% 21% 21% 20% 20% 21% 22% 21% 21% 21% 22% 21% 22% 20% 22% 21% 19% 21% 20% 21% 21% 22% 17% 21%) -> (4.5k/10k) -> write(84%)
|
||||
last tile: 14/5542/14009 (z14 39%) https://onthegomap.github.io/planetiler-demo/#14.5/-77.73728/-58.21655
|
||||
0:14:36 INF [archive] - features: [ 1.6B 61% 15M/s ] 212G tiles: [ 181M 2.5M/s ] 44G
|
||||
cpus: 53.5 gc: 4% heap: 35G/214G direct: 54M postGC: 24G
|
||||
read(79% 85%) -> merge(96%) -> (0/10k) -> encode(27% 26% 27% 27% 28% 29% 25% 26% 27% 26% 24% 27% 29% 26% 25% 29% 29% 27% 27% 26% 26% 29% 27% 22% 25% 25% 26% 25% 24% 25% 24% 27% 25% 24% 28% 26% 26% 26% 27% 26% 22% 26% 24% 26% 26% 28% 26% 26% 29% 29% 24% 26% 25% 29% 27% 25% 23% 28% 26% 29% 23% 27% 28% 24% 26% 26% 26% 27% 27% 27% 26% 25% 25% 25% 25% 28% 27% 25% 27% 27% 26% 25% 27% 24% 23% 24% 28% 26% 25% 27% 26% 26% 27% 24% 24% 27% 26% 28% 27% 25% 26% 24% 26% 27% 26% 28% 27% 26% 26% 27% 24% 26% 26% 24% 25% 24% 26% 26% 27% 26% 25% 25% 27% 27% 26% 26% 25% 26% 23% 25% 24% 28% 24% 26% 25% 26% 23% 28% 24% 26% 27% 27% 26% 26% 24% 28% 26% 28% 27% 24% 29% 23% 24% 26% 28% 26% 26% 26% 26% 26% 29% 25% 25% 25% 27% 27% 25% 26% 29% 24% 26% 25% 24% 26% 25% 28% 28% 26%) -> (93/10k) -> write(87%)
|
||||
last tile: 14/10395/9071 (z14 52%) https://onthegomap.github.io/planetiler-demo/#14.5/-18.96864/48.41675
|
||||
0:14:43 WAR [archive:encode] - {x=14553 y=6450 z=14} 1303kb uncompressed
|
||||
0:14:46 INF [archive] - features: [ 1.8B 67% 15M/s ] 212G tiles: [ 221M 3.9M/s ] 46G
|
||||
cpus: 41 gc: 2% heap: 76G/214G direct: 55M postGC: 24G
|
||||
read(81% 78%) -> merge(98%) -> (2.7k/10k) -> encode(19% 20% 20% 21% 18% 20% 20% 20% 21% 20% 21% 20% 22% 20% 21% 21% 21% 19% 19% 20% 20% 21% 22% 19% 21% 20% 20% 19% 21% 20% 21% 20% 19% 20% 18% 20% 17% 22% 21% 19% 18% 21% 21% 21% 18% 18% 22% 19% 19% 20% 20% 21% 22% 20% 21% 21% 19% 19% 19% 21% 21% 19% 22% 18% 20% 21% 20% 22% 20% 20% 22% 22% 19% 21% 20% 21% 21% 18% 20% 20% 20% 20% 21% 20% 21% 19% 19% 21% 20% 20% 20% 20% 21% 22% 17% 22% 21% 20% 22% 19% 21% 19% 21% 19% 22% 23% 19% 20% 20% 19% 18% 21% 20% 20% 19% 20% 19% 20% 19% 19% 22% 20% 21% 19% 20% 19% 21% 20% 19% 19% 22% 20% 18% 21% 20% 20% 21% 22% 20% 22% 20% 21% 19% 22% 19% 22% 20% 21% 21% 20% 19% 18% 21% 22% 21% 21% 22% 19% 20% 18% 20% 19% 19% 20% 23% 19% 21% 22% 18% 21% 18% 22% 20% 18% 20% 21% 20% 20%) -> (3.3k/10k) -> write(64%)
|
||||
last tile: 14/14337/5699 (z14 78%) https://onthegomap.github.io/planetiler-demo/#14.5/47.93843/135.03296
|
||||
0:14:51 WAR [archive:encode] - {x=13722 y=7013 z=14} 1080kb uncompressed
|
||||
0:14:56 INF [archive] - features: [ 1.9B 73% 14M/s ] 212G tiles: [ 228M 678k/s ] 50G
|
||||
cpus: 69.4 gc: 6% heap: 38G/214G direct: 55M postGC: 36G
|
||||
read(93% 75%) -> merge(93%) -> (0/10k) -> encode(33% 34% 33% 36% 33% 33% 32% 35% 30% 35% 35% 32% 33% 34% 34% 35% 33% 32% 34% 33% 32% 34% 34% 35% 33% 35% 33% 36% 32% 33% 32% 33% 34% 33% 35% 32% 31% 35% 34% 33% 32% 31% 30% 35% 33% 34% 34% 32% 34% 31% 33% 33% 33% 34% 35% 34% 34% 34% 33% 33% 34% 33% 35% 33% 32% 35% 32% 33% 33% 33% 36% 34% 34% 32% 32% 33% 34% 34% 34% 34% 33% 34% 35% 36% 31% 31% 35% 34% 32% 30% 30% 33% 36% 31% 34% 32% 32% 31% 33% 33% 34% 33% 33% 32% 35% 32% 34% 33% 32% 30% 34% 34% 33% 36% 33% 33% 35% 34% 34% 33% 40% 35% 33% 33% 30% 33% 34% 35% 35% 34% 33% 34% 33% 34% 32% 33% 33% 31% 31% 33% 35% 34% 32% 35% 33% 34% 33% 34% 32% 31% 31% 31% 34% 34% 31% 34% 33% 32% 34% 33% 35% 36% 33% 34% 35% 30% 33% 33% 32% 33% 29% 36% 33% 34% 32% 33% 35% 34%) -> (103/10k) -> write(82%)
|
||||
last tile: 14/11970/6960 (z14 82%) https://onthegomap.github.io/planetiler-demo/#14.5/26.10612/83.02368
|
||||
0:15:06 INF [archive] - features: [ 2.1B 78% 15M/s ] 212G tiles: [ 234M 554k/s ] 54G
|
||||
cpus: 50.9 gc: 3% heap: 96G/214G direct: 55M postGC: 37G
|
||||
read(86% 88%) -> merge(97%) -> (0/10k) -> encode(26% 26% 28% 24% 24% 25% 28% 25% 23% 26% 26% 28% 25% 25% 23% 24% 23% 25% 23% 27% 24% 24% 27% 27% 27% 25% 25% 27% 28% 23% 27% 27% 25% 22% 24% 28% 27% 27% 26% 25% 25% 24% 25% 28% 25% 25% 27% 26% 28% 26% 27% 25% 23% 27% 26% 24% 25% 25% 23% 25% 23% 26% 24% 27% 25% 25% 26% 27% 23% 25% 23% 24% 26% 26% 24% 28% 24% 28% 25% 24% 24% 26% 24% 27% 24% 26% 28% 27% 23% 22% 25% 23% 25% 25% 25% 25% 25% 26% 26% 25% 23% 27% 23% 24% 26% 25% 26% 24% 26% 27% 23% 25% 24% 25% 25% 26% 28% 26% 26% 26% 26% 23% 26% 27% 24% 24% 26% 26% 24% 27% 25% 24% 25% 26% 27% 25% 26% 25% 25% 24% 22% 22% 25% 21% 24% 25% 24% 26% 27% 27% 25% 25% 25% 23% 25% 24% 26% 25% 23% 26% 25% 25% 25% 26% 23% 25% 27% 23% 26% 26% 23% 26% 25% 25% 28% 28% 25% 24%) -> (80/10k) -> write(71%)
|
||||
last tile: 14/9821/5680 (z14 84%) https://onthegomap.github.io/planetiler-demo/#14.5/48.21735/35.80444
|
||||
0:15:15 WAR [archive:encode] - {x=8290 y=6118 z=14} 1082kb uncompressed
|
||||
0:15:15 WAR [archive:encode] - {x=8290 y=6119 z=14} 1067kb uncompressed
|
||||
0:15:16 INF [archive] - features: [ 2.2B 84% 14M/s ] 212G tiles: [ 235M 122k/s ] 58G
|
||||
cpus: 44.2 gc: 2% heap: 74G/214G direct: 55M postGC: 36G
|
||||
read(98% 97%) -> merge(98%) -> (0/10k) -> encode(20% 23% 22% 21% 22% 23% 22% 23% 21% 23% 23% 22% 22% 21% 23% 21% 23% 22% 21% 21% 21% 23% 20% 21% 22% 23% 23% 24% 24% 24% 23% 20% 21% 20% 21% 23% 23% 22% 21% 21% 19% 21% 21% 22% 22% 22% 22% 22% 22% 23% 22% 22% 22% 21% 23% 23% 23% 23% 22% 21% 23% 19% 20% 22% 21% 22% 22% 22% 23% 21% 20% 22% 23% 24% 22% 21% 23% 24% 24% 24% 22% 21% 23% 22% 21% 22% 21% 23% 21% 22% 22% 23% 22% 22% 22% 22% 20% 22% 21% 21% 20% 22% 23% 20% 23% 19% 24% 22% 21% 21% 20% 23% 22% 22% 23% 20% 23% 21% 22% 23% 23% 22% 23% 22% 21% 21% 21% 20% 22% 23% 23% 22% 21% 21% 23% 22% 20% 22% 20% 22% 21% 22% 21% 22% 20% 22% 22% 23% 24% 21% 22% 22% 21% 24% 22% 19% 22% 21% 21% 23% 19% 22% 22% 22% 22% 22% 22% 22% 21% 21% 21% 21% 21% 22% 22% 21% 23% 24%) -> (40/10k) -> write(38%)
|
||||
last tile: 14/8200/5891 (z14 85%) https://onthegomap.github.io/planetiler-demo/#14.5/45.03471/0.18677
|
||||
0:15:26 INF [archive] - features: [ 2.4B 89% 14M/s ] 212G tiles: [ 235M 22k/s ] 61G
|
||||
cpus: 34.4 gc: 1% heap: 46G/214G direct: 55M postGC: 35G
|
||||
read(99% 99%) -> merge(95%) -> (0/10k) -> encode(17% 18% 17% 17% 17% 16% 16% 17% 17% 17% 17% 17% 17% 18% 16% 16% 17% 17% 17% 18% 16% 16% 18% 18% 17% 16% 17% 16% 18% 17% 17% 17% 17% 18% 18% 17% 17% 18% 17% 18% 18% 16% 18% 17% 17% 15% 17% 15% 17% 17% 16% 18% 17% 16% 17% 20% 19% 19% 16% 18% 17% 15% 17% 17% 17% 18% 18% 17% 18% 16% 18% 16% 17% 17% 17% 17% 15% 17% 17% 17% 17% 18% 18% 17% 16% 16% 18% 18% 17% 18% 16% 17% 16% 16% 18% 16% 18% 18% 17% 19% 18% 16% 17% 17% 17% 16% 17% 17% 18% 17% 17% 17% 18% 18% 16% 16% 18% 17% 17% 17% 16% 14% 19% 15% 17% 17% 17% 18% 16% 19% 17% 15% 19% 17% 17% 17% 16% 18% 17% 18% 17% 18% 18% 17% 16% 16% 18% 18% 15% 18% 18% 17% 16% 18% 17% 18% 17% 17% 17% 18% 18% 16% 16% 16% 18% 17% 16% 18% 19% 15% 16% 17% 18% 16% 17% 17% 17% 16%) -> (39/10k) -> write(17%)
|
||||
last tile: 14/8386/5508 (z14 85%) https://onthegomap.github.io/planetiler-demo/#14.5/50.67383/4.27368
|
||||
0:15:36 INF [archive] - features: [ 2.5B 95% 15M/s ] 212G tiles: [ 235M 40k/s ] 64G
|
||||
cpus: 33.5 gc: 1% heap: 73G/214G direct: 55M postGC: 35G
|
||||
read(96% 99%) -> merge(96%) -> (0/10k) -> encode(16% 17% 19% 17% 16% 16% 18% 16% 17% 18% 17% 16% 17% 17% 15% 16% 16% 16% 16% 17% 18% 17% 15% 17% 18% 18% 16% 16% 18% 17% 16% 15% 16% 18% 15% 16% 17% 17% 16% 19% 17% 16% 16% 17% 17% 17% 18% 16% 17% 17% 17% 17% 15% 17% 17% 17% 17% 15% 16% 17% 16% 17% 17% 17% 16% 16% 18% 18% 18% 18% 18% 16% 16% 17% 17% 15% 17% 16% 16% 17% 16% 19% 17% 15% 16% 16% 17% 16% 18% 17% 17% 17% 17% 16% 15% 16% 18% 17% 15% 18% 18% 16% 17% 17% 17% 17% 17% 16% 17% 17% 16% 17% 18% 17% 14% 17% 18% 17% 17% 17% 16% 16% 15% 17% 17% 17% 17% 18% 17% 18% 18% 17% 18% 16% 15% 16% 17% 17% 15% 15% 16% 17% 16% 17% 16% 16% 15% 18% 18% 16% 16% 17% 17% 16% 16% 16% 17% 17% 17% 18% 17% 17% 16% 16% 17% 15% 17% 16% 14% 17% 16% 17% 17% 15% 16% 17% 18% 17%) -> (42/10k) -> write(19%)
|
||||
last tile: 14/8994/5282 (z14 85%) https://onthegomap.github.io/planetiler-demo/#14.5/53.71622/17.63306
|
||||
0:15:46 INF [archive] - features: [ 2.6B 99% 11M/s ] 212G tiles: [ 240M 433k/s ] 68G
|
||||
cpus: 46.9 gc: 3% heap: 61G/214G direct: 55M postGC: 42G
|
||||
read(77% 80%) -> merge(89%) -> (9.3k/10k) -> encode(23% 23% 24% 22% 23% 23% 22% 20% 21% 20% 26% 23% 25% 22% 22% 22% 23% 23% 23% 22% 23% 23% 23% 23% 24% 25% 25% 24% 23% 23% 22% 24% 24% 22% 23% 24% 23% 22% 22% 23% 23% 24% 24% 22% 23% 24% 23% 22% 24% 21% 22% 24% 24% 23% 22% 23% 24% 23% 22% 23% 25% 22% 23% 22% 24% 24% 22% 21% 23% 23% 21% 21% 24% 23% 25% 22% 20% 26% 24% 25% 21% 22% 23% 22% 21% 23% 23% 21% 22% 23% 22% 22% 26% 25% 23% 23% 24% 20% 26% 26% 25% 23% 25% 22% 24% 23% 22% 21% 24% 25% 24% 20% 22% 24% 24% 24% 25% 24% 25% 23% 24% 22% 23% 23% 25% 24% 25% 25% 24% 23% 23% 23% 22% 21% 23% 24% 23% 23% 25% 21% 24% 23% 24% 24% 24% 21% 25% 22% 21% 23% 21% 24% 22% 23% 22% 23% 25% 26% 23% 26% 23% 23% 21% 24% 23% 22% 20% 24% 23% 23% 23% 25% 25% 24% 24% 20% 22% 24%) -> (10k/10k) -> write(76%)
|
||||
last tile: 14/11448/4481 (z14 87%) https://onthegomap.github.io/planetiler-demo/#14.5/62.90022/71.55396
|
||||
0:15:53 INF [archive:write] - Finished z14 in 2m5s cpu:1h33m24s gc:3s avg:44.7
|
||||
0:15:53 INF [archive:write] - Building directories with 14083 entries per leaf, attempt 1...
|
||||
0:15:56 INF [archive] - features: [ 2.7B 100% 3.5M/s ] 212G tiles: [ 270M 2.9M/s ] 68G
|
||||
cpus: 9.9 gc: 1% heap: 71G/214G direct: 55M postGC: 42G
|
||||
read( -% -%) -> merge( -%) -> (0/10k) -> encode( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%) -> (0/10k) -> write(72%)
|
||||
last tile: 14/16383/0 (z14 100%) https://onthegomap.github.io/planetiler-demo/#14.5/85.05018/179.98901
|
||||
0:15:58 INF [archive:write] - Built directories with 3501 leaves, 16460B root directory
|
||||
0:15:58 INF [archive:write] - Building directories with 16899 entries per leaf, attempt 2...
|
||||
0:16:04 INF [archive:write] - Built directories with 2917 leaves, 14121B root directory
|
||||
0:16:04 INF [archive:write] - Writing metadata and leaf directories...
|
||||
0:16:04 INF [archive:write] - Writing header...
|
||||
0:16:04 INF [archive:write] - # addressed tiles: 270425693
|
||||
0:16:04 INF [archive:write] - # of tile entries: 49291908
|
||||
0:16:04 INF [archive:write] - # of tile contents: 40261197
|
||||
0:16:04 INF [archive:write] - Root directory: 14kB
|
||||
0:16:04 INF [archive:write] - # leaves: 2917
|
||||
0:16:04 INF [archive:write] - Leaf directories: 87MB
|
||||
0:16:04 INF [archive:write] - Avg leaf size: 29kB
|
||||
0:16:04 INF [archive:write] - Total dir bytes: 87MB
|
||||
0:16:04 INF [archive:write] - Average bytes per addressed tile: 0.32291183589571126
|
||||
0:16:04 INF [archive] - features: [ 2.7B 100% 0/s ] 212G tiles: [ 270M 0/s ] 68G
|
||||
cpus: 1 gc: 0% heap: 74G/214G direct: 141M postGC: 42G
|
||||
read( -% -%) -> merge( -%) -> (0/10k) -> encode( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%) -> (0/10k) -> write( -%)
|
||||
last tile: 14/16383/0 (z14 100%) https://onthegomap.github.io/planetiler-demo/#14.5/85.05018/179.98901
|
||||
0:16:04 DEB [archive] - Tile stats:
|
||||
0:16:04 DEB [archive] - Biggest tiles (gzipped)
|
||||
1. 14/14553/6450 (747k) https://onthegomap.github.io/planetiler-demo/#14.5/35.70192/139.77905 (poi:979k)
|
||||
2. 14/8290/6118 (675k) https://onthegomap.github.io/planetiler-demo/#14.5/41.40154/2.16431 (poi:537k)
|
||||
3. 14/8290/6119 (661k) https://onthegomap.github.io/planetiler-demo/#14.5/41.38505/2.16431 (poi:611k)
|
||||
4. 14/13722/7013 (617k) https://onthegomap.github.io/planetiler-demo/#14.5/25.05574/121.51978 (poi:685k)
|
||||
5. 14/6437/8362 (592k) https://onthegomap.github.io/planetiler-demo/#14.5/-3.74367/-38.55103 (building:605k)
|
||||
6. 14/7990/6392 (592k) https://onthegomap.github.io/planetiler-demo/#14.5/36.73008/-4.42749 (building:380k)
|
||||
7. 14/13722/7014 (588k) https://onthegomap.github.io/planetiler-demo/#14.5/25.03584/121.51978 (poi:627k)
|
||||
8. 14/14552/6450 (577k) https://onthegomap.github.io/planetiler-demo/#14.5/35.70192/139.75708 (poi:744k)
|
||||
9. 14/6435/8361 (573k) https://onthegomap.github.io/planetiler-demo/#14.5/-3.72175/-38.59497 (building:710k)
|
||||
10. 14/6436/8361 (558k) https://onthegomap.github.io/planetiler-demo/#14.5/-3.72175/-38.573 (building:607k)
|
||||
0:16:04 INF [archive] - Other tiles with large layers
|
||||
14/8414/5384 (313k) https://onthegomap.github.io/planetiler-demo/#14.5/52.36889/4.88892 (housenumber:313k)
|
||||
14/3411/6216 (333k) https://onthegomap.github.io/planetiler-demo/#14.5/39.76632/-105.04028 (landcover:333k)
|
||||
10/236/413 (176k) https://onthegomap.github.io/planetiler-demo/#10.5/32.69474/-96.85547 (landuse:176k)
|
||||
13/1596/3157 (337k) https://onthegomap.github.io/planetiler-demo/#13.5/38.08269/-109.84131 (mountain_peak:337k)
|
||||
5/5/11 (144k) https://onthegomap.github.io/planetiler-demo/#5.5/44.9512/-118.125 (park:144k)
|
||||
3/5/3 (558k) https://onthegomap.github.io/planetiler-demo/#3.5/20.48995/67.5 (place:558k)
|
||||
12/3229/2032 (313k) https://onthegomap.github.io/planetiler-demo/#12.5/1.36218/103.84277 (transportation:313k)
|
||||
14/9618/6751 (179k) https://onthegomap.github.io/planetiler-demo/#14.5/30.15463/31.34399 (transportation_name:179k)
|
||||
12/3415/1774 (165k) https://onthegomap.github.io/planetiler-demo/#12.5/23.36242/120.19043 (water:165k)
|
||||
0:16:04 DEB [archive] - Max tile sizes
|
||||
z0 z1 z2 z3 z4 z5 z6 z7 z8 z9 z10 z11 z12 z13 z14 all
|
||||
boundary 5.4k 37k 43k 25k 19k 24k 18k 14k 14k 28k 23k 17k 31k 18k 9.4k 43k
|
||||
landcover 1.5k 982 8k 4.6k 3.2k 31k 17k 271k 333k 235k 153k 175k 166k 111k 333k 333k
|
||||
place 52k 145k 546k 558k 351k 183k 109k 58k 41k 52k 62k 69k 50k 122k 221k 558k
|
||||
water 8.4k 4.1k 10k 9k 14k 13k 89k 113k 126k 109k 132k 94k 165k 115k 91k 165k
|
||||
water_name 8.5k 19k 26k 14k 12k 7.4k 5k 4.7k 12k 8.6k 5.6k 3.8k 3.1k 9.4k 29k 29k
|
||||
waterway 0 0 0 546 3.7k 1.6k 17k 13k 9.8k 28k 20k 16k 59k 75k 88k 88k
|
||||
landuse 0 0 0 0 2.6k 1.5k 32k 66k 125k 113k 176k 129k 63k 124k 47k 176k
|
||||
park 0 0 0 0 54k 144k 99k 76k 71k 82k 90k 55k 47k 19k 50k 144k
|
||||
transportation 0 0 0 0 60k 107k 62k 122k 89k 135k 91k 67k 313k 187k 128k 313k
|
||||
transportation_name 0 0 0 0 0 0 34k 20k 19k 15k 37k 22k 33k 27k 179k 179k
|
||||
mountain_peak 0 0 0 0 0 0 0 12k 12k 10k 10k 9.5k 9.4k 337k 234k 337k
|
||||
aerodrome_label 0 0 0 0 0 0 0 0 4.1k 2.8k 3.9k 2.9k 2.7k 2.7k 2.7k 4.1k
|
||||
aeroway 0 0 0 0 0 0 0 0 0 0 16k 25k 35k 31k 18k 35k
|
||||
poi 0 0 0 0 0 0 0 0 0 0 0 175 35k 17k 979k 979k
|
||||
building 0 0 0 0 0 0 0 0 0 0 0 0 0 66k 710k 710k
|
||||
housenumber 0 0 0 0 0 0 0 0 0 0 0 0 0 0 313k 313k
|
||||
full tile 76k 204k 626k 590k 401k 349k 271k 396k 370k 343k 272k 204k 379k 341k 1.3M 1.3M
|
||||
gzipped 46k 119k 334k 314k 238k 204k 172k 284k 268k 250k 182k 141k 188k 227k 747k 747k
|
||||
0:16:04 DEB [archive] - Max tile: 1.3M (gzipped: 747k)
|
||||
0:16:04 DEB [archive] - Avg tile: 98k (gzipped: 63k) using weighted average based on OSM traffic
|
||||
0:16:04 DEB [archive] - # tiles: 270,425,693
|
||||
0:16:04 DEB [archive] - # features: 2,731,231,488
|
||||
0:16:04 INF [archive] - Finished in 4m10s cpu:4h19m10s gc:10s avg:62.2
|
||||
0:16:04 INF [archive] - read 2x(78% 3m16s wait:25s done:11s)
|
||||
0:16:04 INF [archive] - merge 1x(84% 3m31s wait:16s done:12s)
|
||||
0:16:04 INF [archive] - encode 178x(31% 1m18s block:44s wait:1m51s done:12s)
|
||||
0:16:04 INF [archive] - write 1x(47% 1m56s wait:1m57s done:12s)
|
||||
0:16:04 INF - Finished in 16m4s cpu:27h44m50s gc:47s avg:103.6
|
||||
0:16:04 INF - FINISHED!
|
||||
0:16:04 INF -
|
||||
0:16:04 INF - ----------------------------------------
|
||||
0:16:04 INF - data errors:
|
||||
0:16:04 INF - render_snap_fix_input 21,288,964
|
||||
0:16:04 INF - merge_snap_fix_input 2,945
|
||||
0:16:04 INF - feature_polygon_osm_invalid_multipolygon_empty_after_fix 254
|
||||
0:16:04 INF - omt_park_area_osm_invalid_multipolygon_empty_after_fix 23
|
||||
0:16:04 INF - feature_centroid_if_convex_osm_invalid_multipolygon_empty_after_fix 17
|
||||
0:16:04 INF - feature_point_on_surface_osm_invalid_multipolygon_empty_after_fix 4
|
||||
0:16:04 INF - feature_centroid_osm_invalid_multipolygon_empty_after_fix 2
|
||||
0:16:04 INF - omt_place_island_poly_osm_invalid_multipolygon_empty_after_fix 2
|
||||
0:16:04 INF - merge_snap_fix_input2 1
|
||||
0:16:04 INF - merge_snap_fix_input3 1
|
||||
0:16:04 INF - ----------------------------------------
|
||||
0:16:04 INF - overall 16m4s cpu:27h44m50s gc:47s avg:103.6
|
||||
0:16:04 INF - lake_centerlines 2s cpu:8s avg:3.3
|
||||
0:16:04 INF - read 2x(18% 0.4s done:2s)
|
||||
0:16:04 INF - process 174x(0% 0s wait:2s)
|
||||
0:16:04 INF - write 6x(0% 0s wait:2s)
|
||||
0:16:04 INF - water_polygons 33s cpu:22m40s avg:40.8
|
||||
0:16:04 INF - read 2x(16% 5s wait:9s done:18s)
|
||||
0:16:04 INF - process 174x(20% 7s wait:26s)
|
||||
0:16:04 INF - write 6x(74% 25s wait:8s)
|
||||
0:16:04 INF - natural_earth 15s cpu:25s avg:1.7
|
||||
0:16:04 INF - read 2x(24% 4s wait:2s done:9s)
|
||||
0:16:04 INF - process 174x(0% 0.1s wait:12s done:3s)
|
||||
0:16:04 INF - write 6x(0% 0s wait:12s done:3s)
|
||||
0:16:04 INF - osm_pass1 58s cpu:1h29m56s gc:5s avg:92.8
|
||||
0:16:04 INF - read 1x(65% 38s wait:2s done:14s)
|
||||
0:16:04 INF - process 179x(44% 26s block:16s wait:12s done:1s)
|
||||
0:16:04 INF - osm_pass2 8m1s cpu:20h33m34s gc:25s avg:154
|
||||
0:16:04 INF - read 1x(13% 1m2s wait:6m2s done:51s)
|
||||
0:16:04 INF - process 174x(81% 6m28s block:14s wait:26s done:2s)
|
||||
0:16:04 INF - write 6x(64% 5m6s wait:2m17s)
|
||||
0:16:04 INF - boundaries 9s cpu:11s avg:1.3
|
||||
0:16:04 INF - agg_stop 0.3s cpu:0.7s avg:2.6
|
||||
0:16:04 INF - sort 1m56s cpu:58m44s gc:7s avg:30.5
|
||||
0:16:04 INF - worker 35x(8% 9s wait:1m18s done:7s)
|
||||
0:16:04 INF - archive 4m10s cpu:4h19m10s gc:10s avg:62.2
|
||||
0:16:04 INF - read 2x(78% 3m16s wait:25s done:11s)
|
||||
0:16:04 INF - merge 1x(84% 3m31s wait:16s done:12s)
|
||||
0:16:04 INF - encode 178x(31% 1m18s block:44s wait:1m51s done:12s)
|
||||
0:16:04 INF - write 1x(47% 1m56s wait:1m57s done:12s)
|
||||
0:16:04 INF - ----------------------------------------
|
||||
0:16:04 INF - archive 68GB
|
||||
0:16:04 INF - features 212GB
|
|
@ -0,0 +1,777 @@
|
|||
0:00:00 DEB - argument: config=null (path to config file)
|
||||
0:00:00 DEB - argument: download_dir=data/sources (download directory)
|
||||
0:00:00 DEB - argument: area=planet (name of the extract to download if osm_url/osm_path not specified (i.e. 'monaco' 'rhode island' 'australia' or 'planet'))
|
||||
0:00:00 INF - argument: stats=use in-memory stats
|
||||
0:00:00 DEB - argument: madvise=true (default value for whether to use linux madvise(random) to improve memory-mapped read performance for temporary storage)
|
||||
0:00:00 DEB - argument: storage=ram (default storage type for temporary data, one of [ram, mmap, direct])
|
||||
0:00:00 DEB - argument: threads=180 (num threads)
|
||||
0:00:00 DEB - argument: write_threads=6 (number of threads to use when writing temp features)
|
||||
0:00:00 DEB - argument: process_threads=174 (number of threads to use when processing input features)
|
||||
0:00:00 DEB - argument: bounds=Env[-180.0 : 180.0, -85.0511287798066 : 85.0511287798066] (bounds)
|
||||
0:00:00 DEB - argument: polygon=null (a .poly file that limits output to tiles intersecting the shape)
|
||||
0:00:00 DEB - argument: minzoom=0 (minimum zoom level)
|
||||
0:00:00 DEB - argument: maxzoom=14 (maximum zoom level up to 15)
|
||||
0:00:00 DEB - argument: render_maxzoom=14 (maximum rendering zoom level up to 15)
|
||||
0:00:00 DEB - argument: tmpdir=data/tmp (temp directory)
|
||||
0:00:00 DEB - argument: feature_read_threads=2 (number of threads to use when reading features at tile write time)
|
||||
0:00:00 DEB - argument: tile_write_threads=1 (number of threads used to write tiles - only supported by [files, csv, tsv, proto, pbf, json])
|
||||
0:00:00 DEB - argument: loginterval=10 seconds (time between logs)
|
||||
0:00:00 DEB - argument: force=false (overwriting output file and ignore disk/RAM warnings)
|
||||
0:00:00 DEB - argument: append=false (append to the output file - only supported by [files, csv, tsv, proto, pbf, json])
|
||||
0:00:00 DEB - argument: gzip_temp=false (gzip temporary feature storage (uses more CPU, but less disk space))
|
||||
0:00:00 DEB - argument: mmap_temp=true (use memory-mapped IO for temp feature files)
|
||||
0:00:00 DEB - argument: sort_max_readers=6 (maximum number of concurrent read threads to use when sorting chunks)
|
||||
0:00:00 DEB - argument: sort_max_writers=6 (maximum number of concurrent write threads to use when sorting chunks)
|
||||
0:00:00 DEB - argument: nodemap_type=array (type of node location map, one of [noop, sortedtable, sparsearray, array])
|
||||
0:00:00 DEB - argument: nodemap_storage=ram (storage for node location map, one of [ram, mmap, direct])
|
||||
0:00:00 DEB - argument: nodemap_madvise=true (use linux madvise(random) for node locations)
|
||||
0:00:00 DEB - argument: multipolygon_geometry_storage=ram (storage for multipolygon geometries, one of [ram, mmap, direct])
|
||||
0:00:00 DEB - argument: multipolygon_geometry_madvise=true (use linux madvise(random) for temporary multipolygon geometry storage)
|
||||
0:00:00 DEB - argument: http_user_agent=Planetiler downloader (https://github.com/onthegomap/planetiler) (User-Agent header to set when downloading files over HTTP)
|
||||
0:00:00 DEB - argument: http_timeout=30 seconds (Timeout to use when downloading files over HTTP)
|
||||
0:00:00 DEB - argument: http_retries=1 (Retries to use when downloading files over HTTP)
|
||||
0:00:00 DEB - argument: download_chunk_size_mb=100 (Size of file chunks to download in parallel in megabytes)
|
||||
0:00:00 DEB - argument: download_threads=1 (Number of parallel threads to use when downloading each file)
|
||||
0:00:00 DEB - argument: download_max_bandwidth= (Maximum bandwidth to consume when downloading files in units mb/s, mbps, kbps, etc.)
|
||||
0:00:00 DEB - argument: min_feature_size_at_max_zoom=0.0625 (Default value for the minimum size in tile pixels of features to emit at the maximum zoom level to allow for overzooming)
|
||||
0:00:00 DEB - argument: min_feature_size=1.0 (Default value for the minimum size in tile pixels of features to emit below the maximum zoom level)
|
||||
0:00:00 DEB - argument: simplify_tolerance_at_max_zoom=0.0625 (Default value for the tile pixel tolerance to use when simplifying features at the maximum zoom level to allow for overzooming)
|
||||
0:00:00 DEB - argument: simplify_tolerance=0.1 (Default value for the tile pixel tolerance to use when simplifying features below the maximum zoom level)
|
||||
0:00:00 DEB - argument: osm_lazy_reads=false (Read OSM blocks from disk in worker threads)
|
||||
0:00:00 DEB - argument: skip_filled_tiles=false (Skip writing tiles containing only polygon fills to the output)
|
||||
0:00:00 DEB - argument: tile_warning_size_mb=1.0 (Maximum size in megabytes of a tile to emit a warning about)
|
||||
0:00:00 DEB - argument: color=null (Color the terminal output)
|
||||
0:00:00 DEB - argument: keep_unzipped=false (keep unzipped sources by default after reading)
|
||||
0:00:00 DEB - argument: tile_compression=gzip (the tile compression, one of [gzip, none])
|
||||
0:00:00 DEB - argument: output_layerstats=false (output a tsv.gz file for each tile/layer size)
|
||||
0:00:00 DEB - argument: debug_url=https://onthegomap.github.io/planetiler-demo/#{z}/{lat}/{lon} (debug url to use for displaying tiles with {z} {lat} {lon} placeholders)
|
||||
0:00:00 DEB - argument: tile_weights=data/tile_weights.tsv.gz (tsv.gz file with columns z,x,y,loads to generate weighted average tile size stat)
|
||||
0:00:00 DEB - argument: max_point_buffer=Infinity (Max tile pixels to include points outside tile bounds. Set to a lower value to reduce tile size for clients that handle label collisions across tiles (most web and native clients). NOTE: Do not reduce if you need to support raster tile rendering)
|
||||
0:00:00 DEB - argument: log_jts_exceptions=false (Emit verbose details to debug JTS geometry errors)
|
||||
0:00:00 DEB - argument: only_download=false (download source data then exit)
|
||||
0:00:00 DEB - argument: download=false (download sources)
|
||||
0:00:00 DEB - argument: download_osm_tile_weights=false (download OSM tile weights file)
|
||||
0:00:00 DEB - argument: temp_nodes=data/tmp/node.db (temp node db location)
|
||||
0:00:00 DEB - argument: temp_multipolygons=data/tmp/multipolygon.db (temp multipolygon db location)
|
||||
0:00:00 DEB - argument: temp_features=data/tmp/feature.db (temp feature db location)
|
||||
0:00:00 DEB - argument: osm_parse_node_bounds=false (parse bounds from OSM nodes instead of header)
|
||||
0:00:00 DEB - argument: only_fetch_wikidata=false (fetch wikidata translations then quit)
|
||||
0:00:00 DEB - argument: fetch_wikidata=false (fetch wikidata translations then continue)
|
||||
0:00:00 DEB - argument: use_wikidata=true (use wikidata translations)
|
||||
0:00:00 DEB - argument: wikidata_cache=data/sources/wikidata_names.json (wikidata cache file)
|
||||
0:00:00 DEB - argument: lake_centerlines_path=data/sources/lake_centerline.shp.zip (lake_centerlines shapefile path)
|
||||
0:00:00 DEB - argument: free_lake_centerlines_after_read=false (delete lake_centerlines input file after reading to make space for output (reduces peak disk usage))
|
||||
0:00:00 DEB - argument: water_polygons_path=data/sources/water-polygons-split-3857.zip (water_polygons shapefile path)
|
||||
0:00:00 DEB - argument: free_water_polygons_after_read=false (delete water_polygons input file after reading to make space for output (reduces peak disk usage))
|
||||
0:00:00 DEB - argument: natural_earth_path=data/sources/natural_earth_vector.sqlite.zip (natural_earth sqlite db path)
|
||||
0:00:00 DEB - argument: free_natural_earth_after_read=false (delete natural_earth input file after reading to make space for output (reduces peak disk usage))
|
||||
0:00:00 DEB - argument: natural_earth_keep_unzipped=false (keep unzipped natural_earth after reading)
|
||||
0:00:00 DEB - argument: osm_path=data/sources/planet.osm.pbf (osm OSM input file path)
|
||||
0:00:00 DEB - argument: free_osm_after_read=false (delete osm input file after reading to make space for output (reduces peak disk usage))
|
||||
0:00:00 DEB - argument: output=planet.pmtiles (output tile archive path)
|
||||
0:00:00 DEB - argument: version=false (show version then exit)
|
||||
0:00:00 INF - Planetiler build git hash: 328e1b4d536dd7da38a192e56f4014a18c23a63b
|
||||
0:00:00 INF - Planetiler build version: 0.7-SNAPSHOT
|
||||
0:00:00 INF - Planetiler build timestamp: 2024-01-21T12:08:38.997Z
|
||||
0:00:00 DEB - argument: transliterate=true (attempt to transliterate latin names)
|
||||
0:00:00 DEB - argument: languages=am,ar,az,be,bg,bn,br,bs,ca,co,cs,cy,da,de,el,en,eo,es,et,eu,fa,fi,fr,fy,ga,gd,he,hi,hr,hu,hy,id,is,it,ja,ja_kana,ja_rm,ja-Latn,ja-Hira,ka,kk,kn,ko,ko-Latn,ku,la,lb,lt,lv,mk,mt,ml,nl,no,oc,pa,pnb,pl,pt,rm,ro,ru,sk,sl,sq,sr,sr-Latn,sv,ta,te,th,tr,uk,ur,vi,zh,zh-Hant,zh-Hans (languages to use)
|
||||
0:00:00 DEB - argument: only_layers= (Include only certain layers)
|
||||
0:00:00 DEB - argument: exclude_layers= (Exclude certain layers)
|
||||
0:00:00 DEB - argument: boundary_country_names=true (boundary layer: add left/right codes of neighboring countries)
|
||||
0:00:00 DEB - argument: boundary_osm_only=false (boundary layer: only use OSM, even at low zoom levels)
|
||||
0:00:00 DEB - argument: transportation_z13_paths=false (transportation(_name) layer: show all paths on z13)
|
||||
0:00:00 DEB - argument: building_merge_z13=true (building layer: merge nearby buildings at z13)
|
||||
0:00:00 DEB - argument: transportation_name_brunnel=false (transportation_name layer: set to false to omit brunnel and help merge long highways)
|
||||
0:00:00 DEB - argument: transportation_name_size_for_shield=false (transportation_name layer: allow road names on shorter segments (ie. they will have a shield))
|
||||
0:00:00 DEB - argument: transportation_name_limit_merge=false (transportation_name layer: limit merge so we don't combine different relations to help merge long highways)
|
||||
0:00:00 DEB - argument: transportation_name_minor_refs=false (transportation_name layer: include name and refs from minor road networks if not present on a way)
|
||||
0:00:00 DEB - argument: help=false (show arguments then exit)
|
||||
0:00:00 DEB - argument: layer_stats=/data/planet.pmtiles.layerstats.tsv.gz (layer stats output path)
|
||||
0:00:00 INF - Building OpenMapTilesProfile profile into file:///data/planet.pmtiles in these phases:
|
||||
0:00:00 INF - lake_centerlines: Process features in data/sources/lake_centerline.shp.zip
|
||||
0:00:00 INF - water_polygons: Process features in data/sources/water-polygons-split-3857.zip
|
||||
0:00:00 INF - natural_earth: Process features in data/sources/natural_earth_vector.sqlite.zip
|
||||
0:00:00 INF - osm_pass1: Pre-process OpenStreetMap input (store node locations then relation members)
|
||||
0:00:00 INF - osm_pass2: Process OpenStreetMap nodes, ways, then relations
|
||||
0:00:00 INF - sort: Sort rendered features by tile ID
|
||||
0:00:00 INF - archive: Encode each tile and write to TileArchiveConfig[format=PMTILES, scheme=FILE, uri=file:///data/planet.pmtiles, options={}]
|
||||
0:00:00 INF - no wikidata translations found, run with --fetch-wikidata to download
|
||||
0:00:00 DEB - ✓ 260G storage on /data (tmpfs) requested for read phase disk, 457G available
|
||||
0:00:00 DEB - - 260G used for temporary feature storage
|
||||
0:00:00 DEB - ✓ 390G storage on /data (tmpfs) requested for write phase disk, 457G available
|
||||
0:00:00 DEB - - 260G used for temporary feature storage
|
||||
0:00:00 DEB - - 130G used for archive output
|
||||
0:00:00 DEB - ✓ 124G JVM heap requested for read phase, 214G available
|
||||
0:00:00 DEB - - 88G used for array node location cache (switch to sparsearray to reduce size)
|
||||
0:00:00 DEB - - 11G used for multipolygon way geometries
|
||||
0:00:00 DEB - - 23G used for temporary profile storage
|
||||
0:00:00 DEB - ✓ 0 temporary files and 545G of free memory for OS to cache them
|
||||
0:00:00 DEB - argument: archive_name=OpenMapTiles ('name' attribute for tileset metadata)
|
||||
0:00:00 DEB - argument: archive_description=A tileset showcasing all layers in OpenMapTiles. https://openmaptiles.org ('description' attribute for tileset metadata)
|
||||
0:00:00 DEB - argument: archive_attribution=<a href="https://www.openmaptiles.org/" target="_blank">© OpenMapTiles</a> <a href="https://www.openstreetmap.org/copyright" target="_blank">© OpenStreetMap contributors</a> ('attribution' attribute for tileset metadata)
|
||||
0:00:00 DEB - argument: archive_version=3.14.0 ('version' attribute for tileset metadata)
|
||||
0:00:00 DEB - argument: archive_type=baselayer ('type' attribute for tileset metadata)
|
||||
0:00:00 DEB - argument: archive_format=pbf ('format' attribute for tileset metadata)
|
||||
0:00:00 INF - Using merge sort feature map, chunk size=2000mb max workers=180
|
||||
0:00:00 INF [lake_centerlines] -
|
||||
0:00:00 INF [lake_centerlines] - Starting...
|
||||
0:00:02 INF [lake_centerlines] - read: [ 59k 100% 34k/s ] write: [ 0 0/s ] 0
|
||||
cpus: 2.2 gc: 2% heap: 179M/214G direct: 262k postGC: 211M
|
||||
-> (0/4) -> read( -% -%) -> (0/1.1k) -> process( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%) -> (0/230k) -> write( -% -% -% -% -% -%)
|
||||
0:00:02 INF [lake_centerlines] - Finished in 3s cpu:9s avg:3.5
|
||||
0:00:02 INF [lake_centerlines] - read 2x(17% 0.4s done:2s)
|
||||
0:00:02 INF [lake_centerlines] - process 174x(0% 0s wait:2s)
|
||||
0:00:02 INF [lake_centerlines] - write 6x(0% 0s wait:2s)
|
||||
0:00:02 INF [water_polygons] -
|
||||
0:00:02 INF [water_polygons] - Starting...
|
||||
0:00:13 INF [water_polygons] - read: [ 5.6k 39% 566/s ] write: [ 32M 3.2M/s ] 12G
|
||||
cpus: 90.8 gc: 6% heap: 4.6G/214G direct: 54M postGC: 3.8G
|
||||
-> (0/4) -> read(93%) -> (0/1.1k) -> process(49% 48% 48% 33% 46% 42% 68% 23% 29% 63% 56% 38% 55% 55% 37% 44% 35% 37% 47% 53% 73% 73% 25% 55% 28% 50% 48% 37% 38% 49% 65% 50% 35% 61% 31% 58% 32% 48% 70% 45% 48% 61% 56% 66% 27% 30% 61% 50% 37% 27% 77% 46% 32% 54% 54% 43% 53% 65% 46% 37% 44% 68% 40% 56% 43% 41% 49% 32% 39% 75% 41% 54% 41% 51% 48% 53% 30% 36% 61% 37% 40% 27% 49% 41% 37% 39% 41% 60% 65% 70% 85% 42% 30% 43% 41% 51% 84% 29% 64% 45% 58% 65% 45% 47% 53% 28% 66% 63% 42% 33% 49% 56% 42% 23% 80% 28% 53% 68% 34% 50% 48% 52% 34% 59% 44% 28% 39% 52% 57% 63% 41% 40% 41% 62% 61% 41% 49% 42% 58% 41% 47% 34% 50% 46% 44% 39% 46% 40% 50% 34% 74% 50% 72% 51% 42% 39% 26% 41% 35% 34% 61% 24% 44% 65% 48% 46% 46% 66% 42% 59% 86% 39% 32% 40%) -> (143k/230k) -> write(28% 28% 28% 28% 28% 27%)
|
||||
0:00:23 INF [water_polygons] - read: [ 10k 70% 441/s ] write: [ 120M 8.6M/s ] 15G
|
||||
cpus: 29.4 gc: 1% heap: 5.8G/214G direct: 54M postGC: 1.8G
|
||||
-> (0/4) -> read(11%) -> (1k/1.1k) -> process( 6% 52% 10% 6% 7% 6% 4% 4% 6% 21% 25% 5% 5% 15% 12% 25% 14% 4% 10% 3% 4% 16% 38% 9% 4% 8% 10% 7% 5% 10% 9% 5% 11% 10% 13% 5% 8% 9% 10% 4% 6% 5% 10% 28% 8% 20% 7% 15% 8% 6% 16% 51% 5% 30% 13% 13% 6% 5% 16% 4% 20% 7% 15% 4% 12% 6% 7% 20% 5% 6% 6% 4% 5% 3% 9% 4% 7% 14% 7% 9% 5% 3% 11% 6% 9% 6% 16% 10% 13% 11% 31% 4% 17% 5% 15% 4% 17% 5% 4% 29% 12% 7% 6% 26% 8% 18% 4% 15% 33% 4% 15% 18% 4% 27% 60% 5% 18% 11% 6% 9% 5% 8% 18% 7% 10% 5% 3% 60% 8% 10% 8% 11% 9% 18% 8% 89% 8% 15% 6% 4% 5% 5% 4% 5% 4% 6% 6% 13% 47% 24% 5% 22% 29% 6% 5% 11% 6% 5% 8% 11% 12% 6% 39% 5% 11% 4% 15% 30% 48% 40% 20% 13% 20% 49%) -> (226k/230k) -> write(91% 91% 91% 91% 91% 91%)
|
||||
0:00:33 INF [water_polygons] - read: [ 13k 95% 369/s ] write: [ 205M 8.4M/s ] 17G
|
||||
cpus: 9.6 gc: 0% heap: 30G/214G direct: 54M postGC: 1.7G
|
||||
-> (0/4) -> read( -%) -> (665/1.1k) -> process( 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 3% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 3% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 10% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 3% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2%) -> (225k/230k) -> write(100% 100% 100% 100% 100% 100%)
|
||||
0:00:35 INF [water_polygons] - read: [ 14k 100% 294/s ] write: [ 222M 7.7M/s ] 10G
|
||||
cpus: 9 gc: 0% heap: 7.5G/214G direct: 54M postGC: 1.7G
|
||||
-> (0/4) -> read( -%) -> (0/1.1k) -> process( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%) -> (0/230k) -> write( -% -% -% -% -% -%)
|
||||
0:00:35 INF [water_polygons] - Finished in 32s cpu:22m5s avg:40.9
|
||||
0:00:35 INF [water_polygons] - read 2x(16% 5s wait:9s done:18s)
|
||||
0:00:35 INF [water_polygons] - process 174x(20% 6s wait:25s)
|
||||
0:00:35 INF [water_polygons] - write 6x(74% 24s wait:8s)
|
||||
0:00:35 INF [natural_earth] -
|
||||
0:00:35 INF [natural_earth] - Starting...
|
||||
0:00:35 INF [natural_earth] - unzipping /data/data/sources/natural_earth_vector.sqlite.zip to data/tmp/%2Fnatural_earth_vector.sqlite%2Fpackages%2Fnatural_earth_vector.sqlite
|
||||
0:00:38 INF [natural_earth] - unzipping /data/data/sources/natural_earth_vector.sqlite.zip to data/tmp/%2Fnatural_earth_vector.sqlite%2Fpackages%2Fnatural_earth_vector.sqlite
|
||||
0:00:48 INF [natural_earth] - read: [ 304k 87% 30k/s ] write: [ 0 0/s ] 22G
|
||||
cpus: 2 gc: 0% heap: 14G/214G direct: 54M postGC: 1.7G
|
||||
-> (0/4) -> read(63%) -> (1/1.1k) -> process( 0% 1% 0% 0% 0% 1% 0% 0% 1% 0% 0% 0% 1% 1% 0% 1% 0% 1% 0% 0% 1% 0% 0% 1% 1% 1% 1% 0% 1% 1% 1% 0% 1% 0% 1% 0% 0% 0% 1% 0% 0% 1% 1% 0% 1% 0% 0% 0% 0% 1% 1% 0% 0% 1% 0% 1% 1% 1% 1% 0% 1% 1% 1% 0% 1% 0% 1% 9% 1% 1% 1% 1% 1% 1% 0% 0% 0% 0% 0% 0% 0% 1% 0% 0% 1% 0% 1% 0% 1% 1% 1% 0% 0% 0% 0% 1% 1% 1% 0% 0% 1% 0% 0% 1% 1% 1% 0% 0% 1% 0% 1% 0% 1% 1% 1% 0% 0% 0% 0% 1% 1% 1% 0% 0% 1% 1% 1% 0% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 0% 1% 1% 1% 1% 1% 1% 1% 0% 1% 1% 1% 0% 0% 0% 0% 1% 0% 1% 0% 1% 0% 0% 0% 0% 1% 0% 0% 1% 1% 0% 1% 0% 0% 0% 0%) -> (27k/230k) -> write( 0% 0% 0% 0% 0% 0%)
|
||||
0:00:49 INF [natural_earth] - read: [ 349k 100% 36k/s ] write: [ 33k 26k/s ] 10G
|
||||
cpus: 1.6 gc: 0% heap: 15G/214G direct: 54M postGC: 1.7G
|
||||
-> (0/4) -> read( -%) -> (0/1.1k) -> process( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%) -> (0/230k) -> write( -% -% -% -% -% -%)
|
||||
0:00:49 INF [natural_earth] - Finished in 14s cpu:25s avg:1.7
|
||||
0:00:49 INF [natural_earth] - read 2x(24% 3s wait:2s done:9s)
|
||||
0:00:49 INF [natural_earth] - process 174x(0% 0.1s wait:11s done:3s)
|
||||
0:00:49 INF [natural_earth] - write 6x(0% 0s wait:11s done:3s)
|
||||
0:00:49 INF [osm_pass1] -
|
||||
0:00:49 INF [osm_pass1] - Starting...
|
||||
0:00:59 INF [osm_pass1] - nodes: [ 2.2B 227M/s ] 24G ways: [ 0 0/s ] rels: [ 0 0/s ] blocks: [ 9.1k 907/s ]
|
||||
cpus: 104.4 gc: 9% heap: 31G/214G direct: 57M postGC: 28G hppc: 1k
|
||||
read(76%) -> (0/538) -> process(55% 54% 53% 54% 55% 50% 54% 53% 52% 54% 52% 52% 56% 57% 53% 52% 50% 52% 53% 49% 48% 55% 55% 52% 53% 49% 48% 52% 52% 52% 54% 54% 54% 53% 57% 52% 54% 52% 52% 51% 50% 49% 51% 54% 50% 53% 52% 56% 53% 52% 52% 54% 53% 53% 50% 52% 58% 54% 53% 50% 51% 53% 53% 55% 53% 52% 51% 54% 53% 52% 55% 54% 50% 53% 52% 52% 53% 53% 52% 52% 54% 54% 56% 54% 50% 53% 55% 58% 49% 54% 52% 55% 51% 52% 55% 52% 53% 52% 53% 55% 53% 53% 55% 54% 51% 52% 54% 54% 56% 56% 53% 52% 54% 54% 54% 54% 52% 51% 51% 53% 51% 50% 53% 60% 50% 55% 52% 52% 53% 51% 54% 54% 53% 53% 52% 49% 50% 52% 53% 55% 52% 54% 54% 52% 52% 51% 55% 48% 55% 52% 50% 54% 53% 52% 51% 55% 52% 53% 53% 55% 53% 53% 50% 51% 54% 51% 53% 52% 54% 52% 48% 54% 53% 56% 50% 50% 52% 53% 55%)
|
||||
0:01:09 INF [osm_pass1] - nodes: [ 5.5B 322M/s ] 57G ways: [ 0 0/s ] rels: [ 0 0/s ] blocks: [ 18k 936/s ]
|
||||
cpus: 100.9 gc: 12% heap: 111G/214G direct: 57M postGC: 60G hppc: 1k
|
||||
read(88%) -> (0/538) -> process(48% 50% 49% 51% 48% 48% 49% 49% 47% 51% 50% 48% 51% 52% 49% 46% 49% 48% 49% 50% 49% 48% 49% 51% 49% 48% 50% 51% 50% 50% 51% 51% 45% 48% 51% 50% 49% 48% 50% 48% 46% 51% 48% 52% 45% 49% 47% 51% 49% 54% 49% 49% 48% 48% 47% 45% 48% 51% 51% 45% 47% 46% 51% 50% 54% 47% 47% 49% 50% 49% 49% 51% 50% 49% 50% 50% 48% 52% 52% 49% 48% 48% 47% 50% 50% 48% 49% 50% 46% 50% 48% 50% 49% 49% 51% 50% 48% 45% 48% 47% 49% 50% 49% 46% 49% 51% 50% 46% 49% 50% 50% 47% 51% 50% 48% 50% 46% 50% 49% 50% 47% 50% 52% 50% 49% 49% 49% 49% 50% 48% 49% 50% 51% 48% 49% 50% 48% 49% 50% 46% 50% 49% 50% 48% 51% 47% 48% 47% 50% 53% 50% 49% 49% 50% 50% 48% 49% 47% 50% 50% 48% 47% 51% 49% 49% 52% 50% 49% 48% 52% 50% 49% 50% 51% 49% 50% 47% 48% 51%)
|
||||
0:01:19 INF [osm_pass1] - nodes: [ 8.8B 331M/s ] 90G ways: [ 0 0/s ] rels: [ 0 0/s ] blocks: [ 27k 930/s ]
|
||||
cpus: 109.7 gc: 13% heap: 103G/214G direct: 57M postGC: 96G hppc: 1k
|
||||
read(85%) -> (277/538) -> process(53% 53% 55% 54% 50% 53% 51% 50% 53% 53% 48% 47% 51% 50% 51% 55% 51% 52% 50% 53% 50% 50% 56% 52% 50% 52% 49% 52% 48% 52% 53% 52% 49% 54% 54% 50% 49% 51% 51% 51% 47% 48% 50% 50% 52% 52% 50% 47% 49% 53% 52% 51% 50% 48% 49% 55% 49% 49% 53% 51% 48% 48% 51% 48% 50% 50% 50% 50% 49% 48% 53% 52% 52% 49% 52% 52% 51% 52% 51% 50% 51% 51% 53% 52% 52% 50% 52% 52% 50% 48% 53% 49% 49% 52% 49% 50% 51% 51% 51% 50% 48% 49% 50% 51% 48% 33% 51% 52% 52% 52% 52% 50% 55% 50% 49% 49% 49% 49% 51% 52% 52% 53% 51% 53% 52% 53% 54% 53% 51% 52% 52% 52% 51% 54% 54% 50% 52% 46% 38% 47% 52% 51% 51% 54% 51% 52% 50% 54% 51% 52% 48% 53% 54% 49% 49% 40% 55% 50% 51% 53% 49% 51% 51% 48% 46% 52% 50% 54% 54% 51% 52% 50% 52% 49% 51% 51% 53% 39% 49%)
|
||||
0:01:20 INF [osm_pass1:process] - Finished nodes: 8,876,780,887 (295M/s) in 30s cpu:52m26s gc:3s avg:104.9
|
||||
0:01:30 INF [osm_pass1] - nodes: [ 8.8B 4M/s ] 92G ways: [ 644M 64M/s ] rels: [ 0 0/s ] blocks: [ 37k 1k/s ]
|
||||
cpus: 138.6 gc: 5% heap: 162G/214G direct: 58M postGC: 105G hppc: 1k
|
||||
read(85%) -> (3/538) -> process(71% 70% 68% 72% 67% 71% 69% 67% 71% 69% 68% 69% 68% 66% 67% 72% 72% 64% 69% 72% 69% 67% 71% 70% 66% 67% 69% 69% 68% 70% 72% 70% 71% 70% 67% 72% 71% 68% 65% 70% 70% 70% 72% 70% 71% 69% 67% 69% 70% 68% 70% 66% 73% 70% 69% 71% 70% 67% 68% 72% 63% 70% 69% 71% 70% 68% 72% 68% 65% 67% 69% 68% 71% 67% 70% 67% 74% 69% 72% 71% 69% 67% 66% 68% 69% 73% 66% 67% 65% 66% 73% 71% 68% 69% 68% 68% 67% 71% 73% 73% 68% 68% 69% 67% 69% 67% 71% 70% 66% 68% 71% 72% 70% 66% 66% 69% 68% 71% 69% 72% 67% 70% 70% 73% 67% 68% 68% 69% 69% 67% 71% 67% 68% 73% 67% 72% 69% 70% 65% 72% 68% 68% 71% 68% 66% 69% 71% 66% 66% 70% 69% 69% 68% 67% 71% 67% 71% 70% 65% 69% 70% 68% 68% 70% 70% 66% 70% 70% 68% 71% 70% 69% 69% 72% 69% 69% 68% 68% 71%)
|
||||
0:01:34 INF [osm_pass1:process] - Finished ways: 993,607,585 (69M/s) in 14s cpu:33m25s avg:139.5
|
||||
0:01:40 INF [osm_pass1] - nodes: [ 8.8B 0/s ] 92G ways: [ 993M 34M/s ] rels: [ 4.4M 440k/s ] blocks: [ 42k 495/s ]
|
||||
cpus: 76.1 gc: 5% heap: 105G/214G direct: 54M postGC: 100G hppc: 321M
|
||||
read( -%) -> (129/538) -> process(37% 36% 39% 38% 38% 38% 37% 37% 37% 38% 36% 36% 34% 37% 41% 37% 37% 39% 36% 39% 36% 37% 39% 36% 36% 37% 36% 36% 38% 37% 40% 37% 36% 37% 40% 37% 37% 35% 37% 39% 36% 37% 35% 38% 38% 39% 37% 38% 37% 36% 39% 37% 39% 38% 37% 36% 38% 37% 38% 38% 38% 36% 37% 36% 38% 36% 35% 38% 37% 38% 38% 39% 38% 39% 37% 36% 38% 37% 35% 36% 38% 37% 36% 38% 37% 37% 36% 38% 39% 39% 38% 39% 39% 36% 36% 37% 37% 36% 39% 37% 40% 38% 39% 39% 38% 39% 38% 35% 38% 37% 36% 36% 37% 38% 37% 37% 35% 38% 36% 37% 35% 36% 37% 34% 36% 39% 39% 38% 36% 36% 39% 35% 37% 38% 38% 37% 36% 36% 41% 37% 38% 39% 39% 37% 38% 39% 36% 40% 38% 35% 36% 36% 37% 36% 39% 40% 36% 37% 38% 40% 37% 37% 40% 38% 36% 38% 39% 36% 36% 34% 40% 37% 36% 35% 37% 37% 40% 38% 36%)
|
||||
0:01:47 INF [osm_pass1:process] - Finished relations: 11,749,466 (887k/s) in 13s cpu:4m16s avg:19.3
|
||||
0:01:47 INF [osm_pass1] - nodes: [ 8.8B 0/s ] 92G ways: [ 993M 0/s ] rels: [ 11M 955k/s ] blocks: [ 43k 40/s ]
|
||||
cpus: 16.4 gc: 7% heap: 104G/214G direct: 54M postGC: 101G hppc: 708M
|
||||
read( -%) -> (0/538) -> process( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%)
|
||||
0:01:47 DEB [osm_pass1] - Processed 43,182 blocks:
|
||||
0:01:47 DEB [osm_pass1] - nodes: 8,876,780,887 (295M/s) in 30s cpu:52m26s gc:3s avg:104.9
|
||||
0:01:47 DEB [osm_pass1] - ways: 993,607,585 (69M/s) in 14s cpu:33m25s avg:139.5
|
||||
0:01:47 DEB [osm_pass1] - relations: 11,749,466 (887k/s) in 13s cpu:4m16s avg:19.3
|
||||
0:01:47 INF [osm_pass1] - Finished in 58s cpu:1h30m37s gc:5s avg:94
|
||||
0:01:47 INF [osm_pass1] - read 1x(65% 38s wait:2s done:13s)
|
||||
0:01:47 INF [osm_pass1] - process 179x(45% 26s block:16s wait:11s done:1s)
|
||||
0:01:47 INF [osm_pass2] -
|
||||
0:01:47 INF [osm_pass2] - Starting...
|
||||
0:01:58 INF [osm_pass2] - nodes: [ 785M 9% 78M/s ] 92G ways: [ 0 0% 0/s ] rels: [ 0 0% 0/s ] features: [ 280M 5.7M/s ] 22G blocks: [ 3.5k 8% 349/s ]
|
||||
cpus: 94.8 gc: 10% heap: 151G/214G direct: 57M postGC: 103G relInfo: 708M mpGeoms: 297
|
||||
read(36%) -> (28/262) -> process(49% 45% 43% 49% 54% 53% 53% 59% 44% 45% 58% 50% 58% 49% 56% 54% 47% 48% 49% 51% 40% 45% 48% 46% 41% 42% 45% 41% 58% 45% 50% 48% 46% 46% 42% 53% 53% 47% 50% 51% 63% 46% 46% 56% 50% 52% 52% 48% 49% 44% 42% 44% 46% 49% 50% 47% 52% 47% 49% 48% 48% 49% 45% 44% 47% 43% 48% 49% 44% 47% 47% 50% 45% 45% 42% 45% 45% 49% 50% 44% 45% 46% 49% 49% 43% 48% 53% 50% 42% 45% 48% 49% 42% 48% 43% 46% 51% 47% 43% 45% 46% 45% 47% 45% 51% 44% 49% 40% 50% 52% 51% 45% 49% 44% 60% 49% 46% 46% 49% 45% 45% 43% 44% 43% 52% 43% 45% 51% 49% 50% 46% 45% 48% 49% 43% 44% 46% 43% 51% 40% 50% 51% 47% 44% 48% 32% 48% 48% 50% 40% 42% 40% 42% 49% 48% 54% 45% 50% 45% 50% 46% 51% 43% 43% 46% 49% 42% 48% 42% 42% 46% 50% 46% 48%) -> (88k/230k) -> write(41% 42% 42% 42% 42% 42%)
|
||||
0:02:11 INF [osm_pass2] - nodes: [ 2.2B 26% 141M/s ] 92G ways: [ 0 0% 0/s ] rels: [ 0 0% 0/s ] features: [ 351M 6.6M/s ] 30G blocks: [ 9.2k 21% 523/s ]
|
||||
cpus: 122.2 gc: 10% heap: 143G/214G direct: 57M postGC: 101G relInfo: 708M mpGeoms: 297
|
||||
read(63%) -> (49/262) -> process(64% 70% 57% 64% 65% 61% 59% 57% 67% 64% 72% 64% 64% 60% 57% 61% 69% 60% 57% 70% 58% 64% 73% 68% 58% 62% 65% 63% 71% 60% 55% 62% 66% 55% 58% 69% 55% 65% 61% 63% 70% 58% 64% 71% 63% 65% 39% 65% 51% 66% 66% 64% 60% 55% 62% 53% 64% 62% 69% 63% 56% 64% 63% 61% 60% 62% 61% 64% 62% 63% 59% 59% 64% 60% 67% 62% 61% 61% 61% 64% 70% 64% 57% 62% 64% 63% 61% 60% 62% 67% 55% 64% 60% 62% 53% 66% 58% 59% 58% 60% 63% 60% 61% 62% 66% 70% 54% 64% 64% 63% 66% 65% 60% 65% 48% 55% 68% 53% 72% 68% 60% 57% 62% 63% 62% 66% 63% 62% 66% 63% 58% 64% 57% 68% 67% 53% 54% 60% 70% 61% 56% 63% 63% 67% 53% 55% 60% 60% 60% 65% 51% 60% 62% 68% 58% 64% 53% 63% 61% 64% 61% 69% 60% 56% 70% 67% 69% 65% 66% 66% 62% 65% 70% 60%) -> (107k/230k) -> write(71% 71% 70% 70% 71% 70%)
|
||||
0:02:23 INF [osm_pass2] - nodes: [ 4.6B 52% 171M/s ] 92G ways: [ 0 0% 0/s ] rels: [ 0 0% 0/s ] features: [ 425M 5.5M/s ] 38G blocks: [ 16k 37% 505/s ]
|
||||
cpus: 124.9 gc: 4% heap: 176G/214G direct: 57M postGC: 100G relInfo: 708M mpGeoms: 297
|
||||
read(76%) -> (87/262) -> process(64% 63% 65% 60% 60% 71% 73% 58% 62% 59% 58% 56% 68% 62% 63% 61% 60% 61% 73% 62% 71% 56% 54% 54% 61% 65% 56% 57% 65% 71% 74% 58% 63% 63% 63% 53% 64% 67% 66% 67% 51% 57% 61% 60% 57% 64% 65% 69% 58% 66% 65% 66% 63% 68% 63% 69% 53% 69% 59% 56% 67% 66% 63% 58% 61% 50% 65% 71% 75% 62% 59% 67% 71% 66% 64% 66% 61% 61% 63% 48% 72% 57% 59% 58% 66% 62% 62% 67% 68% 63% 62% 64% 57% 69% 64% 61% 72% 57% 57% 60% 56% 57% 69% 61% 60% 62% 64% 66% 67% 63% 69% 60% 59% 57% 67% 66% 58% 68% 61% 56% 63% 68% 61% 59% 59% 62% 64% 61% 49% 68% 65% 64% 63% 60% 61% 69% 65% 58% 64% 63% 64% 59% 58% 66% 70% 63% 60% 59% 65% 59% 66% 69% 66% 61% 61% 60% 62% 68% 60% 66% 65% 65% 59% 61% 68% 63% 61% 58% 65% 65% 62% 64% 72% 67%) -> (90k/230k) -> write(62% 61% 63% 61% 62% 62%)
|
||||
0:02:34 INF [osm_pass2] - nodes: [ 6.6B 75% 176M/s ] 92G ways: [ 0 0% 0/s ] rels: [ 0 0% 0/s ] features: [ 484M 5M/s ] 46G blocks: [ 21k 50% 497/s ]
|
||||
cpus: 148.6 gc: 4% heap: 185G/214G direct: 57M postGC: 100G relInfo: 708M mpGeoms: 297
|
||||
read(82%) -> (77/262) -> process(77% 76% 86% 78% 78% 83% 84% 74% 75% 74% 75% 77% 79% 75% 75% 78% 79% 81% 75% 78% 74% 81% 74% 80% 79% 75% 78% 83% 77% 73% 80% 80% 74% 78% 71% 72% 70% 74% 79% 79% 69% 85% 89% 68% 83% 74% 79% 63% 79% 80% 76% 74% 69% 80% 78% 73% 76% 74% 72% 75% 72% 71% 85% 81% 75% 73% 77% 77% 74% 71% 80% 71% 74% 74% 72% 81% 69% 72% 83% 77% 61% 72% 71% 81% 84% 80% 80% 80% 74% 76% 78% 78% 70% 74% 79% 79% 73% 73% 86% 71% 70% 76% 73% 78% 72% 77% 80% 72% 74% 77% 77% 71% 84% 81% 84% 73% 76% 77% 79% 78% 79% 80% 74% 86% 78% 77% 78% 80% 75% 76% 72% 73% 76% 74% 82% 78% 77% 84% 79% 82% 83% 79% 81% 77% 82% 75% 80% 83% 79% 78% 80% 78% 73% 75% 79% 78% 77% 75% 79% 78% 73% 86% 72% 76% 72% 71% 79% 76% 71% 71% 76% 71% 83% 77%) -> (108k/230k) -> write(70% 69% 70% 70% 69% 68%)
|
||||
0:02:44 INF [osm_pass2] - nodes: [ 8.5B 96% 174M/s ] 92G ways: [ 0 0% 0/s ] rels: [ 0 0% 0/s ] features: [ 542M 5.4M/s ] 51G blocks: [ 26k 62% 488/s ]
|
||||
cpus: 152.1 gc: 3% heap: 177G/214G direct: 57M postGC: 99G relInfo: 708M mpGeoms: 297
|
||||
read(79%) -> (84/262) -> process(78% 85% 86% 77% 77% 76% 87% 81% 72% 73% 67% 82% 76% 78% 80% 84% 82% 81% 77% 76% 85% 81% 75% 83% 75% 79% 77% 75% 81% 82% 78% 79% 77% 75% 77% 75% 83% 68% 82% 76% 75% 80% 81% 76% 80% 85% 70% 78% 74% 70% 82% 74% 80% 81% 74% 79% 77% 80% 75% 81% 79% 82% 76% 81% 77% 82% 69% 83% 79% 80% 83% 75% 82% 78% 79% 78% 81% 68% 66% 85% 83% 80% 79% 80% 79% 82% 81% 80% 85% 68% 72% 76% 76% 70% 77% 80% 74% 76% 86% 76% 77% 71% 76% 74% 75% 85% 78% 69% 75% 77% 67% 78% 72% 73% 76% 80% 82% 71% 83% 82% 78% 71% 79% 77% 74% 76% 78% 85% 77% 67% 81% 82% 84% 75% 74% 69% 75% 83% 76% 75% 80% 77% 74% 80% 80% 82% 81% 80% 83% 75% 78% 76% 72% 77% 74% 83% 77% 77% 73% 79% 83% 80% 81% 73% 62% 79% 77% 80% 74% 76% 80% 80% 80% 78%) -> (92k/230k) -> write(73% 76% 74% 75% 74% 74%)
|
||||
0:02:46 DEB [osm_pass2:process] - Sorting long long multimap...
|
||||
0:02:47 INF [osm_pass2:process] - Finished nodes: 8,876,780,887 (150M/s) in 59s cpu:2h6m27s gc:4s avg:128.3
|
||||
0:02:53 DEB [osm_pass2:process] - Sorted long long multimap 6s cpu:2m48s avg:26.3
|
||||
0:02:54 INF [osm_pass2] - nodes: [ 8.8B 100% 33M/s ] 92G ways: [ 230k 0% 22k/s ] rels: [ 0 0% 0/s ] features: [ 556M 1.3M/s ] 54G blocks: [ 27k 65% 104/s ]
|
||||
cpus: 55 gc: 1% heap: 114G/214G direct: 57M postGC: 103G relInfo: 573M mpGeoms: 3.1M
|
||||
read(14%) -> (88/262) -> process(18% 22% 24% 18% 23% 19% 23% 22% 24% 16% 22% 23% 20% 23% 19% 18% 21% 24% 23% 17% 20% 20% 20% 22% 24% 18% 18% 18% 16% 18% 24% 23% 18% 22% 26% 22% 16% 22% 23% 14% 19% 22% 24% 17% 15% 17% 19% 22% 24% 23% 23% 18% 22% 19% 25% 67% 22% 21% 22% 18% 20% 21% 20% 18% 23% 24% 23% 23% 14% 21% 22% 24% 17% 19% 22% 19% 19% 15% 18% 20% 19% 23% 21% 22% 25% 20% 19% 24% 20% 19% 22% 20% 20% 24% 22% 20% 20% 22% 20% 18% 20% 19% 22% 24% 20% 23% 18% 21% 24% 22% 22% 22% 23% 16% 20% 16% 19% 23% 15% 22% 19% 19% 24% 22% 17% 21% 21% 20% 21% 17% 18% 22% 23% 21% 23% 24% 21% 23% 23% 14% 15% 18% 17% 16% 24% 22% 19% 16% 17% 21% 23% 26% 22% 17% 20% 17% 21% 21% 18% 19% 21% 23% 22% 23% 21% 15% 21% 24% 19% 22% 19% 21% 17% 23%) -> (89k/230k) -> write(14% 14% 12% 14% 14% 14%)
|
||||
0:03:05 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 13M 1% 1.3M/s ] rels: [ 0 0% 0/s ] features: [ 641M 8.2M/s ] 62G blocks: [ 28k 65% 21/s ]
|
||||
cpus: 93 gc: 3% heap: 104G/214G direct: 57M postGC: 101G relInfo: 573M mpGeoms: 177M
|
||||
read( 2%) -> (87/262) -> process(45% 45% 44% 48% 49% 49% 49% 46% 47% 37% 48% 47% 49% 47% 47% 42% 52% 48% 48% 42% 43% 45% 43% 47% 50% 43% 46% 47% 48% 43% 48% 52% 45% 49% 50% 47% 41% 51% 47% 48% 47% 47% 50% 39% 45% 33% 41% 49% 41% 48% 44% 48% 48% 45% 46% 37% 46% 44% 40% 47% 47% 47% 45% 46% 48% 46% 47% 47% 47% 49% 47% 49% 39% 41% 50% 48% 50% 43% 41% 47% 50% 46% 49% 50% 44% 43% 43% 46% 48% 46% 47% 46% 46% 50% 47% 44% 44% 49% 48% 46% 45% 48% 44% 49% 40% 49% 51% 45% 48% 46% 48% 43% 44% 38% 48% 49% 42% 50% 41% 47% 48% 45% 48% 50% 46% 49% 51% 49% 46% 48% 49% 49% 48% 52% 48% 46% 49% 50% 45% 47% 45% 48% 45% 39% 48% 48% 49% 47% 46% 51% 45% 46% 49% 45% 43% 41% 46% 49% 40% 48% 49% 52% 49% 47% 48% 37% 47% 46% 46% 48% 47% 48% 45% 49%) -> (176k/230k) -> write(77% 76% 76% 77% 77% 77%)
|
||||
0:03:15 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 31M 3% 1.6M/s ] rels: [ 0 0% 0/s ] features: [ 726M 8.1M/s ] 69G blocks: [ 28k 66% 37/s ]
|
||||
cpus: 131.4 gc: 7% heap: 103G/214G direct: 58M postGC: 102G relInfo: 573M mpGeoms: 621M
|
||||
read( 5%) -> (87/262) -> process(68% 66% 61% 67% 69% 65% 63% 67% 65% 67% 71% 66% 66% 76% 60% 66% 63% 70% 69% 62% 68% 62% 63% 67% 64% 71% 67% 66% 62% 69% 60% 63% 66% 66% 68% 73% 63% 66% 65% 65% 68% 61% 64% 66% 62% 65% 66% 66% 67% 66% 61% 66% 67% 65% 61% 64% 63% 61% 62% 66% 68% 64% 69% 67% 67% 69% 66% 72% 68% 64% 63% 62% 69% 68% 64% 73% 65% 68% 66% 67% 67% 68% 64% 64% 74% 64% 66% 63% 64% 62% 61% 65% 65% 68% 65% 66% 70% 62% 69% 64% 67% 65% 64% 66% 66% 71% 64% 64% 64% 66% 73% 75% 66% 65% 67% 68% 65% 68% 64% 71% 66% 64% 69% 66% 64% 65% 70% 65% 74% 64% 67% 64% 68% 64% 66% 67% 68% 64% 65% 66% 72% 73% 61% 62% 67% 65% 66% 67% 66% 65% 67% 65% 73% 67% 70% 68% 68% 65% 72% 66% 62% 66% 61% 63% 69% 71% 65% 69% 64% 74% 64% 69% 73% 66%) -> (134k/230k) -> write(85% 85% 86% 85% 84% 85%)
|
||||
0:03:26 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 53M 5% 2M/s ] rels: [ 0 0% 0/s ] features: [ 793M 6.4M/s ] 74G blocks: [ 29k 67% 39/s ]
|
||||
cpus: 157.7 gc: 6% heap: 195G/214G direct: 58M postGC: 139G relInfo: 573M mpGeoms: 909M
|
||||
read(10%) -> (88/262) -> process(78% 85% 84% 80% 81% 78% 79% 74% 82% 81% 80% 85% 81% 87% 80% 83% 79% 80% 81% 82% 80% 75% 77% 78% 84% 77% 78% 80% 77% 80% 82% 81% 79% 76% 83% 85% 76% 80% 85% 79% 79% 79% 82% 80% 84% 82% 84% 78% 83% 79% 81% 79% 79% 76% 81% 73% 79% 75% 82% 84% 82% 80% 87% 80% 80% 77% 78% 85% 79% 81% 80% 81% 81% 80% 78% 87% 80% 80% 76% 82% 79% 79% 83% 79% 87% 78% 79% 78% 80% 76% 81% 78% 84% 81% 82% 84% 82% 82% 84% 85% 77% 81% 83% 83% 81% 86% 83% 78% 77% 81% 81% 71% 79% 80% 83% 76% 79% 76% 80% 84% 83% 79% 80% 75% 81% 77% 76% 76% 89% 79% 81% 81% 87% 79% 79% 76% 78% 72% 83% 83% 85% 81% 73% 84% 84% 79% 81% 83% 79% 80% 82% 83% 73% 82% 84% 84% 80% 79% 84% 80% 77% 80% 80% 81% 81% 81% 81% 78% 81% 88% 77% 80% 82% 80%) -> (85k/230k) -> write(84% 85% 85% 86% 84% 85%)
|
||||
0:03:37 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 74M 7% 1.9M/s ] rels: [ 0 0% 0/s ] features: [ 860M 6.3M/s ] 78G blocks: [ 29k 68% 36/s ]
|
||||
cpus: 157.5 gc: 6% heap: 147G/214G direct: 58M postGC: 102G relInfo: 573M mpGeoms: 1.2G
|
||||
read( 8%) -> (88/262) -> process(80% 81% 86% 85% 80% 81% 84% 84% 83% 81% 81% 79% 84% 76% 81% 84% 83% 83% 80% 83% 81% 82% 82% 83% 82% 84% 83% 83% 87% 80% 83% 86% 72% 82% 84% 85% 76% 86% 83% 77% 84% 79% 83% 83% 75% 76% 83% 77% 84% 86% 84% 84% 82% 81% 87% 83% 80% 85% 81% 81% 82% 76% 81% 83% 82% 84% 77% 84% 84% 79% 87% 82% 85% 83% 81% 78% 80% 85% 80% 83% 79% 78% 82% 82% 77% 82% 74% 86% 82% 85% 82% 80% 87% 81% 83% 85% 84% 83% 76% 77% 85% 75% 85% 79% 84% 87% 78% 83% 82% 79% 83% 84% 82% 81% 81% 78% 77% 83% 83% 81% 81% 80% 78% 85% 81% 83% 82% 85% 80% 75% 84% 71% 74% 80% 86% 82% 79% 84% 75% 80% 80% 78% 79% 78% 81% 81% 82% 84% 85% 84% 84% 83% 77% 83% 81% 79% 85% 79% 82% 87% 81% 84% 78% 82% 80% 81% 79% 84% 82% 77% 83% 71% 79% 80%) -> (105k/230k) -> write(84% 85% 86% 86% 85% 86%)
|
||||
0:03:47 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 99M 10% 2.3M/s ] rels: [ 0 0% 0/s ] features: [ 940M 7.3M/s ] 85G blocks: [ 29k 69% 39/s ]
|
||||
cpus: 147.7 gc: 6% heap: 191G/214G direct: 58M postGC: 102G relInfo: 573M mpGeoms: 1.5G
|
||||
read( 7%) -> (88/262) -> process(75% 76% 76% 75% 77% 77% 77% 75% 72% 78% 78% 78% 72% 73% 74% 79% 75% 77% 77% 76% 72% 78% 75% 76% 77% 75% 79% 74% 74% 76% 76% 77% 76% 76% 75% 79% 76% 75% 76% 79% 79% 77% 76% 75% 77% 76% 78% 75% 76% 75% 74% 75% 77% 74% 77% 76% 76% 79% 76% 76% 77% 76% 77% 77% 75% 78% 77% 75% 70% 76% 72% 75% 79% 73% 75% 77% 75% 77% 75% 77% 76% 74% 75% 77% 75% 73% 74% 76% 74% 74% 74% 77% 75% 75% 75% 78% 75% 75% 76% 76% 74% 80% 76% 77% 75% 75% 75% 79% 77% 76% 75% 76% 75% 77% 76% 74% 76% 75% 76% 73% 73% 74% 75% 75% 75% 78% 75% 76% 77% 78% 79% 77% 76% 76% 76% 78% 77% 76% 79% 78% 75% 76% 76% 74% 76% 74% 75% 77% 72% 78% 74% 76% 77% 77% 74% 76% 73% 77% 76% 75% 76% 78% 76% 74% 76% 76% 79% 76% 70% 77% 79% 75% 78% 77%) -> (151k/230k) -> write(90% 90% 89% 89% 90% 90%)
|
||||
0:03:57 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 123M 12% 2.3M/s ] rels: [ 0 0% 0/s ] features: [ 1B 7.4M/s ] 91G blocks: [ 30k 70% 40/s ]
|
||||
cpus: 143.7 gc: 6% heap: 114G/214G direct: 58M postGC: 102G relInfo: 573M mpGeoms: 1.8G
|
||||
read( 7%) -> (88/262) -> process(78% 75% 73% 73% 74% 74% 73% 74% 77% 75% 76% 71% 73% 75% 72% 73% 76% 73% 71% 74% 74% 70% 73% 79% 71% 74% 75% 76% 73% 70% 77% 77% 74% 73% 72% 71% 76% 74% 74% 74% 73% 75% 73% 72% 75% 71% 71% 74% 75% 74% 75% 72% 74% 76% 77% 73% 67% 74% 74% 73% 77% 74% 75% 75% 76% 75% 73% 75% 68% 77% 73% 71% 74% 74% 73% 74% 71% 71% 73% 73% 71% 73% 74% 75% 77% 75% 75% 75% 74% 74% 74% 74% 73% 73% 75% 69% 72% 72% 76% 75% 73% 74% 76% 73% 76% 77% 73% 73% 75% 68% 73% 75% 77% 75% 74% 74% 75% 75% 76% 74% 71% 75% 75% 73% 75% 72% 75% 74% 76% 75% 74% 75% 77% 74% 74% 74% 74% 75% 71% 74% 73% 74% 73% 76% 75% 74% 73% 74% 74% 75% 71% 72% 74% 73% 71% 74% 73% 66% 74% 74% 73% 75% 74% 75% 75% 74% 70% 76% 76% 72% 75% 72% 74% 73%) -> (124k/230k) -> write(88% 88% 88% 89% 90% 88%)
|
||||
0:04:07 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 146M 15% 2.2M/s ] rels: [ 0 0% 0/s ] features: [ 1B 7M/s ] 95G blocks: [ 30k 71% 34/s ]
|
||||
cpus: 149 gc: 6% heap: 176G/214G direct: 58M postGC: 138G relInfo: 573M mpGeoms: 2.1G
|
||||
read( 6%) -> (88/262) -> process(78% 76% 75% 75% 74% 76% 79% 78% 77% 74% 77% 75% 77% 78% 76% 77% 77% 78% 79% 76% 73% 77% 77% 76% 77% 78% 78% 76% 74% 74% 76% 76% 75% 76% 74% 76% 75% 77% 76% 76% 79% 78% 75% 79% 78% 76% 77% 76% 77% 72% 77% 78% 78% 74% 76% 77% 76% 79% 75% 75% 75% 72% 75% 76% 76% 76% 73% 76% 77% 78% 79% 75% 77% 76% 76% 78% 76% 78% 78% 77% 73% 75% 78% 75% 76% 79% 77% 76% 77% 77% 76% 78% 79% 74% 79% 72% 74% 77% 76% 77% 74% 75% 74% 75% 78% 74% 75% 75% 74% 76% 74% 77% 78% 77% 77% 73% 76% 79% 76% 77% 78% 74% 78% 74% 74% 75% 75% 76% 77% 77% 77% 75% 77% 78% 73% 76% 74% 76% 78% 76% 80% 74% 79% 75% 77% 75% 73% 73% 76% 77% 75% 75% 74% 79% 75% 77% 77% 78% 75% 74% 78% 78% 72% 77% 75% 77% 77% 75% 77% 75% 77% 76% 77% 75%) -> (152k/230k) -> write(87% 88% 87% 89% 87% 87%)
|
||||
0:04:17 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 169M 17% 2.2M/s ] rels: [ 0 0% 0/s ] features: [ 1.1B 7.1M/s ] 100G blocks: [ 30k 72% 36/s ]
|
||||
cpus: 145.3 gc: 6% heap: 153G/214G direct: 58M postGC: 103G relInfo: 573M mpGeoms: 2.3G
|
||||
read( 7%) -> (88/262) -> process(74% 77% 74% 76% 75% 72% 75% 74% 73% 74% 75% 71% 75% 75% 72% 74% 78% 76% 73% 76% 72% 75% 73% 74% 74% 72% 76% 71% 71% 75% 74% 75% 72% 73% 76% 73% 73% 74% 72% 74% 74% 74% 75% 73% 72% 75% 75% 76% 77% 77% 77% 74% 74% 75% 77% 75% 76% 71% 75% 78% 75% 74% 75% 73% 75% 76% 72% 73% 74% 76% 76% 77% 78% 73% 73% 75% 75% 73% 77% 76% 75% 74% 74% 74% 76% 75% 73% 72% 76% 75% 72% 73% 72% 73% 75% 71% 73% 74% 75% 76% 77% 72% 76% 72% 72% 74% 74% 74% 75% 75% 76% 73% 76% 75% 74% 74% 73% 73% 73% 76% 69% 72% 74% 74% 73% 75% 77% 76% 74% 72% 76% 73% 73% 72% 74% 77% 75% 73% 75% 73% 76% 77% 73% 72% 74% 72% 75% 74% 76% 73% 72% 73% 74% 77% 69% 75% 76% 71% 73% 74% 75% 76% 73% 74% 72% 76% 75% 75% 73% 75% 74% 75% 74% 74%) -> (155k/230k) -> write(89% 89% 90% 89% 89% 89%)
|
||||
0:04:27 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 192M 19% 2.3M/s ] rels: [ 0 0% 0/s ] features: [ 1.2B 7M/s ] 105G blocks: [ 31k 73% 35/s ]
|
||||
cpus: 146.1 gc: 6% heap: 138G/214G direct: 58M postGC: 103G relInfo: 573M mpGeoms: 2.6G
|
||||
read( 6%) -> (88/262) -> process(75% 73% 74% 76% 72% 73% 76% 73% 73% 73% 76% 74% 72% 74% 74% 78% 74% 76% 75% 74% 74% 75% 76% 77% 73% 74% 76% 72% 77% 73% 76% 74% 75% 75% 73% 78% 70% 74% 76% 78% 74% 72% 73% 74% 77% 74% 76% 75% 76% 72% 82% 76% 73% 74% 75% 74% 74% 75% 73% 77% 77% 77% 74% 73% 77% 76% 78% 73% 76% 76% 74% 76% 74% 75% 75% 75% 74% 73% 73% 75% 78% 72% 76% 73% 80% 76% 73% 76% 75% 76% 74% 72% 72% 73% 74% 74% 74% 75% 76% 75% 73% 73% 73% 73% 74% 75% 77% 73% 74% 72% 74% 75% 72% 75% 75% 74% 75% 72% 75% 72% 78% 77% 76% 73% 77% 74% 75% 74% 76% 73% 73% 74% 74% 73% 70% 76% 77% 74% 77% 76% 75% 75% 75% 77% 77% 72% 75% 74% 72% 73% 74% 73% 74% 76% 77% 75% 73% 73% 70% 74% 79% 77% 75% 71% 76% 75% 73% 77% 74% 74% 75% 72% 73% 74%) -> (163k/230k) -> write(89% 90% 90% 90% 90% 89%)
|
||||
0:04:38 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 216M 22% 2.3M/s ] rels: [ 0 0% 0/s ] features: [ 1.2B 6.4M/s ] 109G blocks: [ 31k 73% 39/s ]
|
||||
cpus: 152.1 gc: 7% heap: 152G/214G direct: 58M postGC: 147G relInfo: 573M mpGeoms: 2.9G
|
||||
read( 8%) -> (88/262) -> process(79% 78% 77% 79% 79% 75% 76% 79% 74% 79% 79% 77% 80% 75% 80% 79% 78% 79% 77% 77% 80% 81% 78% 77% 76% 76% 75% 76% 78% 76% 78% 75% 75% 77% 79% 79% 77% 78% 79% 78% 79% 76% 76% 78% 78% 76% 75% 75% 78% 77% 79% 77% 80% 80% 77% 77% 76% 78% 78% 78% 75% 75% 78% 78% 76% 82% 77% 79% 76% 79% 78% 80% 77% 78% 75% 77% 76% 77% 77% 75% 78% 76% 75% 77% 78% 78% 75% 78% 77% 75% 79% 77% 76% 77% 78% 79% 77% 74% 77% 80% 77% 77% 78% 79% 77% 78% 79% 79% 78% 79% 77% 79% 78% 78% 77% 75% 75% 74% 78% 74% 79% 79% 77% 79% 80% 77% 75% 76% 79% 75% 76% 74% 77% 77% 78% 75% 77% 78% 79% 77% 80% 76% 78% 79% 78% 79% 76% 77% 77% 79% 81% 78% 76% 79% 78% 77% 78% 78% 75% 78% 78% 75% 78% 76% 78% 79% 77% 78% 77% 77% 75% 76% 78% 78%) -> (146k/230k) -> write(87% 87% 86% 88% 86% 88%)
|
||||
0:04:48 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 240M 24% 2.3M/s ] rels: [ 0 0% 0/s ] features: [ 1.3B 6.7M/s ] 113G blocks: [ 32k 74% 37/s ]
|
||||
cpus: 148.9 gc: 6% heap: 152G/214G direct: 58M postGC: 104G relInfo: 573M mpGeoms: 3.2G
|
||||
read( 7%) -> (88/262) -> process(76% 76% 76% 74% 78% 78% 76% 77% 74% 76% 77% 76% 77% 82% 78% 74% 74% 75% 79% 78% 79% 77% 77% 77% 76% 77% 75% 76% 77% 73% 74% 77% 75% 76% 76% 76% 73% 77% 74% 73% 78% 74% 76% 75% 74% 75% 75% 75% 76% 77% 75% 78% 79% 78% 78% 74% 77% 74% 77% 78% 75% 76% 75% 75% 76% 77% 76% 75% 79% 76% 76% 71% 76% 73% 76% 79% 75% 75% 77% 77% 75% 78% 76% 74% 76% 75% 74% 75% 76% 73% 75% 79% 77% 77% 75% 77% 78% 77% 75% 76% 76% 77% 74% 77% 75% 75% 75% 76% 76% 75% 74% 74% 75% 75% 75% 76% 76% 73% 74% 75% 76% 76% 77% 73% 72% 75% 75% 76% 75% 74% 76% 76% 77% 78% 75% 75% 74% 75% 74% 76% 76% 72% 75% 77% 75% 76% 75% 76% 75% 77% 75% 75% 76% 77% 76% 72% 75% 76% 75% 75% 72% 78% 76% 72% 73% 79% 76% 79% 74% 75% 77% 78% 77% 73%) -> (144k/230k) -> write(89% 85% 88% 86% 88% 88%)
|
||||
0:04:58 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 263M 27% 2.3M/s ] rels: [ 0 0% 0/s ] features: [ 1.4B 6.7M/s ] 118G blocks: [ 32k 75% 37/s ]
|
||||
cpus: 147.3 gc: 6% heap: 156G/214G direct: 58M postGC: 140G relInfo: 573M mpGeoms: 3.5G
|
||||
read( 7%) -> (88/262) -> process(75% 71% 77% 75% 79% 75% 75% 75% 74% 77% 77% 78% 76% 76% 73% 77% 72% 76% 73% 74% 76% 76% 74% 75% 75% 74% 73% 75% 74% 72% 78% 76% 71% 76% 77% 73% 78% 74% 73% 77% 75% 74% 74% 75% 76% 75% 76% 71% 72% 74% 77% 75% 75% 77% 75% 74% 78% 76% 73% 76% 76% 76% 76% 73% 74% 75% 78% 76% 75% 74% 75% 76% 78% 74% 74% 72% 77% 77% 74% 75% 76% 74% 76% 76% 74% 75% 76% 78% 75% 76% 77% 74% 76% 77% 73% 74% 76% 71% 74% 76% 75% 75% 77% 71% 76% 74% 75% 73% 77% 74% 76% 74% 75% 74% 77% 75% 76% 72% 75% 77% 75% 74% 75% 77% 73% 74% 74% 74% 74% 71% 70% 73% 73% 74% 77% 76% 75% 72% 73% 75% 77% 73% 76% 73% 75% 76% 73% 72% 76% 75% 73% 77% 74% 76% 77% 76% 74% 78% 71% 76% 77% 76% 77% 76% 77% 76% 72% 74% 75% 75% 76% 77% 76% 77%) -> (146k/230k) -> write(88% 88% 89% 88% 88% 88%)
|
||||
0:05:08 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 289M 29% 2.5M/s ] rels: [ 0 0% 0/s ] features: [ 1.5B 6.7M/s ] 122G blocks: [ 32k 76% 38/s ]
|
||||
cpus: 145.8 gc: 6% heap: 186G/214G direct: 58M postGC: 104G relInfo: 573M mpGeoms: 3.8G
|
||||
read( 7%) -> (88/262) -> process(75% 72% 71% 73% 72% 77% 74% 75% 74% 74% 75% 78% 73% 76% 71% 75% 73% 76% 71% 71% 73% 76% 74% 75% 70% 73% 75% 77% 72% 72% 72% 76% 75% 77% 76% 75% 76% 72% 76% 74% 73% 75% 72% 73% 76% 75% 74% 74% 72% 75% 73% 75% 71% 74% 72% 75% 76% 77% 77% 74% 74% 76% 73% 74% 77% 76% 76% 77% 75% 77% 75% 76% 74% 72% 74% 76% 75% 74% 76% 76% 78% 72% 76% 75% 73% 74% 79% 70% 74% 76% 76% 74% 70% 76% 68% 72% 73% 74% 71% 73% 76% 72% 76% 69% 71% 72% 77% 76% 75% 75% 74% 68% 75% 76% 75% 76% 70% 75% 77% 76% 75% 75% 75% 68% 71% 74% 73% 75% 76% 74% 71% 74% 76% 73% 75% 76% 78% 74% 76% 69% 73% 78% 72% 72% 78% 73% 72% 75% 73% 74% 77% 76% 73% 75% 76% 76% 74% 71% 78% 76% 75% 74% 77% 74% 69% 74% 74% 76% 78% 71% 77% 75% 75% 77%) -> (155k/230k) -> write(87% 89% 88% 89% 88% 88%)
|
||||
0:05:18 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 314M 32% 2.4M/s ] rels: [ 0 0% 0/s ] features: [ 1.5B 6.7M/s ] 126G blocks: [ 33k 77% 36/s ]
|
||||
cpus: 151 gc: 6% heap: 106G/214G direct: 58M postGC: 105G relInfo: 573M mpGeoms: 4.1G
|
||||
read( 6%) -> (88/262) -> process(78% 73% 77% 80% 77% 75% 76% 76% 78% 78% 77% 77% 76% 77% 80% 80% 79% 77% 78% 76% 77% 76% 77% 75% 77% 78% 77% 78% 77% 78% 79% 77% 78% 77% 76% 75% 77% 76% 75% 78% 75% 78% 79% 78% 76% 79% 75% 77% 78% 79% 76% 77% 79% 78% 79% 77% 74% 77% 77% 78% 76% 75% 78% 79% 78% 77% 76% 77% 74% 80% 77% 75% 79% 77% 79% 78% 78% 76% 79% 76% 76% 76% 79% 75% 78% 77% 77% 75% 80% 76% 78% 76% 75% 80% 78% 78% 78% 75% 77% 74% 77% 79% 77% 76% 78% 73% 77% 77% 80% 79% 78% 78% 78% 78% 76% 80% 76% 75% 78% 75% 77% 75% 76% 77% 78% 79% 76% 79% 76% 76% 77% 75% 77% 77% 76% 77% 77% 77% 79% 77% 79% 76% 79% 78% 75% 76% 77% 79% 74% 74% 78% 76% 77% 77% 78% 77% 79% 76% 74% 73% 78% 76% 80% 74% 75% 77% 77% 75% 76% 77% 76% 75% 78% 78%) -> (155k/230k) -> write(87% 87% 88% 88% 87% 87%)
|
||||
0:05:28 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 339M 34% 2.5M/s ] rels: [ 0 0% 0/s ] features: [ 1.6B 6.6M/s ] 130G blocks: [ 33k 78% 36/s ]
|
||||
cpus: 152.5 gc: 6% heap: 144G/214G direct: 58M postGC: 133G relInfo: 573M mpGeoms: 4.3G
|
||||
read( 7%) -> (88/262) -> process(77% 81% 77% 75% 75% 78% 80% 76% 77% 80% 79% 77% 78% 78% 78% 80% 79% 79% 77% 77% 79% 75% 80% 79% 76% 80% 80% 80% 77% 76% 78% 80% 75% 80% 77% 79% 82% 75% 79% 77% 76% 79% 79% 77% 75% 78% 80% 75% 77% 80% 78% 77% 79% 78% 79% 76% 77% 77% 76% 77% 78% 76% 80% 76% 78% 78% 80% 80% 80% 77% 77% 77% 79% 74% 79% 79% 78% 78% 75% 77% 81% 77% 78% 77% 78% 77% 76% 77% 78% 78% 79% 79% 76% 78% 78% 74% 75% 78% 78% 78% 78% 77% 82% 80% 80% 79% 80% 77% 79% 77% 76% 76% 76% 78% 77% 80% 78% 81% 79% 77% 79% 76% 76% 78% 79% 81% 80% 78% 76% 79% 76% 77% 78% 78% 79% 77% 77% 78% 78% 82% 79% 77% 80% 76% 79% 77% 78% 76% 80% 79% 78% 78% 79% 79% 77% 77% 79% 77% 78% 79% 76% 78% 79% 77% 78% 77% 78% 78% 81% 76% 77% 77% 78% 77%) -> (148k/230k) -> write(86% 86% 87% 87% 87% 87%)
|
||||
0:05:38 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 365M 37% 2.5M/s ] rels: [ 0 0% 0/s ] features: [ 1.7B 6.6M/s ] 134G blocks: [ 33k 79% 37/s ]
|
||||
cpus: 147.7 gc: 6% heap: 186G/214G direct: 58M postGC: 105G relInfo: 573M mpGeoms: 4.6G
|
||||
read( 6%) -> (88/262) -> process(75% 75% 76% 77% 75% 75% 76% 77% 75% 72% 75% 73% 76% 80% 78% 76% 77% 76% 73% 78% 76% 75% 75% 74% 74% 70% 75% 74% 75% 76% 78% 77% 76% 72% 76% 76% 77% 78% 72% 76% 74% 79% 75% 72% 73% 74% 76% 74% 78% 78% 72% 75% 72% 76% 75% 75% 76% 77% 75% 78% 71% 73% 75% 73% 74% 77% 72% 79% 76% 75% 73% 76% 76% 74% 71% 77% 78% 77% 77% 76% 76% 75% 75% 74% 80% 77% 77% 78% 74% 74% 76% 74% 75% 79% 76% 73% 74% 71% 74% 77% 76% 76% 74% 75% 72% 73% 72% 74% 75% 76% 74% 75% 76% 76% 76% 74% 73% 77% 78% 75% 77% 79% 77% 74% 77% 75% 71% 78% 76% 78% 77% 76% 76% 74% 76% 76% 74% 76% 75% 79% 72% 73% 77% 78% 78% 70% 77% 73% 77% 73% 77% 76% 73% 77% 75% 72% 76% 76% 74% 73% 78% 74% 76% 76% 73% 72% 74% 71% 74% 74% 76% 78% 77% 74%) -> (168k/230k) -> write(88% 86% 89% 86% 88% 89%)
|
||||
0:05:48 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 390M 39% 2.5M/s ] rels: [ 0 0% 0/s ] features: [ 1.7B 6.5M/s ] 138G blocks: [ 34k 80% 36/s ]
|
||||
cpus: 148.4 gc: 6% heap: 163G/214G direct: 58M postGC: 144G relInfo: 573M mpGeoms: 5G
|
||||
read( 6%) -> (88/262) -> process(76% 77% 72% 77% 73% 77% 75% 75% 74% 74% 77% 76% 72% 77% 74% 76% 76% 78% 76% 75% 74% 75% 75% 77% 77% 74% 77% 74% 77% 76% 76% 74% 74% 77% 72% 77% 76% 77% 77% 75% 71% 74% 78% 74% 75% 78% 78% 76% 77% 76% 74% 76% 77% 77% 77% 76% 80% 75% 76% 76% 78% 77% 73% 78% 74% 75% 77% 74% 76% 76% 75% 76% 75% 76% 75% 75% 72% 76% 76% 75% 76% 77% 77% 69% 78% 75% 72% 76% 76% 76% 73% 76% 75% 74% 78% 75% 74% 78% 75% 78% 77% 75% 77% 76% 78% 75% 76% 77% 80% 72% 78% 77% 74% 76% 77% 76% 75% 74% 76% 77% 75% 75% 75% 76% 74% 76% 75% 77% 71% 75% 75% 75% 76% 73% 74% 78% 76% 76% 79% 74% 74% 75% 77% 74% 76% 77% 78% 75% 74% 76% 75% 76% 77% 75% 77% 76% 74% 77% 76% 76% 75% 75% 75% 75% 75% 78% 72% 76% 77% 74% 76% 76% 74% 77%) -> (146k/230k) -> write(88% 88% 86% 87% 88% 86%)
|
||||
0:05:58 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 418M 42% 2.6M/s ] rels: [ 0 0% 0/s ] features: [ 1.8B 6.7M/s ] 142G blocks: [ 34k 80% 35/s ]
|
||||
cpus: 150.4 gc: 6% heap: 144G/214G direct: 58M postGC: 136G relInfo: 573M mpGeoms: 5.2G
|
||||
read( 6%) -> (88/262) -> process(78% 76% 74% 76% 76% 79% 75% 78% 78% 77% 76% 80% 76% 76% 78% 74% 79% 78% 80% 79% 76% 77% 76% 79% 78% 77% 75% 76% 76% 79% 79% 77% 78% 73% 75% 77% 77% 79% 75% 79% 74% 77% 80% 78% 79% 76% 79% 77% 75% 78% 76% 78% 79% 77% 73% 77% 80% 77% 78% 78% 78% 77% 76% 74% 75% 78% 76% 77% 77% 79% 76% 79% 74% 77% 77% 76% 79% 80% 79% 76% 77% 79% 77% 76% 75% 78% 79% 77% 76% 74% 76% 77% 80% 76% 76% 76% 74% 78% 77% 75% 74% 75% 75% 77% 78% 75% 77% 77% 73% 79% 74% 76% 74% 78% 79% 77% 81% 77% 75% 77% 79% 79% 77% 78% 79% 79% 76% 76% 78% 76% 75% 79% 76% 74% 80% 78% 73% 77% 76% 77% 78% 77% 77% 79% 77% 75% 75% 81% 80% 75% 79% 74% 77% 80% 77% 79% 77% 76% 76% 77% 78% 79% 78% 78% 78% 76% 80% 77% 75% 77% 75% 78% 77% 77%) -> (166k/230k) -> write(90% 88% 89% 89% 88% 90%)
|
||||
0:06:09 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 445M 45% 2.6M/s ] rels: [ 0 0% 0/s ] features: [ 1.9B 6.8M/s ] 147G blocks: [ 35k 81% 37/s ]
|
||||
cpus: 149.2 gc: 5% heap: 201G/214G direct: 58M postGC: 106G relInfo: 573M mpGeoms: 5.4G
|
||||
read( 6%) -> (88/262) -> process(76% 75% 77% 74% 79% 76% 77% 75% 78% 76% 78% 74% 78% 73% 78% 76% 76% 77% 78% 75% 76% 76% 75% 76% 79% 77% 76% 76% 74% 76% 79% 75% 78% 77% 76% 74% 78% 79% 76% 76% 78% 78% 78% 75% 74% 80% 77% 77% 78% 80% 79% 78% 76% 77% 78% 75% 76% 76% 78% 76% 77% 74% 77% 76% 78% 77% 73% 78% 74% 77% 74% 77% 79% 77% 75% 75% 77% 77% 78% 75% 79% 78% 77% 78% 76% 76% 77% 77% 78% 77% 77% 78% 77% 78% 75% 76% 76% 78% 78% 78% 78% 79% 78% 76% 78% 76% 76% 77% 77% 76% 76% 77% 77% 76% 76% 76% 78% 79% 76% 75% 77% 77% 75% 77% 76% 76% 78% 77% 77% 76% 76% 73% 74% 75% 76% 76% 76% 75% 79% 73% 80% 78% 79% 77% 76% 74% 79% 76% 78% 77% 77% 78% 78% 79% 77% 75% 74% 76% 78% 78% 76% 78% 75% 74% 74% 75% 78% 77% 77% 78% 74% 75% 74% 76%) -> (88k/230k) -> write(88% 87% 88% 88% 89% 86%)
|
||||
0:06:19 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 473M 48% 2.7M/s ] rels: [ 0 0% 0/s ] features: [ 1.9B 6.8M/s ] 151G blocks: [ 35k 82% 38/s ]
|
||||
cpus: 147 gc: 6% heap: 175G/214G direct: 58M postGC: 106G relInfo: 573M mpGeoms: 5.6G
|
||||
read( 5%) -> (88/262) -> process(76% 76% 77% 76% 73% 73% 75% 76% 74% 73% 74% 74% 78% 75% 76% 73% 74% 74% 78% 76% 75% 78% 76% 73% 77% 75% 75% 72% 74% 76% 74% 76% 74% 78% 73% 75% 75% 73% 76% 78% 74% 75% 75% 73% 77% 74% 75% 73% 72% 75% 77% 77% 74% 77% 74% 74% 77% 75% 75% 77% 78% 72% 77% 78% 76% 74% 74% 75% 77% 78% 75% 77% 77% 74% 76% 76% 73% 76% 75% 75% 74% 76% 75% 74% 76% 77% 76% 74% 77% 74% 73% 75% 78% 73% 76% 75% 75% 77% 76% 76% 76% 76% 74% 73% 74% 76% 78% 72% 77% 73% 79% 74% 78% 75% 80% 75% 75% 76% 75% 75% 75% 76% 76% 76% 75% 75% 75% 75% 74% 74% 75% 75% 75% 79% 74% 79% 72% 78% 77% 75% 74% 74% 78% 77% 73% 78% 76% 74% 76% 75% 74% 75% 76% 77% 74% 73% 74% 76% 76% 76% 73% 75% 77% 74% 73% 76% 74% 76% 74% 76% 77% 78% 75% 76%) -> (157k/230k) -> write(90% 89% 89% 88% 88% 88%)
|
||||
0:06:29 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 501M 50% 2.8M/s ] rels: [ 0 0% 0/s ] features: [ 2B 6.8M/s ] 153G blocks: [ 35k 83% 37/s ]
|
||||
cpus: 148.1 gc: 6% heap: 157G/214G direct: 58M postGC: 106G relInfo: 573M mpGeoms: 5.8G
|
||||
read( 6%) -> (88/262) -> process(77% 78% 77% 75% 77% 73% 77% 75% 73% 74% 75% 79% 75% 75% 73% 74% 76% 77% 75% 76% 76% 72% 75% 75% 74% 75% 76% 74% 74% 74% 76% 75% 76% 74% 77% 76% 76% 75% 77% 75% 79% 76% 78% 77% 76% 74% 73% 74% 73% 74% 79% 74% 74% 75% 78% 75% 76% 76% 76% 74% 75% 78% 76% 76% 76% 78% 75% 73% 77% 77% 76% 76% 75% 76% 76% 77% 79% 76% 76% 73% 74% 77% 77% 75% 76% 73% 76% 74% 77% 73% 75% 73% 74% 74% 79% 75% 78% 78% 78% 77% 73% 77% 74% 72% 77% 75% 76% 76% 78% 73% 78% 78% 77% 76% 74% 79% 77% 78% 75% 75% 74% 75% 72% 77% 77% 76% 76% 74% 77% 78% 73% 74% 75% 73% 75% 77% 76% 76% 75% 74% 75% 75% 77% 75% 77% 77% 78% 76% 75% 76% 73% 72% 75% 76% 73% 76% 76% 74% 76% 75% 77% 73% 76% 75% 76% 78% 77% 77% 74% 74% 73% 76% 74% 77%) -> (152k/230k) -> write(89% 90% 88% 90% 89% 90%)
|
||||
0:06:39 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 529M 53% 2.7M/s ] rels: [ 0 0% 0/s ] features: [ 2.1B 6.7M/s ] 158G blocks: [ 36k 84% 37/s ]
|
||||
cpus: 147.8 gc: 6% heap: 127G/214G direct: 58M postGC: 106G relInfo: 573M mpGeoms: 6G
|
||||
read( 6%) -> (88/262) -> process(74% 82% 77% 74% 75% 74% 73% 75% 75% 78% 74% 76% 73% 77% 76% 75% 76% 76% 76% 75% 75% 75% 74% 78% 74% 75% 76% 79% 75% 79% 73% 77% 75% 76% 76% 74% 76% 73% 73% 78% 77% 75% 76% 77% 77% 77% 78% 74% 75% 80% 74% 72% 75% 78% 73% 77% 75% 75% 74% 73% 70% 76% 74% 77% 76% 74% 74% 74% 77% 78% 77% 75% 75% 76% 78% 76% 74% 76% 75% 74% 71% 76% 74% 76% 74% 75% 72% 73% 72% 74% 78% 77% 77% 76% 75% 78% 79% 75% 76% 77% 76% 76% 76% 71% 76% 77% 75% 73% 80% 77% 77% 75% 74% 72% 73% 75% 73% 74% 75% 77% 74% 77% 73% 74% 77% 75% 74% 78% 76% 75% 73% 73% 78% 77% 77% 75% 75% 70% 74% 73% 73% 76% 76% 75% 75% 76% 74% 75% 73% 75% 77% 73% 76% 76% 71% 76% 74% 75% 74% 73% 71% 79% 71% 77% 74% 72% 75% 78% 76% 73% 73% 78% 73% 74%) -> (163k/230k) -> write(87% 88% 88% 87% 89% 89%)
|
||||
0:06:49 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 555M 56% 2.6M/s ] rels: [ 0 0% 0/s ] features: [ 2.1B 6.8M/s ] 161G blocks: [ 36k 85% 36/s ]
|
||||
cpus: 148.8 gc: 5% heap: 195G/214G direct: 58M postGC: 143G relInfo: 573M mpGeoms: 6.2G
|
||||
read( 6%) -> (88/262) -> process(78% 83% 78% 74% 78% 75% 76% 80% 76% 77% 75% 77% 76% 77% 79% 76% 76% 78% 78% 76% 79% 77% 81% 80% 74% 78% 74% 75% 74% 73% 72% 75% 76% 75% 79% 74% 75% 76% 76% 76% 75% 77% 74% 76% 79% 75% 75% 76% 75% 76% 75% 77% 74% 76% 78% 77% 79% 75% 75% 74% 75% 77% 77% 76% 75% 78% 76% 76% 80% 75% 75% 79% 79% 76% 78% 77% 75% 76% 76% 75% 77% 81% 75% 77% 78% 77% 77% 77% 78% 77% 77% 75% 74% 77% 75% 75% 73% 79% 80% 82% 76% 75% 76% 77% 76% 75% 78% 77% 78% 76% 74% 79% 78% 77% 75% 75% 79% 76% 77% 75% 78% 75% 77% 73% 76% 75% 75% 78% 74% 72% 76% 77% 75% 74% 77% 76% 74% 76% 79% 75% 75% 78% 74% 77% 75% 76% 78% 79% 77% 74% 80% 76% 79% 75% 79% 76% 78% 75% 76% 77% 75% 74% 74% 73% 78% 78% 76% 75% 77% 76% 76% 75% 79% 76%) -> (162k/230k) -> write(90% 88% 90% 87% 87% 89%)
|
||||
0:06:59 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 582M 59% 2.6M/s ] rels: [ 0 0% 0/s ] features: [ 2.2B 6.8M/s ] 165G blocks: [ 36k 86% 37/s ]
|
||||
cpus: 148.6 gc: 6% heap: 160G/214G direct: 58M postGC: 139G relInfo: 573M mpGeoms: 6.5G
|
||||
read( 5%) -> (88/262) -> process(77% 76% 78% 76% 75% 77% 76% 76% 75% 75% 77% 76% 77% 76% 76% 80% 75% 75% 77% 75% 77% 77% 79% 76% 76% 75% 80% 78% 78% 76% 74% 75% 77% 76% 74% 73% 75% 76% 75% 77% 75% 73% 74% 76% 73% 76% 70% 76% 77% 76% 75% 77% 75% 73% 75% 77% 74% 79% 78% 76% 78% 73% 78% 74% 77% 78% 76% 77% 78% 76% 77% 77% 76% 75% 74% 78% 76% 76% 77% 76% 71% 74% 77% 77% 79% 77% 76% 78% 76% 75% 75% 74% 74% 74% 74% 78% 74% 76% 75% 78% 74% 75% 75% 75% 79% 75% 75% 76% 78% 72% 73% 74% 79% 76% 78% 76% 76% 77% 79% 74% 74% 78% 78% 75% 76% 77% 75% 75% 76% 76% 76% 77% 75% 76% 79% 72% 77% 74% 75% 77% 78% 75% 78% 76% 76% 77% 76% 76% 75% 74% 78% 75% 73% 76% 80% 76% 74% 77% 76% 79% 77% 74% 75% 76% 80% 76% 78% 76% 76% 77% 76% 77% 75% 76%) -> (158k/230k) -> write(90% 88% 88% 88% 90% 88%)
|
||||
0:07:09 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 610M 61% 2.7M/s ] rels: [ 0 0% 0/s ] features: [ 2.3B 7M/s ] 171G blocks: [ 37k 87% 40/s ]
|
||||
cpus: 148.8 gc: 6% heap: 123G/214G direct: 58M postGC: 107G relInfo: 573M mpGeoms: 6.8G
|
||||
read( 6%) -> (88/262) -> process(80% 78% 77% 75% 76% 74% 75% 74% 76% 79% 78% 76% 77% 73% 78% 78% 76% 75% 76% 76% 77% 74% 75% 75% 75% 75% 77% 75% 75% 74% 77% 74% 75% 78% 76% 75% 76% 77% 79% 78% 75% 74% 77% 79% 75% 74% 75% 73% 74% 78% 77% 74% 78% 77% 75% 78% 76% 77% 78% 75% 75% 76% 75% 77% 77% 75% 80% 75% 79% 75% 77% 75% 74% 77% 77% 74% 73% 76% 75% 75% 79% 76% 76% 79% 78% 75% 77% 74% 78% 76% 75% 76% 74% 77% 75% 79% 74% 76% 77% 77% 74% 72% 75% 79% 74% 76% 75% 75% 76% 75% 76% 76% 75% 76% 78% 76% 75% 76% 76% 72% 73% 77% 76% 78% 75% 76% 79% 78% 76% 73% 76% 78% 78% 75% 74% 76% 77% 76% 78% 78% 74% 76% 76% 77% 77% 74% 75% 79% 79% 76% 78% 77% 77% 77% 76% 77% 76% 75% 74% 75% 75% 78% 76% 78% 77% 78% 74% 76% 77% 75% 78% 76% 77% 76%) -> (152k/230k) -> write(89% 87% 89% 88% 89% 88%)
|
||||
0:07:19 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 637M 64% 2.6M/s ] rels: [ 0 0% 0/s ] features: [ 2.3B 6.8M/s ] 174G blocks: [ 37k 87% 37/s ]
|
||||
cpus: 154.2 gc: 6% heap: 196G/214G direct: 58M postGC: 107G relInfo: 573M mpGeoms: 7.1G
|
||||
read( 6%) -> (88/262) -> process(78% 81% 79% 79% 77% 80% 79% 80% 81% 80% 80% 79% 77% 77% 79% 83% 78% 80% 83% 76% 77% 79% 77% 83% 81% 78% 79% 81% 78% 78% 79% 80% 79% 80% 79% 81% 80% 79% 78% 78% 76% 83% 79% 82% 76% 78% 81% 80% 77% 76% 77% 79% 80% 75% 79% 79% 79% 77% 79% 79% 77% 79% 80% 79% 77% 80% 77% 80% 78% 77% 75% 79% 82% 83% 77% 78% 79% 74% 76% 80% 78% 78% 79% 76% 75% 79% 80% 78% 79% 76% 80% 77% 79% 78% 79% 80% 77% 79% 80% 80% 80% 78% 79% 79% 78% 76% 80% 75% 79% 81% 78% 78% 79% 80% 78% 78% 76% 80% 78% 78% 83% 81% 81% 77% 77% 79% 80% 79% 78% 79% 77% 78% 81% 79% 78% 78% 78% 79% 80% 80% 79% 83% 78% 80% 78% 79% 77% 78% 77% 82% 80% 80% 78% 80% 77% 76% 78% 79% 77% 80% 76% 79% 78% 80% 76% 79% 77% 80% 78% 76% 79% 80% 76% 79%) -> (113k/230k) -> write(87% 88% 85% 86% 88% 88%)
|
||||
0:07:29 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 666M 67% 2.8M/s ] rels: [ 0 0% 0/s ] features: [ 2.4B 7M/s ] 178G blocks: [ 38k 88% 37/s ]
|
||||
cpus: 150.8 gc: 6% heap: 186G/214G direct: 58M postGC: 108G relInfo: 573M mpGeoms: 7.4G
|
||||
read( 6%) -> (88/262) -> process(79% 80% 75% 76% 74% 75% 74% 77% 77% 75% 76% 78% 76% 79% 75% 84% 77% 75% 75% 78% 77% 76% 75% 76% 80% 75% 74% 76% 78% 78% 76% 76% 77% 80% 83% 78% 75% 77% 79% 77% 78% 80% 75% 75% 76% 77% 76% 78% 76% 77% 77% 74% 75% 79% 77% 76% 77% 78% 79% 77% 78% 76% 74% 76% 76% 76% 75% 78% 80% 79% 76% 79% 78% 75% 74% 79% 73% 77% 77% 77% 76% 77% 80% 74% 75% 76% 80% 75% 76% 79% 78% 74% 78% 77% 74% 73% 75% 76% 78% 80% 77% 76% 76% 76% 77% 79% 79% 77% 75% 76% 77% 77% 75% 77% 75% 77% 80% 77% 80% 78% 80% 77% 78% 76% 78% 76% 74% 75% 77% 76% 76% 76% 76% 76% 75% 75% 76% 79% 74% 80% 79% 75% 79% 77% 78% 86% 77% 78% 78% 80% 74% 72% 76% 82% 78% 77% 77% 77% 77% 79% 74% 77% 77% 80% 78% 78% 75% 76% 77% 74% 75% 75% 74% 80%) -> (140k/230k) -> write(87% 89% 88% 89% 87% 89%)
|
||||
0:07:39 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 694M 70% 2.7M/s ] rels: [ 0 0% 0/s ] features: [ 2.5B 6.9M/s ] 182G blocks: [ 38k 89% 40/s ]
|
||||
cpus: 150.2 gc: 6% heap: 178G/214G direct: 58M postGC: 143G relInfo: 573M mpGeoms: 7.7G
|
||||
read( 6%) -> (88/262) -> process(77% 75% 78% 76% 81% 79% 76% 75% 76% 74% 76% 74% 77% 79% 76% 77% 77% 79% 76% 72% 75% 77% 76% 75% 77% 77% 77% 78% 78% 75% 76% 75% 77% 77% 75% 77% 77% 74% 77% 76% 76% 76% 77% 78% 79% 78% 77% 77% 76% 77% 77% 80% 79% 75% 76% 72% 78% 76% 80% 72% 76% 77% 79% 78% 74% 74% 77% 76% 78% 77% 76% 75% 78% 75% 76% 78% 75% 79% 76% 75% 78% 76% 78% 76% 77% 80% 85% 79% 75% 77% 78% 73% 76% 69% 75% 77% 75% 76% 77% 78% 77% 75% 77% 79% 77% 78% 78% 76% 74% 76% 76% 76% 79% 77% 76% 77% 76% 75% 81% 78% 76% 75% 78% 73% 76% 78% 78% 76% 77% 77% 73% 77% 74% 75% 75% 75% 77% 74% 76% 77% 76% 76% 78% 77% 76% 74% 76% 76% 78% 75% 78% 77% 79% 82% 75% 76% 78% 75% 72% 77% 76% 78% 79% 77% 78% 78% 74% 75% 76% 78% 74% 79% 75% 81%) -> (162k/230k) -> write(89% 87% 89% 89% 89% 89%)
|
||||
0:07:50 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 723M 73% 2.8M/s ] rels: [ 0 0% 0/s ] features: [ 2.6B 6.9M/s ] 185G blocks: [ 38k 90% 39/s ]
|
||||
cpus: 150 gc: 6% heap: 178G/214G direct: 58M postGC: 145G relInfo: 573M mpGeoms: 7.9G
|
||||
read( 5%) -> (88/262) -> process(77% 80% 77% 78% 76% 77% 79% 75% 76% 76% 78% 78% 74% 77% 77% 78% 78% 76% 77% 75% 79% 78% 78% 78% 77% 76% 78% 78% 79% 76% 78% 76% 77% 77% 79% 76% 78% 78% 78% 78% 77% 78% 74% 79% 76% 75% 78% 78% 77% 80% 77% 78% 77% 76% 71% 76% 79% 76% 77% 76% 79% 77% 76% 78% 74% 77% 79% 80% 77% 76% 77% 79% 80% 75% 75% 76% 75% 79% 78% 77% 75% 77% 76% 75% 75% 79% 77% 75% 80% 75% 78% 78% 75% 77% 80% 79% 76% 76% 74% 76% 76% 78% 79% 74% 76% 80% 77% 77% 77% 77% 79% 80% 80% 79% 78% 75% 77% 77% 80% 78% 77% 77% 77% 79% 76% 76% 75% 78% 77% 79% 74% 77% 76% 76% 78% 76% 77% 80% 74% 77% 77% 76% 77% 75% 78% 79% 77% 77% 79% 76% 78% 78% 80% 76% 77% 77% 77% 77% 78% 76% 76% 75% 77% 76% 78% 78% 76% 77% 79% 78% 77% 76% 78% 77%) -> (139k/230k) -> write(88% 89% 90% 89% 89% 88%)
|
||||
0:08:00 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 753M 76% 2.9M/s ] rels: [ 0 0% 0/s ] features: [ 2.6B 6.9M/s ] 190G blocks: [ 39k 91% 40/s ]
|
||||
cpus: 151.9 gc: 6% heap: 192G/214G direct: 58M postGC: 151G relInfo: 573M mpGeoms: 8.1G
|
||||
read( 6%) -> (88/262) -> process(79% 79% 79% 79% 76% 79% 79% 74% 79% 76% 79% 78% 76% 77% 76% 77% 77% 80% 80% 77% 78% 78% 79% 79% 77% 80% 78% 77% 80% 78% 76% 75% 82% 82% 78% 78% 78% 78% 77% 78% 81% 78% 71% 78% 81% 77% 77% 80% 80% 77% 79% 77% 78% 79% 76% 80% 79% 80% 76% 76% 78% 77% 79% 81% 77% 76% 80% 77% 78% 78% 80% 79% 79% 77% 75% 78% 76% 78% 76% 78% 76% 76% 81% 78% 77% 81% 79% 79% 79% 76% 79% 76% 76% 80% 80% 78% 76% 80% 78% 76% 79% 78% 79% 77% 77% 73% 77% 76% 78% 77% 77% 79% 78% 78% 78% 78% 80% 78% 80% 74% 76% 80% 74% 77% 78% 79% 76% 80% 79% 76% 79% 76% 78% 77% 79% 78% 79% 78% 78% 78% 78% 77% 75% 77% 74% 78% 77% 75% 77% 79% 78% 79% 78% 79% 78% 76% 77% 79% 79% 78% 78% 76% 78% 77% 78% 75% 80% 76% 76% 78% 78% 79% 79% 79%) -> (137k/230k) -> write(88% 87% 89% 88% 90% 88%)
|
||||
0:08:10 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 781M 79% 2.8M/s ] rels: [ 0 0% 0/s ] features: [ 2.7B 6.7M/s ] 194G blocks: [ 39k 92% 38/s ]
|
||||
cpus: 152.5 gc: 6% heap: 110G/214G direct: 58M postGC: 109G relInfo: 573M mpGeoms: 8.4G
|
||||
read( 5%) -> (88/262) -> process(77% 78% 78% 81% 76% 77% 79% 80% 80% 76% 77% 78% 81% 78% 76% 82% 76% 79% 80% 79% 78% 78% 78% 80% 80% 74% 80% 80% 79% 78% 80% 79% 79% 77% 76% 79% 75% 80% 80% 77% 78% 79% 77% 79% 78% 79% 79% 77% 80% 76% 80% 78% 78% 78% 80% 76% 78% 77% 79% 76% 81% 76% 77% 76% 76% 81% 79% 77% 78% 79% 80% 77% 78% 79% 81% 80% 77% 79% 78% 77% 78% 76% 81% 80% 79% 79% 77% 81% 77% 75% 78% 80% 79% 80% 78% 80% 78% 76% 76% 78% 78% 77% 79% 78% 77% 73% 78% 77% 78% 80% 79% 76% 80% 79% 80% 79% 77% 78% 77% 78% 75% 76% 76% 79% 80% 80% 80% 78% 77% 79% 78% 79% 79% 77% 76% 79% 79% 80% 76% 79% 77% 77% 78% 77% 78% 79% 77% 78% 79% 78% 80% 76% 75% 81% 79% 78% 77% 79% 80% 79% 78% 78% 77% 79% 79% 77% 79% 78% 80% 78% 79% 78% 81% 79%) -> (144k/230k) -> write(88% 88% 87% 87% 86% 89%)
|
||||
0:08:20 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 809M 82% 2.7M/s ] rels: [ 0 0% 0/s ] features: [ 2.8B 6.6M/s ] 197G blocks: [ 40k 93% 40/s ]
|
||||
cpus: 153.7 gc: 6% heap: 119G/214G direct: 58M postGC: 109G relInfo: 573M mpGeoms: 8.6G
|
||||
read( 6%) -> (88/262) -> process(79% 80% 79% 77% 77% 80% 76% 80% 78% 79% 80% 80% 80% 78% 79% 77% 82% 80% 80% 79% 82% 80% 75% 78% 80% 76% 77% 78% 79% 78% 78% 78% 79% 75% 77% 80% 78% 80% 78% 78% 78% 79% 77% 79% 78% 80% 80% 78% 78% 77% 76% 78% 80% 79% 78% 78% 79% 82% 76% 74% 75% 77% 81% 78% 78% 78% 78% 77% 79% 79% 79% 79% 80% 79% 79% 80% 79% 80% 81% 80% 79% 78% 80% 81% 80% 77% 78% 79% 78% 75% 77% 78% 80% 80% 80% 76% 77% 78% 76% 78% 76% 79% 81% 78% 76% 79% 79% 79% 76% 77% 78% 79% 77% 75% 80% 79% 78% 78% 77% 81% 79% 80% 80% 80% 78% 78% 78% 81% 80% 79% 80% 78% 77% 76% 80% 82% 77% 83% 79% 79% 79% 80% 80% 80% 76% 81% 78% 78% 82% 78% 76% 81% 80% 79% 74% 78% 79% 79% 78% 79% 80% 81% 76% 77% 79% 78% 80% 74% 81% 78% 81% 77% 78% 81%) -> (147k/230k) -> write(87% 87% 88% 88% 87% 84%)
|
||||
0:08:30 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 837M 84% 2.7M/s ] rels: [ 0 0% 0/s ] features: [ 2.8B 6.3M/s ] 201G blocks: [ 40k 94% 36/s ]
|
||||
cpus: 149 gc: 6% heap: 111G/214G direct: 58M postGC: 110G relInfo: 573M mpGeoms: 9.2G
|
||||
read( 5%) -> (88/262) -> process(75% 78% 80% 78% 75% 78% 78% 79% 75% 73% 75% 77% 76% 77% 77% 78% 78% 78% 78% 75% 77% 77% 78% 76% 75% 76% 80% 75% 74% 77% 77% 75% 77% 77% 77% 78% 77% 75% 75% 76% 76% 75% 77% 80% 75% 76% 77% 76% 77% 78% 76% 78% 76% 75% 74% 77% 81% 74% 79% 77% 80% 75% 77% 77% 78% 77% 75% 75% 75% 75% 78% 79% 77% 76% 79% 77% 75% 77% 77% 76% 77% 75% 75% 77% 75% 76% 73% 77% 77% 76% 73% 77% 75% 77% 79% 77% 75% 75% 77% 76% 76% 76% 76% 78% 76% 78% 77% 76% 77% 76% 77% 75% 78% 75% 74% 75% 78% 77% 78% 75% 77% 77% 81% 79% 77% 76% 76% 76% 76% 77% 80% 76% 74% 75% 76% 76% 78% 75% 74% 77% 77% 75% 79% 79% 76% 78% 76% 76% 73% 77% 80% 77% 76% 75% 76% 76% 77% 78% 76% 73% 78% 78% 78% 78% 78% 77% 78% 75% 77% 73% 76% 76% 77% 79%) -> (158k/230k) -> write(85% 86% 86% 86% 86% 84%)
|
||||
0:08:40 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 865M 87% 2.8M/s ] rels: [ 0 0% 0/s ] features: [ 2.9B 6.6M/s ] 205G blocks: [ 40k 95% 38/s ]
|
||||
cpus: 152.6 gc: 5% heap: 150G/214G direct: 58M postGC: 110G relInfo: 573M mpGeoms: 9.4G
|
||||
read( 6%) -> (88/262) -> process(77% 78% 81% 79% 78% 76% 75% 80% 78% 79% 82% 78% 79% 79% 82% 79% 82% 80% 75% 80% 76% 79% 79% 80% 76% 78% 76% 80% 77% 79% 78% 79% 76% 79% 80% 80% 76% 79% 78% 81% 78% 80% 83% 77% 82% 78% 81% 78% 78% 80% 79% 78% 80% 78% 79% 81% 80% 78% 81% 76% 79% 80% 78% 81% 76% 80% 78% 79% 77% 79% 77% 79% 78% 75% 77% 78% 77% 77% 77% 78% 77% 79% 75% 77% 77% 79% 77% 78% 81% 77% 79% 79% 77% 81% 79% 76% 78% 80% 73% 82% 76% 80% 76% 76% 81% 80% 78% 80% 77% 80% 76% 78% 77% 79% 78% 79% 80% 78% 79% 84% 77% 80% 79% 78% 78% 77% 78% 79% 74% 76% 79% 77% 77% 79% 75% 78% 79% 80% 82% 77% 77% 79% 80% 76% 78% 80% 80% 78% 77% 77% 80% 78% 80% 77% 81% 77% 78% 79% 76% 80% 79% 78% 77% 78% 78% 77% 78% 77% 79% 77% 78% 77% 80% 78%) -> (142k/230k) -> write(89% 88% 88% 90% 89% 89%)
|
||||
0:08:50 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 893M 90% 2.7M/s ] rels: [ 0 0% 0/s ] features: [ 3B 6.5M/s ] 208G blocks: [ 41k 96% 39/s ]
|
||||
cpus: 156.3 gc: 6% heap: 172G/214G direct: 58M postGC: 110G relInfo: 573M mpGeoms: 9.7G
|
||||
read( 6%) -> (88/262) -> process(82% 78% 83% 81% 79% 80% 79% 77% 82% 82% 80% 81% 82% 78% 80% 80% 82% 80% 80% 79% 80% 79% 80% 82% 83% 80% 80% 79% 81% 78% 78% 79% 82% 79% 81% 82% 80% 82% 80% 79% 81% 78% 78% 80% 82% 81% 81% 81% 78% 80% 83% 80% 83% 81% 82% 81% 79% 80% 80% 80% 78% 82% 82% 79% 81% 78% 82% 78% 82% 79% 82% 76% 79% 80% 81% 83% 78% 81% 78% 79% 80% 79% 80% 81% 81% 78% 80% 80% 82% 79% 80% 79% 82% 81% 78% 79% 81% 80% 79% 81% 81% 80% 81% 82% 78% 79% 78% 80% 80% 80% 81% 81% 80% 82% 83% 79% 81% 81% 80% 80% 81% 83% 79% 78% 79% 79% 82% 81% 80% 78% 82% 82% 81% 79% 79% 79% 78% 81% 81% 80% 79% 81% 82% 79% 80% 80% 77% 82% 78% 76% 77% 80% 80% 79% 83% 80% 81% 78% 81% 78% 79% 77% 80% 80% 82% 79% 79% 79% 82% 81% 82% 80% 79% 81%) -> (156k/230k) -> write(85% 85% 88% 88% 86% 86%)
|
||||
0:09:00 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 921M 93% 2.7M/s ] rels: [ 0 0% 0/s ] features: [ 3B 6.3M/s ] 212G blocks: [ 41k 97% 36/s ]
|
||||
cpus: 157.1 gc: 6% heap: 115G/214G direct: 58M postGC: 110G relInfo: 573M mpGeoms: 10G
|
||||
read( 5%) -> (88/262) -> process(83% 79% 82% 82% 81% 80% 83% 79% 79% 82% 82% 81% 80% 80% 82% 81% 83% 82% 82% 82% 78% 78% 82% 81% 82% 83% 81% 83% 79% 80% 80% 80% 83% 82% 81% 79% 81% 80% 83% 84% 80% 82% 83% 81% 78% 83% 80% 81% 79% 83% 82% 81% 82% 81% 81% 80% 77% 82% 81% 82% 83% 81% 81% 78% 82% 81% 78% 83% 79% 79% 80% 79% 80% 81% 81% 82% 82% 82% 81% 81% 81% 79% 79% 82% 82% 83% 80% 81% 81% 80% 81% 81% 83% 79% 80% 79% 80% 82% 80% 82% 80% 80% 80% 79% 81% 85% 79% 81% 79% 83% 84% 84% 80% 82% 81% 79% 83% 81% 80% 80% 82% 80% 81% 80% 80% 81% 81% 79% 82% 82% 80% 81% 82% 80% 81% 81% 80% 79% 83% 78% 79% 82% 80% 81% 79% 79% 78% 83% 79% 80% 78% 80% 82% 81% 82% 81% 83% 82% 80% 82% 81% 80% 80% 82% 80% 82% 81% 82% 80% 80% 82% 82% 79% 78%) -> (111k/230k) -> write(84% 86% 87% 86% 85% 87%)
|
||||
0:09:10 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 948M 95% 2.6M/s ] rels: [ 0 0% 0/s ] features: [ 3.1B 6.2M/s ] 215G blocks: [ 42k 97% 38/s ]
|
||||
cpus: 160.3 gc: 6% heap: 169G/214G direct: 58M postGC: 155G relInfo: 573M mpGeoms: 10G
|
||||
read( 7%) -> (88/262) -> process(82% 82% 83% 82% 82% 80% 82% 86% 85% 80% 82% 81% 83% 83% 81% 83% 85% 82% 83% 83% 81% 84% 82% 84% 81% 83% 84% 81% 82% 84% 84% 82% 84% 82% 84% 83% 83% 83% 83% 83% 82% 83% 83% 82% 81% 84% 84% 81% 84% 84% 85% 83% 81% 84% 83% 84% 83% 82% 82% 81% 84% 83% 81% 84% 83% 82% 82% 83% 84% 82% 79% 84% 83% 81% 83% 83% 83% 82% 81% 81% 82% 85% 80% 80% 81% 81% 84% 84% 81% 83% 84% 83% 83% 83% 83% 81% 83% 85% 81% 84% 83% 85% 81% 81% 82% 85% 81% 84% 83% 82% 82% 82% 82% 84% 81% 86% 83% 82% 83% 84% 82% 82% 83% 83% 84% 80% 81% 83% 84% 80% 79% 81% 84% 81% 79% 83% 83% 82% 82% 83% 81% 81% 81% 81% 81% 81% 84% 85% 81% 83% 84% 82% 82% 83% 85% 83% 83% 81% 83% 80% 83% 82% 87% 84% 83% 83% 85% 82% 82% 82% 81% 78% 83% 81%) -> (144k/230k) -> write(86% 85% 86% 88% 85% 86%)
|
||||
0:09:21 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 976M 98% 2.7M/s ] rels: [ 0 0% 0/s ] features: [ 3.2B 6.3M/s ] 220G blocks: [ 42k 98% 37/s ]
|
||||
cpus: 157.4 gc: 6% heap: 120G/214G direct: 58M postGC: 111G relInfo: 573M mpGeoms: 10G
|
||||
read( 6%) -> (88/262) -> process(80% 83% 84% 83% 81% 77% 83% 80% 83% 80% 77% 82% 80% 81% 82% 82% 79% 81% 83% 83% 82% 83% 81% 83% 81% 82% 82% 80% 76% 79% 81% 84% 81% 84% 82% 80% 82% 81% 79% 81% 82% 81% 81% 82% 82% 79% 81% 83% 81% 82% 83% 84% 80% 81% 80% 81% 83% 82% 81% 79% 80% 79% 82% 81% 83% 82% 82% 82% 82% 84% 81% 80% 82% 83% 82% 83% 81% 82% 80% 80% 82% 80% 81% 82% 82% 77% 81% 80% 83% 79% 82% 80% 80% 80% 81% 78% 80% 77% 82% 83% 81% 81% 82% 78% 82% 82% 82% 79% 81% 79% 81% 79% 81% 80% 80% 84% 82% 80% 82% 82% 81% 80% 83% 82% 80% 83% 81% 82% 81% 83% 81% 81% 81% 81% 83% 81% 83% 81% 81% 78% 81% 80% 82% 83% 82% 82% 78% 81% 82% 82% 80% 82% 79% 82% 83% 81% 82% 82% 80% 82% 83% 83% 81% 83% 78% 82% 81% 84% 80% 79% 84% 79% 82% 81%) -> (144k/230k) -> write(85% 88% 86% 85% 87% 87%)
|
||||
0:09:29 INF [osm_pass2:process] - Finished ways: 993,607,585 (2.4M/s) in 6m43s cpu:16h19m39s gc:23s avg:145.8
|
||||
0:09:31 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 993M 100% 1.7M/s ] rels: [ 211k 2% 20k/s ] features: [ 3.2B 4.3M/s ] 223G blocks: [ 42k 99% 34/s ]
|
||||
cpus: 131 gc: 5% heap: 180G/214G direct: 58M postGC: 139G relInfo: 573M mpGeoms: 10G
|
||||
read( 5%) -> (88/262) -> process(73% 73% 75% 56% 77% 58% 55% 63% 76% 53% 69% 72% 54% 60% 61% 76% 63% 76% 76% 76% 54% 76% 52% 55% 52% 59% 64% 60% 59% 62% 66% 79% 77% 48% 57% 57% 51% 61% 74% 58% 61% 76% 85% 80% 64% 62% 52% 72% 81% 75% 81% 71% 54% 70% 54% 57% 67% 71% 66% 77% 58% 63% 70% 77% 83% 63% 65% 49% 59% 61% 80% 76% 61% 74% 74% 67% 66% 74% 76% 75% 75% 86% 68% 73% 67% 52% 63% 71% 72% 56% 71% 75% 80% 58% 78% 73% 59% 71% 73% 77% 65% 70% 57% 60% 58% 70% 71% 76% 50% 61% 73% 62% 70% 69% 73% 72% 81% 68% 68% 71% 73% 78% 70% 78% 76% 70% 74% 68% 50% 76% 77% 80% 72% 72% 54% 71% 77% 88% 68% 71% 81% 65% 67% 63% 66% 52% 55% 60% 55% 75% 52% 61% 54% 69% 69% 58% 54% 78% 56% 73% 63% 63% 73% 75% 60% 70% 61% 75% 74% 66% 76% 51% 49% 74%) -> (85k/230k) -> write(56% 54% 55% 55% 54% 54%)
|
||||
0:09:41 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 993M 100% 0/s ] rels: [ 1.3M 11% 109k/s ] features: [ 3.2B 756k/s ] 223G blocks: [ 42k 99% <1/s ]
|
||||
cpus: 168.8 gc: 5% heap: 155G/214G direct: 58M postGC: 112G relInfo: 573M mpGeoms: 10G
|
||||
read( 0%) -> (88/262) -> process(93% 94% 94% 93% 91% 93% 93% 93% 93% 93% 92% 91% 94% 93% 90% 92% 92% 91% 93% 94% 92% 92% 93% 92% 93% 94% 92% 92% 92% 91% 93% 93% 93% 93% 92% 92% 93% 92% 90% 93% 93% 93% 91% 94% 93% 93% 94% 93% 91% 91% 93% 93% 93% 93% 92% 94% 92% 92% 94% 91% 92% 93% 93% 93% 92% 93% 94% 93% 92% 93% 93% 92% 92% 93% 93% 92% 90% 91% 92% 91% 92% 92% 92% 92% 93% 93% 90% 93% 91% 93% 92% 92% 92% 92% 93% 93% 92% 93% 91% 92% 92% 92% 93% 92% 92% 92% 90% 91% 92% 93% 90% 92% 92% 92% 93% 93% 93% 93% 93% 92% 93% 92% 94% 92% 92% 91% 93% 93% 93% 91% 93% 93% 93% 91% 92% 92% 92% 92% 93% 93% 92% 93% 93% 92% 93% 91% 92% 92% 92% 93% 93% 93% 90% 93% 91% 91% 93% 92% 93% 91% 93% 91% 92% 93% 93% 93% 93% 92% 91% 92% 91% 92% 93% 93%) -> (85k/230k) -> write( 9% 9% 9% 9% 9% 10%)
|
||||
0:09:51 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 993M 100% 0/s ] rels: [ 2.5M 21% 117k/s ] features: [ 3.2B 736k/s ] 224G blocks: [ 42k 99% <1/s ]
|
||||
cpus: 170.3 gc: 3% heap: 170G/214G direct: 58M postGC: 112G relInfo: 573M mpGeoms: 10G
|
||||
read( 0%) -> (88/262) -> process(94% 94% 95% 95% 94% 96% 94% 94% 95% 95% 95% 93% 94% 95% 93% 93% 94% 95% 93% 94% 95% 94% 96% 94% 94% 95% 95% 95% 95% 95% 94% 94% 93% 96% 95% 94% 95% 93% 94% 95% 94% 95% 94% 95% 94% 92% 94% 94% 94% 92% 93% 94% 94% 94% 95% 93% 92% 93% 95% 92% 94% 94% 92% 94% 94% 95% 94% 93% 95% 92% 95% 93% 93% 94% 93% 93% 95% 95% 94% 94% 94% 94% 94% 95% 95% 94% 94% 95% 95% 95% 95% 93% 96% 93% 95% 95% 95% 94% 95% 95% 95% 95% 94% 94% 95% 93% 93% 95% 95% 95% 95% 94% 94% 94% 95% 95% 95% 94% 94% 94% 94% 94% 94% 94% 93% 94% 93% 94% 96% 93% 93% 94% 94% 94% 94% 94% 94% 95% 95% 92% 95% 94% 94% 94% 94% 94% 94% 93% 92% 95% 94% 95% 96% 94% 95% 94% 95% 96% 95% 95% 94% 94% 94% 94% 92% 93% 95% 93% 94% 92% 95% 94% 95% 95%) -> (86k/230k) -> write(10% 10% 10% 9% 12% 9%)
|
||||
0:10:01 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 993M 100% 0/s ] rels: [ 3.7M 32% 119k/s ] features: [ 3.2B 899k/s ] 225G blocks: [ 42k 99% 1/s ]
|
||||
cpus: 170.5 gc: 2% heap: 117G/214G direct: 58M postGC: 112G relInfo: 573M mpGeoms: 10G
|
||||
read( 0%) -> (88/262) -> process(96% 95% 95% 95% 94% 96% 96% 94% 95% 94% 95% 95% 95% 96% 95% 96% 93% 94% 93% 94% 94% 92% 95% 94% 95% 94% 96% 95% 93% 94% 95% 94% 95% 93% 95% 94% 94% 93% 96% 94% 95% 95% 95% 94% 95% 95% 95% 95% 95% 94% 94% 96% 93% 95% 95% 95% 93% 95% 95% 95% 96% 95% 96% 95% 95% 94% 95% 94% 93% 95% 94% 95% 94% 95% 94% 94% 94% 94% 95% 96% 93% 94% 94% 94% 95% 93% 95% 95% 96% 94% 96% 95% 95% 96% 96% 95% 95% 96% 95% 95% 95% 96% 96% 94% 95% 95% 94% 96% 94% 96% 95% 95% 95% 96% 95% 93% 93% 95% 94% 96% 95% 94% 96% 95% 95% 95% 96% 96% 94% 94% 96% 91% 95% 96% 95% 95% 94% 96% 95% 95% 95% 95% 96% 95% 94% 94% 94% 95% 95% 95% 96% 94% 96% 96% 94% 95% 95% 94% 93% 94% 94% 95% 95% 94% 95% 93% 95% 95% 96% 94% 96% 95% 95% 95%) -> (89k/230k) -> write(11% 14% 11% 14% 12% 11%)
|
||||
0:10:11 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 993M 100% 0/s ] rels: [ 4.9M 42% 121k/s ] features: [ 3.2B 1.7M/s ] 230G blocks: [ 42k 99% 5/s ]
|
||||
cpus: 168.3 gc: 3% heap: 146G/214G direct: 58M postGC: 143G relInfo: 573M mpGeoms: 10G
|
||||
read( 1%) -> (88/262) -> process(94% 92% 94% 94% 94% 93% 95% 94% 95% 94% 93% 94% 94% 94% 95% 95% 95% 93% 95% 92% 94% 93% 94% 94% 93% 95% 93% 96% 93% 94% 92% 94% 92% 96% 94% 93% 94% 94% 93% 93% 93% 93% 92% 94% 94% 93% 91% 92% 92% 94% 93% 92% 95% 95% 92% 95% 93% 92% 94% 93% 92% 92% 95% 94% 95% 94% 94% 93% 94% 93% 94% 93% 92% 96% 92% 94% 95% 92% 92% 90% 93% 94% 94% 94% 95% 94% 94% 92% 91% 94% 95% 92% 93% 94% 93% 94% 93% 93% 93% 94% 95% 95% 93% 93% 93% 95% 95% 92% 93% 93% 93% 93% 94% 93% 93% 92% 94% 93% 94% 95% 94% 95% 91% 93% 93% 94% 94% 93% 93% 93% 93% 96% 93% 92% 95% 95% 90% 93% 93% 94% 93% 91% 93% 95% 93% 93% 93% 93% 95% 94% 94% 95% 94% 94% 94% 94% 93% 93% 95% 93% 95% 91% 94% 93% 93% 93% 91% 92% 95% 93% 93% 93% 95% 94%) -> (83k/230k) -> write(13% 14% 15% 14% 14% 16%)
|
||||
0:10:21 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 993M 100% 0/s ] rels: [ 6.1M 53% 122k/s ] features: [ 3.2B 1M/s ] 231G blocks: [ 42k 99% 4/s ]
|
||||
cpus: 169.7 gc: 3% heap: 197G/214G direct: 54M postGC: 112G relInfo: 573M mpGeoms: 10G
|
||||
read( -%) -> (69/262) -> process(95% 93% 95% 95% 95% 96% 95% 96% 96% 95% 94% 95% 96% 95% 95% 93% 95% 93% 95% 95% 95% 95% 95% 96% 96% 96% 96% 95% 95% 95% 95% 94% 96% 94% 96% 95% 95% 95% 95% 93% 94% 95% 95% 95% 96% 93% 96% 95% 95% 94% 95% 94% 94% 94% 94% 95% 95% 94% 95% 93% 95% 94% 95% 95% 96% 95% 95% 93% 95% 95% 94% 95% 95% 95% 95% 95% 93% 95% 95% 95% 94% 94% 94% 94% 94% 95% 96% 95% 95% 94% 96% 95% 95% 94% 95% 94% 94% 95% 95% 95% 95% 96% 95% 93% 94% 95% 96% 95% 96% 94% 95% 94% 93% 93% 96% 94% 94% 95% 95% 95% 94% 95% 95% 94% 95% 94% 95% 94% 94% 94% 95% 95% 94% 95% 95% 95% 94% 94% 94% 94% 94% 95% 95% 95% 95% 95% 95% 96% 95% 95% 94% 95% 94% 95% 95% 95% 94% 94% 96% 95% 95% 95% 94% 93% 95% 93% 95% 95% 96% 95% 95% 95% 95% 96%) -> (87k/230k) -> write(12% 10% 11% 10% 11% 11%)
|
||||
0:10:31 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 993M 100% 0/s ] rels: [ 7.5M 64% 136k/s ] features: [ 3.3B 1.4M/s ] 233G blocks: [ 42k 100% 3/s ]
|
||||
cpus: 170.3 gc: 3% heap: 149G/214G direct: 54M postGC: 112G relInfo: 573M mpGeoms: 10G
|
||||
read( -%) -> (33/262) -> process(94% 95% 95% 95% 94% 96% 94% 94% 95% 95% 95% 95% 94% 95% 94% 94% 94% 94% 93% 94% 94% 96% 95% 94% 93% 93% 96% 94% 94% 95% 95% 96% 94% 95% 94% 94% 95% 95% 93% 92% 93% 92% 94% 94% 95% 94% 94% 93% 93% 96% 94% 94% 94% 94% 95% 96% 94% 94% 94% 93% 95% 93% 92% 95% 95% 96% 92% 94% 94% 93% 95% 94% 95% 94% 95% 94% 94% 95% 95% 96% 94% 95% 92% 93% 94% 95% 94% 95% 93% 94% 93% 93% 95% 95% 96% 95% 94% 93% 94% 95% 95% 94% 95% 93% 93% 93% 94% 95% 95% 96% 94% 94% 93% 94% 92% 95% 93% 93% 95% 95% 94% 93% 95% 94% 96% 95% 95% 94% 94% 95% 95% 94% 94% 94% 95% 95% 92% 94% 94% 93% 94% 93% 95% 94% 95% 95% 93% 95% 95% 95% 92% 94% 95% 94% 94% 94% 94% 95% 94% 94% 95% 95% 95% 93% 93% 94% 95% 95% 95% 96% 94% 93% 95% 92%) -> (131k/230k) -> write(15% 16% 15% 15% 17% 14%)
|
||||
0:10:42 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 993M 100% 0/s ] rels: [ 8.9M 76% 139k/s ] features: [ 3.3B 1.1M/s ] 236G blocks: [ 43k 100% 3/s ]
|
||||
cpus: 170.2 gc: 3% heap: 180G/214G direct: 54M postGC: 112G relInfo: 573M mpGeoms: 10G
|
||||
read( -%) -> (0/262) -> process(95% 96% 95% 95% 95% 95% 96% 93% 96% 95% 94% 95% 94% 96% 94% 95% 95% 94% 96% 95% 94% 94% 94% 92% 96% 95% 95% 94% 94% 94% 94% 95% 95% 94% 93% 95% 95% 94% 94% 94% 94% 94% 95% 94% 93% 94% 95% 96% 95% 96% 96% 96% 95% 95% 94% 95% 96% 96% 96% 93% 96% 94% 95% 94% 94% 95% 95% 96% 95% 96% 95% 94% 95% 95% 94% 95% 94% 95% 93% 96% 94% 95% 95% 94% 95% 95% 95% 95% 94% 96% 95% 95% 95% 94% 94% 96% 96% 94% 95% 95% 95% 95% 96% 94% 95% 95% 95% 95% 94% 96% 93% 94% 93% 91% 93% 94% 95% 95% 95% 94% 95% 96% 94% 96% 95% 95% 95% 95% 95% 96% 95% 96% 95% 94% 95% 95% 94% 94% 94% 95% 95% 96% 94% 95% 94% 94% 94% 94% 95% 91% 96% 95% 95% 94% 95% 93% 94% 94% 95% 95% 95% 95% 95% 96% 96% 95% 94% 95% 95% 96% 95% 96% 95% 95%) -> (80k/230k) -> write(12% 13% 13% 16% 12% 12%)
|
||||
0:10:52 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 993M 100% 0/s ] rels: [ 10M 89% 140k/s ] features: [ 3.3B 811k/s ] 239G blocks: [ 43k 100% 5/s ]
|
||||
cpus: 169.5 gc: 3% heap: 127G/214G direct: 54M postGC: 111G relInfo: 573M mpGeoms: 10G
|
||||
read( -%) -> (0/262) -> process(95% 94% 95% 95% 95% 95% 95% 95% 93% 95% 95% 94% 95% 95% 92% 94% 94% 95% 94% 94% 96% 94% 94% 94% 95% 95% 95% 94% 96% 92% 95% 96% 96% 94% 95% 95% 95% 94% 95% 94% 93% 94% 95% 95% 96% 96% 95% 95% 94% 95% 94% 95% 94% 95% 95% 95% 93% 94% 93% 95% 94% 95% 95% 93% 94% 94% 95% 94% 95% 95% 94% 95% 95% 93% 91% 95% 93% 95% 95% 95% 94% 95% 93% 95% 95% 96% 95% 95% 96% 95% 94% 95% 94% 96% 94% 95% 95% 94% 95% 95% 93% 94% 93% 96% 94% 95% 95% 94% 93% 95% 94% 95% 94% 96% 95% 93% 95% 94% 96% 96% 93% 94% 95% 94% 95% 96% 95% 95% 96% 96% 96% 95% 95% 96% 94% 95% 96% 96% 93% 94% 95% 94% 93% 96% 96% 95% 94% 93% 93% 93% 95% 94% 95% 93% 95% 94% 95% 94% 94% 93% 93% 95% 94% 96% 94% 95% 95% 94% 94% 93% 95% 96% 95% 95%) -> (90k/230k) -> write(10% 10% 11% 10% 10% 12%)
|
||||
0:11:02 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 993M 100% 0/s ] rels: [ 11M 100% 128k/s ] features: [ 3.3B 641k/s ] 241G blocks: [ 43k 100% 10/s ]
|
||||
cpus: 169.7 gc: 2% heap: 165G/214G direct: 54M postGC: 134G relInfo: 573M mpGeoms: 10G
|
||||
read( -%) -> (0/262) -> process(95% 94% 96% 94% 96% 96% 96% 95% 95% 96% 94% 96% 95% 95% 96% 95% 96% 96% 95% 95% 94% 95% 95% 96% 95% 96% 96% 96% 95% 95% 94% 95% 96% 95% 95% 94% 96% 94% 95% 95% 95% 95% 94% 94% 96% 95% 95% 96% 95% 96% 96% 95% 96% 96% 95% 95% 95% 95% 95% 95% 94% 96% 95% 94% 95% 95% 95% 96% 95% 95% 95% 95% 96% 95% 95% 95% 95% 96% 95% 95% 95% 97% 96% 94% 94% 95% 94% 96% 94% 95% 95% 96% 96% 96% 95% 96% 93% 96% 94% 95% 95% 94% 94% 94% 95% 96% 95% 95% 95% 95% 96% 94% 96% 93% 95% 94% 94% 95% 95% 93% 95% 95% 95% 96% 95% 95% 95% 95% 95% 96% 96% 95% 95% 94% 96% 95% 94% 94% 94% 96% 95% 95% 95% 95% 95% 96% 95% 94% 94% 94% 95% 95% 95% 95% 96% 95% 95% 94% 94% 94% 94% 94% 94% 94% 96% 96% 95% 96% 95% 94% 96% 95% 95% 95%) -> (99k/230k) -> write(12% 9% 9% 9% 9% 9%)
|
||||
0:11:04 INF [osm_pass2:process] - Finished relations: 11,749,466 (124k/s) in 1m34s cpu:4h22m23s gc:3s avg:166.7
|
||||
0:11:06 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 993M 100% 0/s ] rels: [ 11M 100% 9.8k/s ] features: [ 3.3B 84k/s ] 233G blocks: [ 43k 100% 2/s ]
|
||||
cpus: 16.4 gc: 0% heap: 137G/214G direct: 54M postGC: 110G relInfo: 573M mpGeoms: 10G
|
||||
read( -%) -> (0/262) -> process( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%) -> (0/230k) -> write( -% -% -% -% -% -%)
|
||||
0:11:06 DEB [osm_pass2] - Processed 43,182 blocks:
|
||||
0:11:06 DEB [osm_pass2] - nodes: 8,876,780,887 (150M/s) in 59s cpu:2h6m27s gc:4s avg:128.3
|
||||
0:11:06 DEB [osm_pass2] - ways: 993,607,585 (2.4M/s) in 6m43s cpu:16h19m39s gc:23s avg:145.8
|
||||
0:11:06 DEB [osm_pass2] - relations: 11,749,466 (124k/s) in 1m34s cpu:4h22m23s gc:3s avg:166.7
|
||||
0:11:06 INF [osm_pass2] - Finished in 9m19s cpu:22h48m33s gc:29s avg:147
|
||||
0:11:06 INF [osm_pass2] - read 1x(11% 1m4s wait:7m20s done:49s)
|
||||
0:11:06 INF [osm_pass2] - process 174x(76% 7m6s block:10s wait:1m6s done:2s)
|
||||
0:11:06 INF [osm_pass2] - write 6x(70% 6m31s wait:2m6s)
|
||||
0:11:06 INF [boundaries] -
|
||||
0:11:06 INF [boundaries] - Starting...
|
||||
0:11:06 INF [boundaries] - Creating polygons for 218 boundaries
|
||||
0:11:10 INF [boundaries] - Finished creating 218 country polygons
|
||||
0:11:11 WAR [boundaries] - no left or right country for border between OSM country relations: [51477] around https://www.openstreetmap.org/#map=10/54.19118/7.52130
|
||||
0:11:11 WAR [boundaries] - no left or right country for border between OSM country relations: [51477] around https://www.openstreetmap.org/#map=10/54.61356/12.41358
|
||||
0:11:13 WAR [boundaries] - no left or right country for border between OSM country relations: [51477] around https://www.openstreetmap.org/#map=10/50.01340/6.13601
|
||||
0:11:13 WAR [boundaries] - no left or right country for border between OSM country relations: [51477] around https://www.openstreetmap.org/#map=10/49.77642/6.51023
|
||||
0:11:14 WAR [boundaries] - no left or right country for border between OSM country relations: [51477, 16239] around https://www.openstreetmap.org/#map=10/47.38554/10.16937
|
||||
0:11:14 WAR [boundaries] - no left or right country for border between OSM country relations: [51477, 16239] around https://www.openstreetmap.org/#map=10/47.67866/12.16969
|
||||
0:11:14 WAR [boundaries] - no left or right country for border between OSM country relations: [51477] around https://www.openstreetmap.org/#map=10/53.42387/6.88641
|
||||
0:11:14 INF [boundaries] - Finished in 8s cpu:10s avg:1.2
|
||||
0:11:14 INF [agg_stop] -
|
||||
0:11:14 INF [agg_stop] - Starting...
|
||||
0:11:14 INF [agg_stop] - Processing 28687 agg_stop sets
|
||||
0:11:14 INF [agg_stop] - Finished in 0.3s cpu:0.9s avg:3.4
|
||||
0:11:14 INF - Deleting node.db to make room for output file
|
||||
0:11:14 INF [sort] -
|
||||
0:11:14 INF [sort] - Starting...
|
||||
0:11:14 INF [sort] - Grouped 226 chunks into 205
|
||||
0:11:25 INF [sort] - chunks: [ 19 / 205 9% ] 237G
|
||||
cpus: 54.2 gc: 10% heap: 171G/214G direct: 54M postGC: 171G
|
||||
-> (151/241) -> worker(20% 21% 17% 21% 18% 16% 19% 19% 14% 16% 17% 17% 16% 14% 16% 14% 15% 18% 14% 17% 14% 17% 5% 7% 14% 3% 3% 3% 3% 3% 0% 0% 0% 0% 0%)
|
||||
0:11:35 INF [sort] - chunks: [ 37 / 205 18% ] 235G
|
||||
cpus: 30.1 gc: 9% heap: 62G/214G direct: 54M postGC: 62G
|
||||
-> (133/241) -> worker( 4% 13% 13% 14% 16% 2% 11% 0% 2% 16% 1% 0% 0% 4% 0% 0% 0% 0% 0% 0% 0% 0% 9% 8% 0% 14% 16% 14% 15% 13% 14% 16% 16% 16% 13%)
|
||||
0:11:46 INF [sort] - chunks: [ 52 / 205 25% ] 237G
|
||||
cpus: 27.1 gc: 5% heap: 91G/214G direct: 54M postGC: 91G
|
||||
-> (118/241) -> worker(12% 0% 0% 0% 0% 15% 0% 11% 3% 0% 17% 17% 15% 13% 11% 17% 17% 11% 11% 4% 17% 16% 3% 3% 17% 0% 0% 2% 0% 0% 0% 0% 0% 0% 0%)
|
||||
0:11:57 INF [sort] - chunks: [ 68 / 205 33% ] 234G
|
||||
cpus: 26.2 gc: 4% heap: 34G/214G direct: 54M postGC: 34G
|
||||
-> (102/241) -> worker( 0% 1% 4% 13% 3% 0% 0% 0% 14% 1% 0% 0% 0% 0% 0% 0% 0% 0% 0% 13% 0% 0% 13% 14% 0% 16% 16% 10% 14% 16% 16% 17% 16% 4% 17%)
|
||||
0:12:08 INF [sort] - chunks: [ 85 / 205 41% ] 235G
|
||||
cpus: 30 gc: 6% heap: 60G/214G direct: 54M postGC: 60G
|
||||
-> (85/241) -> worker(14% 13% 14% 0% 13% 17% 17% 18% 0% 16% 18% 17% 17% 17% 11% 16% 11% 3% 17% 0% 4% 4% 1% 1% 4% 0% 0% 0% 0% 0% 0% 0% 0% 14% 0%)
|
||||
0:12:20 INF [sort] - chunks: [ 101 / 205 49% ] 234G
|
||||
cpus: 29.7 gc: 5% heap: 22G/214G direct: 54M postGC: 22G
|
||||
-> (69/241) -> worker( 0% 1% 1% 2% 1% 0% 0% 0% 15% 0% 0% 0% 0% 0% 0% 0% 0% 13% 0% 15% 12% 13% 15% 14% 12% 13% 13% 15% 14% 13% 13% 16% 2% 0% 13%)
|
||||
0:12:30 INF [sort] - chunks: [ 120 / 205 59% ] 234G
|
||||
cpus: 34 gc: 7% heap: 58G/214G direct: 54M postGC: 58G
|
||||
-> (50/241) -> worker(18% 17% 18% 18% 18% 17% 19% 18% 0% 15% 19% 17% 15% 13% 18% 3% 15% 1% 17% 0% 2% 2% 2% 0% 3% 0% 0% 0% 1% 0% 0% 0% 16% 19% 0%)
|
||||
0:12:40 INF [sort] - chunks: [ 133 / 205 65% ] 234G
|
||||
cpus: 28.9 gc: 5% heap: 42G/214G direct: 54M postGC: 34G
|
||||
-> (37/241) -> worker( 0% 0% 2% 3% 0% 0% 0% 0% 18% 0% 0% 0% 0% 0% 0% 14% 0% 16% 0% 18% 15% 15% 15% 12% 14% 11% 4% 18% 4% 17% 19% 4% 0% 0% 4%)
|
||||
0:12:51 INF [sort] - chunks: [ 146 / 205 71% ] 237G
|
||||
cpus: 35.4 gc: 7% heap: 31G/214G direct: 54M postGC: 31G
|
||||
-> (24/241) -> worker(17% 16% 15% 13% 18% 18% 17% 1% 0% 17% 1% 1% 17% 5% 1% 0% 4% 0% 17% 0% 0% 0% 0% 0% 0% 0% 14% 0% 14% 0% 0% 7% 16% 18% 14%)
|
||||
0:13:02 INF [sort] - chunks: [ 163 / 205 80% ] 238G
|
||||
cpus: 36.5 gc: 7% heap: 53G/214G direct: 54M postGC: 53G
|
||||
-> (7/241) -> worker( 0% 0% 1% 2% 0% 0% 0% 11% 16% 0% 17% 12% 0% 11% 15% 17% 13% 17% 0% 16% 16% 17% 15% 14% 16% 5% 1% 13% 2% 16% 16% 3% 0% 0% 0%)
|
||||
0:13:13 INF [sort] - chunks: [ 184 / 205 90% ] 236G
|
||||
cpus: 41.5 gc: 7% heap: 48G/214G direct: 54M postGC: 40G
|
||||
-> (0/241) -> worker( -% -% -% -% -% 14% -% 4% 0% -% 2% 4% -% 15% 13% 2% 16% 0% -% 0% 0% 0% 1% 0% 3% 10% -% 0% -% 0% 0% 14% -% -% -%)
|
||||
0:13:20 INF [sort] - chunks: [ 205 / 205 100% ] 233G
|
||||
cpus: 35 gc: 7% heap: 70G/214G direct: 54M postGC: 65G
|
||||
-> (0/241) -> worker( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%)
|
||||
0:13:20 INF [sort] - Finished in 2m5s cpu:1h10m52s gc:8s avg:33.9
|
||||
0:13:20 INF [sort] - worker 35x(8% 10s wait:1m28s done:6s)
|
||||
0:13:20 INF - read:737s write:355s sort:68s
|
||||
0:13:20 INF [archive] -
|
||||
0:13:20 INF [archive] - Starting...
|
||||
0:13:22 INF [archive:write] - Starting z0
|
||||
0:13:22 INF [archive:write] - Finished z0 in 0s cpu:0.7s avg:532.1, now starting z1
|
||||
0:13:22 INF [archive:write] - Finished z1 in 0s cpu:0.1s avg:24.6, now starting z2
|
||||
0:13:23 INF [archive:write] - Finished z2 in 0.3s cpu:40s avg:136.1, now starting z3
|
||||
0:13:23 INF [archive:write] - Finished z3 in 0s cpu:3s avg:164, now starting z4
|
||||
0:13:25 INF [archive:write] - Finished z4 in 2s cpu:4m54s avg:150.3, now starting z5
|
||||
0:13:25 INF [archive:write] - Finished z5 in 0s cpu:3s avg:175.8, now starting z6
|
||||
0:13:27 INF [archive:write] - Finished z6 in 2s cpu:6m15s avg:164.6, now starting z7
|
||||
0:13:31 INF [archive] - features: [ 48M 1% 4.8M/s ] 233G tiles: [ 14k 1.4k/s ] 107M
|
||||
cpus: 153 gc: 22% heap: 48G/214G direct: 54M postGC: 22G
|
||||
read(69% 68%) -> merge(71%) -> (0/10k) -> encode(72% 72% 73% 72% 73% 73% 68% 73% 71% 72% 72% 73% 72% 73% 68% 72% 71% 72% 73% 71% 70% 71% 71% 71% 73% 72% 72% 72% 72% 72% 73% 72% 73% 72% 74% 73% 72% 70% 72% 71% 73% 72% 71% 70% 71% 71% 73% 70% 70% 71% 73% 71% 72% 73% 71% 68% 72% 71% 68% 70% 71% 71% 71% 72% 71% 69% 73% 72% 70% 73% 70% 71% 69% 70% 72% 69% 72% 71% 73% 67% 71% 70% 70% 68% 70% 70% 71% 73% 70% 66% 71% 70% 67% 70% 72% 69% 71% 70% 69% 71% 69% 69% 67% 69% 67% 70% 71% 69% 72% 71% 71% 70% 70% 70% 67% 71% 70% 69% 71% 68% 67% 67% 70% 68% 69% 71% 70% 69% 69% 69% 70% 70% 68% 68% 67% 69% 70% 69% 68% 68% 68% 68% 70% 71% 68% 69% 67% 68% 68% 68% 70% 69% 67% 69% 70% 69% 68% 70% 70% 68% 69% 70% 69% 67% 66% 68% 74% 68% 69% 68% 68% 68% 67% 68% 67% 65% 66% 66%) -> (1.4k/10k) -> write( 2%)
|
||||
last tile: 7/77/41 (z7 85%) https://onthegomap.github.io/planetiler-demo/#7.5/53.32261/37.96875
|
||||
0:13:31 INF [archive:write] - Finished z7 in 4s cpu:10m47s avg:151.7, now starting z8
|
||||
0:13:38 INF [archive:write] - Finished z8 in 7s cpu:17m34s avg:154.4, now starting z9
|
||||
0:13:41 INF [archive] - features: [ 111M 3% 6.1M/s ] 233G tiles: [ 122k 10k/s ] 611M
|
||||
cpus: 137.7 gc: 10% heap: 42G/214G direct: 54M postGC: 27G
|
||||
read(87% 89%) -> merge(88%) -> (0/10k) -> encode(72% 71% 64% 68% 71% 74% 70% 77% 76% 69% 73% 85% 65% 66% 68% 69% 69% 70% 72% 70% 68% 68% 70% 72% 70% 72% 74% 73% 71% 71% 71% 66% 73% 74% 68% 70% 65% 69% 70% 70% 73% 71% 76% 77% 73% 70% 61% 68% 72% 63% 69% 71% 64% 58% 66% 73% 69% 70% 68% 71% 66% 70% 69% 74% 62% 76% 64% 67% 61% 72% 60% 70% 74% 68% 68% 66% 73% 75% 67% 69% 70% 69% 69% 66% 64% 72% 69% 72% 73% 72% 73% 74% 66% 74% 66% 76% 72% 71% 73% 73% 71% 73% 73% 66% 60% 70% 74% 70% 75% 71% 65% 77% 71% 71% 66% 70% 72% 69% 73% 72% 64% 73% 72% 66% 72% 67% 65% 76% 69% 75% 67% 68% 73% 67% 71% 70% 73% 64% 72% 68% 64% 68% 75% 75% 70% 63% 69% 67% 65% 69% 73% 68% 64% 76% 66% 74% 70% 74% 73% 71% 75% 70% 83% 71% 67% 70% 74% 67% 71% 72% 63% 68% 66% 64% 68% 65% 74% 73%) -> (2.7k/10k) -> write( 5%)
|
||||
last tile: 9/123/172 (z9 21%) https://onthegomap.github.io/planetiler-demo/#9.5/50.5129/-93.16406
|
||||
0:13:45 INF [archive:write] - Finished z9 in 7s cpu:16m22s avg:145.3, now starting z10
|
||||
0:13:51 INF [archive] - features: [ 175M 5% 6.3M/s ] 233G tiles: [ 495k 37k/s ] 1.6G
|
||||
cpus: 138.2 gc: 6% heap: 102G/214G direct: 54M postGC: 31G
|
||||
read(92% 89%) -> merge(90%) -> (4/10k) -> encode(71% 76% 76% 72% 73% 76% 69% 66% 70% 69% 71% 75% 72% 70% 73% 72% 71% 71% 73% 71% 74% 73% 73% 72% 74% 72% 73% 71% 72% 72% 74% 77% 73% 69% 71% 74% 76% 68% 70% 73% 70% 72% 71% 73% 73% 70% 74% 70% 71% 73% 73% 71% 72% 72% 73% 70% 73% 71% 76% 71% 70% 72% 73% 73% 69% 73% 73% 75% 92% 72% 74% 76% 75% 76% 91% 70% 75% 73% 72% 74% 71% 71% 74% 72% 74% 71% 72% 70% 67% 73% 72% 76% 71% 73% 69% 72% 72% 76% 72% 72% 68% 71% 75% 73% 69% 72% 73% 91% 73% 68% 69% 72% 72% 73% 68% 69% 74% 74% 70% 71% 74% 78% 69% 71% 73% 72% 70% 73% 75% 70% 70% 70% 71% 76% 73% 73% 66% 71% 69% 74% 74% 69% 71% 72% 73% 74% 71% 71% 75% 70% 72% 72% 68% 72% 72% 71% 76% 70% 75% 73% 71% 73% 71% 71% 74% 70% 72% 76% 69% 72% 72% 73% 72% 74% 73% 72% 69% 78%) -> (4.9k/10k) -> write(12%)
|
||||
last tile: 10/172/399 (z10 20%) https://onthegomap.github.io/planetiler-demo/#10.5/36.73875/-119.35547
|
||||
0:14:00 INF [archive:write] - Finished z10 in 15s cpu:22m36s gc:1s avg:89.8, now starting z11
|
||||
0:14:01 INF [archive] - features: [ 238M 7% 6.2M/s ] 233G tiles: [ 2.7M 223k/s ] 3.8G
|
||||
cpus: 70.8 gc: 7% heap: 142G/214G direct: 54M postGC: 42G
|
||||
read(65% 59%) -> merge(67%) -> (0/10k) -> encode(32% 32% 33% 31% 34% 34% 32% 35% 33% 30% 33% 30% 35% 35% 51% 34% 37% 32% 36% 34% 33% 35% 33% 34% 40% 35% 33% 34% 31% 36% 32% 32% 35% 34% 31% 34% 32% 35% 34% 30% 54% 33% 33% 31% 33% 33% 34% 34% 31% 36% 58% 34% 31% 32% 31% 36% 31% 34% 36% 33% 33% 32% 37% 34% 34% 32% 33% 39% 39% 29% 39% 35% 35% 33% 32% 35% 34% 31% 37% 37% 30% 33% 38% 32% 39% 32% 30% 31% 34% 33% 36% 37% 32% 31% 31% 39% 34% 34% 33% 33% 35% 34% 36% 31% 36% 35% 33% 81% 35% 28% 42% 32% 32% 30% 38% 32% 30% 34% 35% 35% 31% 32% 33% 31% 33% 33% 32% 33% 33% 36% 31% 33% 31% 36% 34% 33% 38% 33% 30% 35% 36% 32% 32% 32% 35% 33% 34% 32% 37% 33% 41% 32% 29% 29% 39% 36% 31% 29% 48% 36% 36% 34% 35% 34% 31% 50% 33% 36% 39% 35% 37% 36% 34% 34% 30% 38% 33% 30%) -> (3.9k/10k) -> write(20%)
|
||||
last tile: 11/662/1245 (z11 47%) https://onthegomap.github.io/planetiler-demo/#11.5/-36.24424/-63.54492
|
||||
0:14:06 INF [archive:write] - Finished z11 in 6s cpu:8m32s avg:88.6, now starting z12
|
||||
0:14:11 INF [archive] - features: [ 335M 10% 9.6M/s ] 233G tiles: [ 7.6M 485k/s ] 7.7G
|
||||
cpus: 88.4 gc: 4% heap: 48G/214G direct: 54M postGC: 36G
|
||||
read(88% 95%) -> merge(93%) -> (0/10k) -> encode(44% 48% 49% 42% 49% 48% 49% 44% 49% 42% 47% 42% 48% 44% 46% 49% 41% 42% 49% 47% 46% 47% 49% 46% 48% 47% 44% 41% 44% 48% 44% 45% 42% 46% 46% 46% 49% 46% 47% 44% 47% 49% 45% 44% 44% 45% 47% 43% 45% 41% 45% 47% 45% 45% 46% 46% 46% 41% 45% 44% 45% 46% 44% 42% 45% 49% 44% 52% 45% 43% 50% 41% 44% 47% 45% 43% 45% 48% 42% 47% 46% 43% 46% 46% 47% 48% 47% 48% 46% 45% 47% 49% 44% 48% 47% 47% 44% 47% 50% 47% 42% 46% 51% 45% 46% 44% 46% 43% 48% 43% 43% 47% 47% 47% 48% 46% 43% 48% 44% 47% 48% 45% 43% 43% 47% 46% 44% 47% 47% 40% 45% 49% 49% 47% 49% 46% 47% 44% 47% 45% 45% 48% 48% 47% 41% 48% 45% 44% 46% 44% 48% 48% 47% 44% 48% 45% 41% 43% 44% 44% 44% 40% 42% 41% 48% 46% 44% 46% 46% 49% 46% 44% 48% 43% 43% 48% 47% 50%) -> (912/10k) -> write(45%)
|
||||
last tile: 12/686/1597 (z12 20%) https://onthegomap.github.io/planetiler-demo/#12.5/36.77408/-119.66309
|
||||
0:14:21 INF [archive] - features: [ 448M 13% 11M/s ] 233G tiles: [ 14M 709k/s ] 10G
|
||||
cpus: 66.1 gc: 2% heap: 75G/214G direct: 54M postGC: 36G
|
||||
read(97% 94%) -> merge(94%) -> (0/10k) -> encode(32% 35% 36% 33% 32% 37% 33% 35% 35% 34% 36% 38% 32% 32% 32% 34% 36% 32% 37% 35% 35% 33% 34% 33% 34% 34% 34% 33% 32% 33% 36% 34% 31% 30% 35% 33% 36% 31% 31% 33% 33% 34% 34% 33% 42% 34% 35% 32% 34% 31% 32% 33% 34% 35% 30% 32% 34% 30% 31% 35% 32% 39% 30% 34% 31% 40% 38% 33% 36% 32% 30% 32% 37% 33% 35% 33% 40% 35% 31% 33% 34% 33% 35% 40% 34% 34% 33% 31% 36% 37% 34% 35% 34% 32% 33% 33% 31% 35% 36% 32% 40% 31% 36% 34% 33% 38% 37% 38% 37% 34% 34% 35% 31% 32% 35% 33% 31% 34% 32% 32% 33% 36% 37% 34% 31% 34% 33% 31% 38% 32% 40% 35% 35% 34% 31% 34% 32% 38% 33% 33% 34% 31% 33% 33% 35% 33% 35% 34% 35% 40% 41% 33% 33% 35% 30% 33% 40% 34% 32% 31% 36% 40% 37% 32% 34% 35% 33% 36% 31% 31% 36% 33% 34% 33% 35% 36% 32% 34%) -> (1.2k/10k) -> write(43%)
|
||||
last tile: 12/3026/1762 (z12 82%) https://onthegomap.github.io/planetiler-demo/#12.5/24.32707/86.00098
|
||||
0:14:31 INF [archive] - features: [ 541M 16% 9.2M/s ] 233G tiles: [ 15M 73k/s ] 13G
|
||||
cpus: 65.5 gc: 2% heap: 88G/214G direct: 54M postGC: 37G
|
||||
read(98% 79%) -> merge(87%) -> (829/10k) -> encode(38% 36% 36% 30% 35% 36% 33% 34% 35% 37% 36% 35% 33% 36% 34% 30% 35% 31% 34% 36% 34% 35% 33% 34% 35% 34% 32% 38% 34% 38% 33% 31% 41% 35% 27% 35% 36% 34% 35% 34% 37% 36% 36% 33% 37% 37% 38% 35% 36% 34% 34% 38% 36% 35% 32% 35% 31% 37% 33% 35% 36% 28% 36% 33% 39% 34% 35% 33% 39% 34% 38% 35% 36% 39% 34% 35% 35% 33% 33% 33% 30% 33% 33% 35% 37% 36% 35% 35% 32% 33% 34% 32% 31% 31% 36% 32% 36% 36% 31% 34% 31% 36% 29% 33% 32% 32% 33% 35% 31% 34% 38% 37% 37% 34% 37% 31% 34% 34% 31% 31% 33% 35% 33% 35% 35% 38% 34% 34% 32% 32% 36% 34% 38% 34% 31% 36% 36% 36% 31% 31% 33% 39% 30% 35% 37% 33% 30% 29% 37% 34% 32% 32% 35% 36% 35% 32% 32% 32% 34% 35% 33% 34% 35% 36% 31% 38% 35% 36% 35% 36% 34% 32% 32% 30% 37% 35% 33% 37%) -> (1.6k/10k) -> write(27%)
|
||||
last tile: 12/2771/1512 (z12 87%) https://onthegomap.github.io/planetiler-demo/#12.5/42.52069/63.58887
|
||||
0:14:32 INF [archive:write] - Finished z12 in 26s cpu:30m avg:68.2, now starting z13
|
||||
0:14:41 INF [archive] - features: [ 593M 18% 5.1M/s ] 233G tiles: [ 25M 1M/s ] 14G
|
||||
cpus: 135.3 gc: 9% heap: 76G/214G direct: 54M postGC: 44G
|
||||
read(82% 78%) -> merge(86%) -> (4k/10k) -> encode(69% 71% 67% 68% 71% 69% 69% 70% 70% 69% 70% 69% 70% 70% 71% 70% 69% 66% 71% 69% 70% 69% 69% 70% 69% 70% 69% 69% 68% 70% 70% 68% 70% 70% 70% 70% 70% 69% 68% 68% 70% 70% 70% 69% 70% 68% 70% 69% 69% 70% 69% 68% 70% 69% 69% 69% 69% 69% 72% 69% 66% 69% 70% 72% 68% 69% 71% 68% 70% 69% 70% 70% 70% 70% 70% 70% 68% 70% 70% 70% 69% 68% 69% 69% 70% 70% 69% 69% 69% 67% 70% 69% 69% 69% 69% 70% 70% 70% 69% 70% 71% 70% 70% 70% 70% 70% 70% 69% 70% 67% 69% 70% 67% 68% 68% 69% 69% 70% 69% 68% 68% 69% 69% 71% 69% 70% 69% 70% 70% 69% 69% 70% 70% 69% 69% 70% 67% 71% 69% 69% 69% 69% 69% 70% 70% 71% 70% 67% 68% 69% 71% 69% 71% 69% 70% 69% 70% 70% 67% 69% 69% 69% 65% 66% 69% 69% 69% 69% 69% 71% 69% 68% 68% 69% 70% 69% 70% 70%) -> (6.6k/10k) -> write(33%)
|
||||
last tile: 13/2421/2930 (z13 13%) https://onthegomap.github.io/planetiler-demo/#13.5/45.50634/-73.58643
|
||||
0:14:51 INF [archive] - features: [ 623M 19% 2.9M/s ] 233G tiles: [ 26M 121k/s ] 15G
|
||||
cpus: 168.1 gc: 12% heap: 79G/214G direct: 54M postGC: 49G
|
||||
read(65% 67%) -> merge(77%) -> (8.1k/10k) -> encode(87% 87% 86% 85% 87% 87% 87% 85% 85% 87% 86% 87% 86% 86% 87% 86% 86% 85% 87% 87% 87% 86% 87% 87% 87% 87% 86% 87% 87% 84% 87% 85% 87% 87% 87% 87% 86% 86% 87% 85% 86% 87% 87% 86% 87% 87% 87% 87% 86% 87% 87% 87% 87% 87% 87% 86% 87% 86% 87% 86% 86% 87% 86% 87% 86% 86% 87% 85% 86% 87% 87% 87% 82% 86% 86% 86% 85% 87% 87% 86% 86% 86% 86% 87% 87% 87% 87% 86% 86% 85% 87% 85% 86% 86% 85% 85% 87% 87% 85% 83% 87% 83% 85% 86% 87% 86% 87% 87% 86% 86% 87% 86% 87% 87% 87% 86% 82% 87% 87% 86% 86% 85% 86% 87% 86% 87% 87% 87% 86% 87% 86% 87% 86% 87% 87% 86% 87% 86% 86% 87% 87% 87% 86% 87% 86% 86% 86% 86% 86% 87% 85% 87% 87% 84% 86% 86% 86% 86% 86% 87% 87% 87% 87% 87% 85% 87% 87% 86% 87% 87% 86% 87% 86% 86% 86% 87% 86% 87%) -> (9k/10k) -> write(17%)
|
||||
last tile: 13/4090/2723 (z13 15%) https://onthegomap.github.io/planetiler-demo/#13.5/51.52241/-0.2417
|
||||
0:15:01 INF [archive] - features: [ 654M 20% 3M/s ] 233G tiles: [ 26M 6.3k/s ] 15G
|
||||
cpus: 168.8 gc: 12% heap: 71G/214G direct: 54M postGC: 55G
|
||||
read(36% 33%) -> merge(48%) -> (8k/10k) -> encode(87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 86% 87% 86% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 85% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 86% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 86% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 85% 87% 87% 87% 87% 87% 87% 85% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87%) -> (10k/10k) -> write( 2%)
|
||||
last tile: 13/4083/2952 (z13 15%) https://onthegomap.github.io/planetiler-demo/#13.5/44.82471/-0.54932
|
||||
0:15:12 INF [archive] - features: [ 680M 20% 2.5M/s ] 233G tiles: [ 27M 91k/s ] 15G
|
||||
cpus: 169.7 gc: 10% heap: 176G/214G direct: 54M postGC: 59G
|
||||
read(27% 26%) -> merge(34%) -> (7.9k/10k) -> encode(88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 89% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 89% 88% 88% 88% 88% 88% 88% 88% 88% 88% 86% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 86% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 86% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 86% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 87% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 86% 88% 88%) -> (10k/10k) -> write( 8%)
|
||||
last tile: 13/4059/3812 (z13 17%) https://onthegomap.github.io/planetiler-demo/#13.5/12.36147/-1.604
|
||||
0:15:22 INF [archive] - features: [ 724M 22% 4.3M/s ] 233G tiles: [ 28M 104k/s ] 16G
|
||||
cpus: 170.7 gc: 9% heap: 127G/214G direct: 54M postGC: 27G
|
||||
read(30% 28%) -> merge(36%) -> (5.5k/10k) -> encode(91% 90% 90% 92% 90% 87% 88% 92% 91% 90% 91% 90% 91% 92% 91% 90% 90% 92% 91% 89% 92% 92% 91% 91% 90% 89% 92% 89% 90% 92% 91% 90% 90% 91% 90% 90% 90% 91% 91% 89% 91% 91% 90% 89% 91% 89% 85% 90% 92% 92% 91% 91% 88% 90% 90% 89% 92% 89% 89% 88% 91% 91% 92% 92% 91% 89% 91% 89% 89% 85% 91% 91% 91% 90% 91% 92% 89% 91% 91% 87% 91% 91% 91% 91% 91% 92% 90% 91% 87% 91% 92% 90% 91% 89% 90% 89% 91% 90% 91% 91% 92% 91% 88% 90% 91% 87% 90% 91% 91% 91% 89% 90% 91% 90% 89% 89% 88% 92% 91% 91% 88% 91% 89% 91% 90% 89% 91% 91% 91% 91% 91% 92% 91% 88% 92% 92% 90% 91% 92% 90% 91% 90% 91% 91% 90% 92% 88% 91% 92% 92% 90% 92% 90% 90% 89% 90% 90% 89% 89% 89% 88% 91% 91% 88% 91% 89% 92% 87% 91% 91% 92% 89% 91% 90% 90% 91% 91% 92%) -> (8.4k/10k) -> write(10%)
|
||||
last tile: 13/2270/3104 (z13 18%) https://onthegomap.github.io/planetiler-demo/#13.5/39.89288/-80.22217
|
||||
0:15:32 INF [archive] - features: [ 758M 23% 3.2M/s ] 233G tiles: [ 29M 26k/s ] 16G
|
||||
cpus: 169.6 gc: 11% heap: 109G/214G direct: 54M postGC: 36G
|
||||
read(41% 40%) -> merge(66%) -> (5.8k/10k) -> encode(88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 86% 88% 88% 88% 88% 88% 87% 87% 87% 88% 88% 88% 85% 88% 86% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 87% 88% 88% 88% 88% 87% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 86% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 87% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 87% 87% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 87% 87% 86% 88% 88% 88% 88% 88% 88% 88% 86% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 86% 88% 88% 88%) -> (8.9k/10k) -> write( 7%)
|
||||
last tile: 13/2393/3846 (z13 19%) https://onthegomap.github.io/planetiler-demo/#13.5/10.89804/-74.81689
|
||||
0:15:42 INF [archive] - features: [ 790M 24% 3.1M/s ] 233G tiles: [ 30M 85k/s ] 16G
|
||||
cpus: 168.8 gc: 11% heap: 54G/214G direct: 54M postGC: 38G
|
||||
read(11% 11%) -> merge(25%) -> (7.7k/10k) -> encode(88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88%) -> (10k/10k) -> write( 7%)
|
||||
last tile: 13/1430/3312 (z13 20%) https://onthegomap.github.io/planetiler-demo/#13.5/32.52829/-117.13623
|
||||
0:15:52 INF [archive] - features: [ 847M 25% 5.5M/s ] 233G tiles: [ 40M 1M/s ] 18G
|
||||
cpus: 110.5 gc: 6% heap: 72G/214G direct: 54M postGC: 44G
|
||||
read(12% 9%) -> merge(15%) -> (15/10k) -> encode(61% 60% 62% 62% 57% 70% 59% 57% 60% 59% 55% 58% 60% 58% 59% 58% 59% 58% 58% 58% 59% 59% 60% 57% 58% 57% 60% 58% 62% 60% 61% 56% 59% 58% 58% 57% 56% 58% 57% 58% 60% 61% 60% 60% 59% 59% 59% 58% 57% 58% 63% 56% 56% 59% 56% 57% 59% 62% 62% 55% 61% 59% 57% 62% 58% 61% 55% 59% 56% 60% 59% 59% 59% 60% 62% 57% 56% 58% 57% 59% 57% 62% 60% 59% 56% 60% 57% 55% 56% 59% 61% 58% 60% 57% 57% 59% 59% 59% 59% 61% 60% 55% 58% 57% 56% 59% 62% 59% 57% 56% 57% 60% 61% 61% 59% 60% 58% 61% 57% 56% 60% 56% 57% 59% 58% 56% 57% 58% 63% 55% 58% 56% 56% 56% 56% 62% 63% 57% 57% 60% 59% 57% 59% 59% 58% 57% 58% 55% 57% 59% 58% 57% 59% 55% 56% 59% 59% 61% 58% 60% 60% 58% 57% 58% 58% 60% 58% 61% 57% 61% 57% 58% 59% 59% 61% 55% 59% 57%) -> (2.8k/10k) -> write(33%)
|
||||
last tile: 13/3645/5644 (z13 44%) https://onthegomap.github.io/planetiler-demo/#13.5/-56.0843/-19.79736
|
||||
0:16:02 INF [archive] - features: [ 884M 26% 3.6M/s ] 233G tiles: [ 43M 276k/s ] 18G
|
||||
cpus: 169.6 gc: 11% heap: 123G/214G direct: 54M postGC: 51G
|
||||
read(41% 43%) -> merge(70%) -> (1.7k/10k) -> encode(88% 88% 88% 87% 87% 88% 88% 88% 87% 88% 87% 87% 87% 88% 87% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 87% 88% 87% 88% 88% 88% 87% 88% 87% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 87% 88% 87% 88% 88% 87% 86% 88% 87% 88% 87% 88% 87% 87% 88% 88% 88% 87% 88% 87% 88% 88% 88% 87% 88% 87% 88% 87% 88% 88% 86% 88% 87% 87% 87% 86% 87% 86% 87% 88% 88% 87% 88% 88% 88% 87% 88% 88% 87% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 87% 88% 88% 86% 88% 87% 88% 87% 86% 88% 88% 87% 88% 88% 88% 87% 88% 88% 87% 87% 88% 87% 88% 87% 86% 87% 88% 87% 88% 88% 87% 88% 87% 87% 86% 87% 88% 87% 87% 88% 88% 88% 88% 88% 88% 87% 87% 88% 88% 87% 88% 87% 88% 88% 88% 88% 87% 86% 87% 87% 88% 88% 88% 87% 88% 88%) -> (7.1k/10k) -> write( 6%)
|
||||
last tile: 13/3040/4647 (z13 47%) https://onthegomap.github.io/planetiler-demo/#13.5/-23.54384/-46.38428
|
||||
0:16:13 INF [archive] - features: [ 907M 27% 2.3M/s ] 233G tiles: [ 43M 78k/s ] 19G
|
||||
cpus: 168.9 gc: 12% heap: 74G/214G direct: 54M postGC: 55G
|
||||
read(36% 36%) -> merge(44%) -> (3.8k/10k) -> encode(88% 88% 87% 88% 88% 87% 88% 88% 88% 86% 88% 87% 87% 87% 87% 88% 88% 87% 88% 87% 87% 87% 87% 87% 88% 87% 87% 88% 86% 87% 87% 87% 87% 87% 87% 86% 88% 87% 88% 87% 86% 88% 87% 87% 87% 87% 87% 88% 87% 87% 88% 86% 86% 87% 87% 87% 87% 88% 87% 87% 88% 86% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 88% 88% 86% 87% 88% 88% 87% 87% 87% 87% 88% 87% 87% 86% 87% 88% 88% 88% 87% 87% 88% 87% 87% 87% 87% 88% 87% 87% 88% 87% 87% 87% 87% 87% 87% 87% 87% 87% 84% 86% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 86% 87% 88% 87% 87% 88% 87% 87% 86% 85% 87% 87% 88% 87% 88% 87% 87% 87% 87% 85% 87% 88% 87% 87% 87% 87% 87% 88% 87% 87% 87% 87% 87% 86% 87% 87% 88% 87% 87% 87% 87% 87% 86% 87% 88% 87% 87% 87% 88% 87% 87% 87% 87% 87%) -> (9.3k/10k) -> write(18%)
|
||||
last tile: 13/3034/4578 (z13 48%) https://onthegomap.github.io/planetiler-demo/#13.5/-20.73556/-46.64795
|
||||
0:16:23 INF [archive] - features: [ 932M 28% 2.4M/s ] 233G tiles: [ 44M 17k/s ] 19G
|
||||
cpus: 170.1 gc: 9% heap: 130G/214G direct: 54M postGC: 24G
|
||||
read( 3% 3%) -> merge( 5%) -> (3.4k/10k) -> encode(89% 90% 88% 88% 90% 90% 90% 90% 90% 87% 90% 88% 89% 90% 89% 90% 89% 90% 90% 90% 90% 90% 89% 90% 89% 90% 87% 90% 90% 88% 89% 87% 89% 90% 88% 88% 87% 89% 88% 90% 89% 89% 89% 89% 89% 90% 90% 89% 90% 89% 88% 90% 90% 90% 87% 90% 90% 88% 88% 86% 90% 90% 89% 88% 90% 90% 88% 90% 89% 90% 89% 86% 87% 87% 90% 88% 90% 90% 90% 88% 90% 89% 88% 86% 90% 89% 87% 88% 89% 90% 90% 88% 89% 90% 87% 89% 90% 88% 89% 90% 90% 89% 87% 89% 86% 89% 90% 88% 88% 89% 88% 90% 88% 90% 88% 90% 88% 90% 89% 89% 90% 90% 90% 90% 90% 88% 88% 89% 90% 90% 88% 88% 89% 90% 88% 87% 90% 90% 90% 88% 90% 90% 89% 90% 90% 90% 90% 90% 87% 89% 88% 90% 90% 87% 90% 89% 89% 89% 90% 90% 88% 90% 90% 90% 90% 88% 89% 89% 88% 90% 90% 90% 90% 89% 89% 90% 88% 90%) -> (10k/10k) -> write( 5%)
|
||||
last tile: 13/3219/4181 (z13 49%) https://onthegomap.github.io/planetiler-demo/#13.5/-3.75463/-38.51807
|
||||
0:16:33 INF [archive] - features: [ 965M 29% 3.2M/s ] 233G tiles: [ 46M 190k/s ] 19G
|
||||
cpus: 165.5 gc: 9% heap: 72G/214G direct: 54M postGC: 31G
|
||||
read(31% 29%) -> merge(39%) -> (2.1k/10k) -> encode(90% 86% 90% 90% 88% 87% 87% 91% 87% 85% 86% 88% 87% 86% 85% 87% 85% 89% 84% 90% 86% 85% 87% 86% 89% 86% 87% 87% 91% 89% 88% 87% 89% 89% 86% 87% 88% 84% 85% 87% 88% 91% 89% 85% 85% 85% 84% 85% 90% 85% 85% 89% 86% 86% 87% 88% 88% 88% 86% 87% 90% 88% 87% 87% 88% 91% 87% 87% 88% 87% 91% 90% 87% 85% 88% 88% 89% 87% 87% 86% 88% 87% 87% 91% 89% 87% 87% 86% 87% 88% 90% 88% 91% 87% 87% 89% 88% 87% 90% 87% 85% 86% 87% 87% 87% 87% 85% 88% 91% 89% 86% 86% 88% 91% 87% 87% 85% 86% 87% 87% 86% 89% 88% 86% 89% 86% 89% 87% 87% 87% 87% 88% 91% 87% 87% 84% 88% 89% 85% 86% 87% 85% 89% 88% 87% 87% 87% 86% 86% 86% 87% 86% 85% 86% 85% 84% 88% 86% 85% 91% 87% 88% 86% 87% 90% 86% 86% 91% 88% 87% 86% 89% 85% 90% 90% 88% 88% 88%) -> (10k/10k) -> write(17%)
|
||||
last tile: 13/4987/4252 (z13 52%) https://onthegomap.github.io/planetiler-demo/#13.5/-6.86098/39.17725
|
||||
0:16:43 INF [archive] - features: [ 980M 29% 1.4M/s ] 233G tiles: [ 53M 702k/s ] 20G
|
||||
cpus: 169.1 gc: 12% heap: 121G/214G direct: 54M postGC: 36G
|
||||
read(25% 27%) -> merge(32%) -> (4.1k/10k) -> encode(88% 88% 88% 88% 88% 88% 88% 87% 87% 87% 88% 85% 88% 86% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 87% 87% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 87% 88% 87% 88% 88% 87% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 84% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 85% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 87% 88% 85% 86% 88% 88% 88% 88% 88% 87% 86% 88% 88% 88% 88% 88% 88% 87% 88% 86% 86% 88% 88% 87% 87% 88% 85% 88% 88% 88% 88% 86% 87% 86% 88% 88% 88% 88% 88% 88% 88% 88%) -> (5.4k/10k) -> write(18%)
|
||||
last tile: 13/6526/4240 (z13 73%) https://onthegomap.github.io/planetiler-demo/#13.5/-6.33714/106.80908
|
||||
0:16:53 INF [archive] - features: [ 999M 30% 1.9M/s ] 233G tiles: [ 53M 1.3k/s ] 20G
|
||||
cpus: 168.2 gc: 13% heap: 48G/214G direct: 54M postGC: 43G
|
||||
read(51% 51%) -> merge(69%) -> (9.1k/10k) -> encode(86% 86% 86% 86% 86% 86% 83% 86% 86% 86% 86% 86% 86% 83% 86% 86% 86% 86% 86% 84% 86% 84% 84% 86% 86% 86% 86% 86% 85% 86% 86% 84% 85% 86% 86% 86% 86% 86% 86% 86% 86% 86% 86% 86% 86% 86% 85% 86% 86% 85% 86% 85% 86% 85% 86% 86% 86% 86% 86% 86% 86% 86% 86% 83% 86% 86% 86% 85% 86% 86% 84% 85% 85% 85% 86% 86% 86% 86% 86% 86% 85% 86% 86% 86% 86% 86% 86% 86% 86% 85% 86% 86% 86% 86% 86% 86% 86% 86% 84% 86% 86% 86% 85% 86% 86% 86% 86% 86% 83% 86% 84% 86% 84% 86% 85% 86% 86% 86% 86% 85% 86% 86% 85% 83% 86% 86% 86% 86% 86% 86% 86% 86% 86% 86% 86% 86% 84% 86% 85% 86% 86% 86% 86% 86% 86% 86% 86% 86% 86% 86% 86% 86% 86% 86% 86% 86% 86% 86% 86% 84% 86% 86% 86% 86% 86% 86% 86% 83% 85% 86% 86% 86% 86% 86% 86% 86% 86% 86%) -> (10k/10k) -> write( 1%)
|
||||
last tile: 13/6607/4275 (z13 73%) https://onthegomap.github.io/planetiler-demo/#13.5/-7.86338/110.36865
|
||||
0:17:03 INF [archive] - features: [ 1B 31% 2.7M/s ] 233G tiles: [ 53M 7.7k/s ] 20G
|
||||
cpus: 169.1 gc: 10% heap: 107G/214G direct: 54M postGC: 46G
|
||||
read(13% 14%) -> merge(18%) -> (6.6k/10k) -> encode(89% 89% 89% 89% 89% 88% 89% 89% 89% 88% 89% 88% 89% 89% 89% 88% 89% 89% 89% 89% 89% 89% 89% 89% 88% 89% 89% 89% 89% 88% 89% 89% 88% 88% 89% 88% 89% 88% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 88% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 88% 89% 89% 89% 89% 89% 89% 89% 89% 89% 88% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 88% 88% 88% 89% 89% 89% 89% 89% 89% 89% 89% 88% 89% 89% 89% 89% 89% 89% 88% 89% 89% 88% 89% 89% 89% 89% 89% 88% 89% 89% 89% 88% 88% 88% 88% 87% 89% 89% 89% 89% 89% 89% 89% 89% 89% 88% 89% 89% 89% 89% 88% 87% 89% 89% 89% 88% 88% 89% 89% 88% 89% 88% 89% 89% 89% 89% 89% 89% 87% 89% 89% 87% 89% 87% 88%) -> (10k/10k) -> write( 2%)
|
||||
last tile: 13/6660/4261 (z13 73%) https://onthegomap.github.io/planetiler-demo/#13.5/-7.2535/112.69775
|
||||
0:17:14 INF [archive] - features: [ 1B 32% 2.8M/s ] 233G tiles: [ 56M 276k/s ] 20G
|
||||
cpus: 161.1 gc: 9% heap: 132G/214G direct: 54M postGC: 49G
|
||||
read(31% 34%) -> merge(42%) -> (6.9k/10k) -> encode(86% 86% 82% 82% 86% 83% 85% 91% 84% 84% 82% 85% 85% 86% 85% 87% 85% 86% 85% 82% 84% 86% 81% 85% 86% 89% 86% 83% 84% 83% 83% 84% 83% 89% 83% 85% 82% 86% 85% 86% 84% 84% 88% 84% 85% 89% 86% 91% 84% 87% 84% 86% 85% 86% 87% 83% 83% 89% 86% 84% 87% 84% 90% 85% 84% 86% 87% 83% 84% 89% 84% 86% 83% 85% 83% 87% 87% 83% 89% 88% 82% 83% 81% 85% 87% 85% 84% 84% 83% 82% 88% 85% 84% 83% 82% 82% 86% 86% 86% 83% 85% 86% 87% 83% 85% 84% 84% 86% 84% 89% 86% 87% 84% 90% 85% 84% 86% 84% 83% 85% 87% 85% 82% 83% 82% 83% 87% 87% 86% 85% 84% 86% 82% 87% 87% 89% 83% 84% 83% 83% 87% 84% 81% 83% 83% 84% 88% 84% 84% 85% 85% 84% 84% 85% 85% 86% 85% 83% 87% 84% 84% 83% 81% 84% 86% 82% 83% 84% 83% 82% 83% 86% 84% 83% 82% 84% 83% 84%) -> (8.7k/10k) -> write(22%)
|
||||
last tile: 13/7319/2968 (z13 78%) https://onthegomap.github.io/planetiler-demo/#13.5/44.32385/141.65771
|
||||
0:17:24 INF [archive] - features: [ 1B 33% 3.7M/s ] 233G tiles: [ 56M 79k/s ] 21G
|
||||
cpus: 168.8 gc: 12% heap: 55G/214G direct: 54M postGC: 55G
|
||||
read(29% 32%) -> merge(37%) -> (6.7k/10k) -> encode(86% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 85% 87% 85% 85% 87% 87% 87% 87% 87% 87% 87% 87% 87% 86% 87% 87% 87% 87% 87% 87% 87% 87% 86% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 86% 87% 87% 87% 87% 87% 86% 87% 87% 87% 87% 86% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 85% 87% 87% 86% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 86% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 85% 87% 85% 86% 87% 85% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87% 87%) -> (10k/10k) -> write(18%)
|
||||
last tile: 13/6154/3542 (z13 80%) https://onthegomap.github.io/planetiler-demo/#13.5/23.62439/90.46143
|
||||
0:17:34 INF [archive] - features: [ 1.1B 34% 2.8M/s ] 233G tiles: [ 57M 46k/s ] 21G
|
||||
cpus: 169.5 gc: 11% heap: 73G/214G direct: 54M postGC: 26G
|
||||
read(31% 30%) -> merge(47%) -> (7.7k/10k) -> encode(88% 85% 86% 87% 88% 88% 86% 87% 85% 88% 89% 85% 89% 88% 89% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 84% 89% 85% 88% 85% 88% 87% 88% 88% 88% 88% 88% 87% 87% 88% 88% 88% 88% 86% 88% 88% 88% 88% 87% 88% 87% 89% 89% 89% 87% 88% 86% 88% 88% 86% 87% 85% 88% 87% 88% 89% 88% 89% 88% 88% 86% 88% 88% 85% 88% 87% 88% 86% 88% 87% 88% 88% 88% 87% 87% 88% 87% 88% 88% 86% 87% 88% 85% 86% 88% 88% 87% 86% 88% 87% 88% 87% 86% 88% 87% 86% 88% 86% 88% 88% 88% 88% 88% 88% 84% 88% 88% 87% 85% 86% 87% 88% 86% 88% 86% 87% 88% 87% 88% 87% 87% 87% 87% 84% 85% 87% 86% 86% 87% 88% 86% 88% 87% 88% 86% 88% 88% 86% 87% 88% 88% 87% 86% 84% 84% 87% 88% 88% 84% 88% 87% 87% 87% 88% 87% 88% 88% 88% 84% 85% 87% 87% 88% 87% 87% 86% 86% 86%) -> (10k/10k) -> write(16%)
|
||||
last tile: 13/6850/3761 (z13 81%) https://onthegomap.github.io/planetiler-demo/#13.5/14.54105/121.04736
|
||||
0:17:44 INF [archive] - features: [ 1.1B 35% 2.8M/s ] 233G tiles: [ 57M 65k/s ] 22G
|
||||
cpus: 169.9 gc: 10% heap: 140G/214G direct: 54M postGC: 30G
|
||||
read(28% 26%) -> merge(36%) -> (8.4k/10k) -> encode(88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 87% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 86% 88% 87% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 86% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 87% 87% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88%) -> (9.7k/10k) -> write(11%)
|
||||
last tile: 13/5883/3693 (z13 82%) https://onthegomap.github.io/planetiler-demo/#13.5/17.41354/78.55225
|
||||
0:17:54 INF [archive] - features: [ 1.1B 36% 3.4M/s ] 233G tiles: [ 58M 12k/s ] 22G
|
||||
cpus: 169.5 gc: 11% heap: 88G/214G direct: 54M postGC: 35G
|
||||
read(34% 33%) -> merge(41%) -> (8.3k/10k) -> encode(89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 88% 88% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 86% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 88% 89% 89% 88% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 88% 89% 88% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 88% 88% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 85% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 87% 89% 89% 89% 89%) -> (10k/10k) -> write( 5%)
|
||||
last tile: 13/6039/3439 (z13 82%) https://onthegomap.github.io/planetiler-demo/#13.5/27.70298/85.40771
|
||||
0:18:04 INF [archive] - features: [ 1.2B 36% 2.5M/s ] 233G tiles: [ 58M 64k/s ] 23G
|
||||
cpus: 170.4 gc: 10% heap: 39G/214G direct: 54M postGC: 38G
|
||||
read(20% 21%) -> merge(30%) -> (7.8k/10k) -> encode(90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 89% 89% 90% 90% 90% 90% 89% 90% 90% 87% 90% 90% 90% 89% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 87% 90% 90% 90% 90% 90% 90% 90% 90% 90% 89% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 89% 90% 90% 89% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 89% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 89% 90% 89% 90% 90% 90% 90% 90% 90% 89% 90% 90% 90% 90% 90% 90% 90% 90% 90% 89% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 86% 89% 90% 90% 90% 90% 90% 90% 89%) -> (10k/10k) -> write(15%)
|
||||
last tile: 13/5126/4048 (z13 83%) https://onthegomap.github.io/planetiler-demo/#13.5/2.08694/45.28564
|
||||
0:18:15 INF [archive] - features: [ 1.2B 37% 2M/s ] 233G tiles: [ 59M 30k/s ] 23G
|
||||
cpus: 171.2 gc: 8% heap: 111G/214G direct: 54M postGC: 41G
|
||||
read(29% 28%) -> merge(39%) -> (8.6k/10k) -> encode(91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 90% 91% 91% 91% 91% 91% 91% 91% 91% 90% 91% 91% 91% 91% 91% 91% 90% 91% 91% 91% 91% 90% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 90% 91% 91% 91% 91% 91% 90% 91% 91% 91% 91% 90% 91% 91% 91% 91% 91% 91% 91% 90% 91% 91% 91% 91% 91% 90% 91% 91% 91% 90% 89% 91% 91% 91% 91% 89% 89% 91% 91% 90% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 90% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 89% 91% 91% 91% 91% 91% 91% 91% 90% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 90% 89% 91% 91% 91% 91% 91% 91% 91% 91% 91% 90% 91% 91% 90% 91% 91% 91% 91%) -> (9.4k/10k) -> write(11%)
|
||||
last tile: 13/4319/3861 (z13 83%) https://onthegomap.github.io/planetiler-demo/#13.5/10.25006/9.82178
|
||||
0:18:25 INF [archive] - features: [ 1.2B 38% 3.2M/s ] 233G tiles: [ 59M 27k/s ] 23G
|
||||
cpus: 170.1 gc: 10% heap: 66G/214G direct: 54M postGC: 46G
|
||||
read(38% 39%) -> merge(44%) -> (8.8k/10k) -> encode(90% 90% 90% 90% 90% 90% 89% 89% 89% 89% 89% 89% 89% 90% 90% 89% 90% 89% 90% 90% 89% 89% 89% 90% 89% 87% 89% 88% 89% 90% 89% 90% 88% 89% 90% 90% 90% 89% 89% 89% 89% 90% 90% 90% 89% 90% 90% 89% 89% 89% 88% 86% 90% 90% 90% 90% 90% 90% 89% 89% 90% 90% 89% 90% 90% 89% 90% 88% 90% 90% 89% 89% 90% 89% 89% 90% 87% 89% 90% 89% 89% 89% 89% 89% 89% 89% 89% 90% 90% 89% 89% 89% 89% 90% 90% 90% 87% 90% 89% 89% 90% 87% 89% 90% 87% 90% 90% 90% 90% 89% 90% 89% 90% 89% 89% 89% 90% 89% 89% 90% 90% 89% 88% 89% 89% 89% 89% 90% 87% 89% 89% 89% 89% 89% 90% 90% 89% 89% 89% 89% 90% 89% 90% 88% 90% 90% 90% 89% 88% 90% 87% 89% 90% 89% 89% 90% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 90% 89% 89% 88% 89% 89% 89% 90% 89%) -> (10k/10k) -> write( 8%)
|
||||
last tile: 13/4636/3160 (z13 84%) https://onthegomap.github.io/planetiler-demo/#13.5/37.97884/23.75244
|
||||
0:18:35 INF [archive] - features: [ 1.3B 39% 5M/s ] 233G tiles: [ 59M 44k/s ] 24G
|
||||
cpus: 170.4 gc: 9% heap: 64G/214G direct: 54M postGC: 51G
|
||||
read(39% 40%) -> merge(48%) -> (7.3k/10k) -> encode(87% 90% 90% 89% 88% 90% 90% 90% 89% 90% 88% 89% 90% 90% 90% 90% 87% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 89% 89% 89% 90% 90% 90% 90% 89% 89% 89% 89% 89% 90% 90% 90% 89% 89% 90% 90% 90% 90% 90% 90% 90% 89% 90% 89% 90% 90% 90% 90% 90% 90% 90% 89% 88% 89% 90% 90% 90% 90% 90% 89% 88% 90% 90% 89% 90% 90% 90% 90% 90% 89% 90% 90% 90% 90% 90% 90% 90% 89% 90% 90% 90% 90% 88% 90% 90% 89% 87% 90% 89% 90% 89% 89% 90% 88% 90% 88% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 89% 90% 90% 89% 90% 90% 90% 88% 90% 90% 90% 90% 90% 90% 90% 90% 90% 87% 90% 90% 90% 90% 89% 90% 90% 90% 89% 90% 89% 89% 90% 90% 89% 89% 88% 90% 90% 90% 90% 89% 90% 89% 90% 90% 90% 90% 87% 90% 87% 90% 90% 90% 90%) -> (8.4k/10k) -> write(21%)
|
||||
last tile: 13/4669/2996 (z13 85%) https://onthegomap.github.io/planetiler-demo/#13.5/43.43696/25.20264
|
||||
0:18:45 INF [archive] - features: [ 1.3B 41% 3.5M/s ] 233G tiles: [ 59M 8.5k/s ] 25G
|
||||
cpus: 170.1 gc: 11% heap: 159G/214G direct: 54M postGC: 58G
|
||||
read(77% 77%) -> merge(72%) -> (9.9k/10k) -> encode(87% 87% 87% 88% 88% 84% 87% 88% 87% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 89% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 85% 88% 87% 88% 88% 88% 86% 88% 87% 86% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 87% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 86% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 87% 88% 88% 88% 88% 88% 88% 88% 87% 87% 88% 87% 88% 88% 88% 87% 88% 88% 88% 88% 88% 84% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 85% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 82% 88% 88% 87% 88% 88% 86% 88% 88% 86% 88% 88% 88% 88% 88% 87% 85% 86% 88% 88% 88% 88% 86% 88% 88% 88% 88% 88% 88% 87% 88% 88% 87% 88% 88% 87% 85% 88% 87% 87% 88% 88% 88% 87% 88% 88% 88% 87% 88% 87%) -> (10k/10k) -> write( 7%)
|
||||
last tile: 13/4329/2983 (z13 85%) https://onthegomap.github.io/planetiler-demo/#13.5/43.85037/10.26123
|
||||
0:18:55 INF [archive] - features: [ 1.3B 41% 2.4M/s ] 233G tiles: [ 59M 1.5k/s ] 25G
|
||||
cpus: 168.9 gc: 10% heap: 48G/214G direct: 54M postGC: 24G
|
||||
read( 8% 7%) -> merge( 8%) -> (8.1k/10k) -> encode(87% 89% 89% 86% 89% 87% 89% 89% 89% 89% 87% 88% 89% 89% 87% 89% 89% 89% 89% 89% 88% 88% 85% 89% 89% 88% 89% 89% 89% 87% 89% 89% 89% 87% 89% 88% 88% 89% 89% 89% 88% 89% 86% 88% 89% 88% 87% 89% 89% 87% 89% 89% 89% 89% 87% 89% 88% 87% 86% 88% 88% 88% 89% 89% 88% 88% 89% 89% 89% 89% 86% 87% 89% 89% 89% 89% 88% 87% 89% 89% 89% 89% 87% 89% 88% 86% 88% 88% 89% 89% 87% 87% 89% 89% 88% 89% 88% 89% 89% 88% 89% 88% 87% 87% 89% 86% 88% 88% 88% 87% 89% 88% 88% 86% 89% 88% 88% 89% 89% 89% 88% 87% 88% 87% 86% 88% 88% 89% 87% 89% 87% 87% 88% 87% 89% 88% 89% 89% 85% 87% 88% 89% 88% 87% 89% 88% 88% 89% 89% 89% 88% 87% 88% 87% 88% 89% 89% 87% 87% 89% 88% 87% 87% 89% 89% 88% 88% 88% 89% 89% 87% 87% 89% 89% 89% 89% 89% 87%) -> (10k/10k) -> write( 1%)
|
||||
last tile: 13/4146/3059 (z13 85%) https://onthegomap.github.io/planetiler-demo/#13.5/41.39329/2.21924
|
||||
0:19:06 INF [archive] - features: [ 1.4B 42% 3.1M/s ] 233G tiles: [ 59M 4.1k/s ] 25G
|
||||
cpus: 172.9 gc: 6% heap: 139G/214G direct: 54M postGC: 29G
|
||||
read(54% 55%) -> merge(55%) -> (9.8k/10k) -> encode(93% 93% 92% 93% 92% 93% 92% 92% 93% 93% 91% 92% 93% 93% 93% 92% 92% 92% 93% 92% 93% 93% 92% 93% 93% 92% 91% 92% 92% 92% 91% 93% 92% 93% 90% 93% 93% 92% 93% 93% 93% 92% 93% 93% 93% 92% 93% 93% 93% 93% 93% 93% 93% 92% 93% 93% 93% 90% 93% 93% 93% 93% 93% 93% 92% 93% 93% 90% 92% 91% 93% 92% 93% 92% 93% 93% 93% 93% 93% 93% 89% 92% 92% 93% 88% 93% 93% 92% 92% 92% 91% 90% 92% 91% 92% 93% 91% 90% 93% 93% 92% 93% 93% 93% 93% 92% 93% 93% 92% 92% 92% 92% 93% 93% 93% 92% 92% 92% 89% 92% 93% 93% 93% 93% 93% 92% 93% 93% 93% 92% 92% 91% 93% 92% 91% 92% 93% 93% 92% 93% 92% 93% 93% 91% 92% 91% 92% 92% 92% 93% 92% 92% 92% 93% 93% 92% 92% 93% 92% 92% 92% 93% 93% 93% 93% 93% 92% 92% 93% 91% 92% 93% 92% 92% 91% 93% 92% 91%) -> (10k/10k) -> write( 6%)
|
||||
last tile: 13/4293/2816 (z13 85%) https://onthegomap.github.io/planetiler-demo/#13.5/48.90806/8.6792
|
||||
0:19:16 INF [archive] - features: [ 1.4B 43% 2.6M/s ] 233G tiles: [ 59M 1.2k/s ] 26G
|
||||
cpus: 169.4 gc: 11% heap: 112G/214G direct: 54M postGC: 35G
|
||||
read(32% 32%) -> merge(33%) -> (10k/10k) -> encode(89% 89% 89% 89% 89% 89% 88% 89% 88% 89% 89% 89% 89% 89% 89% 89% 89% 88% 87% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 88% 89% 89% 89% 88% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 88% 88% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 88% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 88% 89% 88% 89% 89% 89% 89% 89% 89% 89% 88% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 88%) -> (10k/10k) -> write( 2%)
|
||||
last tile: 13/4249/2696 (z13 85%) https://onthegomap.github.io/planetiler-demo/#13.5/52.25471/6.74561
|
||||
0:19:26 INF [archive] - features: [ 1.4B 44% 2.2M/s ] 233G tiles: [ 59M 840/s ] 26G
|
||||
cpus: 170.5 gc: 9% heap: 40G/214G direct: 54M postGC: 37G
|
||||
read(19% 19%) -> merge(27%) -> (9.7k/10k) -> encode(91% 91% 91% 91% 91% 90% 91% 91% 91% 91% 91% 91% 90% 91% 91% 90% 91% 91% 91% 91% 91% 90% 91% 90% 91% 90% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 90% 91% 91% 91% 90% 91% 91% 91% 91% 91% 91% 91% 91% 90% 91% 91% 91% 91% 91% 91% 90% 91% 91% 91% 91% 91% 90% 90% 90% 89% 90% 91% 91% 91% 91% 91% 90% 91% 91% 90% 91% 90% 91% 91% 91% 91% 91% 91% 91% 91% 89% 90% 91% 91% 91% 90% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 90% 90% 91% 91% 91% 91% 90% 91% 91% 90% 91% 91% 90% 91% 90% 91% 91% 90% 91% 91% 91% 91% 90% 90% 90% 90% 91% 91% 91% 91% 90% 91% 90% 90% 90% 90% 91% 91% 90% 90% 91% 91% 91% 90% 91% 91% 91% 91% 91% 91% 90% 91% 91% 90% 90% 91% 91% 90% 90% 91% 91% 91% 91% 90% 91% 90% 91% 91% 91% 91% 90% 90% 91% 91% 91%) -> (10k/10k) -> write( 1%)
|
||||
last tile: 13/4168/2752 (z13 85%) https://onthegomap.github.io/planetiler-demo/#13.5/50.72254/3.18604
|
||||
0:19:36 INF [archive] - features: [ 1.4B 44% 2.1M/s ] 233G tiles: [ 59M 1.3k/s ] 26G
|
||||
cpus: 171.4 gc: 8% heap: 93G/214G direct: 54M postGC: 40G
|
||||
read(22% 22%) -> merge(35%) -> (9.8k/10k) -> encode(92% 91% 91% 91% 91% 92% 91% 91% 91% 92% 92% 92% 91% 91% 91% 91% 91% 92% 91% 91% 91% 91% 91% 91% 92% 91% 92% 91% 91% 91% 91% 91% 91% 91% 91% 92% 91% 91% 91% 92% 92% 91% 91% 91% 91% 91% 91% 91% 92% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 92% 90% 91% 91% 92% 91% 92% 92% 91% 91% 91% 91% 91% 92% 91% 91% 91% 92% 91% 91% 91% 91% 92% 91% 92% 91% 91% 92% 91% 91% 92% 91% 92% 91% 91% 91% 91% 91% 92% 92% 92% 91% 91% 91% 91% 91% 90% 91% 91% 91% 91% 91% 91% 91% 91% 91% 92% 91% 91% 91% 91% 91% 91% 92% 91% 92% 91% 91% 92% 92% 91% 91% 91% 91% 92% 91% 91% 91% 92% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 92% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 92% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 91% 92%) -> (10k/10k) -> write( 2%)
|
||||
last tile: 13/4194/2703 (z13 85%) https://onthegomap.github.io/planetiler-demo/#13.5/52.066/4.32861
|
||||
0:19:46 INF [archive] - features: [ 1.5B 46% 3.6M/s ] 233G tiles: [ 60M 6.8k/s ] 26G
|
||||
cpus: 171.7 gc: 8% heap: 90G/214G direct: 54M postGC: 44G
|
||||
read(23% 23%) -> merge(47%) -> (10k/10k) -> encode(92% 92% 92% 92% 92% 92% 92% 91% 92% 92% 92% 92% 92% 91% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 91% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 91% 92% 92% 91% 92% 92% 92% 92% 92% 91% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 91% 92% 92% 92% 92% 92% 92% 92% 92% 92% 91% 92% 92% 92% 92% 92% 91% 92% 92% 91% 92% 92% 92% 92% 92% 92% 92% 91% 92% 92% 92% 92% 92% 92% 91% 91% 92% 92% 91% 92% 92% 91% 92% 91% 92% 92% 91% 92% 91% 91% 92% 91% 92% 92% 91% 92% 92% 92% 91% 92% 92% 92% 92% 92% 92% 91% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 91% 92% 92% 92% 91% 92% 92% 92% 92% 92% 91% 91% 92% 92% 92% 92% 92%) -> (10k/10k) -> write( 6%)
|
||||
last tile: 13/4482/2738 (z13 85%) https://onthegomap.github.io/planetiler-demo/#13.5/51.11042/16.98486
|
||||
0:19:56 INF [archive] - features: [ 1.5B 47% 6.4M/s ] 233G tiles: [ 60M 64k/s ] 28G
|
||||
cpus: 168.2 gc: 9% heap: 65G/214G direct: 54M postGC: 48G
|
||||
read( 3% 3%) -> merge(11%) -> (9.6k/10k) -> encode(90% 90% 89% 90% 91% 89% 90% 90% 89% 89% 90% 89% 90% 90% 90% 89% 89% 89% 90% 90% 90% 90% 88% 87% 90% 90% 90% 89% 89% 89% 90% 89% 88% 89% 89% 90% 89% 89% 89% 90% 89% 89% 89% 89% 89% 89% 90% 90% 90% 90% 89% 88% 91% 90% 89% 90% 89% 88% 90% 90% 89% 89% 89% 90% 90% 90% 89% 89% 90% 90% 89% 90% 90% 89% 89% 89% 89% 90% 90% 89% 89% 89% 90% 88% 90% 88% 90% 90% 90% 89% 88% 90% 89% 89% 90% 89% 90% 90% 89% 90% 89% 90% 91% 90% 90% 89% 89% 90% 89% 89% 89% 89% 89% 89% 89% 90% 90% 89% 88% 89% 88% 88% 89% 90% 89% 90% 89% 90% 91% 89% 91% 89% 90% 89% 90% 90% 90% 89% 89% 90% 89% 89% 89% 89% 89% 89% 88% 90% 89% 89% 90% 89% 90% 90% 90% 90% 88% 89% 89% 89% 89% 90% 89% 88% 90% 89% 88% 90% 88% 89% 90% 90% 90% 90% 89% 90% 89% 89%) -> (10k/10k) -> write(27%)
|
||||
last tile: 13/5463/2520 (z13 86%) https://onthegomap.github.io/planetiler-demo/#13.5/56.74067/60.09521
|
||||
0:20:01 INF [archive:write] - Finished z13 in 5m29s cpu:15h8m57s gc:32s avg:165.9, now starting z14
|
||||
0:20:06 INF [archive] - features: [ 1.6B 51% 9.9M/s ] 233G tiles: [ 100M 3.9M/s ] 30G
|
||||
cpus: 69.3 gc: 4% heap: 49G/214G direct: 54M postGC: 48G
|
||||
read(40% 43%) -> merge(52%) -> (1/10k) -> encode(33% 38% 35% 35% 36% 36% 34% 37% 34% 34% 35% 36% 34% 33% 36% 33% 37% 34% 33% 37% 37% 35% 34% 35% 33% 34% 34% 36% 34% 36% 33% 35% 33% 35% 36% 35% 36% 34% 34% 34% 35% 36% 35% 37% 36% 34% 37% 34% 36% 34% 35% 34% 36% 35% 33% 36% 33% 34% 35% 38% 33% 35% 36% 34% 34% 35% 35% 34% 38% 35% 37% 34% 34% 34% 37% 35% 35% 36% 34% 35% 37% 34% 37% 33% 35% 36% 39% 37% 36% 35% 35% 35% 37% 35% 34% 34% 37% 34% 36% 35% 35% 37% 33% 36% 38% 36% 35% 35% 34% 36% 37% 34% 37% 35% 34% 35% 35% 34% 34% 34% 36% 34% 37% 35% 35% 35% 35% 33% 33% 35% 34% 33% 37% 36% 34% 36% 37% 34% 34% 37% 35% 40% 35% 35% 33% 35% 37% 34% 36% 36% 36% 35% 37% 35% 34% 34% 36% 35% 36% 36% 35% 35% 39% 38% 34% 33% 37% 34% 36% 34% 35% 35% 38% 34% 35% 36% 34% 37%) -> (569/10k) -> write(84%)
|
||||
last tile: 14/4696/5932 (z14 13%) https://onthegomap.github.io/planetiler-demo/#14.5/44.39454/-76.80542
|
||||
0:20:16 INF [archive] - features: [ 1.8B 55% 13M/s ] 233G tiles: [ 109M 848k/s ] 34G
|
||||
cpus: 43.6 gc: 2% heap: 97G/214G direct: 54M postGC: 47G
|
||||
read(98% 98%) -> merge(98%) -> (0/10k) -> encode(23% 24% 22% 20% 22% 21% 21% 21% 22% 21% 21% 21% 21% 21% 22% 20% 21% 22% 22% 21% 23% 21% 23% 22% 20% 22% 23% 23% 22% 21% 21% 23% 22% 20% 24% 22% 20% 22% 24% 22% 23% 21% 22% 21% 21% 23% 21% 22% 21% 23% 22% 22% 22% 22% 24% 22% 22% 24% 23% 22% 21% 20% 21% 23% 23% 21% 23% 22% 22% 22% 22% 21% 22% 23% 21% 20% 21% 21% 22% 21% 21% 20% 21% 19% 23% 21% 21% 22% 22% 20% 21% 21% 20% 21% 23% 21% 20% 23% 22% 21% 20% 20% 24% 21% 22% 20% 20% 22% 20% 20% 22% 21% 22% 20% 21% 22% 21% 21% 20% 23% 23% 21% 23% 20% 23% 24% 18% 19% 22% 21% 23% 23% 23% 22% 22% 21% 21% 23% 18% 21% 22% 23% 21% 19% 22% 21% 22% 23% 23% 23% 21% 22% 21% 23% 21% 21% 19% 22% 23% 20% 22% 22% 22% 21% 23% 22% 20% 20% 24% 22% 21% 23% 19% 23% 21% 21% 23% 22%) -> (188/10k) -> write(44%)
|
||||
last tile: 14/7476/7518 (z14 16%) https://onthegomap.github.io/planetiler-demo/#14.5/14.63674/-15.72144
|
||||
0:20:26 INF [archive] - features: [ 1.9B 59% 13M/s ] 233G tiles: [ 118M 864k/s ] 37G
|
||||
cpus: 42.6 gc: 2% heap: 144G/214G direct: 54M postGC: 47G
|
||||
read(98% 98%) -> merge(98%) -> (0/10k) -> encode(19% 20% 20% 21% 22% 21% 20% 21% 22% 23% 22% 21% 20% 19% 23% 22% 25% 21% 21% 19% 20% 21% 22% 21% 21% 19% 23% 20% 23% 21% 22% 20% 19% 21% 22% 24% 21% 22% 23% 22% 21% 21% 19% 19% 20% 21% 24% 21% 23% 17% 21% 20% 21% 22% 19% 18% 21% 22% 21% 22% 20% 20% 22% 21% 23% 20% 19% 23% 20% 19% 22% 22% 22% 23% 19% 21% 21% 22% 21% 20% 21% 21% 20% 22% 24% 20% 21% 20% 21% 18% 21% 20% 21% 25% 21% 23% 21% 21% 24% 21% 23% 23% 19% 21% 23% 20% 20% 23% 22% 22% 20% 21% 21% 20% 21% 19% 22% 22% 21% 19% 22% 21% 22% 21% 20% 20% 20% 21% 21% 21% 21% 20% 22% 23% 21% 20% 21% 20% 20% 21% 23% 21% 21% 20% 21% 22% 20% 23% 22% 20% 20% 22% 21% 20% 20% 22% 21% 22% 21% 22% 20% 19% 21% 21% 21% 21% 22% 22% 23% 21% 20% 22% 20% 20% 22% 20% 21% 22%) -> (54/10k) -> write(41%)
|
||||
last tile: 14/2527/6200 (z14 20%) https://onthegomap.github.io/planetiler-demo/#14.5/40.03603/-124.46411
|
||||
0:20:36 INF [archive] - features: [ 2B 62% 11M/s ] 233G tiles: [ 121M 364k/s ] 40G
|
||||
cpus: 48.7 gc: 2% heap: 63G/214G direct: 54M postGC: 54G
|
||||
read(97% 83%) -> merge(94%) -> (8k/10k) -> encode(24% 23% 25% 24% 25% 25% 25% 23% 25% 25% 24% 25% 23% 24% 25% 23% 23% 24% 25% 25% 24% 22% 25% 25% 24% 27% 23% 25% 26% 23% 23% 23% 24% 25% 22% 22% 25% 23% 22% 23% 25% 27% 24% 26% 27% 24% 25% 22% 24% 24% 22% 25% 23% 24% 25% 23% 26% 25% 23% 23% 23% 23% 24% 24% 26% 23% 25% 24% 24% 24% 23% 23% 24% 22% 26% 26% 25% 25% 27% 26% 22% 25% 23% 25% 25% 24% 27% 23% 23% 26% 25% 24% 23% 26% 24% 22% 24% 22% 24% 26% 26% 25% 24% 23% 23% 23% 27% 23% 25% 22% 24% 25% 25% 24% 23% 24% 23% 24% 26% 23% 26% 22% 24% 25% 26% 24% 23% 26% 25% 26% 25% 23% 23% 24% 24% 23% 24% 24% 23% 24% 26% 23% 24% 24% 26% 26% 22% 24% 24% 24% 24% 23% 23% 23% 24% 25% 24% 24% 24% 23% 23% 23% 27% 24% 24% 24% 25% 22% 24% 27% 27% 26% 24% 23% 23% 25% 25% 23%) -> (9.7k/10k) -> write(62%)
|
||||
last tile: 14/3009/5363 (z14 22%) https://onthegomap.github.io/planetiler-demo/#14.5/52.64973/-113.87329
|
||||
0:20:47 INF [archive] - features: [ 2.2B 66% 13M/s ] 233G tiles: [ 178M 5.6M/s ] 43G
|
||||
cpus: 43.5 gc: 1% heap: 143G/214G direct: 54M postGC: 51G
|
||||
read(73% 73%) -> merge(85%) -> (648/10k) -> encode(21% 21% 22% 23% 21% 23% 22% 24% 21% 22% 21% 21% 19% 20% 21% 23% 22% 22% 24% 23% 24% 20% 21% 22% 20% 23% 21% 22% 21% 21% 22% 21% 24% 22% 23% 25% 21% 22% 23% 23% 22% 20% 22% 23% 22% 22% 22% 22% 20% 21% 21% 20% 23% 23% 24% 23% 21% 22% 19% 23% 20% 21% 20% 24% 23% 24% 21% 22% 23% 19% 20% 20% 22% 22% 23% 22% 21% 22% 23% 22% 21% 22% 23% 21% 23% 22% 22% 22% 24% 23% 23% 23% 22% 20% 21% 21% 22% 21% 23% 20% 22% 20% 21% 21% 23% 23% 21% 23% 24% 22% 20% 22% 23% 20% 22% 21% 21% 23% 23% 23% 21% 20% 23% 21% 19% 22% 20% 24% 22% 21% 20% 24% 24% 22% 21% 23% 22% 21% 21% 22% 22% 21% 21% 22% 20% 20% 24% 23% 22% 21% 23% 22% 21% 22% 22% 20% 19% 22% 23% 23% 23% 25% 22% 20% 21% 22% 23% 20% 25% 21% 20% 22% 21% 21% 22% 23% 20% 22%) -> (2.6k/10k) -> write(91%)
|
||||
last tile: 14/8750/8445 (z14 50%) https://onthegomap.github.io/planetiler-demo/#14.5/-5.56132/12.27173
|
||||
0:20:57 INF [archive] - features: [ 2.3B 72% 17M/s ] 233G tiles: [ 212M 3.3M/s ] 46G
|
||||
cpus: 42.5 gc: 2% heap: 113G/214G direct: 54M postGC: 51G
|
||||
read(92% 88%) -> merge(98%) -> (0/10k) -> encode(22% 20% 21% 20% 21% 19% 22% 21% 20% 19% 21% 20% 22% 23% 21% 22% 22% 21% 20% 21% 21% 23% 21% 21% 20% 18% 20% 21% 19% 21% 20% 22% 21% 23% 19% 21% 22% 20% 21% 22% 19% 19% 20% 20% 20% 21% 22% 25% 21% 24% 22% 22% 24% 20% 22% 22% 20% 20% 23% 20% 22% 20% 19% 22% 21% 20% 20% 22% 20% 22% 19% 22% 22% 22% 23% 23% 21% 20% 20% 22% 21% 22% 21% 21% 20% 21% 22% 21% 21% 20% 21% 21% 21% 21% 22% 22% 23% 22% 21% 19% 19% 20% 18% 23% 22% 20% 21% 20% 22% 18% 22% 21% 21% 19% 20% 20% 18% 19% 20% 21% 22% 20% 21% 18% 19% 22% 19% 23% 20% 21% 19% 20% 20% 21% 22% 19% 20% 24% 21% 21% 19% 21% 21% 21% 20% 20% 22% 19% 19% 24% 21% 22% 19% 20% 19% 20% 20% 19% 23% 22% 19% 22% 22% 21% 20% 22% 20% 22% 21% 21% 21% 23% 20% 22% 21% 21% 19% 19%) -> (2.1k/10k) -> write(66%)
|
||||
last tile: 14/14924/10025 (z14 74%) https://onthegomap.github.io/planetiler-demo/#14.5/-37.32649/147.93091
|
||||
0:20:58 WAR [archive:encode] - {x=14553 y=6450 z=14} 1303kb uncompressed
|
||||
0:21:06 WAR [archive:encode] - {x=13722 y=7013 z=14} 1080kb uncompressed
|
||||
0:21:07 INF [archive] - features: [ 2.5B 76% 13M/s ] 233G tiles: [ 225M 1.3M/s ] 49G
|
||||
cpus: 61.5 gc: 4% heap: 59G/214G direct: 55M postGC: 53G
|
||||
read(96% 93%) -> merge(96%) -> (0/10k) -> encode(31% 29% 30% 32% 32% 30% 31% 33% 31% 30% 30% 31% 31% 30% 30% 30% 31% 30% 29% 30% 29% 32% 30% 29% 30% 30% 29% 31% 28% 29% 29% 30% 31% 30% 30% 31% 30% 31% 29% 30% 29% 30% 29% 30% 30% 31% 31% 29% 30% 31% 31% 30% 31% 29% 31% 30% 30% 31% 30% 29% 33% 31% 32% 31% 31% 31% 28% 31% 29% 32% 30% 31% 29% 29% 30% 29% 30% 33% 31% 33% 31% 31% 31% 29% 30% 30% 32% 31% 30% 29% 34% 31% 30% 27% 31% 28% 29% 32% 31% 32% 31% 30% 31% 30% 30% 29% 29% 31% 30% 31% 30% 29% 30% 32% 31% 29% 29% 29% 31% 30% 32% 31% 31% 30% 30% 30% 29% 27% 30% 30% 28% 31% 30% 28% 32% 28% 30% 30% 29% 29% 30% 30% 31% 32% 29% 30% 32% 29% 32% 29% 32% 31% 33% 32% 32% 33% 30% 29% 33% 28% 30% 30% 30% 28% 30% 31% 30% 30% 29% 31% 28% 29% 30% 31% 28% 31% 30% 33%) -> (2.9k/10k) -> write(79%)
|
||||
last tile: 14/13688/7494 (z14 81%) https://onthegomap.github.io/planetiler-demo/#14.5/15.14637/120.77271
|
||||
0:21:17 INF [archive] - features: [ 2.6B 81% 16M/s ] 233G tiles: [ 232M 722k/s ] 53G
|
||||
cpus: 51 gc: 1% heap: 143G/214G direct: 55M postGC: 50G
|
||||
read(90% 94%) -> merge(99%) -> (0/10k) -> encode(25% 27% 26% 26% 28% 28% 27% 25% 25% 25% 25% 29% 25% 26% 27% 27% 27% 26% 27% 27% 24% 26% 27% 24% 23% 25% 26% 27% 23% 24% 27% 26% 27% 25% 26% 25% 26% 25% 25% 24% 26% 24% 27% 26% 24% 26% 27% 26% 25% 26% 27% 25% 23% 25% 26% 25% 24% 27% 29% 26% 28% 23% 25% 26% 25% 28% 23% 31% 24% 29% 27% 26% 26% 26% 24% 26% 28% 25% 26% 25% 25% 26% 28% 24% 27% 27% 31% 29% 24% 27% 26% 28% 27% 28% 28% 25% 27% 27% 25% 27% 28% 25% 27% 25% 26% 27% 24% 28% 27% 26% 25% 28% 27% 26% 27% 24% 26% 27% 25% 24% 24% 26% 27% 26% 25% 27% 26% 23% 27% 24% 26% 26% 26% 28% 26% 26% 26% 26% 26% 29% 28% 26% 23% 27% 27% 25% 26% 27% 24% 27% 26% 28% 24% 26% 26% 26% 26% 24% 26% 24% 24% 25% 26% 27% 25% 25% 28% 25% 24% 27% 27% 27% 26% 27% 26% 24% 27% 26%) -> (1.1k/10k) -> write(77%)
|
||||
last tile: 14/8192/6915 (z14 84%) https://onthegomap.github.io/planetiler-demo/#14.5/26.99062/0.01099
|
||||
0:21:27 INF [archive] - features: [ 2.8B 85% 13M/s ] 233G tiles: [ 235M 254k/s ] 57G
|
||||
cpus: 44.5 gc: 1% heap: 68G/214G direct: 55M postGC: 49G
|
||||
read(96% 99%) -> merge(97%) -> (0/10k) -> encode(24% 22% 24% 21% 21% 23% 23% 22% 23% 23% 23% 22% 23% 22% 22% 21% 22% 21% 22% 23% 21% 22% 20% 24% 22% 22% 21% 23% 21% 24% 23% 21% 21% 23% 23% 22% 20% 22% 21% 22% 22% 21% 24% 22% 25% 22% 24% 22% 22% 23% 22% 21% 21% 22% 22% 24% 22% 21% 22% 22% 24% 24% 23% 23% 23% 23% 23% 22% 22% 23% 22% 22% 22% 22% 24% 23% 23% 20% 24% 22% 21% 23% 24% 24% 22% 23% 21% 22% 22% 23% 22% 23% 24% 20% 21% 23% 22% 23% 21% 24% 22% 22% 24% 21% 24% 21% 26% 21% 24% 21% 22% 23% 20% 22% 23% 23% 22% 23% 24% 21% 23% 24% 21% 23% 22% 22% 22% 24% 22% 22% 22% 22% 24% 23% 26% 21% 24% 20% 26% 25% 22% 22% 21% 21% 22% 23% 23% 21% 23% 22% 23% 23% 24% 22% 20% 25% 23% 22% 25% 21% 23% 23% 21% 24% 22% 22% 21% 23% 22% 23% 22% 22% 23% 24% 22% 22% 21% 24%) -> (40/10k) -> write(51%)
|
||||
last tile: 14/8869/5670 (z14 85%) https://onthegomap.github.io/planetiler-demo/#14.5/48.36355/14.88647
|
||||
0:21:30 WAR [archive:encode] - {x=8290 y=6118 z=14} 1082kb uncompressed
|
||||
0:21:30 WAR [archive:encode] - {x=8290 y=6119 z=14} 1067kb uncompressed
|
||||
0:21:37 INF [archive] - features: [ 2.9B 89% 13M/s ] 233G tiles: [ 235M 36k/s ] 60G
|
||||
cpus: 35.1 gc: 1% heap: 57G/214G direct: 55M postGC: 49G
|
||||
read(98% 99%) -> merge(90%) -> (0/10k) -> encode(18% 18% 18% 18% 18% 17% 16% 17% 19% 17% 16% 19% 18% 17% 18% 19% 17% 17% 17% 19% 17% 18% 19% 17% 18% 18% 16% 16% 18% 18% 18% 16% 17% 19% 17% 18% 18% 18% 18% 18% 18% 19% 18% 18% 17% 17% 18% 16% 17% 18% 19% 18% 18% 19% 17% 17% 16% 17% 17% 18% 18% 19% 18% 17% 17% 16% 17% 18% 18% 16% 18% 19% 16% 17% 17% 18% 17% 17% 17% 17% 17% 18% 18% 18% 17% 17% 17% 17% 18% 20% 16% 18% 17% 18% 17% 16% 18% 16% 17% 14% 19% 16% 19% 17% 19% 16% 19% 16% 17% 17% 18% 18% 18% 18% 19% 17% 16% 18% 17% 17% 18% 18% 17% 19% 17% 19% 18% 16% 18% 18% 16% 18% 15% 17% 19% 17% 17% 17% 17% 17% 17% 16% 19% 20% 17% 18% 18% 17% 17% 18% 17% 18% 17% 18% 21% 17% 17% 18% 20% 20% 18% 18% 18% 15% 17% 17% 17% 17% 19% 17% 18% 17% 19% 20% 17% 19% 16% 17%) -> (42/10k) -> write(19%)
|
||||
last tile: 14/8699/5576 (z14 85%) https://onthegomap.github.io/planetiler-demo/#14.5/49.71738/11.15112
|
||||
0:21:47 INF [archive] - features: [ 3.1B 93% 14M/s ] 233G tiles: [ 235M 30k/s ] 63G
|
||||
cpus: 30.1 gc: 1% heap: 113G/214G direct: 55M postGC: 49G
|
||||
read(99% 99%) -> merge(90%) -> (0/10k) -> encode(15% 15% 14% 15% 15% 16% 15% 13% 15% 15% 14% 14% 14% 14% 14% 14% 17% 16% 15% 14% 16% 14% 16% 14% 14% 15% 16% 14% 16% 15% 16% 14% 13% 15% 15% 16% 14% 15% 14% 14% 17% 15% 16% 16% 15% 15% 16% 15% 17% 15% 14% 17% 15% 13% 14% 16% 16% 13% 15% 14% 14% 16% 14% 14% 16% 14% 15% 16% 15% 14% 15% 15% 13% 14% 15% 14% 14% 15% 15% 15% 15% 15% 14% 14% 15% 16% 15% 15% 16% 15% 15% 17% 17% 13% 14% 14% 15% 16% 15% 17% 14% 15% 16% 15% 15% 14% 16% 13% 15% 15% 15% 16% 16% 15% 16% 16% 17% 16% 15% 14% 15% 15% 15% 15% 17% 15% 15% 17% 14% 13% 15% 15% 14% 13% 15% 16% 14% 15% 15% 14% 15% 14% 15% 15% 15% 15% 16% 15% 16% 15% 15% 16% 15% 15% 16% 15% 14% 15% 15% 15% 15% 13% 15% 13% 15% 15% 14% 14% 16% 16% 14% 15% 17% 15% 16% 15% 14% 15%) -> (34/10k) -> write(14%)
|
||||
last tile: 14/8922/5370 (z14 85%) https://onthegomap.github.io/planetiler-demo/#14.5/52.55632/16.05103
|
||||
0:21:57 INF [archive] - features: [ 3.2B 97% 13M/s ] 233G tiles: [ 237M 173k/s ] 66G
|
||||
cpus: 40.1 gc: 1% heap: 123G/214G direct: 55M postGC: 50G
|
||||
read(97% 99%) -> merge(94%) -> (0/10k) -> encode(22% 22% 20% 19% 19% 21% 22% 18% 21% 18% 20% 20% 21% 19% 18% 22% 19% 19% 19% 21% 22% 19% 22% 23% 20% 22% 19% 21% 19% 20% 18% 17% 20% 22% 20% 22% 20% 21% 21% 17% 20% 21% 22% 21% 19% 22% 20% 20% 21% 18% 20% 22% 20% 23% 20% 20% 20% 20% 21% 22% 20% 20% 21% 19% 20% 20% 20% 19% 22% 20% 20% 18% 19% 19% 18% 21% 21% 21% 24% 21% 21% 20% 20% 22% 20% 22% 21% 20% 21% 19% 21% 20% 19% 19% 20% 21% 19% 21% 20% 20% 19% 20% 21% 20% 22% 20% 20% 20% 21% 20% 20% 21% 21% 21% 23% 19% 22% 19% 20% 21% 22% 21% 19% 21% 18% 23% 21% 22% 21% 19% 20% 19% 22% 20% 20% 20% 20% 22% 20% 21% 20% 21% 20% 19% 20% 19% 21% 20% 19% 21% 20% 19% 20% 21% 19% 19% 20% 19% 20% 19% 20% 20% 20% 19% 20% 20% 21% 21% 19% 20% 22% 20% 20% 21% 20% 21% 20% 19%) -> (72/10k) -> write(39%)
|
||||
last tile: 14/9509/4714 (z14 86%) https://onthegomap.github.io/planetiler-demo/#14.5/60.47346/28.94897
|
||||
0:22:07 INF [archive] - features: [ 3.3B 100% 8.1M/s ] 233G tiles: [ 264M 2.7M/s ] 69G
|
||||
cpus: 31 gc: 1% heap: 166G/214G direct: 55M postGC: 53G
|
||||
read(57% 67%) -> merge(55%) -> (0/10k) -> encode(16% 14% 15% 16% 14% 15% 14% 15% 17% 15% 16% 15% 14% 15% 17% 14% 15% 15% 16% 15% 14% 17% 18% 15% 17% 14% 14% 15% 17% 15% 15% 16% 15% 16% 15% 16% 16% 15% 14% 16% 15% 16% 15% 15% 15% 16% 16% 15% 15% 14% 16% 14% 17% 14% 15% 16% 14% 17% 16% 13% 16% 16% 14% 15% 17% 14% 15% 15% 16% 15% 16% 14% 14% 16% 16% 14% 16% 15% 15% 15% 16% 16% 15% 14% 16% 18% 17% 14% 15% 15% 15% 15% 14% 14% 16% 15% 15% 16% 12% 17% 16% 16% 15% 16% 16% 17% 14% 15% 16% 16% 15% 18% 17% 16% 15% 17% 15% 16% 15% 16% 17% 14% 17% 16% 15% 15% 17% 14% 16% 15% 16% 17% 16% 15% 14% 15% 15% 17% 14% 14% 17% 15% 15% 15% 17% 15% 14% 15% 14% 14% 15% 15% 15% 15% 13% 15% 17% 16% 15% 16% 16% 16% 18% 15% 13% 15% 14% 17% 16% 16% 15% 17% 16% 16% 16% 15% 16% 17%) -> (0/10k) -> write(83%)
|
||||
last tile: 14/16333/3936 (z14 98%) https://onthegomap.github.io/planetiler-demo/#14.5/67.8714/178.89038
|
||||
0:22:09 INF [archive:write] - Finished z14 in 2m9s cpu:1h30m36s gc:2s avg:42.3
|
||||
0:22:09 INF [archive:write] - Building directories with 14085 entries per leaf, attempt 1...
|
||||
0:22:15 INF [archive:write] - Built directories with 3501 leaves, 16467B root directory
|
||||
0:22:15 INF [archive:write] - Building directories with 16902 entries per leaf, attempt 2...
|
||||
0:22:17 INF [archive] - features: [ 3.3B 100% 571k/s ] 233G tiles: [ 270M 552k/s ] 69G
|
||||
cpus: 1.4 gc: 0% heap: 176G/214G direct: 55M postGC: 53G
|
||||
read( -% -%) -> merge( -%) -> (0/10k) -> encode( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%) -> (0/10k) -> write(78%)
|
||||
last tile: 14/16383/0 (z14 100%) https://onthegomap.github.io/planetiler-demo/#14.5/85.05018/179.98901
|
||||
0:22:20 INF [archive:write] - Built directories with 2917 leaves, 14102B root directory
|
||||
0:22:20 INF [archive:write] - Writing metadata and leaf directories...
|
||||
0:22:21 INF [archive:write] - Writing header...
|
||||
0:22:21 INF [archive:write] - # addressed tiles: 270436913
|
||||
0:22:21 INF [archive:write] - # of tile entries: 49299873
|
||||
0:22:21 INF [archive:write] - # of tile contents: 40261320
|
||||
0:22:21 INF [archive:write] - Root directory: 14kB
|
||||
0:22:21 INF [archive:write] - # leaves: 2917
|
||||
0:22:21 INF [archive:write] - Leaf directories: 87MB
|
||||
0:22:21 INF [archive:write] - Avg leaf size: 29kB
|
||||
0:22:21 INF [archive:write] - Total dir bytes: 87MB
|
||||
0:22:21 INF [archive:write] - Average bytes per addressed tile: 0.323166223983632
|
||||
0:22:21 INF [archive] - features: [ 3.3B 100% 0/s ] 233G tiles: [ 270M 0/s ] 69G
|
||||
cpus: 1.1 gc: 0% heap: 178G/214G direct: 141M postGC: 53G
|
||||
read( -% -%) -> merge( -%) -> (0/10k) -> encode( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%) -> (0/10k) -> write( -%)
|
||||
last tile: 14/16383/0 (z14 100%) https://onthegomap.github.io/planetiler-demo/#14.5/85.05018/179.98901
|
||||
0:22:21 DEB [archive] - Tile stats:
|
||||
0:22:21 DEB [archive] - Biggest tiles (gzipped)
|
||||
1. 14/14553/6450 (747k) https://onthegomap.github.io/planetiler-demo/#14.5/35.70192/139.77905 (poi:979k)
|
||||
2. 14/8290/6118 (675k) https://onthegomap.github.io/planetiler-demo/#14.5/41.40154/2.16431 (poi:537k)
|
||||
3. 14/8290/6119 (661k) https://onthegomap.github.io/planetiler-demo/#14.5/41.38505/2.16431 (poi:611k)
|
||||
4. 14/13722/7013 (617k) https://onthegomap.github.io/planetiler-demo/#14.5/25.05574/121.51978 (poi:685k)
|
||||
5. 14/6437/8362 (592k) https://onthegomap.github.io/planetiler-demo/#14.5/-3.74367/-38.55103 (building:605k)
|
||||
6. 14/7990/6392 (592k) https://onthegomap.github.io/planetiler-demo/#14.5/36.73008/-4.42749 (building:380k)
|
||||
7. 14/13722/7014 (588k) https://onthegomap.github.io/planetiler-demo/#14.5/25.03584/121.51978 (poi:627k)
|
||||
8. 14/14552/6450 (577k) https://onthegomap.github.io/planetiler-demo/#14.5/35.70192/139.75708 (poi:744k)
|
||||
9. 14/6435/8361 (573k) https://onthegomap.github.io/planetiler-demo/#14.5/-3.72175/-38.59497 (building:710k)
|
||||
10. 14/6436/8361 (558k) https://onthegomap.github.io/planetiler-demo/#14.5/-3.72175/-38.573 (building:607k)
|
||||
0:22:21 INF [archive] - Other tiles with large layers
|
||||
14/8414/5384 (313k) https://onthegomap.github.io/planetiler-demo/#14.5/52.36889/4.88892 (housenumber:313k)
|
||||
14/3411/6216 (333k) https://onthegomap.github.io/planetiler-demo/#14.5/39.76632/-105.04028 (landcover:333k)
|
||||
10/236/413 (176k) https://onthegomap.github.io/planetiler-demo/#10.5/32.69474/-96.85547 (landuse:176k)
|
||||
13/1596/3157 (337k) https://onthegomap.github.io/planetiler-demo/#13.5/38.08269/-109.84131 (mountain_peak:337k)
|
||||
5/5/11 (144k) https://onthegomap.github.io/planetiler-demo/#5.5/44.9512/-118.125 (park:144k)
|
||||
3/5/3 (558k) https://onthegomap.github.io/planetiler-demo/#3.5/20.48995/67.5 (place:558k)
|
||||
12/3229/2032 (313k) https://onthegomap.github.io/planetiler-demo/#12.5/1.36218/103.84277 (transportation:313k)
|
||||
14/9618/6751 (179k) https://onthegomap.github.io/planetiler-demo/#14.5/30.15463/31.34399 (transportation_name:179k)
|
||||
12/3415/1774 (165k) https://onthegomap.github.io/planetiler-demo/#12.5/23.36242/120.19043 (water:165k)
|
||||
0:22:21 DEB [archive] - Max tile sizes
|
||||
z0 z1 z2 z3 z4 z5 z6 z7 z8 z9 z10 z11 z12 z13 z14 all
|
||||
boundary 5.4k 37k 43k 25k 19k 24k 18k 14k 14k 28k 23k 17k 31k 18k 9.4k 43k
|
||||
landcover 1.5k 982 8k 4.6k 3.2k 31k 17k 271k 333k 235k 153k 175k 166k 111k 333k 333k
|
||||
place 52k 145k 546k 558k 351k 183k 109k 58k 41k 52k 62k 69k 50k 122k 221k 558k
|
||||
water 8.4k 4.1k 10k 9k 14k 13k 89k 113k 126k 109k 132k 94k 165k 115k 91k 165k
|
||||
water_name 8.5k 19k 26k 14k 12k 7.4k 5k 4.7k 12k 8.6k 5.6k 3.8k 3.1k 9.4k 29k 29k
|
||||
waterway 0 0 0 546 3.7k 1.6k 17k 13k 9.8k 28k 20k 16k 59k 75k 88k 88k
|
||||
landuse 0 0 0 0 2.6k 1.5k 32k 66k 125k 113k 176k 129k 63k 124k 47k 176k
|
||||
park 0 0 0 0 54k 144k 99k 76k 71k 82k 90k 55k 47k 19k 50k 144k
|
||||
transportation 0 0 0 0 60k 107k 62k 122k 89k 135k 91k 67k 313k 187k 128k 313k
|
||||
transportation_name 0 0 0 0 0 0 34k 20k 19k 15k 37k 22k 33k 27k 179k 179k
|
||||
mountain_peak 0 0 0 0 0 0 0 12k 12k 10k 10k 9.5k 9.4k 337k 234k 337k
|
||||
aerodrome_label 0 0 0 0 0 0 0 0 4.1k 2.8k 3.9k 2.9k 2.7k 2.7k 2.7k 4.1k
|
||||
aeroway 0 0 0 0 0 0 0 0 0 0 16k 25k 35k 31k 18k 35k
|
||||
poi 0 0 0 0 0 0 0 0 0 0 0 175 35k 17k 979k 979k
|
||||
building 0 0 0 0 0 0 0 0 0 0 0 0 0 141k 710k 710k
|
||||
housenumber 0 0 0 0 0 0 0 0 0 0 0 0 0 0 313k 313k
|
||||
full tile 76k 204k 626k 590k 401k 349k 271k 396k 370k 343k 272k 204k 379k 341k 1.3M 1.3M
|
||||
gzipped 46k 119k 334k 314k 238k 204k 172k 284k 268k 250k 182k 141k 188k 227k 747k 747k
|
||||
0:22:21 DEB [archive] - Max tile: 1.3M (gzipped: 747k)
|
||||
0:22:21 DEB [archive] - Avg tile: 99k (gzipped: 64k) using weighted average based on OSM traffic
|
||||
0:22:21 DEB [archive] - # tiles: 270,436,913
|
||||
0:22:21 DEB [archive] - # features: 3,338,872,773
|
||||
0:22:21 INF [archive] - Finished in 9m1s cpu:18h41m14s gc:40s avg:124.4
|
||||
0:22:21 INF [archive] - read 2x(51% 4m38s wait:3m40s done:11s)
|
||||
0:22:21 INF [archive] - merge 1x(57% 5m8s wait:2m31s done:12s)
|
||||
0:22:21 INF [archive] - encode 178x(64% 5m49s block:39s wait:1m40s done:12s)
|
||||
0:22:21 INF [archive] - write 1x(24% 2m8s wait:6m29s done:12s)
|
||||
0:22:21 INF - Finished in 22m21s cpu:44h34m7s gc:1m23s avg:119.7
|
||||
0:22:21 INF - FINISHED!
|
||||
0:22:21 INF -
|
||||
0:22:21 INF - ----------------------------------------
|
||||
0:22:21 INF - data errors:
|
||||
0:22:21 INF - render_snap_fix_input 21,388,532
|
||||
0:22:21 INF - merge_snap_fix_input 21,243
|
||||
0:22:21 INF - feature_polygon_osm_invalid_multipolygon_empty_after_fix 254
|
||||
0:22:21 INF - omt_park_area_osm_invalid_multipolygon_empty_after_fix 23
|
||||
0:22:21 INF - feature_centroid_if_convex_osm_invalid_multipolygon_empty_after_fix 17
|
||||
0:22:21 INF - feature_point_on_surface_osm_invalid_multipolygon_empty_after_fix 4
|
||||
0:22:21 INF - feature_centroid_osm_invalid_multipolygon_empty_after_fix 2
|
||||
0:22:21 INF - omt_place_island_poly_osm_invalid_multipolygon_empty_after_fix 2
|
||||
0:22:21 INF - merge_snap_fix_input2 1
|
||||
0:22:21 INF - merge_snap_fix_input3 1
|
||||
0:22:21 INF - ----------------------------------------
|
||||
0:22:21 INF - overall 22m21s cpu:44h34m7s gc:1m23s avg:119.7
|
||||
0:22:21 INF - lake_centerlines 3s cpu:9s avg:3.5
|
||||
0:22:21 INF - read 2x(17% 0.4s done:2s)
|
||||
0:22:21 INF - process 174x(0% 0s wait:2s)
|
||||
0:22:21 INF - write 6x(0% 0s wait:2s)
|
||||
0:22:21 INF - water_polygons 32s cpu:22m5s avg:40.9
|
||||
0:22:21 INF - read 2x(16% 5s wait:9s done:18s)
|
||||
0:22:21 INF - process 174x(20% 6s wait:25s)
|
||||
0:22:21 INF - write 6x(74% 24s wait:8s)
|
||||
0:22:21 INF - natural_earth 14s cpu:25s avg:1.7
|
||||
0:22:21 INF - read 2x(24% 3s wait:2s done:9s)
|
||||
0:22:21 INF - process 174x(0% 0.1s wait:11s done:3s)
|
||||
0:22:21 INF - write 6x(0% 0s wait:11s done:3s)
|
||||
0:22:21 INF - osm_pass1 58s cpu:1h30m37s gc:5s avg:94
|
||||
0:22:21 INF - read 1x(65% 38s wait:2s done:13s)
|
||||
0:22:21 INF - process 179x(45% 26s block:16s wait:11s done:1s)
|
||||
0:22:21 INF - osm_pass2 9m19s cpu:22h48m33s gc:29s avg:147
|
||||
0:22:21 INF - read 1x(11% 1m4s wait:7m20s done:49s)
|
||||
0:22:21 INF - process 174x(76% 7m6s block:10s wait:1m6s done:2s)
|
||||
0:22:21 INF - write 6x(70% 6m31s wait:2m6s)
|
||||
0:22:21 INF - boundaries 8s cpu:10s avg:1.2
|
||||
0:22:21 INF - agg_stop 0.3s cpu:0.9s avg:3.4
|
||||
0:22:21 INF - sort 2m5s cpu:1h10m52s gc:8s avg:33.9
|
||||
0:22:21 INF - worker 35x(8% 10s wait:1m28s done:6s)
|
||||
0:22:21 INF - archive 9m1s cpu:18h41m14s gc:40s avg:124.4
|
||||
0:22:21 INF - read 2x(51% 4m38s wait:3m40s done:11s)
|
||||
0:22:21 INF - merge 1x(57% 5m8s wait:2m31s done:12s)
|
||||
0:22:21 INF - encode 178x(64% 5m49s block:39s wait:1m40s done:12s)
|
||||
0:22:21 INF - write 1x(24% 2m8s wait:6m29s done:12s)
|
||||
0:22:21 INF - ----------------------------------------
|
||||
0:22:21 INF - archive 69GB
|
||||
0:22:21 INF - features 233GB
|
|
@ -0,0 +1,907 @@
|
|||
0:00:00 DEB - argument: config=null (path to config file)
|
||||
0:00:00 DEB - argument: download_dir=data/sources (download directory)
|
||||
0:00:00 DEB - argument: area=planet (name of the extract to download if osm_url/osm_path not specified (i.e. 'monaco' 'rhode island' 'australia' or 'planet'))
|
||||
0:00:00 INF - argument: stats=use in-memory stats
|
||||
0:00:00 DEB - argument: madvise=true (default value for whether to use linux madvise(random) to improve memory-mapped read performance for temporary storage)
|
||||
0:00:00 DEB - argument: storage=mmap (default storage type for temporary data, one of [ram, mmap, direct])
|
||||
0:00:00 DEB - argument: threads=64 (num threads)
|
||||
0:00:00 DEB - argument: write_threads=2 (number of threads to use when writing temp features)
|
||||
0:00:00 DEB - argument: process_threads=62 (number of threads to use when processing input features)
|
||||
0:00:00 DEB - argument: bounds=null (bounds)
|
||||
0:00:00 DEB - argument: polygon=null (a .poly file that limits output to tiles intersecting the shape)
|
||||
0:00:00 DEB - argument: minzoom=0 (minimum zoom level)
|
||||
0:00:00 DEB - argument: maxzoom=14 (maximum zoom level up to 15)
|
||||
0:00:00 DEB - argument: render_maxzoom=14 (maximum rendering zoom level up to 15)
|
||||
0:00:00 DEB - argument: tmpdir=data/tmp (temp directory)
|
||||
0:00:00 DEB - argument: feature_read_threads=2 (number of threads to use when reading features at tile write time)
|
||||
0:00:00 DEB - argument: tile_write_threads=1 (number of threads used to write tiles - only supported by [files, csv, tsv, proto, pbf, json])
|
||||
0:00:00 DEB - argument: loginterval=10 seconds (time between logs)
|
||||
0:00:00 DEB - argument: force=true (overwriting output file and ignore disk/RAM warnings)
|
||||
0:00:00 DEB - argument: append=false (append to the output file - only supported by [files, csv, tsv, proto, pbf, json])
|
||||
0:00:00 DEB - argument: gzip_temp=false (gzip temporary feature storage (uses more CPU, but less disk space))
|
||||
0:00:00 DEB - argument: mmap_temp=true (use memory-mapped IO for temp feature files)
|
||||
0:00:00 DEB - argument: sort_max_readers=6 (maximum number of concurrent read threads to use when sorting chunks)
|
||||
0:00:00 DEB - argument: sort_max_writers=6 (maximum number of concurrent write threads to use when sorting chunks)
|
||||
0:00:00 DEB - argument: nodemap_type=array (type of node location map, one of [noop, sortedtable, sparsearray, array])
|
||||
0:00:00 DEB - argument: nodemap_storage=mmap (storage for node location map, one of [ram, mmap, direct])
|
||||
0:00:00 DEB - argument: nodemap_madvise=true (use linux madvise(random) for node locations)
|
||||
0:00:00 DEB - argument: multipolygon_geometry_storage=mmap (storage for multipolygon geometries, one of [ram, mmap, direct])
|
||||
0:00:00 DEB - argument: multipolygon_geometry_madvise=true (use linux madvise(random) for temporary multipolygon geometry storage)
|
||||
0:00:00 DEB - argument: http_user_agent=Planetiler downloader (https://github.com/onthegomap/planetiler) (User-Agent header to set when downloading files over HTTP)
|
||||
0:00:00 DEB - argument: http_timeout=30 seconds (Timeout to use when downloading files over HTTP)
|
||||
0:00:00 DEB - argument: http_retries=1 (Retries to use when downloading files over HTTP)
|
||||
0:00:00 DEB - argument: download_chunk_size_mb=100 (Size of file chunks to download in parallel in megabytes)
|
||||
0:00:00 DEB - argument: download_threads=1 (Number of parallel threads to use when downloading each file)
|
||||
0:00:00 DEB - argument: download_max_bandwidth= (Maximum bandwidth to consume when downloading files in units mb/s, mbps, kbps, etc.)
|
||||
0:00:00 DEB - argument: min_feature_size_at_max_zoom=0.0625 (Default value for the minimum size in tile pixels of features to emit at the maximum zoom level to allow for overzooming)
|
||||
0:00:00 DEB - argument: min_feature_size=1.0 (Default value for the minimum size in tile pixels of features to emit below the maximum zoom level)
|
||||
0:00:00 DEB - argument: simplify_tolerance_at_max_zoom=0.0625 (Default value for the tile pixel tolerance to use when simplifying features at the maximum zoom level to allow for overzooming)
|
||||
0:00:00 DEB - argument: simplify_tolerance=0.1 (Default value for the tile pixel tolerance to use when simplifying features below the maximum zoom level)
|
||||
0:00:00 DEB - argument: osm_lazy_reads=true (Read OSM blocks from disk in worker threads)
|
||||
0:00:00 DEB - argument: skip_filled_tiles=false (Skip writing tiles containing only polygon fills to the output)
|
||||
0:00:00 DEB - argument: tile_warning_size_mb=1.0 (Maximum size in megabytes of a tile to emit a warning about)
|
||||
0:00:00 DEB - argument: color=null (Color the terminal output)
|
||||
0:00:00 DEB - argument: keep_unzipped=false (keep unzipped sources by default after reading)
|
||||
0:00:00 DEB - argument: tile_compression=gzip (the tile compression, one of [gzip, none])
|
||||
0:00:00 DEB - argument: output_layerstats=false (output a tsv.gz file for each tile/layer size)
|
||||
0:00:00 DEB - argument: debug_url=https://onthegomap.github.io/planetiler-demo/#{z}/{lat}/{lon} (debug url to use for displaying tiles with {z} {lat} {lon} placeholders)
|
||||
0:00:00 DEB - argument: tile_weights=data/tile_weights.tsv.gz (tsv.gz file with columns z,x,y,loads to generate weighted average tile size stat)
|
||||
0:00:00 DEB - argument: max_point_buffer=Infinity (Max tile pixels to include points outside tile bounds. Set to a lower value to reduce tile size for clients that handle label collisions across tiles (most web and native clients). NOTE: Do not reduce if you need to support raster tile rendering)
|
||||
0:00:00 DEB - argument: log_jts_exceptions=false (Emit verbose details to debug JTS geometry errors)
|
||||
0:00:00 DEB - argument: only_download=false (download source data then exit)
|
||||
0:00:00 DEB - argument: download=false (download sources)
|
||||
0:00:00 DEB - argument: download_osm_tile_weights=false (download OSM tile weights file)
|
||||
0:00:00 DEB - argument: temp_nodes=data/tmp/node.db (temp node db location)
|
||||
0:00:00 DEB - argument: temp_multipolygons=data/tmp/multipolygon.db (temp multipolygon db location)
|
||||
0:00:00 DEB - argument: temp_features=data/tmp/feature.db (temp feature db location)
|
||||
0:00:00 DEB - argument: osm_parse_node_bounds=false (parse bounds from OSM nodes instead of header)
|
||||
0:00:00 DEB - argument: only_fetch_wikidata=false (fetch wikidata translations then quit)
|
||||
0:00:00 DEB - argument: fetch_wikidata=false (fetch wikidata translations then continue)
|
||||
0:00:00 DEB - argument: use_wikidata=true (use wikidata translations)
|
||||
0:00:00 DEB - argument: wikidata_cache=data/sources/wikidata_names.json (wikidata cache file)
|
||||
0:00:00 DEB - argument: lake_centerlines_path=data/sources/lake_centerline.shp.zip (lake_centerlines shapefile path)
|
||||
0:00:00 DEB - argument: free_lake_centerlines_after_read=false (delete lake_centerlines input file after reading to make space for output (reduces peak disk usage))
|
||||
0:00:00 DEB - argument: water_polygons_path=data/sources/water-polygons-split-3857.zip (water_polygons shapefile path)
|
||||
0:00:00 DEB - argument: free_water_polygons_after_read=false (delete water_polygons input file after reading to make space for output (reduces peak disk usage))
|
||||
0:00:00 DEB - argument: natural_earth_path=data/sources/natural_earth_vector.sqlite.zip (natural_earth sqlite db path)
|
||||
0:00:00 DEB - argument: free_natural_earth_after_read=false (delete natural_earth input file after reading to make space for output (reduces peak disk usage))
|
||||
0:00:00 DEB - argument: natural_earth_keep_unzipped=false (keep unzipped natural_earth after reading)
|
||||
0:00:00 DEB - argument: osm_path=data/sources/planet.osm.pbf (osm OSM input file path)
|
||||
0:00:00 DEB - argument: free_osm_after_read=false (delete osm input file after reading to make space for output (reduces peak disk usage))
|
||||
0:00:00 DEB - argument: output=planet.pmtiles (output tile archive path)
|
||||
0:00:00 DEB - argument: version=false (show version then exit)
|
||||
0:00:00 INF - Planetiler build git hash: fdb9ea6e026e052b41fdaba069c3d743d50b08f3
|
||||
0:00:00 INF - Planetiler build version: 0.7-SNAPSHOT
|
||||
0:00:00 INF - Planetiler build timestamp: 2024-01-17T10:53:26.321Z
|
||||
0:00:00 DEB - argument: transliterate=true (attempt to transliterate latin names)
|
||||
0:00:00 DEB - argument: languages=am,ar,az,be,bg,bn,br,bs,ca,co,cs,cy,da,de,el,en,eo,es,et,eu,fa,fi,fr,fy,ga,gd,he,hi,hr,hu,hy,id,is,it,ja,ja_kana,ja_rm,ja-Latn,ja-Hira,ka,kk,kn,ko,ko-Latn,ku,la,lb,lt,lv,mk,mt,ml,nl,no,oc,pa,pnb,pl,pt,rm,ro,ru,sk,sl,sq,sr,sr-Latn,sv,ta,te,th,tr,uk,ur,vi,zh,zh-Hant,zh-Hans (languages to use)
|
||||
0:00:00 DEB - argument: only_layers= (Include only certain layers)
|
||||
0:00:00 DEB - argument: exclude_layers= (Exclude certain layers)
|
||||
0:00:00 DEB - argument: boundary_country_names=true (boundary layer: add left/right codes of neighboring countries)
|
||||
0:00:00 DEB - argument: boundary_osm_only=false (boundary layer: only use OSM, even at low zoom levels)
|
||||
0:00:00 DEB - argument: transportation_z13_paths=false (transportation(_name) layer: show all paths on z13)
|
||||
0:00:00 DEB - argument: building_merge_z13=false (building layer: merge nearby buildings at z13)
|
||||
0:00:00 DEB - argument: transportation_name_brunnel=false (transportation_name layer: set to false to omit brunnel and help merge long highways)
|
||||
0:00:00 DEB - argument: transportation_name_size_for_shield=false (transportation_name layer: allow road names on shorter segments (ie. they will have a shield))
|
||||
0:00:00 DEB - argument: transportation_name_limit_merge=false (transportation_name layer: limit merge so we don't combine different relations to help merge long highways)
|
||||
0:00:00 DEB - argument: transportation_name_minor_refs=false (transportation_name layer: include name and refs from minor road networks if not present on a way)
|
||||
0:00:00 DEB - argument: help=false (show arguments then exit)
|
||||
0:00:00 DEB - argument: layer_stats=/data/planet.pmtiles.layerstats.tsv.gz (layer stats output path)
|
||||
0:00:00 INF - Building OpenMapTilesProfile profile into file:///data/planet.pmtiles in these phases:
|
||||
0:00:00 INF - lake_centerlines: Process features in data/sources/lake_centerline.shp.zip
|
||||
0:00:00 INF - water_polygons: Process features in data/sources/water-polygons-split-3857.zip
|
||||
0:00:00 INF - natural_earth: Process features in data/sources/natural_earth_vector.sqlite.zip
|
||||
0:00:00 INF - osm_pass1: Pre-process OpenStreetMap input (store node locations then relation members)
|
||||
0:00:00 INF - osm_pass2: Process OpenStreetMap nodes, ways, then relations
|
||||
0:00:00 INF - sort: Sort rendered features by tile ID
|
||||
0:00:00 INF - archive: Encode each tile and write to TileArchiveConfig[format=PMTILES, scheme=FILE, uri=file:///data/planet.pmtiles, options={}]
|
||||
0:00:00 INF - no wikidata translations found, run with --fetch-wikidata to download
|
||||
0:00:00 DEB - ✓ 360G storage on /data (/dev/md0) requested for read phase disk, 3.6T available
|
||||
0:00:00 DEB - - 88G used for temporary node location cache
|
||||
0:00:00 DEB - - 11G used for temporary multipolygon geometry cache
|
||||
0:00:00 DEB - - 259G used for temporary feature storage
|
||||
0:00:00 DEB - ✓ 389G storage on /data (/dev/md0) requested for write phase disk, 3.6T available
|
||||
0:00:00 DEB - - 259G used for temporary feature storage
|
||||
0:00:00 DEB - - 129G used for archive output
|
||||
0:00:00 DEB - ✓ 100G storage on /data (/dev/md0) requested for read phase, 3.6T available
|
||||
0:00:00 DEB - - 88G used for array node location cache (switch to sparsearray to reduce size)
|
||||
0:00:00 DEB - - 11G used for multipolygon way geometries
|
||||
0:00:00 DEB - ✓ 23G JVM heap requested for read phase, 32G available
|
||||
0:00:00 DEB - - 23G used for temporary profile storage
|
||||
0:00:00 WAR - Planetiler will use ~100G memory-mapped files for node locations and multipolygon geometries but the OS only
|
||||
has 100G available to cache pages, this may slow the import down. To speed up, run on a machine with more
|
||||
memory or reduce the -Xmx setting.
|
||||
|
||||
0:00:00 INF - Setting map bounds from input: Env[-180.0 : 180.0, -90.0 : 90.0]
|
||||
0:00:00 DEB - argument: archive_name=OpenMapTiles ('name' attribute for tileset metadata)
|
||||
0:00:00 DEB - argument: archive_description=A tileset showcasing all layers in OpenMapTiles. https://openmaptiles.org ('description' attribute for tileset metadata)
|
||||
0:00:00 DEB - argument: archive_attribution=<a href="https://www.openmaptiles.org/" target="_blank">© OpenMapTiles</a> <a href="https://www.openstreetmap.org/copyright" target="_blank">© OpenStreetMap contributors</a> ('attribution' attribute for tileset metadata)
|
||||
0:00:00 DEB - argument: archive_version=3.14.0 ('version' attribute for tileset metadata)
|
||||
0:00:00 DEB - argument: archive_type=baselayer ('type' attribute for tileset metadata)
|
||||
0:00:00 DEB - argument: archive_format=pbf ('format' attribute for tileset metadata)
|
||||
0:00:00 INF - Using merge sort feature map, chunk size=2000mb max workers=64
|
||||
0:00:00 INF [lake_centerlines] -
|
||||
0:00:00 INF [lake_centerlines] - Starting...
|
||||
0:00:03 INF [lake_centerlines] - read: [ 59k 100% 39k/s ] write: [ 0 0/s ] 0
|
||||
cpus: 2.3 gc: 1% heap: 360M/32G direct: 262k postGC: 177M
|
||||
-> (0/4) -> read( -% -%) -> (0/1k) -> process( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%) -> (0/114k) -> write( -% -%)
|
||||
0:00:03 INF [lake_centerlines] - Finished in 2s cpu:8s avg:3.3
|
||||
0:00:03 INF [lake_centerlines] - read 2x(27% 0.7s done:2s)
|
||||
0:00:03 INF [lake_centerlines] - process 62x(0% 0s wait:1s done:1s)
|
||||
0:00:03 INF [lake_centerlines] - write 2x(0% 0s wait:2s)
|
||||
0:00:03 INF [water_polygons] -
|
||||
0:00:03 INF [water_polygons] - Starting...
|
||||
0:00:13 INF [water_polygons] - read: [ 4.2k 29% 427/s ] write: [ 25M 2.5M/s ] 4G
|
||||
cpus: 57.2 gc: 7% heap: 11G/32G direct: 54M postGC: 4.5G
|
||||
-> (0/4) -> read(91%) -> (151/1k) -> process(86% 86% 84% 85% 80% 85% 86% 80% 84% 82% 83% 87% 86% 84% 84% 86% 87% 85% 85% 88% 84% 81% 87% 80% 89% 87% 83% 84% 81% 79% 80% 82% 89% 83% 83% 87% 89% 86% 85% 84% 83% 85% 85% 84% 89% 81% 85% 85% 87% 83% 88% 84% 85% 85% 81% 80% 82% 88% 82% 84% 85% 81%) -> (35k/114k) -> write(18% 18%)
|
||||
0:00:23 INF [water_polygons] - read: [ 8.6k 60% 440/s ] write: [ 88M 6.3M/s ] 7G
|
||||
cpus: 42.4 gc: 5% heap: 10G/32G direct: 54M postGC: 6.4G
|
||||
-> (0/4) -> read(38%) -> (1k/1k) -> process(94% 57% 59% 53% 54% 54% 60% 84% 54% 54% 54% 68% 78% 90% 55% 95% 54% 94% 56% 54% 53% 59% 57% 54% 53% 53% 62% 54% 54% 76% 55% 62% 80% 54% 93% 54% 54% 54% 76% 54% 57% 54% 65% 95% 61% 77% 56% 56% 53% 94% 54% 57% 58% 54% 55% 64% 53% 72% 55% 57% 56% 59%) -> (109k/114k) -> write(55% 55%)
|
||||
0:00:33 INF [water_polygons] - read: [ 12k 89% 427/s ] write: [ 186M 9.7M/s ] 11G
|
||||
cpus: 9.4 gc: 0% heap: 13G/32G direct: 54M postGC: 6.3G
|
||||
-> (0/4) -> read( 0%) -> (1k/1k) -> process(26% 11% 10% 10% 10% 10% 10% 10% 10% 10% 10% 10% 10% 10% 10% 14% 10% 13% 10% 10% 10% 10% 10% 10% 10% 10% 10% 10% 10% 10% 10% 10% 10% 10% 10% 10% 10% 10% 10% 10% 10% 10% 10% 17% 10% 10% 10% 10% 10% 81% 10% 10% 10% 10% 10% 10% 10% 10% 10% 10% 10% 10%) -> (109k/114k) -> write(100% 100%)
|
||||
0:00:36 INF [water_polygons] - read: [ 14k 100% 415/s ] write: [ 222M 9.7M/s ] 10G
|
||||
cpus: 8.3 gc: 0% heap: 8.2G/32G direct: 54M postGC: 6.3G
|
||||
-> (0/4) -> read( -%) -> (0/1k) -> process( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%) -> (0/114k) -> write( -% -%)
|
||||
0:00:36 INF [water_polygons] - Finished in 34s cpu:18m42s gc:1s avg:33.2
|
||||
0:00:36 INF [water_polygons] - read 2x(19% 6s wait:9s done:18s)
|
||||
0:00:36 INF [water_polygons] - process 62x(48% 16s wait:16s)
|
||||
0:00:36 INF [water_polygons] - write 2x(62% 21s wait:12s)
|
||||
0:00:36 INF [natural_earth] -
|
||||
0:00:36 INF [natural_earth] - Starting...
|
||||
0:00:36 INF [natural_earth] - unzipping /data/data/sources/natural_earth_vector.sqlite.zip to data/tmp/%2Fnatural_earth_vector.sqlite%2Fpackages%2Fnatural_earth_vector.sqlite
|
||||
0:00:40 INF [natural_earth] - unzipping /data/data/sources/natural_earth_vector.sqlite.zip to data/tmp/%2Fnatural_earth_vector.sqlite%2Fpackages%2Fnatural_earth_vector.sqlite
|
||||
0:00:50 INF [natural_earth] - read: [ 269k 77% 26k/s ] write: [ 1k 99/s ] 14G
|
||||
cpus: 2 gc: 0% heap: 13G/32G direct: 54M postGC: 6.3G
|
||||
-> (0/4) -> read(99%) -> (0/1k) -> process( 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 2% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 12% 1% 1% 1% 1% 1%) -> (26k/114k) -> write( 0% 0%)
|
||||
0:00:52 INF [natural_earth] - read: [ 349k 100% 44k/s ] write: [ 33k 17k/s ] 10G
|
||||
cpus: 1.6 gc: 0% heap: 14G/32G direct: 54M postGC: 6.3G
|
||||
-> (0/4) -> read( -%) -> (0/1k) -> process( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%) -> (0/114k) -> write( -% -%)
|
||||
0:00:52 INF [natural_earth] - Finished in 16s cpu:27s avg:1.7
|
||||
0:00:52 INF [natural_earth] - read 2x(36% 6s done:10s)
|
||||
0:00:52 INF [natural_earth] - process 62x(1% 0.1s wait:11s done:4s)
|
||||
0:00:52 INF [natural_earth] - write 2x(0% 0s wait:12s done:4s)
|
||||
0:00:52 INF [osm_pass1] -
|
||||
0:00:52 INF [osm_pass1] - Starting...
|
||||
0:01:02 INF [osm_pass1] - nodes: [ 1.5B 157M/s ] 17G ways: [ 0 0/s ] rels: [ 0 0/s ] blocks: [ 6.6k 661/s ]
|
||||
cpus: 58.7 gc: 3% heap: 15G/32G direct: 3.1G postGC: 7.1G hppc: 848
|
||||
read( 3%) -> (127/190) -> process(91% 92% 91% 91% 92% 92% 91% 92% 92% 92% 91% 91% 91% 91% 92% 92% 91% 91% 91% 91% 92% 92% 91% 92% 91% 91% 91% 91% 92% 91% 92% 91% 91% 91% 91% 91% 92% 91% 91% 91% 92% 91% 91% 92% 91% 90% 91% 91% 91% 92% 91% 92% 92% 92% 90% 91% 91% 91% 91% 91% 91% 91% 91%)
|
||||
0:01:12 INF [osm_pass1] - nodes: [ 3.4B 184M/s ] 35G ways: [ 0 0/s ] rels: [ 0 0/s ] blocks: [ 12k 589/s ]
|
||||
cpus: 58.8 gc: 5% heap: 9.1G/32G direct: 4.7G postGC: 8.5G hppc: 848
|
||||
read( 3%) -> (127/190) -> process(91% 92% 90% 91% 91% 91% 92% 91% 90% 91% 91% 91% 91% 91% 91% 91% 91% 91% 90% 91% 92% 91% 92% 91% 91% 91% 90% 90% 91% 91% 91% 91% 91% 91% 91% 91% 90% 90% 91% 91% 91% 92% 91% 91% 91% 91% 91% 91% 92% 91% 91% 91% 90% 91% 90% 91% 91% 91% 91% 91% 91% 90% 92%)
|
||||
0:01:22 INF [osm_pass1] - nodes: [ 5.4B 197M/s ] 54G ways: [ 0 0/s ] rels: [ 0 0/s ] blocks: [ 18k 564/s ]
|
||||
cpus: 59.4 gc: 3% heap: 21G/32G direct: 5.9G postGC: 8.9G hppc: 848
|
||||
read( 4%) -> (127/190) -> process(93% 94% 85% 94% 90% 93% 92% 93% 92% 93% 93% 93% 93% 93% 93% 93% 93% 92% 93% 93% 93% 93% 93% 92% 92% 90% 93% 93% 93% 93% 93% 93% 92% 93% 93% 93% 93% 93% 93% 93% 93% 93% 93% 92% 93% 94% 93% 93% 93% 93% 93% 92% 93% 93% 92% 93% 93% 93% 93% 93% 93% 92% 93%)
|
||||
0:01:32 INF [osm_pass1] - nodes: [ 7.4B 199M/s ] 74G ways: [ 0 0/s ] rels: [ 0 0/s ] blocks: [ 23k 559/s ]
|
||||
cpus: 60 gc: 3% heap: 22G/32G direct: 6.3G postGC: 9.1G hppc: 848
|
||||
read( 5%) -> (127/190) -> process(94% 92% 82% 93% 94% 94% 94% 94% 93% 95% 94% 94% 95% 94% 93% 94% 94% 90% 95% 94% 94% 95% 94% 95% 95% 95% 95% 94% 95% 94% 95% 95% 95% 94% 94% 94% 94% 95% 92% 94% 94% 95% 93% 94% 95% 94% 94% 94% 95% 94% 95% 94% 94% 94% 94% 95% 94% 94% 95% 94% 94% 94% 94%)
|
||||
0:01:41 INF [osm_pass1:process] - Finished nodes: 8,860,666,091 (179M/s) in 49s cpu:47m12s gc:2s avg:57.4
|
||||
0:01:42 INF [osm_pass1] - nodes: [ 8.8B 145M/s ] 92G ways: [ 15M 1.5M/s ] rels: [ 0 0/s ] blocks: [ 28k 445/s ]
|
||||
cpus: 50.2 gc: 6% heap: 9.8G/32G direct: 6.4G postGC: 7.8G hppc: 848
|
||||
read( 4%) -> (124/190) -> process(77% 77% 79% 77% 75% 77% 76% 76% 77% 76% 77% 77% 77% 77% 77% 75% 77% 77% 77% 77% 77% 77% 75% 77% 76% 77% 75% 76% 77% 77% 76% 75% 74% 75% 77% 77% 75% 77% 77% 77% 77% 77% 75% 76% 75% 76% 77% 75% 77% 76% 75% 83% 76% 77% 77% 75% 76% 75% 77% 77% 73% 77% 76%)
|
||||
0:01:52 INF [osm_pass1] - nodes: [ 8.8B 0/s ] 92G ways: [ 460M 44M/s ] rels: [ 0 0/s ] blocks: [ 35k 703/s ]
|
||||
cpus: 60.4 gc: 5% heap: 21G/32G direct: 6.4G postGC: 7.5G hppc: 848
|
||||
read( 7%) -> (127/190) -> process(93% 93% 93% 93% 93% 93% 93% 93% 93% 93% 93% 93% 93% 94% 93% 93% 93% 93% 93% 93% 93% 93% 93% 93% 93% 93% 93% 93% 93% 93% 93% 93% 93% 93% 93% 93% 93% 94% 93% 93% 93% 94% 93% 93% 93% 93% 93% 93% 92% 93% 93% 93% 93% 93% 93% 93% 93% 93% 93% 93% 93% 93% 93%)
|
||||
0:02:02 INF [osm_pass1] - nodes: [ 8.8B 0/s ] 92G ways: [ 975M 51M/s ] rels: [ 0 0/s ] blocks: [ 42k 716/s ]
|
||||
cpus: 61.3 gc: 4% heap: 18G/32G direct: 6.4G postGC: 7.6G hppc: 848
|
||||
read( 8%) -> (127/190) -> process(94% 94% 95% 95% 95% 95% 95% 95% 95% 94% 94% 95% 94% 94% 94% 94% 95% 94% 95% 95% 94% 94% 94% 94% 95% 94% 94% 94% 94% 94% 94% 95% 95% 95% 94% 94% 94% 94% 95% 94% 94% 94% 95% 94% 95% 94% 94% 94% 94% 94% 95% 94% 95% 95% 95% 95% 94% 94% 95% 94% 94% 94% 94%)
|
||||
0:02:03 INF [osm_pass1:process] - Finished ways: 992,064,323 (47M/s) in 21s cpu:21m18s avg:60.7
|
||||
0:02:12 INF [osm_pass1] - nodes: [ 8.8B 0/s ] 92G ways: [ 992M 1.6M/s ] rels: [ 8M 802k/s ] blocks: [ 42k 49/s ]
|
||||
cpus: 12.1 gc: 3% heap: 4.2G/32G direct: 6.4G postGC: 4.2G hppc: 492M
|
||||
read( -%) -> (71/190) -> process(12% 19% 17% 9% 11% 11% 12% 10% 10% 9% 10% 10% 14% 14% 13% 14% 16% 10% 14% 14% 12% 16% 10% 16% 16% 12% 14% 10% 14% 11% 14% 14% 14% 11% 16% 9% 12% 13% 9% 11% 11% 10% 10% 12% 15% 16% 9% 15% 12% 9% 13% 9% 10% 10% 12% 12% 11% 14% 15% 11% 14% 16% 14%)
|
||||
0:02:16 INF [osm_pass1:process] - Finished relations: 11,728,203 (870k/s) in 13s cpu:2m16s avg:10.1
|
||||
0:02:16 INF [osm_pass1] - nodes: [ 8.8B 0/s ] 92G ways: [ 992M 0/s ] rels: [ 11M 970k/s ] blocks: [ 43k 35/s ]
|
||||
cpus: 9.3 gc: 1% heap: 4.1G/32G direct: 188M postGC: 3.5G hppc: 700M
|
||||
read( -%) -> (0/190) -> process( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%)
|
||||
0:02:16 DEB [osm_pass1] - Processed 43,112 blocks:
|
||||
0:02:16 DEB [osm_pass1] - nodes: 8,860,666,091 (179M/s) in 49s cpu:47m12s gc:2s avg:57.4
|
||||
0:02:16 DEB [osm_pass1] - ways: 992,064,323 (47M/s) in 21s cpu:21m18s avg:60.7
|
||||
0:02:16 DEB [osm_pass1] - relations: 11,728,203 (870k/s) in 13s cpu:2m16s avg:10.1
|
||||
0:02:16 INF [osm_pass1] - Finished in 1m24s cpu:1h10m52s gc:3s avg:50.7
|
||||
0:02:16 INF [osm_pass1] - read 1x(4% 3s wait:1m6s done:6s)
|
||||
0:02:16 INF [osm_pass1] - process 63x(77% 1m5s block:12s wait:2s)
|
||||
0:02:16 INF [osm_pass2] -
|
||||
0:02:16 INF [osm_pass2] - Starting...
|
||||
0:02:26 INF [osm_pass2] - nodes: [ 559M 6% 55M/s ] 92G ways: [ 0 0% 0/s ] rels: [ 0 0% 0/s ] features: [ 271M 4.8M/s ] 19G blocks: [ 2.4k 6% 240/s ]
|
||||
cpus: 51.7 gc: 7% heap: 8.4G/32G direct: 54M postGC: 4.6G relInfo: 700M mpGeoms: 277
|
||||
read( 1%) -> (32/94) -> process(65% 67% 70% 71% 69% 70% 73% 69% 71% 70% 67% 68% 69% 70% 66% 68% 72% 67% 69% 73% 69% 72% 72% 73% 72% 74% 70% 71% 71% 70% 68% 72% 68% 71% 70% 70% 71% 70% 70% 71% 72% 71% 70% 71% 72% 68% 71% 72% 71% 71% 72% 71% 71% 72% 72% 71% 70% 70% 71% 69% 71% 72%) -> (42k/114k) -> write(54% 54%)
|
||||
0:02:36 INF [osm_pass2] - nodes: [ 1.4B 16% 84M/s ] 92G ways: [ 0 0% 0/s ] rels: [ 0 0% 0/s ] features: [ 307M 3.5M/s ] 22G blocks: [ 5.9k 14% 355/s ]
|
||||
cpus: 57.4 gc: 4% heap: 6.5G/32G direct: 54M postGC: 2.7G relInfo: 700M mpGeoms: 277
|
||||
read( 2%) -> (32/94) -> process(84% 81% 80% 81% 84% 85% 84% 83% 84% 83% 83% 82% 82% 83% 82% 84% 79% 82% 83% 82% 83% 84% 83% 82% 83% 85% 82% 81% 82% 82% 83% 85% 84% 82% 81% 82% 83% 80% 87% 84% 82% 83% 84% 83% 83% 82% 83% 83% 83% 83% 81% 80% 83% 85% 83% 83% 83% 82% 81% 82% 83% 84%) -> (77k/114k) -> write(50% 52%)
|
||||
0:02:46 INF [osm_pass2] - nodes: [ 2.2B 26% 88M/s ] 92G ways: [ 0 0% 0/s ] rels: [ 0 0% 0/s ] features: [ 351M 4.4M/s ] 27G blocks: [ 9.1k 21% 315/s ]
|
||||
cpus: 54.6 gc: 4% heap: 10G/32G direct: 54M postGC: 2.6G relInfo: 700M mpGeoms: 277
|
||||
read( 2%) -> (32/94) -> process(82% 81% 81% 82% 80% 81% 82% 81% 80% 83% 82% 82% 80% 81% 82% 82% 82% 79% 81% 81% 81% 81% 81% 82% 82% 81% 82% 82% 79% 82% 82% 81% 80% 82% 82% 82% 76% 81% 82% 82% 81% 79% 81% 82% 81% 82% 82% 80% 81% 82% 82% 80% 79% 82% 80% 82% 82% 82% 80% 82% 82% 81%) -> (90k/114k) -> write(69% 69%)
|
||||
0:02:56 INF [osm_pass2] - nodes: [ 3.2B 37% 100M/s ] 92G ways: [ 0 0% 0/s ] rels: [ 0 0% 0/s ] features: [ 384M 3.2M/s ] 30G blocks: [ 12k 28% 298/s ]
|
||||
cpus: 57.9 gc: 4% heap: 7.5G/32G direct: 54M postGC: 2.6G relInfo: 700M mpGeoms: 277
|
||||
read( 2%) -> (32/94) -> process(87% 88% 86% 87% 87% 87% 87% 87% 87% 87% 87% 88% 87% 87% 87% 87% 88% 86% 87% 86% 87% 87% 86% 87% 87% 87% 87% 88% 84% 87% 88% 88% 87% 87% 87% 87% 87% 86% 88% 86% 87% 87% 88% 87% 87% 86% 88% 86% 87% 88% 87% 88% 88% 88% 87% 87% 87% 86% 86% 86% 88% 86%) -> (37k/114k) -> write(50% 51%)
|
||||
0:03:06 INF [osm_pass2] - nodes: [ 4.3B 49% 105M/s ] 92G ways: [ 0 0% 0/s ] rels: [ 0 0% 0/s ] features: [ 419M 3.4M/s ] 33G blocks: [ 15k 35% 303/s ]
|
||||
cpus: 60.3 gc: 3% heap: 14G/32G direct: 54M postGC: 2.6G relInfo: 700M mpGeoms: 277
|
||||
read( 2%) -> (32/94) -> process(91% 93% 92% 92% 92% 92% 93% 92% 91% 92% 92% 91% 92% 91% 92% 92% 92% 92% 92% 92% 92% 91% 92% 92% 93% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 93% 92% 92% 92% 92% 91% 92% 91% 92% 92% 92% 92% 92% 91% 92% 92% 91% 92% 92% 92% 91% 92% 92% 92% 91% 92% 92%) -> (29k/114k) -> write(46% 46%)
|
||||
0:03:16 INF [osm_pass2] - nodes: [ 5.4B 62% 109M/s ] 92G ways: [ 0 0% 0/s ] rels: [ 0 0% 0/s ] features: [ 448M 2.9M/s ] 35G blocks: [ 18k 43% 313/s ]
|
||||
cpus: 59.9 gc: 3% heap: 7.8G/32G direct: 54M postGC: 2.5G relInfo: 700M mpGeoms: 277
|
||||
read( 2%) -> (32/94) -> process(93% 92% 93% 93% 93% 92% 92% 92% 93% 93% 92% 93% 93% 93% 92% 92% 93% 93% 93% 93% 92% 93% 93% 93% 93% 93% 93% 93% 93% 92% 92% 92% 92% 93% 93% 93% 92% 93% 92% 93% 92% 92% 93% 93% 93% 92% 92% 93% 92% 92% 93% 93% 92% 92% 92% 93% 93% 92% 92% 92% 93% 92%) -> (50k/114k) -> write(41% 42%)
|
||||
0:03:26 INF [osm_pass2] - nodes: [ 6.5B 74% 111M/s ] 92G ways: [ 0 0% 0/s ] rels: [ 0 0% 0/s ] features: [ 481M 3.2M/s ] 41G blocks: [ 21k 50% 312/s ]
|
||||
cpus: 59.6 gc: 3% heap: 9.8G/32G direct: 54M postGC: 2.6G relInfo: 700M mpGeoms: 277
|
||||
read( 2%) -> (32/94) -> process(92% 92% 92% 91% 92% 92% 92% 91% 91% 93% 93% 91% 92% 91% 92% 93% 92% 92% 92% 92% 92% 92% 91% 92% 92% 92% 93% 93% 92% 92% 93% 92% 92% 91% 92% 92% 92% 92% 92% 92% 92% 92% 92% 92% 93% 92% 92% 92% 91% 91% 92% 92% 92% 93% 92% 92% 92% 93% 92% 92% 93% 92%) -> (40k/114k) -> write(49% 50%)
|
||||
0:03:36 INF [osm_pass2] - nodes: [ 7.6B 86% 106M/s ] 92G ways: [ 0 0% 0/s ] rels: [ 0 0% 0/s ] features: [ 514M 3.3M/s ] 43G blocks: [ 24k 57% 296/s ]
|
||||
cpus: 59.2 gc: 3% heap: 4.8G/32G direct: 54M postGC: 2.5G relInfo: 700M mpGeoms: 277
|
||||
read( 2%) -> (31/94) -> process(92% 92% 92% 93% 91% 92% 93% 91% 92% 92% 93% 91% 91% 91% 91% 92% 92% 93% 93% 92% 91% 91% 92% 93% 92% 92% 93% 92% 93% 91% 91% 92% 91% 93% 90% 91% 92% 91% 93% 93% 93% 91% 91% 92% 92% 91% 93% 92% 92% 91% 91% 90% 91% 92% 92% 90% 93% 93% 92% 92% 92% 91%) -> (49k/114k) -> write(48% 49%)
|
||||
0:03:46 INF [osm_pass2] - nodes: [ 8.7B 98% 107M/s ] 92G ways: [ 0 0% 0/s ] rels: [ 0 0% 0/s ] features: [ 550M 3.5M/s ] 46G blocks: [ 27k 64% 306/s ]
|
||||
cpus: 59.8 gc: 3% heap: 13G/32G direct: 54M postGC: 2.5G relInfo: 700M mpGeoms: 277
|
||||
read( 2%) -> (32/94) -> process(92% 93% 92% 93% 93% 93% 93% 92% 94% 93% 93% 92% 93% 92% 93% 92% 93% 93% 93% 93% 94% 92% 93% 92% 92% 93% 92% 93% 93% 93% 93% 93% 93% 93% 92% 92% 94% 92% 93% 93% 93% 93% 93% 93% 93% 92% 92% 92% 92% 93% 93% 94% 93% 94% 94% 92% 94% 92% 93% 92% 93% 93%) -> (30k/114k) -> write(46% 46%)
|
||||
0:03:48 DEB [osm_pass2:process] - Sorting long long multimap...
|
||||
0:03:48 INF [osm_pass2:process] - Finished nodes: 8,860,666,091 (96M/s) in 1m32s cpu:1h28m19s gc:4s avg:57.8
|
||||
0:03:54 DEB [osm_pass2:process] - Sorted long long multimap 6s cpu:14s avg:2.3
|
||||
0:03:56 INF [osm_pass2] - nodes: [ 8.8B 100% 14M/s ] 92G ways: [ 608k 0% 60k/s ] rels: [ 0 0% 0/s ] features: [ 558M 867k/s ] 47G blocks: [ 27k 65% 44/s ]
|
||||
cpus: 16.2 gc: 1% heap: 6.4G/32G direct: 55M postGC: 3G relInfo: 564M mpGeoms: 9.6M
|
||||
read( 0%) -> (32/94) -> process(21% 21% 22% 23% 19% 22% 20% 22% 20% 21% 19% 20% 21% 21% 24% 22% 24% 20% 20% 21% 21% 22% 25% 22% 19% 20% 21% 21% 20% 22% 22% 19% 24% 20% 79% 21% 22% 21% 21% 21% 20% 21% 20% 21% 22% 20% 22% 20% 21% 21% 22% 20% 19% 20% 21% 23% 19% 19% 22% 21% 19% 24%) -> (36k/114k) -> write(11% 11%)
|
||||
0:04:06 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 5.6M 1% 498k/s ] rels: [ 0 0% 0/s ] features: [ 591M 3.2M/s ] 51G blocks: [ 28k 65% 9/s ]
|
||||
cpus: 30.1 gc: 4% heap: 3.6G/32G direct: 57M postGC: 3.4G relInfo: 564M mpGeoms: 65M
|
||||
read( 0%) -> (32/94) -> process(49% 53% 52% 46% 37% 45% 44% 46% 38% 48% 35% 37% 46% 46% 46% 44% 41% 39% 39% 45% 48% 45% 44% 53% 38% 38% 44% 44% 50% 45% 46% 36% 47% 43% 41% 52% 43% 44% 45% 43% 39% 46% 37% 51% 47% 42% 49% 45% 48% 41% 50% 39% 40% 44% 45% 54% 40% 38% 44% 48% 36% 47%) -> (31k/114k) -> write(49% 49%)
|
||||
0:04:16 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 13M 1% 758k/s ] rels: [ 0 0% 0/s ] features: [ 636M 4.4M/s ] 55G blocks: [ 28k 65% 18/s ]
|
||||
cpus: 39.5 gc: 5% heap: 4.8G/32G direct: 57M postGC: 4.9G relInfo: 564M mpGeoms: 130M
|
||||
read( 0%) -> (32/94) -> process(57% 61% 60% 53% 52% 60% 58% 61% 61% 58% 57% 55% 57% 59% 57% 60% 62% 59% 58% 52% 58% 56% 57% 53% 51% 56% 63% 59% 55% 57% 61% 58% 55% 56% 61% 55% 59% 59% 60% 61% 55% 58% 58% 57% 61% 61% 54% 61% 59% 61% 58% 60% 57% 53% 60% 60% 59% 58% 62% 60% 60% 56%) -> (34k/114k) -> write(81% 81%)
|
||||
0:04:26 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 18M 2% 483k/s ] rels: [ 0 0% 0/s ] features: [ 663M 2.7M/s ] 57G blocks: [ 28k 66% 10/s ]
|
||||
cpus: 38.2 gc: 4% heap: 6.8G/32G direct: 57M postGC: 4.5G relInfo: 564M mpGeoms: 261M
|
||||
read( 0%) -> (32/94) -> process(57% 59% 67% 61% 54% 57% 56% 58% 54% 55% 56% 55% 58% 57% 61% 68% 58% 57% 63% 54% 55% 53% 58% 57% 55% 57% 61% 57% 56% 58% 56% 58% 61% 56% 64% 58% 57% 59% 56% 57% 57% 58% 57% 62% 55% 57% 56% 63% 55% 60% 57% 56% 53% 56% 57% 60% 55% 55% 61% 59% 55% 56%) -> (33k/114k) -> write(40% 40%)
|
||||
0:04:36 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 24M 2% 659k/s ] rels: [ 0 0% 0/s ] features: [ 694M 3M/s ] 60G blocks: [ 28k 66% 14/s ]
|
||||
cpus: 45.4 gc: 7% heap: 7.9G/32G direct: 57M postGC: 4.7G relInfo: 564M mpGeoms: 427M
|
||||
read( 0%) -> (32/94) -> process(71% 66% 66% 74% 68% 66% 67% 62% 71% 64% 71% 65% 67% 75% 65% 67% 65% 74% 71% 66% 73% 67% 65% 65% 67% 64% 65% 77% 68% 67% 69% 71% 71% 74% 71% 67% 66% 74% 66% 70% 63% 75% 73% 69% 69% 69% 73% 67% 66% 66% 65% 70% 66% 67% 70% 68% 66% 58% 65% 66% 68% 70%) -> (31k/114k) -> write(48% 48%)
|
||||
0:04:46 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 30M 3% 601k/s ] rels: [ 0 0% 0/s ] features: [ 720M 2.5M/s ] 63G blocks: [ 28k 66% 12/s ]
|
||||
cpus: 51.5 gc: 6% heap: 7.9G/32G direct: 57M postGC: 4.8G relInfo: 564M mpGeoms: 620M
|
||||
read( 0%) -> (32/94) -> process(82% 75% 76% 74% 75% 72% 76% 86% 74% 74% 74% 83% 76% 77% 85% 74% 79% 78% 73% 83% 84% 73% 76% 85% 75% 76% 83% 75% 75% 76% 76% 74% 78% 72% 84% 74% 84% 73% 76% 75% 73% 83% 78% 83% 77% 86% 75% 77% 78% 86% 73% 87% 74% 78% 76% 83% 76% 76% 83% 76% 77% 76%) -> (32k/114k) -> write(40% 40%)
|
||||
0:04:56 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 38M 4% 804k/s ] rels: [ 0 0% 0/s ] features: [ 745M 2.5M/s ] 65G blocks: [ 28k 67% 16/s ]
|
||||
cpus: 53.5 gc: 6% heap: 8.4G/32G direct: 57M postGC: 4.6G relInfo: 564M mpGeoms: 757M
|
||||
read( 0%) -> (32/94) -> process(86% 79% 80% 78% 80% 78% 79% 82% 80% 76% 79% 85% 79% 80% 85% 80% 77% 79% 80% 90% 79% 79% 78% 78% 77% 82% 83% 79% 81% 81% 82% 79% 79% 81% 85% 83% 85% 84% 78% 80% 80% 83% 82% 83% 77% 86% 80% 78% 81% 88% 80% 87% 81% 81% 80% 81% 82% 78% 78% 79% 79% 82%) -> (31k/114k) -> write(47% 47%)
|
||||
0:05:06 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 50M 5% 1.1M/s ] rels: [ 0 0% 0/s ] features: [ 770M 2.5M/s ] 66G blocks: [ 28k 67% 21/s ]
|
||||
cpus: 54.9 gc: 6% heap: 6.6G/32G direct: 57M postGC: 4.5G relInfo: 564M mpGeoms: 878M
|
||||
read( 0%) -> (32/94) -> process(84% 82% 81% 84% 82% 85% 84% 84% 83% 84% 84% 82% 83% 82% 81% 83% 81% 83% 84% 84% 83% 85% 83% 83% 82% 82% 83% 82% 83% 82% 84% 85% 83% 83% 84% 84% 82% 82% 83% 84% 84% 83% 83% 82% 84% 82% 84% 83% 84% 83% 84% 84% 82% 82% 84% 82% 84% 83% 84% 81% 84% 82%) -> (33k/114k) -> write(42% 42%)
|
||||
0:05:16 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 59M 6% 898k/s ] rels: [ 0 0% 0/s ] features: [ 793M 2.2M/s ] 69G blocks: [ 29k 68% 17/s ]
|
||||
cpus: 55.6 gc: 6% heap: 11G/32G direct: 57M postGC: 4.1G relInfo: 564M mpGeoms: 1G
|
||||
read( 0%) -> (32/94) -> process(86% 84% 84% 85% 88% 83% 86% 83% 84% 86% 86% 83% 84% 85% 82% 84% 83% 83% 84% 84% 85% 81% 84% 84% 87% 83% 86% 81% 87% 86% 86% 85% 84% 83% 87% 85% 86% 83% 84% 86% 84% 84% 84% 86% 85% 83% 85% 82% 85% 82% 84% 87% 86% 83% 83% 83% 87% 85% 88% 83% 83% 86%) -> (29k/114k) -> write(37% 36%)
|
||||
0:05:27 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 68M 7% 894k/s ] rels: [ 0 0% 0/s ] features: [ 817M 2.4M/s ] 70G blocks: [ 29k 68% 17/s ]
|
||||
cpus: 55.4 gc: 6% heap: 7.6G/32G direct: 57M postGC: 3.5G relInfo: 564M mpGeoms: 1.1G
|
||||
read( 0%) -> (32/94) -> process(82% 82% 82% 83% 84% 83% 84% 81% 83% 86% 83% 83% 84% 83% 84% 84% 82% 82% 83% 83% 83% 85% 83% 82% 84% 83% 85% 84% 84% 85% 84% 84% 83% 83% 85% 86% 86% 84% 83% 85% 82% 83% 84% 84% 86% 84% 84% 84% 85% 83% 84% 89% 84% 82% 83% 83% 85% 85% 86% 82% 86% 83%) -> (34k/114k) -> write(43% 43%)
|
||||
0:05:37 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 79M 8% 1M/s ] rels: [ 0 0% 0/s ] features: [ 846M 2.8M/s ] 72G blocks: [ 29k 68% 18/s ]
|
||||
cpus: 55.9 gc: 6% heap: 12G/32G direct: 57M postGC: 5.7G relInfo: 564M mpGeoms: 1.2G
|
||||
read( 0%) -> (32/94) -> process(85% 85% 85% 85% 85% 86% 84% 86% 87% 86% 85% 84% 85% 84% 85% 85% 86% 85% 83% 84% 85% 85% 84% 85% 83% 84% 84% 85% 85% 85% 85% 83% 86% 84% 85% 84% 84% 85% 84% 84% 83% 85% 85% 84% 84% 85% 84% 86% 83% 83% 84% 84% 85% 84% 85% 84% 86% 84% 85% 85% 85% 85%) -> (31k/114k) -> write(50% 50%)
|
||||
0:05:47 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 90M 9% 1.1M/s ] rels: [ 0 0% 0/s ] features: [ 876M 3M/s ] 75G blocks: [ 29k 69% 19/s ]
|
||||
cpus: 55.4 gc: 6% heap: 13G/32G direct: 57M postGC: 4.9G relInfo: 564M mpGeoms: 1.4G
|
||||
read( 0%) -> (32/94) -> process(84% 83% 83% 83% 83% 84% 83% 84% 84% 83% 84% 84% 83% 83% 82% 83% 83% 83% 83% 83% 82% 82% 84% 82% 85% 84% 84% 85% 85% 84% 83% 84% 84% 83% 84% 82% 84% 84% 84% 83% 84% 84% 82% 85% 83% 84% 82% 84% 85% 83% 83% 81% 83% 83% 84% 84% 85% 82% 83% 84% 84% 84%) -> (33k/114k) -> write(53% 53%)
|
||||
0:05:57 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 100M 10% 1M/s ] rels: [ 0 0% 0/s ] features: [ 904M 2.7M/s ] 77G blocks: [ 29k 69% 15/s ]
|
||||
cpus: 56.1 gc: 7% heap: 4.4G/32G direct: 57M postGC: 4.1G relInfo: 564M mpGeoms: 1.6G
|
||||
read( 0%) -> (32/94) -> process(84% 85% 85% 85% 85% 85% 84% 84% 84% 85% 86% 85% 85% 86% 87% 83% 85% 85% 85% 84% 83% 85% 85% 85% 85% 86% 85% 86% 85% 85% 85% 85% 84% 84% 85% 86% 85% 85% 84% 85% 85% 86% 86% 85% 84% 85% 84% 84% 84% 86% 86% 85% 86% 85% 84% 86% 84% 85% 86% 85% 85% 86%) -> (30k/114k) -> write(47% 46%)
|
||||
0:06:07 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 112M 11% 1.1M/s ] rels: [ 0 0% 0/s ] features: [ 934M 3M/s ] 80G blocks: [ 30k 70% 18/s ]
|
||||
cpus: 56 gc: 6% heap: 8.3G/32G direct: 57M postGC: 6.2G relInfo: 564M mpGeoms: 1.7G
|
||||
read( 0%) -> (32/94) -> process(84% 84% 85% 85% 85% 85% 85% 85% 84% 85% 83% 84% 86% 85% 85% 84% 85% 84% 84% 84% 85% 85% 84% 85% 85% 84% 84% 85% 85% 84% 85% 85% 86% 85% 85% 85% 85% 85% 85% 84% 85% 85% 86% 85% 85% 85% 85% 84% 85% 84% 84% 84% 85% 85% 85% 85% 86% 85% 85% 84% 84% 86%) -> (30k/114k) -> write(52% 52%)
|
||||
0:06:17 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 124M 13% 1.1M/s ] rels: [ 0 0% 0/s ] features: [ 967M 3.2M/s ] 82G blocks: [ 30k 70% 20/s ]
|
||||
cpus: 56.4 gc: 6% heap: 13G/32G direct: 57M postGC: 5.2G relInfo: 564M mpGeoms: 1.8G
|
||||
read( 0%) -> (32/94) -> process(85% 85% 85% 84% 85% 85% 84% 85% 85% 86% 85% 86% 85% 85% 85% 85% 85% 85% 85% 85% 86% 85% 85% 84% 84% 84% 85% 85% 86% 85% 85% 85% 86% 85% 85% 84% 85% 85% 85% 86% 85% 85% 85% 86% 86% 87% 86% 85% 85% 84% 83% 85% 85% 86% 86% 84% 85% 85% 84% 86% 85% 85%) -> (33k/114k) -> write(55% 54%)
|
||||
0:06:27 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 135M 14% 1M/s ] rels: [ 0 0% 0/s ] features: [ 996M 2.9M/s ] 85G blocks: [ 30k 71% 16/s ]
|
||||
cpus: 56.8 gc: 6% heap: 12G/32G direct: 57M postGC: 3.7G relInfo: 564M mpGeoms: 1.9G
|
||||
read( 0%) -> (32/94) -> process(86% 87% 85% 86% 86% 87% 84% 85% 87% 86% 86% 86% 87% 86% 86% 86% 86% 85% 86% 85% 85% 86% 86% 86% 86% 86% 86% 86% 85% 86% 87% 85% 86% 85% 86% 86% 86% 86% 86% 86% 86% 87% 86% 86% 85% 86% 87% 86% 86% 86% 86% 86% 85% 86% 86% 87% 85% 86% 87% 85% 86% 86%) -> (29k/114k) -> write(49% 48%)
|
||||
0:06:37 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 146M 15% 1.1M/s ] rels: [ 0 0% 0/s ] features: [ 1B 2.9M/s ] 87G blocks: [ 30k 71% 18/s ]
|
||||
cpus: 57.2 gc: 7% heap: 10G/32G direct: 57M postGC: 5.7G relInfo: 564M mpGeoms: 2.1G
|
||||
read( 0%) -> (32/94) -> process(86% 86% 87% 86% 86% 87% 87% 87% 86% 87% 86% 87% 87% 87% 87% 86% 87% 86% 86% 87% 88% 86% 86% 86% 87% 86% 86% 86% 87% 86% 87% 86% 87% 86% 86% 85% 87% 86% 85% 87% 85% 86% 86% 87% 86% 87% 86% 86% 87% 86% 86% 86% 87% 85% 87% 87% 87% 86% 86% 86% 87% 86%) -> (31k/114k) -> write(52% 52%)
|
||||
0:06:47 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 158M 16% 1.2M/s ] rels: [ 0 0% 0/s ] features: [ 1B 2.9M/s ] 89G blocks: [ 30k 71% 19/s ]
|
||||
cpus: 57.4 gc: 7% heap: 12G/32G direct: 57M postGC: 4.5G relInfo: 564M mpGeoms: 2.2G
|
||||
read( 0%) -> (32/94) -> process(86% 87% 86% 87% 86% 86% 87% 87% 86% 86% 86% 87% 87% 87% 87% 87% 87% 86% 86% 86% 86% 86% 85% 87% 86% 87% 87% 88% 86% 87% 86% 87% 86% 86% 87% 87% 87% 85% 86% 87% 87% 86% 86% 87% 86% 88% 88% 87% 86% 87% 87% 86% 86% 87% 86% 87% 88% 87% 87% 87% 86% 86%) -> (34k/114k) -> write(49% 49%)
|
||||
0:06:57 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 170M 17% 1.1M/s ] rels: [ 0 0% 0/s ] features: [ 1B 2.9M/s ] 92G blocks: [ 30k 72% 18/s ]
|
||||
cpus: 57.3 gc: 7% heap: 13G/32G direct: 57M postGC: 6.7G relInfo: 564M mpGeoms: 2.3G
|
||||
read( 0%) -> (32/94) -> process(87% 86% 87% 87% 86% 87% 87% 87% 86% 87% 86% 86% 87% 85% 87% 87% 87% 86% 87% 87% 87% 89% 87% 87% 87% 87% 87% 86% 85% 86% 86% 87% 87% 87% 86% 87% 87% 87% 86% 86% 87% 87% 86% 86% 86% 87% 86% 87% 86% 87% 87% 87% 86% 87% 86% 87% 87% 87% 87% 86% 86% 87%) -> (33k/114k) -> write(52% 52%)
|
||||
0:07:07 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 182M 18% 1.1M/s ] rels: [ 0 0% 0/s ] features: [ 1.1B 2.9M/s ] 94G blocks: [ 31k 72% 18/s ]
|
||||
cpus: 57.3 gc: 7% heap: 5.5G/32G direct: 57M postGC: 5.6G relInfo: 564M mpGeoms: 2.5G
|
||||
read( 0%) -> (32/94) -> process(87% 86% 86% 86% 87% 85% 86% 87% 86% 86% 86% 87% 86% 87% 86% 86% 86% 86% 86% 86% 85% 87% 86% 87% 86% 87% 87% 86% 86% 86% 87% 85% 85% 86% 85% 86% 87% 86% 90% 87% 86% 87% 86% 87% 86% 87% 87% 87% 87% 86% 87% 86% 86% 87% 86% 86% 86% 86% 86% 88% 86% 86%) -> (30k/114k) -> write(54% 54%)
|
||||
0:07:17 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 194M 20% 1.2M/s ] rels: [ 0 0% 0/s ] features: [ 1.1B 2.8M/s ] 96G blocks: [ 31k 73% 19/s ]
|
||||
cpus: 57.2 gc: 7% heap: 5G/32G direct: 57M postGC: 4.4G relInfo: 564M mpGeoms: 2.6G
|
||||
read( 0%) -> (32/94) -> process(87% 86% 86% 87% 86% 86% 86% 86% 86% 86% 86% 85% 86% 86% 86% 87% 86% 86% 86% 86% 86% 87% 86% 86% 87% 86% 87% 87% 86% 86% 86% 86% 86% 85% 86% 86% 87% 86% 87% 85% 85% 87% 86% 86% 85% 86% 85% 86% 86% 85% 86% 86% 86% 86% 86% 86% 87% 87% 86% 86% 87% 87%) -> (31k/114k) -> write(52% 52%)
|
||||
0:07:27 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 207M 21% 1.2M/s ] rels: [ 0 0% 0/s ] features: [ 1.1B 2.5M/s ] 98G blocks: [ 31k 73% 20/s ]
|
||||
cpus: 57 gc: 7% heap: 7.2G/32G direct: 57M postGC: 6.8G relInfo: 564M mpGeoms: 2.8G
|
||||
read( 0%) -> (32/94) -> process(87% 86% 86% 87% 86% 86% 85% 86% 87% 86% 86% 86% 87% 86% 86% 87% 87% 87% 86% 86% 85% 86% 87% 86% 87% 86% 86% 86% 86% 86% 86% 86% 86% 87% 87% 87% 87% 86% 87% 86% 86% 86% 85% 87% 86% 86% 85% 87% 87% 87% 85% 87% 87% 86% 86% 86% 87% 87% 86% 86% 86% 86%) -> (30k/114k) -> write(45% 44%)
|
||||
0:07:37 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 220M 22% 1.3M/s ] rels: [ 0 0% 0/s ] features: [ 1.1B 2.6M/s ] 100G blocks: [ 31k 74% 23/s ]
|
||||
cpus: 57.3 gc: 7% heap: 16G/32G direct: 57M postGC: 6.2G relInfo: 564M mpGeoms: 2.9G
|
||||
read( 0%) -> (32/94) -> process(87% 87% 87% 87% 87% 86% 87% 85% 87% 85% 87% 87% 87% 86% 87% 86% 87% 85% 86% 87% 86% 87% 86% 87% 86% 86% 86% 87% 87% 87% 86% 86% 87% 87% 86% 88% 87% 86% 86% 87% 86% 87% 87% 86% 87% 87% 86% 86% 86% 87% 85% 87% 87% 87% 86% 87% 85% 86% 87% 87% 86% 87%) -> (31k/114k) -> write(46% 46%)
|
||||
0:07:47 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 232M 23% 1.2M/s ] rels: [ 0 0% 0/s ] features: [ 1.2B 2.6M/s ] 102G blocks: [ 31k 74% 18/s ]
|
||||
cpus: 56.9 gc: 7% heap: 4.1G/32G direct: 57M postGC: 4.1G relInfo: 564M mpGeoms: 3.1G
|
||||
read( 0%) -> (32/94) -> process(86% 86% 86% 86% 86% 87% 86% 87% 85% 86% 85% 86% 86% 86% 86% 86% 86% 86% 87% 85% 85% 86% 85% 87% 85% 86% 87% 86% 86% 85% 86% 86% 85% 87% 84% 86% 87% 86% 85% 86% 87% 85% 86% 86% 86% 86% 85% 87% 85% 85% 87% 86% 86% 86% 86% 86% 85% 86% 86% 87% 86% 86%) -> (28k/114k) -> write(48% 48%)
|
||||
0:07:57 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 244M 25% 1.1M/s ] rels: [ 0 0% 0/s ] features: [ 1.2B 2.8M/s ] 103G blocks: [ 32k 75% 19/s ]
|
||||
cpus: 57.2 gc: 5% heap: 5.8G/32G direct: 57M postGC: 4.2G relInfo: 564M mpGeoms: 3.2G
|
||||
read( 0%) -> (32/94) -> process(88% 87% 87% 88% 86% 87% 87% 87% 87% 88% 87% 87% 86% 87% 87% 87% 87% 87% 87% 86% 88% 88% 88% 87% 86% 88% 88% 88% 87% 87% 87% 87% 87% 88% 87% 88% 88% 87% 87% 88% 87% 87% 86% 87% 87% 88% 87% 88% 87% 87% 86% 87% 88% 88% 88% 87% 87% 87% 88% 87% 87% 87%) -> (36k/114k) -> write(51% 50%)
|
||||
0:08:07 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 256M 26% 1.2M/s ] rels: [ 0 0% 0/s ] features: [ 1.2B 2.7M/s ] 106G blocks: [ 32k 75% 18/s ]
|
||||
cpus: 57.4 gc: 5% heap: 11G/32G direct: 57M postGC: 4.4G relInfo: 564M mpGeoms: 3.4G
|
||||
read( 0%) -> (32/94) -> process(88% 87% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 87% 88% 88% 88% 87% 88% 88% 88% 89% 85% 88% 88% 88% 87% 88% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 87% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 89% 89% 88%) -> (32k/114k) -> write(49% 49%)
|
||||
0:08:17 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 270M 27% 1.3M/s ] rels: [ 0 0% 0/s ] features: [ 1.3B 2.7M/s ] 108G blocks: [ 32k 76% 19/s ]
|
||||
cpus: 57.1 gc: 5% heap: 5.3G/32G direct: 57M postGC: 4.4G relInfo: 564M mpGeoms: 3.6G
|
||||
read( 0%) -> (32/94) -> process(87% 87% 87% 87% 87% 87% 87% 88% 87% 87% 88% 87% 88% 87% 87% 88% 87% 88% 88% 88% 87% 87% 87% 88% 87% 87% 88% 88% 88% 87% 87% 87% 88% 87% 87% 87% 88% 87% 87% 88% 88% 87% 87% 88% 88% 87% 87% 87% 88% 87% 87% 88% 88% 88% 87% 87% 86% 87% 88% 88% 88% 87%) -> (43k/114k) -> write(48% 47%)
|
||||
0:08:27 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 284M 29% 1.4M/s ] rels: [ 0 0% 0/s ] features: [ 1.3B 2.7M/s ] 109G blocks: [ 32k 76% 20/s ]
|
||||
cpus: 57.2 gc: 5% heap: 10G/32G direct: 57M postGC: 4.4G relInfo: 564M mpGeoms: 3.7G
|
||||
read( 0%) -> (32/94) -> process(88% 88% 87% 87% 88% 89% 88% 88% 87% 88% 88% 88% 88% 88% 88% 87% 87% 88% 88% 88% 87% 88% 88% 88% 87% 87% 88% 87% 88% 87% 87% 88% 88% 88% 87% 88% 89% 88% 87% 86% 88% 88% 88% 89% 89% 89% 88% 88% 88% 88% 88% 87% 87% 88% 87% 86% 88% 87% 88% 87% 89% 87%) -> (32k/114k) -> write(48% 48%)
|
||||
0:08:37 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 297M 30% 1.2M/s ] rels: [ 0 0% 0/s ] features: [ 1.3B 2.8M/s ] 112G blocks: [ 32k 76% 19/s ]
|
||||
cpus: 57 gc: 5% heap: 7.7G/32G direct: 57M postGC: 4.5G relInfo: 564M mpGeoms: 3.9G
|
||||
read( 0%) -> (32/94) -> process(88% 87% 88% 87% 88% 88% 87% 88% 87% 87% 87% 87% 88% 86% 87% 87% 88% 88% 88% 88% 87% 87% 88% 87% 88% 87% 88% 87% 87% 86% 87% 87% 87% 86% 88% 88% 87% 87% 87% 87% 87% 88% 87% 87% 88% 88% 88% 88% 86% 88% 87% 87% 87% 87% 87% 89% 87% 88% 87% 86% 88% 87%) -> (30k/114k) -> write(49% 48%)
|
||||
0:08:47 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 310M 31% 1.3M/s ] rels: [ 0 0% 0/s ] features: [ 1.3B 2.7M/s ] 114G blocks: [ 33k 77% 19/s ]
|
||||
cpus: 57.5 gc: 5% heap: 4.4G/32G direct: 57M postGC: 4.5G relInfo: 564M mpGeoms: 4.1G
|
||||
read( 0%) -> (32/94) -> process(88% 88% 88% 88% 88% 88% 88% 89% 89% 88% 88% 87% 88% 88% 87% 88% 88% 88% 87% 89% 88% 89% 88% 88% 89% 89% 87% 89% 87% 88% 88% 88% 88% 89% 88% 89% 89% 88% 88% 88% 88% 87% 88% 88% 88% 88% 88% 88% 89% 88% 88% 87% 87% 89% 89% 88% 88% 87% 88% 88% 87% 87%) -> (31k/114k) -> write(47% 47%)
|
||||
0:08:57 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 324M 33% 1.3M/s ] rels: [ 0 0% 0/s ] features: [ 1.4B 2.7M/s ] 116G blocks: [ 33k 77% 20/s ]
|
||||
cpus: 57.7 gc: 5% heap: 7.9G/32G direct: 57M postGC: 4.7G relInfo: 564M mpGeoms: 4.2G
|
||||
read( 0%) -> (32/94) -> process(88% 89% 88% 89% 88% 88% 89% 88% 87% 89% 89% 88% 88% 88% 89% 88% 88% 89% 89% 88% 89% 88% 88% 87% 89% 88% 88% 89% 88% 88% 89% 89% 89% 88% 88% 88% 89% 89% 88% 88% 88% 89% 88% 88% 89% 89% 88% 89% 90% 89% 89% 89% 89% 88% 88% 88% 88% 89% 88% 89% 89% 86%) -> (31k/114k) -> write(48% 48%)
|
||||
0:09:07 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 338M 34% 1.4M/s ] rels: [ 0 0% 0/s ] features: [ 1.4B 2.7M/s ] 118G blocks: [ 33k 78% 20/s ]
|
||||
cpus: 57.4 gc: 5% heap: 6.3G/32G direct: 57M postGC: 4.8G relInfo: 564M mpGeoms: 4.3G
|
||||
read( 0%) -> (32/94) -> process(87% 88% 88% 88% 87% 88% 89% 86% 88% 88% 90% 88% 88% 87% 87% 88% 88% 87% 88% 87% 87% 88% 88% 87% 88% 87% 88% 88% 86% 88% 87% 88% 88% 87% 87% 88% 88% 87% 88% 88% 89% 88% 87% 87% 88% 88% 88% 88% 87% 89% 87% 87% 89% 88% 88% 88% 87% 88% 88% 87% 88% 87%) -> (32k/114k) -> write(46% 46%)
|
||||
0:09:17 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 352M 36% 1.3M/s ] rels: [ 0 0% 0/s ] features: [ 1.4B 2.7M/s ] 118G blocks: [ 33k 78% 21/s ]
|
||||
cpus: 57.4 gc: 5% heap: 14G/32G direct: 57M postGC: 5G relInfo: 564M mpGeoms: 4.5G
|
||||
read( 0%) -> (32/94) -> process(88% 88% 88% 89% 87% 88% 88% 89% 88% 88% 88% 88% 88% 87% 87% 88% 88% 87% 87% 88% 89% 88% 88% 88% 87% 87% 87% 88% 88% 88% 87% 88% 88% 88% 88% 87% 88% 88% 89% 88% 88% 88% 88% 88% 88% 88% 88% 87% 87% 88% 88% 88% 88% 88% 88% 88% 87% 88% 88% 89% 88% 88%) -> (32k/114k) -> write(47% 47%)
|
||||
0:09:27 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 366M 37% 1.4M/s ] rels: [ 0 0% 0/s ] features: [ 1.5B 2.7M/s ] 121G blocks: [ 34k 79% 21/s ]
|
||||
cpus: 57.6 gc: 6% heap: 7.6G/32G direct: 57M postGC: 4.9G relInfo: 564M mpGeoms: 4.6G
|
||||
read( 0%) -> (32/94) -> process(88% 89% 89% 89% 88% 89% 89% 88% 88% 89% 88% 88% 88% 89% 88% 89% 88% 89% 88% 88% 88% 89% 87% 88% 87% 89% 88% 88% 89% 88% 89% 89% 88% 89% 88% 88% 89% 89% 88% 89% 88% 88% 88% 88% 89% 88% 89% 89% 89% 88% 88% 89% 89% 89% 88% 88% 88% 88% 88% 89% 88% 88%) -> (32k/114k) -> write(45% 45%)
|
||||
0:09:37 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 380M 38% 1.3M/s ] rels: [ 0 0% 0/s ] features: [ 1.5B 2.6M/s ] 123G blocks: [ 34k 79% 20/s ]
|
||||
cpus: 56.8 gc: 6% heap: 14G/32G direct: 57M postGC: 5.6G relInfo: 564M mpGeoms: 4.9G
|
||||
read( 0%) -> (32/94) -> process(87% 87% 87% 87% 87% 87% 87% 87% 87% 86% 87% 86% 86% 87% 87% 86% 87% 86% 87% 87% 87% 87% 86% 85% 87% 86% 86% 87% 87% 87% 87% 86% 86% 87% 87% 86% 87% 86% 86% 87% 86% 87% 87% 87% 87% 87% 86% 87% 87% 88% 87% 87% 87% 86% 87% 87% 87% 86% 87% 87% 87% 86%) -> (32k/114k) -> write(44% 44%)
|
||||
0:09:47 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 395M 40% 1.4M/s ] rels: [ 0 0% 0/s ] features: [ 1.5B 2.7M/s ] 125G blocks: [ 34k 80% 20/s ]
|
||||
cpus: 57.9 gc: 5% heap: 9.9G/32G direct: 57M postGC: 5.6G relInfo: 564M mpGeoms: 5G
|
||||
read( 0%) -> (32/94) -> process(89% 89% 89% 88% 89% 88% 90% 89% 89% 88% 89% 88% 89% 89% 89% 90% 89% 88% 89% 89% 89% 89% 89% 89% 89% 90% 89% 89% 89% 89% 89% 89% 89% 90% 88% 90% 89% 89% 89% 90% 89% 88% 89% 89% 89% 89% 90% 89% 89% 89% 89% 90% 89% 88% 89% 90% 89% 88% 89% 89% 89% 89%) -> (30k/114k) -> write(45% 45%)
|
||||
0:09:57 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 411M 41% 1.5M/s ] rels: [ 0 0% 0/s ] features: [ 1.5B 2.7M/s ] 127G blocks: [ 34k 80% 21/s ]
|
||||
cpus: 58.1 gc: 5% heap: 9.9G/32G direct: 57M postGC: 5.7G relInfo: 564M mpGeoms: 5.1G
|
||||
read( 0%) -> (32/94) -> process(89% 90% 89% 90% 90% 89% 89% 89% 89% 90% 89% 89% 88% 89% 89% 90% 89% 89% 89% 89% 89% 89% 89% 89% 87% 89% 89% 89% 90% 89% 89% 90% 89% 89% 89% 90% 89% 89% 90% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 90% 89% 89% 89% 89% 89% 89% 90% 89% 89% 89% 89%) -> (33k/114k) -> write(45% 45%)
|
||||
0:10:07 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 427M 43% 1.6M/s ] rels: [ 0 0% 0/s ] features: [ 1.6B 2.7M/s ] 129G blocks: [ 34k 81% 22/s ]
|
||||
cpus: 58.2 gc: 5% heap: 12G/32G direct: 57M postGC: 5.7G relInfo: 564M mpGeoms: 5.2G
|
||||
read( 0%) -> (32/94) -> process(90% 90% 90% 89% 89% 89% 90% 89% 89% 90% 90% 89% 90% 89% 89% 89% 89% 90% 90% 89% 89% 90% 89% 89% 90% 90% 90% 90% 90% 90% 90% 89% 89% 89% 89% 89% 89% 90% 89% 90% 90% 89% 89% 90% 90% 90% 89% 89% 89% 89% 90% 89% 89% 90% 89% 89% 89% 90% 89% 90% 90% 89%) -> (34k/114k) -> write(45% 45%)
|
||||
0:10:17 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 442M 45% 1.5M/s ] rels: [ 0 0% 0/s ] features: [ 1.6B 2.8M/s ] 131G blocks: [ 35k 81% 20/s ]
|
||||
cpus: 58.2 gc: 5% heap: 16G/32G direct: 57M postGC: 5.7G relInfo: 564M mpGeoms: 5.3G
|
||||
read( 0%) -> (32/94) -> process(89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 90% 89% 89% 89% 89% 89% 89% 90% 89% 90% 89% 90% 89% 89% 89% 89% 90% 90% 89% 89% 89% 89% 89% 89% 88% 89% 89% 89% 89% 89% 89% 89% 89% 89% 88% 89% 89% 89% 89% 89% 90% 89% 88% 89% 89% 90%) -> (36k/114k) -> write(48% 48%)
|
||||
0:10:27 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 457M 46% 1.5M/s ] rels: [ 0 0% 0/s ] features: [ 1.6B 2.9M/s ] 132G blocks: [ 35k 82% 21/s ]
|
||||
cpus: 57.9 gc: 5% heap: 8.5G/32G direct: 57M postGC: 5.7G relInfo: 564M mpGeoms: 5.5G
|
||||
read( 0%) -> (32/94) -> process(89% 89% 90% 90% 89% 89% 89% 89% 90% 89% 88% 89% 89% 89% 88% 89% 89% 89% 89% 89% 89% 88% 88% 89% 89% 90% 89% 89% 89% 89% 89% 89% 89% 89% 88% 88% 89% 89% 89% 89% 90% 89% 89% 88% 89% 88% 87% 89% 89% 89% 89% 89% 89% 89% 90% 89% 89% 89% 89% 89% 89% 89%) -> (35k/114k) -> write(51% 51%)
|
||||
0:10:37 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 474M 48% 1.6M/s ] rels: [ 0 0% 0/s ] features: [ 1.6B 2.8M/s ] 134G blocks: [ 35k 82% 21/s ]
|
||||
cpus: 58.2 gc: 5% heap: 8.6G/32G direct: 57M postGC: 5.7G relInfo: 564M mpGeoms: 5.6G
|
||||
read( 0%) -> (32/94) -> process(90% 89% 89% 89% 89% 90% 89% 89% 90% 89% 89% 89% 90% 90% 89% 89% 90% 89% 89% 88% 90% 90% 89% 89% 90% 89% 90% 90% 88% 89% 89% 90% 89% 90% 89% 89% 90% 91% 89% 89% 89% 89% 90% 90% 90% 90% 90% 89% 89% 90% 90% 89% 90% 90% 89% 89% 89% 89% 89% 90% 89% 89%) -> (35k/114k) -> write(46% 47%)
|
||||
0:10:47 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 491M 50% 1.7M/s ] rels: [ 0 0% 0/s ] features: [ 1.7B 2.8M/s ] 136G blocks: [ 35k 83% 23/s ]
|
||||
cpus: 58.3 gc: 5% heap: 12G/32G direct: 57M postGC: 5.8G relInfo: 564M mpGeoms: 5.7G
|
||||
read( 0%) -> (32/94) -> process(89% 89% 90% 90% 90% 90% 90% 90% 91% 89% 89% 90% 89% 90% 91% 90% 90% 90% 90% 89% 89% 90% 90% 90% 90% 90% 89% 90% 89% 90% 90% 90% 89% 90% 89% 89% 90% 90% 90% 90% 90% 90% 90% 89% 90% 90% 89% 89% 90% 90% 90% 89% 90% 90% 89% 90% 90% 90% 90% 90% 90% 90%) -> (33k/114k) -> write(46% 46%)
|
||||
0:10:57 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 507M 51% 1.5M/s ] rels: [ 0 0% 0/s ] features: [ 1.7B 2.8M/s ] 137G blocks: [ 35k 83% 21/s ]
|
||||
cpus: 58 gc: 5% heap: 15G/32G direct: 57M postGC: 5.8G relInfo: 564M mpGeoms: 5.8G
|
||||
read( 0%) -> (32/94) -> process(89% 89% 90% 89% 89% 88% 89% 89% 89% 89% 88% 89% 89% 89% 88% 89% 89% 89% 89% 89% 88% 87% 88% 89% 88% 90% 89% 89% 89% 89% 89% 89% 88% 88% 89% 89% 89% 90% 89% 89% 89% 90% 89% 89% 89% 88% 87% 89% 89% 89% 89% 90% 89% 89% 89% 89% 89% 88% 88% 88% 89% 89%) -> (31k/114k) -> write(48% 48%)
|
||||
0:11:07 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 523M 53% 1.6M/s ] rels: [ 0 0% 0/s ] features: [ 1.7B 2.8M/s ] 140G blocks: [ 36k 84% 21/s ]
|
||||
cpus: 57.8 gc: 5% heap: 13G/32G direct: 57M postGC: 5.9G relInfo: 564M mpGeoms: 5.9G
|
||||
read( 0%) -> (32/94) -> process(89% 88% 88% 89% 90% 89% 89% 89% 89% 88% 89% 88% 89% 89% 89% 90% 89% 89% 89% 89% 89% 89% 88% 89% 89% 89% 89% 88% 89% 88% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 88% 88% 89% 90% 89% 89% 89% 88% 89% 88% 88% 89% 88% 89% 88% 88% 88% 89% 88% 90% 88%) -> (37k/114k) -> write(47% 47%)
|
||||
0:11:17 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 537M 54% 1.4M/s ] rels: [ 0 0% 0/s ] features: [ 1.8B 2.7M/s ] 142G blocks: [ 36k 84% 20/s ]
|
||||
cpus: 58.3 gc: 5% heap: 10G/32G direct: 57M postGC: 6G relInfo: 564M mpGeoms: 6.1G
|
||||
read( 0%) -> (32/94) -> process(89% 90% 89% 89% 89% 89% 89% 88% 89% 89% 90% 89% 90% 90% 90% 89% 90% 91% 89% 89% 90% 90% 90% 90% 90% 90% 88% 89% 90% 90% 90% 89% 89% 89% 89% 89% 89% 88% 90% 89% 90% 90% 89% 90% 89% 89% 90% 89% 89% 90% 89% 89% 89% 89% 89% 89% 89% 90% 89% 89% 89% 89%) -> (30k/114k) -> write(47% 46%)
|
||||
0:11:27 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 552M 56% 1.4M/s ] rels: [ 0 0% 0/s ] features: [ 1.8B 2.8M/s ] 144G blocks: [ 36k 85% 19/s ]
|
||||
cpus: 58 gc: 5% heap: 8.4G/32G direct: 57M postGC: 6.1G relInfo: 564M mpGeoms: 6.2G
|
||||
read( 0%) -> (32/94) -> process(90% 88% 89% 89% 88% 89% 89% 89% 89% 88% 89% 89% 89% 89% 89% 89% 88% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 90% 89% 88% 89% 89% 89% 88% 89% 89% 88% 89% 89% 89% 89% 88% 89% 89% 89% 89% 89% 88% 88% 89% 89% 89% 89% 88% 88% 89% 89% 89% 89%) -> (34k/114k) -> write(50% 50%)
|
||||
0:11:37 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 565M 57% 1.3M/s ] rels: [ 0 0% 0/s ] features: [ 1.8B 2.8M/s ] 145G blocks: [ 36k 85% 20/s ]
|
||||
cpus: 57.9 gc: 5% heap: 16G/32G direct: 57M postGC: 6.2G relInfo: 564M mpGeoms: 6.3G
|
||||
read( 0%) -> (32/94) -> process(89% 88% 89% 90% 89% 89% 89% 89% 90% 89% 89% 89% 89% 89% 89% 89% 88% 88% 89% 89% 88% 89% 89% 89% 89% 87% 88% 88% 89% 88% 89% 88% 89% 89% 89% 89% 89% 89% 89% 88% 89% 89% 89% 88% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 90% 89% 89% 88% 89% 88% 89%) -> (29k/114k) -> write(47% 47%)
|
||||
0:11:47 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 581M 59% 1.5M/s ] rels: [ 0 0% 0/s ] features: [ 1.8B 2.8M/s ] 146G blocks: [ 36k 86% 21/s ]
|
||||
cpus: 57.9 gc: 5% heap: 6.2G/32G direct: 57M postGC: 6.2G relInfo: 564M mpGeoms: 6.5G
|
||||
read( 0%) -> (32/94) -> process(89% 89% 89% 90% 88% 89% 89% 90% 87% 89% 88% 89% 89% 89% 89% 89% 88% 89% 89% 89% 89% 89% 90% 89% 88% 88% 89% 89% 89% 89% 89% 89% 88% 89% 88% 89% 89% 89% 89% 89% 88% 89% 89% 89% 89% 88% 89% 88% 89% 89% 88% 89% 89% 89% 89% 88% 89% 88% 89% 89% 89% 89%) -> (33k/114k) -> write(47% 47%)
|
||||
0:11:57 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 596M 60% 1.5M/s ] rels: [ 0 0% 0/s ] features: [ 1.9B 3M/s ] 149G blocks: [ 37k 86% 21/s ]
|
||||
cpus: 58 gc: 5% heap: 15G/32G direct: 57M postGC: 6.3G relInfo: 564M mpGeoms: 6.6G
|
||||
read( 0%) -> (32/94) -> process(88% 89% 89% 88% 89% 89% 89% 90% 89% 89% 89% 89% 89% 89% 89% 89% 88% 89% 89% 89% 89% 89% 89% 90% 89% 88% 89% 88% 90% 90% 89% 89% 89% 89% 90% 89% 89% 90% 90% 89% 89% 89% 88% 89% 90% 89% 89% 89% 89% 89% 88% 90% 85% 90% 89% 89% 89% 88% 88% 89% 90% 89%) -> (30k/114k) -> write(51% 51%)
|
||||
0:12:07 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 611M 62% 1.5M/s ] rels: [ 0 0% 0/s ] features: [ 1.9B 2.9M/s ] 151G blocks: [ 37k 87% 21/s ]
|
||||
cpus: 58.1 gc: 5% heap: 6.3G/32G direct: 57M postGC: 6.3G relInfo: 564M mpGeoms: 6.8G
|
||||
read( 0%) -> (32/94) -> process(89% 89% 89% 89% 90% 89% 90% 90% 90% 89% 87% 89% 88% 89% 89% 88% 90% 89% 89% 90% 89% 89% 89% 88% 89% 89% 89% 90% 88% 90% 89% 89% 88% 89% 90% 89% 90% 88% 88% 89% 89% 89% 89% 89% 90% 87% 90% 90% 90% 86% 89% 89% 90% 89% 90% 89% 88% 90% 89% 89% 90% 88%) -> (29k/114k) -> write(50% 50%)
|
||||
0:12:18 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 625M 63% 1.4M/s ] rels: [ 0 0% 0/s ] features: [ 1.9B 2.8M/s ] 153G blocks: [ 37k 87% 20/s ]
|
||||
cpus: 57.7 gc: 5% heap: 12G/32G direct: 57M postGC: 6.4G relInfo: 564M mpGeoms: 7G
|
||||
read( 0%) -> (32/94) -> process(90% 89% 89% 88% 89% 89% 88% 89% 90% 85% 88% 90% 89% 89% 89% 88% 88% 87% 89% 88% 89% 89% 88% 89% 89% 89% 89% 88% 89% 86% 88% 89% 89% 89% 88% 88% 89% 88% 87% 89% 89% 89% 89% 87% 90% 89% 89% 89% 89% 89% 88% 89% 88% 90% 89% 89% 89% 89% 88% 88% 88% 89%) -> (31k/114k) -> write(48% 48%)
|
||||
0:12:28 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 639M 64% 1.4M/s ] rels: [ 0 0% 0/s ] features: [ 2B 2.7M/s ] 155G blocks: [ 37k 88% 19/s ]
|
||||
cpus: 57.7 gc: 5% heap: 9.8G/32G direct: 57M postGC: 6.5G relInfo: 564M mpGeoms: 7.2G
|
||||
read( 0%) -> (32/94) -> process(89% 88% 89% 89% 88% 89% 89% 89% 88% 89% 89% 89% 89% 89% 89% 89% 89% 88% 88% 89% 87% 89% 89% 89% 89% 89% 88% 89% 89% 88% 89% 89% 89% 89% 89% 89% 89% 89% 88% 86% 89% 88% 89% 89% 88% 89% 90% 89% 87% 90% 88% 88% 89% 89% 88% 88% 89% 89% 89% 88% 88% 89%) -> (32k/114k) -> write(45% 46%)
|
||||
0:12:38 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 655M 66% 1.5M/s ] rels: [ 0 0% 0/s ] features: [ 2B 2.9M/s ] 158G blocks: [ 38k 88% 23/s ]
|
||||
cpus: 58.3 gc: 5% heap: 10G/32G direct: 57M postGC: 6.6G relInfo: 564M mpGeoms: 7.3G
|
||||
read( 0%) -> (32/94) -> process(89% 90% 88% 90% 89% 89% 89% 89% 90% 90% 89% 89% 90% 90% 88% 90% 90% 90% 90% 90% 89% 89% 88% 90% 88% 90% 90% 90% 89% 89% 89% 89% 90% 90% 90% 90% 90% 90% 90% 89% 90% 90% 89% 89% 90% 90% 89% 89% 89% 89% 88% 90% 89% 89% 90% 90% 90% 89% 89% 89% 90% 90%) -> (32k/114k) -> write(49% 48%)
|
||||
0:12:48 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 671M 68% 1.5M/s ] rels: [ 0 0% 0/s ] features: [ 2B 2.9M/s ] 159G blocks: [ 38k 89% 21/s ]
|
||||
cpus: 58.1 gc: 5% heap: 15G/32G direct: 57M postGC: 6.6G relInfo: 564M mpGeoms: 7.4G
|
||||
read( 0%) -> (32/94) -> process(89% 89% 89% 90% 89% 89% 89% 89% 89% 87% 89% 90% 89% 88% 89% 90% 89% 88% 89% 90% 89% 89% 89% 89% 90% 89% 90% 88% 90% 87% 89% 88% 89% 90% 89% 90% 88% 89% 89% 89% 89% 90% 89% 88% 89% 90% 89% 89% 89% 89% 90% 88% 89% 89% 89% 89% 89% 87% 90% 90% 90% 89%) -> (34k/114k) -> write(51% 51%)
|
||||
0:12:58 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 686M 69% 1.5M/s ] rels: [ 0 0% 0/s ] features: [ 2.1B 2.9M/s ] 161G blocks: [ 38k 89% 21/s ]
|
||||
cpus: 58.2 gc: 5% heap: 12G/32G direct: 57M postGC: 6.7G relInfo: 564M mpGeoms: 7.6G
|
||||
read( 0%) -> (32/94) -> process(89% 89% 90% 89% 90% 90% 89% 89% 89% 90% 89% 88% 89% 90% 90% 89% 90% 90% 90% 90% 90% 89% 89% 90% 89% 89% 90% 90% 90% 90% 90% 90% 90% 87% 88% 89% 89% 88% 88% 90% 90% 90% 89% 90% 90% 90% 90% 89% 89% 90% 88% 90% 89% 90% 89% 89% 86% 88% 90% 90% 91% 89%) -> (33k/114k) -> write(48% 48%)
|
||||
0:13:08 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 702M 71% 1.5M/s ] rels: [ 0 0% 0/s ] features: [ 2.1B 2.8M/s ] 162G blocks: [ 38k 90% 21/s ]
|
||||
cpus: 58.3 gc: 5% heap: 7.3G/32G direct: 57M postGC: 6.7G relInfo: 564M mpGeoms: 7.7G
|
||||
read( 0%) -> (32/94) -> process(89% 90% 90% 89% 90% 90% 90% 89% 89% 90% 90% 90% 90% 90% 90% 89% 90% 89% 90% 89% 89% 88% 90% 89% 90% 90% 89% 90% 89% 90% 90% 89% 89% 89% 90% 90% 89% 90% 89% 90% 90% 88% 90% 89% 89% 89% 90% 90% 90% 89% 89% 88% 89% 90% 90% 90% 89% 90% 90% 90% 90% 90%) -> (36k/114k) -> write(47% 47%)
|
||||
0:13:18 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 718M 72% 1.5M/s ] rels: [ 0 0% 0/s ] features: [ 2.1B 2.8M/s ] 164G blocks: [ 38k 90% 21/s ]
|
||||
cpus: 58.3 gc: 5% heap: 11G/32G direct: 57M postGC: 6.7G relInfo: 564M mpGeoms: 7.9G
|
||||
read( 0%) -> (32/94) -> process(89% 90% 89% 90% 90% 90% 90% 88% 89% 89% 90% 90% 89% 89% 89% 90% 90% 90% 90% 89% 90% 90% 89% 89% 90% 89% 90% 89% 90% 89% 90% 89% 90% 89% 90% 90% 89% 89% 88% 88% 89% 89% 90% 89% 90% 90% 89% 89% 90% 89% 89% 90% 89% 89% 90% 89% 90% 90% 90% 90% 88% 90%) -> (36k/114k) -> write(51% 50%)
|
||||
0:13:28 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 734M 74% 1.6M/s ] rels: [ 0 0% 0/s ] features: [ 2.1B 2.9M/s ] 166G blocks: [ 39k 91% 22/s ]
|
||||
cpus: 58.3 gc: 5% heap: 16G/32G direct: 57M postGC: 6.7G relInfo: 564M mpGeoms: 8G
|
||||
read( 0%) -> (32/94) -> process(90% 89% 90% 90% 90% 89% 89% 89% 89% 88% 90% 90% 90% 89% 90% 90% 88% 90% 90% 90% 90% 90% 89% 90% 89% 90% 90% 89% 88% 90% 90% 90% 90% 90% 90% 89% 90% 90% 90% 90% 88% 90% 89% 89% 90% 89% 89% 90% 90% 90% 90% 90% 89% 88% 90% 90% 90% 90% 90% 89% 90% 90%) -> (30k/114k) -> write(49% 49%)
|
||||
0:13:38 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 751M 76% 1.6M/s ] rels: [ 0 0% 0/s ] features: [ 2.2B 2.8M/s ] 167G blocks: [ 39k 91% 23/s ]
|
||||
cpus: 58.2 gc: 5% heap: 11G/32G direct: 57M postGC: 6.8G relInfo: 564M mpGeoms: 8.1G
|
||||
read( 0%) -> (32/94) -> process(89% 90% 89% 90% 90% 90% 89% 90% 89% 88% 90% 90% 90% 90% 90% 89% 89% 88% 89% 89% 89% 89% 89% 90% 90% 89% 90% 90% 90% 89% 90% 89% 89% 90% 89% 90% 89% 90% 90% 90% 90% 89% 89% 89% 89% 90% 89% 90% 90% 90% 89% 90% 90% 90% 89% 89% 89% 89% 89% 90% 90% 90%) -> (26k/114k) -> write(48% 49%)
|
||||
0:13:48 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 768M 77% 1.6M/s ] rels: [ 0 0% 0/s ] features: [ 2.2B 2.8M/s ] 170G blocks: [ 39k 92% 22/s ]
|
||||
cpus: 58.1 gc: 5% heap: 13G/32G direct: 57M postGC: 6.7G relInfo: 564M mpGeoms: 8.3G
|
||||
read( 0%) -> (32/94) -> process(90% 89% 89% 89% 89% 89% 89% 89% 89% 88% 89% 90% 89% 89% 89% 89% 89% 88% 89% 89% 89% 89% 90% 89% 89% 90% 89% 89% 89% 89% 90% 90% 89% 89% 89% 89% 88% 89% 89% 89% 88% 89% 89% 90% 90% 89% 88% 87% 90% 89% 89% 89% 89% 89% 90% 89% 89% 89% 89% 89% 89% 89%) -> (34k/114k) -> write(47% 47%)
|
||||
0:13:58 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 784M 79% 1.5M/s ] rels: [ 0 0% 0/s ] features: [ 2.2B 2.8M/s ] 172G blocks: [ 39k 92% 21/s ]
|
||||
cpus: 58.3 gc: 5% heap: 16G/32G direct: 57M postGC: 6.7G relInfo: 564M mpGeoms: 8.4G
|
||||
read( 0%) -> (32/94) -> process(89% 90% 90% 90% 89% 90% 89% 89% 90% 90% 90% 89% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 90% 89% 90% 90% 90% 90% 90% 89% 90% 89% 90% 88% 90% 89% 90% 89% 89% 89% 90% 90% 90% 90% 89% 89% 90% 89% 89% 90% 90% 90% 90% 89%) -> (31k/114k) -> write(48% 48%)
|
||||
0:14:08 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 799M 81% 1.5M/s ] rels: [ 0 0% 0/s ] features: [ 2.3B 2.7M/s ] 173G blocks: [ 40k 93% 21/s ]
|
||||
cpus: 58.1 gc: 5% heap: 10G/32G direct: 57M postGC: 6.8G relInfo: 564M mpGeoms: 8.5G
|
||||
read( 0%) -> (32/94) -> process(90% 89% 90% 89% 88% 89% 89% 88% 89% 90% 89% 89% 89% 90% 90% 90% 88% 89% 89% 90% 89% 89% 88% 90% 88% 89% 88% 89% 89% 90% 89% 90% 90% 89% 90% 89% 89% 90% 89% 89% 89% 90% 89% 89% 90% 90% 89% 89% 89% 89% 88% 90% 90% 90% 90% 89% 89% 90% 89% 89% 89% 90%) -> (25k/114k) -> write(45% 45%)
|
||||
0:14:18 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 815M 82% 1.5M/s ] rels: [ 0 0% 0/s ] features: [ 2.3B 2.6M/s ] 175G blocks: [ 40k 93% 21/s ]
|
||||
cpus: 58.2 gc: 5% heap: 16G/32G direct: 57M postGC: 6.8G relInfo: 564M mpGeoms: 8.6G
|
||||
read( 0%) -> (32/94) -> process(90% 89% 90% 90% 89% 90% 89% 89% 90% 90% 90% 89% 90% 90% 89% 90% 89% 89% 89% 89% 90% 89% 90% 90% 89% 89% 89% 90% 90% 89% 89% 90% 90% 89% 90% 90% 90% 89% 89% 89% 89% 90% 89% 89% 89% 89% 90% 90% 90% 89% 89% 90% 89% 89% 90% 90% 90% 90% 90% 89% 90% 89%) -> (32k/114k) -> write(44% 44%)
|
||||
0:14:28 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 830M 84% 1.5M/s ] rels: [ 0 0% 0/s ] features: [ 2.3B 2.5M/s ] 176G blocks: [ 40k 94% 20/s ]
|
||||
cpus: 56.9 gc: 5% heap: 14G/32G direct: 57M postGC: 7.2G relInfo: 564M mpGeoms: 9.2G
|
||||
read( 0%) -> (32/94) -> process(87% 88% 87% 87% 87% 87% 87% 87% 87% 88% 88% 87% 87% 87% 88% 88% 87% 89% 87% 87% 88% 89% 87% 87% 87% 87% 88% 87% 88% 88% 88% 88% 88% 87% 87% 88% 87% 87% 87% 87% 87% 87% 87% 89% 87% 88% 88% 88% 87% 88% 87% 87% 87% 89% 87% 87% 87% 87% 87% 87% 87% 88%) -> (34k/114k) -> write(43% 42%)
|
||||
0:14:38 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 846M 85% 1.5M/s ] rels: [ 0 0% 0/s ] features: [ 2.3B 2.6M/s ] 178G blocks: [ 40k 94% 22/s ]
|
||||
cpus: 58.1 gc: 5% heap: 13G/32G direct: 57M postGC: 7.2G relInfo: 564M mpGeoms: 9.3G
|
||||
read( 0%) -> (32/94) -> process(89% 90% 89% 90% 89% 90% 89% 89% 89% 89% 90% 89% 90% 90% 90% 89% 89% 90% 89% 89% 90% 89% 90% 89% 90% 89% 89% 89% 90% 90% 90% 89% 89% 89% 89% 89% 89% 90% 90% 89% 90% 89% 89% 89% 90% 89% 89% 90% 89% 89% 89% 89% 89% 90% 88% 90% 89% 88% 89% 89% 89% 88%) -> (34k/114k) -> write(44% 44%)
|
||||
0:14:48 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 862M 87% 1.6M/s ] rels: [ 0 0% 0/s ] features: [ 2.4B 2.7M/s ] 181G blocks: [ 40k 95% 21/s ]
|
||||
cpus: 58.1 gc: 5% heap: 17G/32G direct: 57M postGC: 7.2G relInfo: 564M mpGeoms: 9.4G
|
||||
read( 0%) -> (32/94) -> process(90% 90% 90% 89% 90% 90% 90% 88% 90% 89% 90% 89% 89% 90% 90% 90% 89% 89% 90% 90% 89% 89% 90% 90% 90% 89% 89% 89% 89% 89% 89% 90% 90% 90% 90% 89% 89% 89% 89% 90% 90% 89% 89% 90% 90% 90% 90% 89% 90% 89% 90% 89% 89% 90% 87% 89% 90% 90% 89% 89% 89% 89%) -> (32k/114k) -> write(46% 45%)
|
||||
0:14:58 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 878M 89% 1.5M/s ] rels: [ 0 0% 0/s ] features: [ 2.4B 2.7M/s ] 182G blocks: [ 41k 95% 20/s ]
|
||||
cpus: 58 gc: 5% heap: 14G/32G direct: 57M postGC: 7.2G relInfo: 564M mpGeoms: 9.5G
|
||||
read( 0%) -> (32/94) -> process(89% 89% 89% 89% 89% 89% 89% 90% 89% 89% 89% 89% 90% 89% 89% 89% 90% 90% 89% 90% 90% 89% 90% 89% 90% 89% 89% 89% 89% 89% 89% 90% 89% 89% 89% 89% 88% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 89% 90% 89% 89% 89% 89% 89% 89% 89% 90% 89%) -> (29k/114k) -> write(45% 45%)
|
||||
0:15:08 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 893M 90% 1.5M/s ] rels: [ 0 0% 0/s ] features: [ 2.4B 2.6M/s ] 183G blocks: [ 41k 96% 21/s ]
|
||||
cpus: 57.3 gc: 5% heap: 10G/32G direct: 57M postGC: 7.3G relInfo: 564M mpGeoms: 9.7G
|
||||
read( 0%) -> (32/94) -> process(88% 88% 87% 89% 87% 88% 88% 88% 88% 88% 86% 87% 88% 89% 88% 89% 89% 88% 89% 88% 87% 87% 89% 89% 88% 87% 89% 87% 88% 88% 88% 88% 89% 88% 88% 88% 89% 86% 89% 86% 89% 89% 89% 88% 88% 87% 88% 88% 88% 89% 88% 87% 87% 89% 89% 87% 88% 88% 86% 87% 88% 88%) -> (33k/114k) -> write(43% 43%)
|
||||
0:15:18 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 907M 92% 1.4M/s ] rels: [ 0 0% 0/s ] features: [ 2.4B 2.5M/s ] 185G blocks: [ 41k 96% 20/s ]
|
||||
cpus: 57.6 gc: 5% heap: 11G/32G direct: 57M postGC: 7.4G relInfo: 564M mpGeoms: 9.9G
|
||||
read( 0%) -> (32/94) -> process(88% 90% 88% 89% 86% 89% 88% 89% 88% 88% 86% 89% 88% 89% 90% 89% 89% 89% 90% 90% 90% 89% 90% 89% 85% 89% 90% 89% 88% 89% 89% 88% 89% 88% 90% 90% 88% 89% 89% 89% 89% 89% 90% 90% 89% 86% 88% 89% 90% 87% 89% 89% 89% 89% 89% 90% 84% 89% 89% 89% 89% 90%) -> (26k/114k) -> write(43% 43%)
|
||||
0:15:28 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 923M 93% 1.5M/s ] rels: [ 0 0% 0/s ] features: [ 2.5B 2.5M/s ] 187G blocks: [ 41k 97% 20/s ]
|
||||
cpus: 58.1 gc: 5% heap: 11G/32G direct: 57M postGC: 7.5G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(91% 87% 89% 90% 91% 89% 89% 90% 92% 90% 89% 90% 90% 88% 90% 88% 89% 89% 90% 89% 90% 90% 90% 89% 89% 90% 89% 89% 91% 90% 90% 89% 89% 89% 89% 90% 90% 88% 90% 91% 89% 89% 88% 89% 89% 90% 90% 88% 90% 90% 88% 89% 90% 90% 90% 90% 89% 89% 89% 88% 90% 89%) -> (29k/114k) -> write(42% 42%)
|
||||
0:15:38 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 937M 95% 1.4M/s ] rels: [ 0 0% 0/s ] features: [ 2.5B 2.5M/s ] 188G blocks: [ 41k 97% 21/s ]
|
||||
cpus: 57.6 gc: 5% heap: 10G/32G direct: 57M postGC: 7.6G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(88% 88% 89% 88% 89% 89% 89% 88% 89% 90% 88% 90% 88% 88% 89% 88% 89% 88% 89% 88% 89% 89% 88% 89% 89% 89% 91% 89% 88% 88% 89% 89% 88% 88% 89% 88% 89% 88% 88% 89% 89% 89% 88% 88% 89% 89% 88% 89% 89% 87% 89% 88% 89% 90% 88% 89% 89% 89% 89% 87% 88% 87%) -> (31k/114k) -> write(41% 41%)
|
||||
0:15:48 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 952M 96% 1.4M/s ] rels: [ 0 0% 0/s ] features: [ 2.5B 2.4M/s ] 189G blocks: [ 42k 98% 20/s ]
|
||||
cpus: 57.7 gc: 5% heap: 11G/32G direct: 57M postGC: 4.2G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(87% 89% 89% 89% 88% 90% 89% 89% 88% 88% 89% 89% 88% 87% 89% 88% 89% 86% 88% 88% 89% 89% 89% 89% 89% 88% 88% 87% 88% 88% 89% 88% 89% 89% 88% 89% 89% 89% 89% 88% 89% 88% 89% 89% 89% 88% 89% 88% 88% 87% 89% 88% 87% 87% 90% 87% 89% 89% 88% 88% 88% 89%) -> (34k/114k) -> write(43% 43%)
|
||||
0:15:58 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 967M 98% 1.5M/s ] rels: [ 0 0% 0/s ] features: [ 2.5B 2.5M/s ] 192G blocks: [ 42k 98% 20/s ]
|
||||
cpus: 58.3 gc: 5% heap: 6.9G/32G direct: 57M postGC: 4.3G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(89% 90% 90% 90% 89% 90% 90% 89% 89% 89% 89% 90% 90% 90% 90% 90% 90% 91% 90% 90% 90% 90% 90% 89% 89% 90% 90% 90% 90% 90% 89% 90% 90% 90% 90% 89% 89% 90% 90% 90% 89% 90% 90% 90% 90% 90% 90% 90% 89% 90% 90% 90% 90% 90% 89% 89% 90% 90% 90% 90% 89% 89%) -> (30k/114k) -> write(42% 43%)
|
||||
0:16:08 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 982M 99% 1.4M/s ] rels: [ 0 0% 0/s ] features: [ 2.6B 2.5M/s ] 194G blocks: [ 42k 99% 21/s ]
|
||||
cpus: 58.1 gc: 5% heap: 5.3G/32G direct: 57M postGC: 4.4G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(90% 90% 90% 89% 89% 90% 89% 89% 89% 89% 90% 89% 89% 90% 90% 90% 89% 90% 89% 89% 88% 90% 88% 89% 90% 88% 90% 90% 88% 89% 89% 89% 90% 90% 89% 89% 89% 90% 90% 90% 90% 90% 90% 88% 90% 90% 89% 89% 89% 89% 90% 89% 90% 89% 90% 89% 89% 90% 89% 90% 90% 90%) -> (28k/114k) -> write(43% 43%)
|
||||
0:16:18 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 991M 100% 942k/s ] rels: [ 0 0% 0/s ] features: [ 2.6B 1.9M/s ] 194G blocks: [ 42k 99% 15/s ]
|
||||
cpus: 51.4 gc: 5% heap: 7.2G/32G direct: 57M postGC: 5G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(78% 88% 76% 68% 88% 89% 82% 90% 77% 90% 75% 79% 66% 84% 90% 83% 80% 81% 83% 65% 83% 75% 66% 69% 66% 65% 82% 76% 78% 78% 69% 89% 82% 69% 88% 77% 82% 74% 89% 69% 87% 89% 74% 89% 66% 73% 67% 89% 75% 66% 88% 82% 82% 75% 72% 90% 89% 76% 89% 91% 72% 77%) -> (30k/114k) -> write(33% 33%)
|
||||
0:16:21 INF [osm_pass2:process] - Finished ways: 992,064,323 (1.3M/s) in 12m34s cpu:11h36m56s gc:40s avg:55.5
|
||||
0:16:28 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 992M 100% 16k/s ] rels: [ 307k 3% 30k/s ] features: [ 2.6B 227k/s ] 195G blocks: [ 42k 99% 1/s ]
|
||||
cpus: 39.7 gc: 3% heap: 10G/32G direct: 57M postGC: 5.2G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(59% 59% 59% 61% 71% 91% 59% 66% 57% 59% 59% 59% 60% 58% 62% 59% 59% 58% 58% 58% 57% 60% 61% 62% 59% 59% 58% 57% 58% 62% 60% 68% 58% 58% 60% 59% 60% 62% 63% 61% 59% 64% 60% 73% 60% 60% 60% 69% 59% 60% 59% 58% 59% 61% 60% 63% 72% 59% 60% 67% 60% 60%) -> (28k/114k) -> write( 3% 4%)
|
||||
0:16:38 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 992M 100% 0/s ] rels: [ 670k 6% 36k/s ] features: [ 2.6B 291k/s ] 196G blocks: [ 42k 99% <1/s ]
|
||||
cpus: 57.8 gc: 2% heap: 6.4G/32G direct: 57M postGC: 5.2G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(91% 91% 92% 91% 92% 92% 94% 91% 92% 93% 92% 92% 91% 93% 93% 90% 92% 92% 92% 92% 91% 93% 91% 90% 91% 93% 92% 91% 93% 93% 92% 92% 93% 93% 93% 92% 93% 93% 93% 93% 92% 92% 93% 92% 91% 93% 92% 91% 91% 92% 91% 92% 91% 93% 91% 93% 92% 92% 92% 92% 91% 93%) -> (35k/114k) -> write( 5% 5%)
|
||||
0:16:48 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 992M 100% 0/s ] rels: [ 1M 9% 36k/s ] features: [ 2.6B 260k/s ] 196G blocks: [ 42k 99% <1/s ]
|
||||
cpus: 58.1 gc: 2% heap: 10G/32G direct: 57M postGC: 5.3G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(94% 92% 94% 92% 93% 93% 93% 92% 92% 93% 92% 93% 91% 94% 94% 93% 94% 92% 93% 93% 93% 94% 92% 93% 92% 91% 93% 91% 93% 93% 95% 93% 94% 95% 93% 94% 93% 93% 93% 92% 93% 94% 93% 94% 91% 94% 92% 93% 92% 92% 93% 94% 95% 92% 93% 93% 94% 93% 93% 93% 91% 94%) -> (29k/114k) -> write( 4% 4%)
|
||||
0:16:58 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 992M 100% 0/s ] rels: [ 1.3M 12% 36k/s ] features: [ 2.6B 303k/s ] 196G blocks: [ 42k 99% 1/s ]
|
||||
cpus: 58.4 gc: 2% heap: 15G/32G direct: 57M postGC: 5.6G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(91% 94% 94% 92% 94% 94% 93% 93% 91% 94% 92% 94% 92% 94% 92% 92% 93% 93% 95% 92% 90% 94% 92% 92% 92% 93% 94% 93% 95% 93% 95% 93% 94% 94% 92% 94% 94% 93% 91% 93% 94% 93% 91% 94% 92% 92% 91% 94% 89% 94% 92% 94% 94% 91% 91% 91% 94% 92% 92% 92% 93% 94%) -> (36k/114k) -> write( 4% 4%)
|
||||
0:17:08 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 992M 100% 0/s ] rels: [ 1.7M 15% 39k/s ] features: [ 2.6B 1.5M/s ] 199G blocks: [ 42k 99% 1/s ]
|
||||
cpus: 58.2 gc: 3% heap: 10G/32G direct: 57M postGC: 5.9G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(90% 89% 94% 93% 91% 93% 91% 94% 91% 92% 92% 95% 91% 92% 90% 93% 93% 95% 93% 87% 91% 95% 93% 92% 92% 95% 94% 93% 95% 94% 93% 91% 94% 94% 92% 90% 93% 93% 92% 92% 94% 92% 92% 94% 93% 90% 93% 93% 93% 93% 90% 85% 94% 93% 93% 92% 91% 91% 90% 91% 93% 93%) -> (28k/114k) -> write( 8% 8%)
|
||||
0:17:18 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 992M 100% 0/s ] rels: [ 2.2M 19% 43k/s ] features: [ 2.6B 443k/s ] 199G blocks: [ 42k 99% 1/s ]
|
||||
cpus: 58.4 gc: 2% heap: 8G/32G direct: 57M postGC: 5.9G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(93% 93% 91% 94% 92% 93% 92% 95% 95% 93% 95% 94% 94% 91% 92% 95% 94% 95% 91% 91% 94% 92% 91% 90% 93% 95% 96% 93% 97% 95% 92% 92% 91% 95% 93% 92% 94% 92% 94% 91% 94% 92% 94% 95% 95% 90% 94% 95% 92% 95% 93% 88% 95% 94% 93% 94% 89% 93% 93% 94% 94% 94%) -> (28k/114k) -> write( 4% 4%)
|
||||
0:17:28 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 992M 100% 0/s ] rels: [ 2.7M 23% 48k/s ] features: [ 2.6B 306k/s ] 199G blocks: [ 42k 99% 1/s ]
|
||||
cpus: 58.1 gc: 2% heap: 16G/32G direct: 57M postGC: 6.1G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(91% 93% 93% 96% 93% 92% 94% 93% 95% 93% 90% 92% 94% 94% 93% 92% 91% 95% 93% 91% 94% 92% 91% 92% 95% 92% 96% 92% 95% 95% 94% 94% 93% 95% 95% 95% 93% 93% 91% 93% 92% 93% 93% 93% 94% 92% 90% 92% 93% 93% 91% 92% 94% 94% 92% 95% 90% 91% 92% 92% 92% 92%) -> (29k/114k) -> write( 4% 4%)
|
||||
0:17:38 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 992M 100% 0/s ] rels: [ 3.2M 27% 50k/s ] features: [ 2.6B 400k/s ] 201G blocks: [ 42k 99% <1/s ]
|
||||
cpus: 58.1 gc: 3% heap: 13G/32G direct: 57M postGC: 6.4G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(92% 92% 93% 95% 91% 92% 92% 91% 94% 92% 90% 94% 95% 93% 93% 90% 93% 95% 94% 93% 94% 92% 92% 93% 93% 90% 96% 93% 95% 91% 92% 92% 94% 94% 95% 92% 93% 93% 93% 94% 93% 93% 93% 89% 93% 93% 92% 93% 93% 90% 91% 88% 92% 91% 93% 94% 93% 93% 90% 92% 89% 91%) -> (31k/114k) -> write( 5% 5%)
|
||||
0:17:48 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 992M 100% 0/s ] rels: [ 3.7M 32% 53k/s ] features: [ 2.6B 286k/s ] 201G blocks: [ 42k 99% 1/s ]
|
||||
cpus: 58.2 gc: 3% heap: 13G/32G direct: 57M postGC: 7G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(94% 92% 94% 91% 86% 89% 92% 89% 93% 91% 92% 94% 93% 92% 92% 93% 93% 90% 91% 94% 94% 93% 93% 92% 94% 90% 95% 93% 94% 97% 93% 93% 95% 93% 94% 89% 93% 91% 94% 94% 93% 92% 92% 90% 93% 94% 93% 93% 89% 92% 93% 90% 93% 92% 94% 91% 91% 92% 93% 93% 93% 92%) -> (29k/114k) -> write( 4% 4%)
|
||||
0:17:58 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 992M 100% 0/s ] rels: [ 4.3M 37% 56k/s ] features: [ 2.6B 327k/s ] 202G blocks: [ 42k 99% 1/s ]
|
||||
cpus: 58.8 gc: 2% heap: 12G/32G direct: 57M postGC: 7G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(95% 95% 96% 93% 92% 98% 95% 93% 93% 94% 93% 96% 92% 94% 93% 92% 92% 93% 93% 95% 93% 94% 95% 93% 95% 93% 95% 92% 96% 97% 92% 93% 93% 94% 94% 94% 93% 95% 93% 95% 93% 93% 94% 93% 95% 95% 93% 96% 93% 94% 94% 94% 95% 95% 92% 93% 93% 95% 94% 93% 94% 93%) -> (30k/114k) -> write( 4% 4%)
|
||||
0:18:08 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 992M 100% 0/s ] rels: [ 4.9M 42% 63k/s ] features: [ 2.6B 543k/s ] 202G blocks: [ 42k 99% 2/s ]
|
||||
cpus: 58.3 gc: 2% heap: 10G/32G direct: 57M postGC: 7.3G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(92% 94% 92% 93% 93% 95% 95% 92% 91% 93% 92% 96% 93% 93% 88% 92% 93% 93% 93% 92% 91% 91% 93% 93% 93% 93% 91% 94% 96% 95% 93% 92% 93% 91% 93% 94% 93% 93% 93% 93% 93% 93% 95% 91% 94% 90% 94% 94% 93% 91% 91% 93% 94% 93% 92% 94% 94% 93% 94% 90% 92% 92%) -> (31k/114k) -> write( 6% 6%)
|
||||
0:18:18 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 992M 100% 0/s ] rels: [ 5.5M 48% 62k/s ] features: [ 2.6B 501k/s ] 204G blocks: [ 42k 100% 1/s ]
|
||||
cpus: 58.7 gc: 2% heap: 5.2G/32G direct: 57M postGC: 4.1G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(94% 93% 94% 92% 92% 95% 93% 93% 92% 92% 93% 93% 93% 93% 93% 94% 92% 94% 94% 93% 93% 93% 93% 92% 93% 94% 91% 94% 92% 96% 93% 91% 94% 93% 94% 92% 93% 94% 94% 94% 94% 94% 96% 91% 92% 93% 94% 93% 94% 93% 93% 95% 91% 93% 93% 93% 94% 92% 93% 93% 94% 93%) -> (34k/114k) -> write( 6% 6%)
|
||||
0:18:28 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 992M 100% 0/s ] rels: [ 6.1M 53% 61k/s ] features: [ 2.6B 362k/s ] 206G blocks: [ 42k 100% 1/s ]
|
||||
cpus: 58.6 gc: 2% heap: 6.3G/32G direct: 57M postGC: 4.2G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(93% 93% 95% 93% 94% 93% 94% 94% 93% 94% 94% 93% 93% 95% 94% 92% 93% 93% 95% 92% 95% 93% 95% 94% 93% 94% 95% 94% 93% 95% 93% 94% 92% 95% 92% 92% 94% 95% 95% 95% 92% 94% 94% 95% 95% 94% 95% 94% 93% 94% 94% 95% 93% 95% 94% 94% 90% 94% 94% 94% 93% 95%) -> (31k/114k) -> write( 5% 4%)
|
||||
0:18:38 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 992M 100% 0/s ] rels: [ 6.7M 58% 57k/s ] features: [ 2.6B 341k/s ] 206G blocks: [ 42k 100% 2/s ]
|
||||
cpus: 58.7 gc: 2% heap: 11G/32G direct: 57M postGC: 4.5G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(94% 94% 95% 94% 93% 94% 94% 94% 93% 94% 94% 95% 94% 94% 94% 94% 94% 94% 92% 93% 92% 93% 94% 94% 94% 94% 93% 94% 93% 94% 94% 92% 93% 94% 94% 94% 93% 94% 94% 94% 93% 93% 92% 95% 95% 94% 93% 95% 94% 92% 94% 94% 93% 93% 95% 95% 94% 94% 94% 90% 92% 95%) -> (30k/114k) -> write( 4% 4%)
|
||||
0:18:48 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 992M 100% 0/s ] rels: [ 7.3M 63% 58k/s ] features: [ 2.7B 876k/s ] 209G blocks: [ 42k 100% 1/s ]
|
||||
cpus: 59.1 gc: 2% heap: 5.1G/32G direct: 57M postGC: 4.6G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(94% 94% 94% 94% 94% 95% 94% 94% 94% 94% 94% 95% 95% 95% 95% 95% 95% 95% 94% 94% 94% 93% 95% 94% 95% 94% 95% 95% 94% 94% 95% 94% 93% 94% 94% 93% 94% 94% 93% 94% 95% 94% 94% 95% 95% 94% 94% 94% 94% 94% 94% 94% 93% 95% 94% 93% 94% 93% 95% 93% 93% 94%) -> (30k/114k) -> write(11% 10%)
|
||||
0:18:58 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 992M 100% 0/s ] rels: [ 7.9M 68% 61k/s ] features: [ 2.7B 410k/s ] 209G blocks: [ 42k 100% 1/s ]
|
||||
cpus: 59.4 gc: 2% heap: 13G/32G direct: 57M postGC: 4.7G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(95% 95% 95% 94% 94% 95% 95% 95% 94% 94% 95% 94% 94% 96% 95% 96% 95% 96% 94% 95% 96% 95% 94% 95% 95% 95% 94% 95% 96% 96% 94% 95% 95% 95% 95% 95% 95% 95% 96% 97% 94% 96% 95% 94% 94% 94% 95% 95% 95% 95% 94% 95% 95% 94% 94% 94% 94% 94% 96% 94% 97% 94%) -> (31k/114k) -> write( 6% 6%)
|
||||
0:19:08 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 992M 100% 0/s ] rels: [ 8.6M 74% 63k/s ] features: [ 2.7B 310k/s ] 211G blocks: [ 42k 100% 1/s ]
|
||||
cpus: 59.5 gc: 2% heap: 10G/32G direct: 57M postGC: 4.8G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(95% 95% 95% 95% 95% 95% 95% 95% 95% 95% 96% 95% 95% 95% 95% 94% 94% 95% 95% 94% 96% 94% 95% 95% 94% 96% 96% 96% 96% 95% 95% 95% 95% 95% 95% 94% 94% 94% 96% 96% 95% 96% 96% 95% 95% 95% 96% 96% 95% 95% 95% 95% 95% 94% 95% 96% 94% 95% 95% 96% 96% 95%) -> (33k/114k) -> write( 5% 5%)
|
||||
0:19:18 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 992M 100% 0/s ] rels: [ 9.2M 79% 64k/s ] features: [ 2.7B 376k/s ] 211G blocks: [ 43k 100% 2/s ]
|
||||
cpus: 59.3 gc: 2% heap: 6.4G/32G direct: 57M postGC: 5G relInfo: 564M mpGeoms: 10G
|
||||
read( 0%) -> (32/94) -> process(95% 94% 94% 95% 94% 95% 94% 94% 95% 94% 95% 95% 96% 94% 95% 95% 95% 95% 95% 94% 95% 94% 95% 95% 95% 94% 94% 94% 96% 95% 96% 94% 95% 95% 94% 95% 95% 94% 94% 94% 95% 94% 95% 95% 95% 93% 94% 95% 96% 94% 94% 95% 94% 95% 94% 94% 95% 95% 95% 94% 96% 95%) -> (30k/114k) -> write( 5% 5%)
|
||||
0:19:28 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 992M 100% 0/s ] rels: [ 9.9M 84% 63k/s ] features: [ 2.7B 288k/s ] 212G blocks: [ 43k 100% 1/s ]
|
||||
cpus: 59.6 gc: 2% heap: 5.2G/32G direct: 57M postGC: 5.2G relInfo: 564M mpGeoms: 10G
|
||||
read( -%) -> (19/94) -> process(96% 96% 94% 94% 95% 95% 93% 95% 95% 96% 95% 96% 95% 93% 95% 96% 96% 96% 95% 95% 95% 96% 95% 96% 96% 95% 94% 95% 95% 95% 95% 95% 94% 96% 96% 96% 96% 96% 96% 95% 96% 96% 95% 95% 94% 95% 95% 95% 95% 95% 95% 94% 95% 95% 95% 96% 96% 94% 96% 94% 95% 95%) -> (31k/114k) -> write( 5% 5%)
|
||||
0:19:38 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 992M 100% 0/s ] rels: [ 10M 90% 68k/s ] features: [ 2.7B 296k/s ] 212G blocks: [ 43k 100% 1/s ]
|
||||
cpus: 59.9 gc: 2% heap: 7.6G/32G direct: 57M postGC: 5.3G relInfo: 564M mpGeoms: 10G
|
||||
read( -%) -> (1/94) -> process(96% 96% 94% 95% 96% 95% 98% 95% 96% 95% 95% 96% 95% 95% 96% 96% 96% 96% 96% 96% 96% 96% 96% 96% 94% 96% 96% 96% 96% 96% 96% 97% 95% 96% 96% 96% 96% 95% 96% 95% 96% 95% 96% 95% 96% 96% 96% 96% 95% 95% 96% 95% 96% 96% 96% 95% 96% 96% 96% 96% 94% 96%) -> (31k/114k) -> write( 5% 5%)
|
||||
0:19:49 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 992M 100% 0/s ] rels: [ 11M 96% 67k/s ] features: [ 2.7B 326k/s ] 212G blocks: [ 43k 100% 2/s ]
|
||||
cpus: 60.8 gc: 2% heap: 9.8G/32G direct: 57M postGC: 5.4G relInfo: 564M mpGeoms: 10G
|
||||
read( -%) -> (0/94) -> process(97% 97% 97% 98% 97% 97% 97% 97% 97% 97% 98% 97% 97% 97% 97% 97% 98% 98% 97% 97% 97% 97% 97% 97% 97% 97% 97% 97% 97% 97% 97% 97% 97% 97% 98% 98% 97% 97% 97% 97% 97% 97% 97% 97% 97% 97% 97% 97% 97% 97% 97% 97% 98% 98% 97% 97% 97% 97% 97% 97% 97% 97%) -> (29k/114k) -> write( 6% 5%)
|
||||
0:19:57 INF [osm_pass2:process] - Finished relations: 11,728,203 (54k/s) in 3m35s cpu:3h31m4s gc:5s avg:58.8
|
||||
0:19:57 INF [osm_pass2] - nodes: [ 8.8B 100% 0/s ] 92G ways: [ 992M 100% 0/s ] rels: [ 11M 100% 55k/s ] features: [ 2.7B 376k/s ] 212G blocks: [ 43k 100% 4/s ]
|
||||
cpus: 59.9 gc: 1% heap: 10G/32G direct: 54M postGC: 5.3G relInfo: 564M mpGeoms: 10G
|
||||
read( -%) -> (0/94) -> process( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%) -> (0/114k) -> write( -% -%)
|
||||
0:19:57 DEB [osm_pass2] - Processed 43,112 blocks:
|
||||
0:19:57 DEB [osm_pass2] - nodes: 8,860,666,091 (96M/s) in 1m32s cpu:1h28m19s gc:4s avg:57.8
|
||||
0:19:57 DEB [osm_pass2] - ways: 992,064,323 (1.3M/s) in 12m34s cpu:11h36m56s gc:40s avg:55.5
|
||||
0:19:57 DEB [osm_pass2] - relations: 11,728,203 (54k/s) in 3m35s cpu:3h31m4s gc:5s avg:58.8
|
||||
0:19:57 INF [osm_pass2] - Finished in 17m41s cpu:16h36m26s gc:48s avg:56.4
|
||||
0:19:57 INF [osm_pass2] - read 1x(0% 3s wait:16m59s done:37s)
|
||||
0:19:57 INF [osm_pass2] - process 62x(87% 15m20s block:7s wait:6s)
|
||||
0:19:57 INF [osm_pass2] - write 2x(38% 6m48s wait:10m18s)
|
||||
0:19:57 INF [boundaries] -
|
||||
0:19:57 INF [boundaries] - Starting...
|
||||
0:19:57 INF [boundaries] - Creating polygons for 218 boundaries
|
||||
0:20:03 INF [boundaries] - Finished creating 218 country polygons
|
||||
0:20:04 WAR [boundaries] - no left or right country for border between OSM country relations: [148838] around https://www.openstreetmap.org/#map=10/37.50088/-122.77084
|
||||
0:20:04 WAR [boundaries] - no left or right country for border between OSM country relations: [148838] around https://www.openstreetmap.org/#map=10/25.02075/-80.14817
|
||||
0:20:04 WAR [boundaries] - no left or right country for border between OSM country relations: [148838] around https://www.openstreetmap.org/#map=10/44.39315/-67.03956
|
||||
0:20:04 WAR [boundaries] - no left or right country for border between OSM country relations: [148838] around https://www.openstreetmap.org/#map=10/44.63496/-66.98339
|
||||
0:20:05 WAR [boundaries] - no left or right country for border between OSM country relations: [51477] around https://www.openstreetmap.org/#map=10/54.19118/7.52130
|
||||
0:20:05 WAR [boundaries] - no left or right country for border between OSM country relations: [51477] around https://www.openstreetmap.org/#map=10/54.61356/12.41358
|
||||
0:20:05 WAR [boundaries] - no left or right country for border between OSM country relations: [1428125] around https://www.openstreetmap.org/#map=10/69.82292/-141.00275
|
||||
0:20:05 WAR [boundaries] - no left or right country for border between OSM country relations: [1428125] around https://www.openstreetmap.org/#map=10/54.69762/-131.07388
|
||||
0:20:05 WAR [boundaries] - no left or right country for border between OSM country relations: [148838] around https://www.openstreetmap.org/#map=10/44.47493/-67.05737
|
||||
0:20:06 WAR [boundaries] - no left or right country for border between OSM country relations: [148838, 1428125] around https://www.openstreetmap.org/#map=10/44.31380/-67.20427
|
||||
0:20:06 WAR [boundaries] - no left or right country for border between OSM country relations: [148838, 1428125] around https://www.openstreetmap.org/#map=10/48.22766/-123.52594
|
||||
0:20:06 WAR [boundaries] - no left or right country for border between OSM country relations: [148838, 1428125] around https://www.openstreetmap.org/#map=10/49.00208/-122.90137
|
||||
0:20:06 WAR [boundaries] - no left or right country for border between OSM country relations: [148838, 1428125] around https://www.openstreetmap.org/#map=10/44.85574/-66.97773
|
||||
0:20:08 WAR [boundaries] - no left or right country for border between OSM country relations: [1428125] around https://www.openstreetmap.org/#map=10/69.68036/-141.00235
|
||||
0:20:08 WAR [boundaries] - no left or right country for border between OSM country relations: [1428125] around https://www.openstreetmap.org/#map=10/76.04680/-123.91190
|
||||
0:20:08 WAR [boundaries] - no left or right country for border between OSM country relations: [1428125] around https://www.openstreetmap.org/#map=10/50.91588/-129.68001
|
||||
0:20:08 WAR [boundaries] - no left or right country for border between OSM country relations: [1428125] around https://www.openstreetmap.org/#map=10/64.08494/-63.79846
|
||||
0:20:08 WAR [boundaries] - no left or right country for border between OSM country relations: [1428125] around https://www.openstreetmap.org/#map=10/79.49433/-71.58243
|
||||
0:20:08 WAR [boundaries] - no left or right country for border between OSM country relations: [1428125] around https://www.openstreetmap.org/#map=10/44.58597/-67.14976
|
||||
0:20:08 WAR [boundaries] - no left or right country for border between OSM country relations: [1428125] around https://www.openstreetmap.org/#map=10/44.99522/-61.11677
|
||||
0:20:08 WAR [boundaries] - no left or right country for border between OSM country relations: [51477] around https://www.openstreetmap.org/#map=10/50.01340/6.13601
|
||||
0:20:08 WAR [boundaries] - no left or right country for border between OSM country relations: [51477] around https://www.openstreetmap.org/#map=10/49.77642/6.51023
|
||||
0:20:08 WAR [boundaries] - no left or right country for border between OSM country relations: [148838, 1428125] around https://www.openstreetmap.org/#map=10/49.00207/-123.07119
|
||||
0:20:08 WAR [boundaries] - no left or right country for border between OSM country relations: [148838, 1428125] around https://www.openstreetmap.org/#map=10/45.26378/-71.36098
|
||||
0:20:08 WAR [boundaries] - no left or right country for border between OSM country relations: [148838, 1428125] around https://www.openstreetmap.org/#map=10/47.25611/-68.59617
|
||||
0:20:08 WAR [boundaries] - no left or right country for border between OSM country relations: [148838, 1428125] around https://www.openstreetmap.org/#map=10/47.35492/-68.36202
|
||||
0:20:08 WAR [boundaries] - no left or right country for border between OSM country relations: [148838, 1428125] around https://www.openstreetmap.org/#map=10/47.22749/-68.00727
|
||||
0:20:08 WAR [boundaries] - no left or right country for border between OSM country relations: [148838, 1428125] around https://www.openstreetmap.org/#map=10/47.16858/-67.93795
|
||||
0:20:08 WAR [boundaries] - no left or right country for border between OSM country relations: [148838, 1428125] around https://www.openstreetmap.org/#map=10/45.91031/-67.76265
|
||||
0:20:09 WAR [boundaries] - no left or right country for border between OSM country relations: [51477, 16239] around https://www.openstreetmap.org/#map=10/47.38554/10.16937
|
||||
0:20:09 WAR [boundaries] - no left or right country for border between OSM country relations: [51477, 16239] around https://www.openstreetmap.org/#map=10/47.67866/12.16969
|
||||
0:20:09 WAR [boundaries] - no left or right country for border between OSM country relations: [51477] around https://www.openstreetmap.org/#map=10/53.42387/6.88641
|
||||
0:20:09 INF [boundaries] - Finished in 13s cpu:16s avg:1.3
|
||||
0:20:09 INF [agg_stop] -
|
||||
0:20:09 INF [agg_stop] - Starting...
|
||||
0:20:09 INF [agg_stop] - Processing 28681 agg_stop sets
|
||||
0:20:10 INF [agg_stop] - Finished in 0.7s cpu:1s avg:2.1
|
||||
0:20:25 INF - Deleting node.db to make room for output file
|
||||
0:20:25 INF [sort] -
|
||||
0:20:25 INF [sort] - Starting...
|
||||
0:20:25 INF [sort] - Grouped 187 chunks into 178
|
||||
0:20:35 INF [sort] - chunks: [ 16 / 178 9% ] 212G
|
||||
cpus: 29.8 gc: 14% heap: 21G/32G direct: 54M postGC: 19G
|
||||
-> (157/184) -> worker(47% 45% 60% 47% 53%)
|
||||
0:20:45 INF [sort] - chunks: [ 29 / 178 16% ] 214G
|
||||
cpus: 27.1 gc: 7% heap: 12G/32G direct: 54M postGC: 10G
|
||||
-> (144/184) -> worker(53% 41% 40% 41% 39%)
|
||||
0:20:55 INF [sort] - chunks: [ 43 / 178 24% ] 215G
|
||||
cpus: 29.1 gc: 8% heap: 12G/32G direct: 54M postGC: 10G
|
||||
-> (130/184) -> worker(46% 47% 44% 45% 53%)
|
||||
0:21:05 INF [sort] - chunks: [ 61 / 178 34% ] 212G
|
||||
cpus: 27.4 gc: 10% heap: 9.8G/32G direct: 54M postGC: 9G
|
||||
-> (112/184) -> worker(46% 38% 47% 44% 40%)
|
||||
0:21:15 INF [sort] - chunks: [ 76 / 178 43% ] 212G
|
||||
cpus: 28.6 gc: 8% heap: 14G/32G direct: 54M postGC: 12G
|
||||
-> (97/184) -> worker(44% 46% 38% 50% 43%)
|
||||
0:21:26 INF [sort] - chunks: [ 89 / 178 50% ] 215G
|
||||
cpus: 29.9 gc: 8% heap: 13G/32G direct: 54M postGC: 9.5G
|
||||
-> (84/184) -> worker(42% 52% 55% 41% 42%)
|
||||
0:21:36 INF [sort] - chunks: [ 106 / 178 60% ] 212G
|
||||
cpus: 26.8 gc: 10% heap: 10G/32G direct: 54M postGC: 10G
|
||||
-> (67/184) -> worker(52% 41% 43% 49% 41%)
|
||||
0:21:46 INF [sort] - chunks: [ 122 / 178 69% ] 212G
|
||||
cpus: 27.9 gc: 9% heap: 19G/32G direct: 54M postGC: 18G
|
||||
-> (51/184) -> worker(44% 47% 46% 57% 47%)
|
||||
0:21:57 INF [sort] - chunks: [ 137 / 178 77% ] 213G
|
||||
cpus: 27.8 gc: 7% heap: 19G/32G direct: 54M postGC: 19G
|
||||
-> (36/184) -> worker(37% 35% 47% 43% 42%)
|
||||
0:22:07 INF [sort] - chunks: [ 149 / 178 84% ] 213G
|
||||
cpus: 29.8 gc: 7% heap: 11G/32G direct: 54M postGC: 11G
|
||||
-> (24/184) -> worker(34% 40% 44% 41% 32%)
|
||||
0:22:18 INF [sort] - chunks: [ 164 / 178 92% ] 216G
|
||||
cpus: 28 gc: 8% heap: 10G/32G direct: 54M postGC: 10G
|
||||
-> (9/184) -> worker(46% 43% 39% 42% 41%)
|
||||
0:22:25 INF [sort] - chunks: [ 178 / 178 100% ] 212G
|
||||
cpus: 22.6 gc: 8% heap: 6.3G/32G direct: 54M postGC: 6.3G
|
||||
-> (0/184) -> worker( -% -% -% -% -%)
|
||||
0:22:25 INF [sort] - Finished in 2m cpu:56m gc:10s avg:28.1
|
||||
0:22:25 INF [sort] - worker 5x(44% 53s wait:32s done:2s)
|
||||
0:22:25 INF - read:258s write:162s sort:169s
|
||||
0:22:25 INF [archive] -
|
||||
0:22:25 INF [archive] - Starting...
|
||||
0:22:27 INF [archive:write] - Starting z0
|
||||
0:22:27 INF [archive:write] - Finished z0 in 0s cpu:0s avg:4.2, now starting z1
|
||||
0:22:27 INF [archive:write] - Finished z1 in 0s cpu:1s avg:1,653.3, now starting z2
|
||||
0:22:27 INF [archive:write] - Finished z2 in 0s cpu:0.1s avg:12.2, now starting z3
|
||||
0:22:27 INF [archive:write] - Finished z3 in 0s cpu:2s avg:71.3, now starting z4
|
||||
0:22:28 INF [archive:write] - Finished z4 in 1s cpu:1m14s avg:55.4, now starting z5
|
||||
0:22:28 INF [archive:write] - Finished z5 in 0s cpu:0.1s avg:6.8, now starting z6
|
||||
0:22:31 INF [archive:write] - Finished z6 in 3s cpu:2m50s avg:59.1, now starting z7
|
||||
0:22:36 INF [archive] - features: [ 27M 1% 2.7M/s ] 212G tiles: [ 16k 1.6k/s ] 142M
|
||||
cpus: 58.9 gc: 12% heap: 21G/32G direct: 54M postGC: 7.5G
|
||||
read(33% 33%) -> merge(50%) -> (1.2k/1.6k) -> encode(81% 79% 80% 78% 82% 81% 79% 81% 82% 79% 78% 76% 79% 82% 78% 81% 83% 76% 81% 73% 81% 82% 77% 82% 81% 82% 81% 76% 79% 82% 78% 79% 79% 78% 82% 80% 79% 77% 78% 79% 79% 78% 78% 81% 80% 78% 83% 79% 80% 79% 81% 80% 78% 82% 79% 79% 79% 78% 77% 75% 79% 75%) -> (1.3k/1.6k) -> write( 1%)
|
||||
last tile: 7/77/41 (z7 85%) https://onthegomap.github.io/planetiler-demo/#7.5/53.32261/37.96875
|
||||
0:22:38 INF [archive:write] - Finished z7 in 8s cpu:7m42s avg:60.7, now starting z8
|
||||
0:22:46 INF [archive] - features: [ 62M 2% 3.4M/s ] 212G tiles: [ 31k 1.4k/s ] 223M
|
||||
cpus: 60.6 gc: 7% heap: 16G/32G direct: 54M postGC: 5.9G
|
||||
read(11% 11%) -> merge(18%) -> (25/1.6k) -> encode(92% 90% 89% 92% 91% 92% 91% 91% 91% 92% 91% 90% 91% 89% 89% 91% 90% 91% 86% 88% 90% 89% 91% 88% 90% 88% 91% 91% 88% 92% 89% 91% 91% 88% 90% 89% 89% 86% 92% 89% 90% 90% 90% 92% 91% 90% 92% 89% 89% 92% 91% 91% 88% 90% 90% 91% 89% 88% 90% 88% 91% 90%) -> (1.6k/1.6k) -> write( 0%)
|
||||
last tile: 8/70/107 (z8 18%) https://onthegomap.github.io/planetiler-demo/#8.5/27.68175/-80.85938
|
||||
0:22:49 INF [archive:write] - Finished z8 in 10s cpu:10m29s avg:60.7, now starting z9
|
||||
0:22:56 INF [archive] - features: [ 89M 3% 2.7M/s ] 212G tiles: [ 122k 9k/s ] 610M
|
||||
cpus: 60.7 gc: 7% heap: 6.4G/32G direct: 54M postGC: 6G
|
||||
read(20% 20%) -> merge(31%) -> (130/1.6k) -> encode(92% 88% 91% 91% 91% 91% 85% 88% 90% 91% 90% 89% 90% 89% 90% 90% 88% 85% 92% 91% 87% 88% 91% 90% 89% 92% 90% 92% 87% 90% 87% 91% 88% 92% 91% 91% 92% 92% 87% 89% 92% 91% 84% 91% 90% 90% 89% 86% 91% 89% 90% 88% 90% 89% 90% 88% 91% 92% 92% 90% 87% 90%) -> (1.6k/1.6k) -> write( 2%)
|
||||
last tile: 9/138/215 (z9 18%) https://onthegomap.github.io/planetiler-demo/#9.5/27.37133/-82.61719
|
||||
0:23:06 INF [archive] - features: [ 119M 4% 2.9M/s ] 212G tiles: [ 258k 13k/s ] 1.2G
|
||||
cpus: 60.3 gc: 7% heap: 17G/32G direct: 54M postGC: 13G
|
||||
read(26% 26%) -> merge(41%) -> (1.2k/1.6k) -> encode(92% 88% 90% 91% 88% 88% 88% 87% 89% 88% 87% 89% 91% 90% 90% 90% 88% 89% 87% 91% 86% 89% 91% 89% 89% 91% 89% 88% 90% 90% 91% 90% 88% 90% 90% 90% 91% 90% 88% 88% 90% 89% 89% 90% 89% 89% 90% 90% 88% 88% 91% 89% 91% 86% 88% 91% 91% 89% 91% 90% 87% 89%) -> (1.6k/1.6k) -> write( 4%)
|
||||
last tile: 9/377/170 (z9 87%) https://onthegomap.github.io/planetiler-demo/#9.5/51.39868/85.42969
|
||||
0:23:06 INF [archive:write] - Finished z9 in 18s cpu:17m38s gc:1s avg:60.4, now starting z10
|
||||
0:23:16 INF [archive] - features: [ 141M 5% 2.2M/s ] 212G tiles: [ 495k 23k/s ] 1.6G
|
||||
cpus: 41.6 gc: 5% heap: 17G/32G direct: 54M postGC: 10G
|
||||
read( 7% 7%) -> merge(11%) -> (0/1.6k) -> encode(61% 60% 61% 61% 60% 61% 61% 58% 61% 60% 60% 60% 62% 61% 61% 61% 94% 61% 61% 58% 61% 92% 57% 59% 61% 61% 87% 57% 60% 55% 61% 61% 59% 59% 59% 61% 60% 63% 58% 61% 58% 61% 60% 59% 60% 60% 61% 61% 58% 61% 60% 60% 60% 59% 62% 55% 60% 61% 61% 61% 62% 61%) -> (1.6k/1.6k) -> write( 2%)
|
||||
last tile: 10/172/399 (z10 20%) https://onthegomap.github.io/planetiler-demo/#10.5/36.73875/-119.35547
|
||||
0:23:26 INF [archive] - features: [ 144M 5% 270k/s ] 212G tiles: [ 552k 5.7k/s ] 1.7G
|
||||
cpus: 2.7 gc: 0% heap: 6.4G/32G direct: 54M postGC: 5.9G
|
||||
read( 2% 2%) -> merge( 4%) -> (0/1.6k) -> encode( 2% 2% 2% 3% 2% 2% 2% 2% 2% 2% 2% 3% 2% 2% 3% 2% 99% 2% 3% 2% 3% 21% 2% 2% 2% 3% 3% 2% 2% 2% 2% 3% 2% 3% 2% 2% 2% 2% 2% 2% 2% 2% 2% 3% 2% 3% 3% 2% 2% 3% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2%) -> (1.3k/1.6k) -> write( 1%)
|
||||
last tile: 10/59/719 (z10 31%) https://onthegomap.github.io/planetiler-demo/#10.5/-58.72248/-159.08203
|
||||
0:23:35 INF [archive:write] - Finished z10 in 29s cpu:16m26s gc:1s avg:34.1, now starting z11
|
||||
0:23:36 INF [archive] - features: [ 180M 7% 3.5M/s ] 212G tiles: [ 1.6M 110k/s ] 3G
|
||||
cpus: 60.7 gc: 7% heap: 16G/32G direct: 54M postGC: 5.3G
|
||||
read(30% 30%) -> merge(49%) -> (975/1.6k) -> encode(89% 91% 91% 88% 90% 90% 90% 90% 90% 91% 86% 86% 91% 88% 87% 89% 88% 88% 90% 89% 87% 90% 90% 90% 91% 88% 90% 91% 91% 89% 87% 90% 91% 87% 88% 90% 88% 90% 91% 88% 90% 89% 90% 90% 91% 91% 88% 86% 86% 86% 90% 88% 90% 87% 90% 87% 88% 88% 87% 86% 87% 89%) -> (1.1k/1.6k) -> write( 9%)
|
||||
last tile: 11/564/765 (z11 13%) https://onthegomap.github.io/planetiler-demo/#11.5/41.31079/-80.77148
|
||||
0:23:46 INF [archive] - features: [ 210M 8% 2.9M/s ] 212G tiles: [ 2.9M 124k/s ] 3.9G
|
||||
cpus: 42 gc: 5% heap: 10G/32G direct: 54M postGC: 5.6G
|
||||
read(13% 13%) -> merge(24%) -> (47/1.6k) -> encode(60% 83% 60% 60% 59% 57% 60% 60% 60% 56% 62% 57% 84% 60% 59% 61% 59% 59% 82% 60% 58% 60% 58% 60% 60% 60% 58% 62% 60% 57% 60% 60% 59% 56% 59% 59% 61% 59% 59% 61% 57% 60% 60% 59% 59% 59% 62% 60% 59% 81% 60% 62% 59% 60% 61% 60% 60% 60% 93% 60% 60% 60%) -> (797/1.6k) -> write( 7%)
|
||||
last tile: 11/1140/1024 (z11 50%) https://onthegomap.github.io/planetiler-demo/#11.5/-0.08789/20.47852
|
||||
0:23:56 INF [archive] - features: [ 262M 10% 5.2M/s ] 212G tiles: [ 3.9M 98k/s ] 5.7G
|
||||
cpus: 60.9 gc: 8% heap: 7.4G/32G direct: 54M postGC: 6.2G
|
||||
read(38% 38%) -> merge(68%) -> (1.4k/1.6k) -> encode(90% 90% 88% 89% 90% 90% 88% 88% 89% 90% 88% 91% 90% 87% 88% 89% 88% 85% 89% 88% 88% 89% 89% 89% 89% 90% 90% 87% 91% 90% 91% 87% 89% 88% 89% 87% 89% 91% 88% 88% 89% 90% 86% 91% 90% 90% 88% 89% 88% 88% 88% 89% 89% 90% 87% 89% 89% 89% 88% 88% 90% 89%) -> (1.6k/1.6k) -> write(11%)
|
||||
last tile: 11/1147/611 (z11 85%) https://onthegomap.github.io/planetiler-demo/#11.5/58.49366/21.70898
|
||||
0:23:59 INF [archive:write] - Finished z11 in 23s cpu:20m28s gc:2s avg:52.7, now starting z12
|
||||
0:24:06 INF [archive] - features: [ 326M 12% 6.3M/s ] 212G tiles: [ 7.4M 355k/s ] 7.6G
|
||||
cpus: 60.6 gc: 9% heap: 8.9G/32G direct: 54M postGC: 7.7G
|
||||
read(40% 40%) -> merge(62%) -> (1.1k/1.6k) -> encode(88% 90% 90% 88% 90% 88% 90% 90% 90% 89% 88% 90% 88% 88% 89% 89% 89% 87% 89% 89% 89% 90% 89% 89% 89% 87% 89% 89% 89% 90% 88% 89% 90% 89% 89% 88% 87% 89% 89% 89% 89% 88% 90% 88% 87% 90% 89% 90% 89% 88% 89% 88% 89% 87% 90% 89% 88% 90% 88% 89% 90% 87%) -> (1.3k/1.6k) -> write(18%)
|
||||
last tile: 12/942/1810 (z12 19%) https://onthegomap.github.io/planetiler-demo/#12.5/20.42701/-97.16309
|
||||
0:24:16 INF [archive] - features: [ 396M 15% 6.9M/s ] 212G tiles: [ 13M 628k/s ] 9.3G
|
||||
cpus: 56.9 gc: 9% heap: 10G/32G direct: 54M postGC: 7.4G
|
||||
read(38% 39%) -> merge(58%) -> (229/1.6k) -> encode(84% 83% 81% 82% 83% 82% 82% 83% 82% 81% 84% 83% 82% 83% 83% 84% 82% 83% 82% 80% 83% 82% 84% 83% 84% 83% 81% 81% 82% 81% 80% 83% 84% 83% 83% 83% 82% 82% 81% 82% 80% 81% 82% 80% 80% 82% 83% 82% 83% 80% 82% 82% 81% 83% 82% 83% 81% 80% 82% 82% 82% 82%) -> (769/1.6k) -> write(21%)
|
||||
last tile: 12/3857/2166 (z12 75%) https://onthegomap.github.io/planetiler-demo/#12.5/-10.35815/159.03809
|
||||
0:24:26 INF [archive] - features: [ 474M 17% 7.8M/s ] 212G tiles: [ 15M 143k/s ] 11G
|
||||
cpus: 61 gc: 10% heap: 8G/32G direct: 54M postGC: 5.2G
|
||||
read(48% 48%) -> merge(81%) -> (698/1.6k) -> encode(89% 87% 87% 87% 88% 88% 88% 90% 89% 89% 89% 88% 89% 89% 87% 89% 89% 88% 89% 89% 89% 89% 87% 90% 88% 89% 85% 87% 88% 88% 89% 88% 88% 88% 89% 89% 89% 88% 88% 90% 88% 89% 88% 87% 88% 89% 90% 89% 87% 88% 88% 90% 89% 88% 89% 89% 88% 89% 89% 87% 89% 89%) -> (785/1.6k) -> write(19%)
|
||||
last tile: 12/2356/1280 (z12 85%) https://onthegomap.github.io/planetiler-demo/#12.5/55.75184/27.11426
|
||||
0:24:36 INF [archive] - features: [ 536M 20% 6.1M/s ] 212G tiles: [ 15M 21k/s ] 13G
|
||||
cpus: 60.9 gc: 9% heap: 21G/32G direct: 54M postGC: 7.2G
|
||||
read(44% 45%) -> merge(59%) -> (1.3k/1.6k) -> encode(90% 88% 90% 89% 90% 89% 89% 90% 89% 89% 90% 89% 90% 90% 88% 90% 89% 89% 90% 90% 90% 90% 87% 89% 90% 88% 88% 88% 89% 88% 88% 88% 88% 88% 89% 88% 90% 89% 89% 89% 90% 89% 90% 89% 88% 89% 87% 88% 89% 87% 90% 87% 90% 89% 90% 89% 88% 90% 88% 90% 88% 89%) -> (1.6k/1.6k) -> write( 9%)
|
||||
last tile: 12/2438/1107 (z12 86%) https://onthegomap.github.io/planetiler-demo/#12.5/63.41119/34.32129
|
||||
0:24:38 INF [archive:write] - Finished z12 in 39s cpu:38m58s gc:4s avg:59.6, now starting z13
|
||||
0:24:46 INF [archive] - features: [ 620M 23% 8.4M/s ] 212G tiles: [ 28M 1.3M/s ] 16G
|
||||
cpus: 58.3 gc: 7% heap: 13G/32G direct: 54M postGC: 5.8G
|
||||
read(47% 44%) -> merge(72%) -> (33/1.6k) -> encode(86% 86% 87% 86% 86% 87% 87% 86% 85% 86% 86% 86% 86% 86% 87% 86% 86% 87% 87% 86% 86% 85% 85% 87% 86% 87% 87% 86% 86% 86% 85% 85% 86% 86% 86% 86% 87% 86% 87% 85% 86% 87% 86% 87% 85% 87% 86% 87% 86% 86% 87% 85% 86% 87% 87% 86% 86% 86% 87% 85% 86% 87%) -> (129/1.6k) -> write(42%)
|
||||
last tile: 13/2261/3091 (z13 18%) https://onthegomap.github.io/planetiler-demo/#13.5/40.32979/-80.61768
|
||||
0:24:56 INF [archive] - features: [ 705M 26% 8.4M/s ] 212G tiles: [ 43M 1.4M/s ] 18G
|
||||
cpus: 53.4 gc: 7% heap: 10G/32G direct: 54M postGC: 5.4G
|
||||
read(50% 53%) -> merge(78%) -> (23/1.6k) -> encode(78% 78% 77% 79% 77% 77% 77% 78% 77% 79% 78% 78% 79% 77% 78% 78% 78% 77% 78% 78% 78% 77% 78% 79% 79% 77% 78% 78% 78% 77% 77% 78% 78% 78% 78% 77% 78% 78% 78% 78% 78% 77% 77% 77% 78% 77% 78% 78% 78% 79% 77% 78% 79% 77% 78% 78% 78% 78% 78% 79% 78% 78%) -> (163/1.6k) -> write(36%)
|
||||
last tile: 13/3001/4658 (z13 47%) https://onthegomap.github.io/planetiler-demo/#13.5/-23.98625/-48.09814
|
||||
0:25:06 INF [archive] - features: [ 781M 29% 7.5M/s ] 212G tiles: [ 56M 1.3M/s ] 20G
|
||||
cpus: 56.8 gc: 8% heap: 8.4G/32G direct: 54M postGC: 6.2G
|
||||
read(48% 49%) -> merge(79%) -> (1.3k/1.6k) -> encode(81% 82% 81% 82% 80% 82% 81% 82% 82% 83% 80% 82% 83% 83% 83% 79% 81% 84% 81% 83% 82% 82% 81% 81% 82% 81% 80% 83% 82% 82% 81% 81% 82% 84% 82% 82% 81% 82% 82% 83% 82% 82% 82% 82% 82% 81% 82% 84% 83% 82% 81% 82% 82% 81% 82% 82% 82% 83% 81% 83% 81% 81%) -> (1.4k/1.6k) -> write(45%)
|
||||
last tile: 13/6588/3342 (z13 80%) https://onthegomap.github.io/planetiler-demo/#13.5/31.40991/109.53369
|
||||
0:25:16 INF [archive] - features: [ 870M 32% 8.9M/s ] 212G tiles: [ 59M 268k/s ] 23G
|
||||
cpus: 59.7 gc: 6% heap: 15G/32G direct: 54M postGC: 4.6G
|
||||
read(53% 56%) -> merge(66%) -> (52/1.6k) -> encode(88% 89% 89% 88% 88% 87% 89% 88% 89% 90% 89% 88% 88% 89% 88% 90% 86% 89% 90% 88% 89% 89% 89% 89% 88% 86% 86% 89% 90% 89% 89% 88% 89% 89% 89% 89% 89% 88% 90% 89% 89% 89% 88% 88% 87% 90% 86% 84% 90% 89% 86% 90% 89% 88% 88% 90% 89% 89% 89% 89% 89% 89%) -> (182/1.6k) -> write(35%)
|
||||
last tile: 13/4865/2602 (z13 85%) https://onthegomap.github.io/planetiler-demo/#13.5/54.71193/33.81592
|
||||
0:25:26 INF [archive] - features: [ 957M 35% 8.6M/s ] 212G tiles: [ 60M 39k/s ] 26G
|
||||
cpus: 57.6 gc: 5% heap: 20G/32G direct: 54M postGC: 4.4G
|
||||
read(69% 69%) -> merge(78%) -> (4/1.6k) -> encode(86% 85% 87% 87% 85% 87% 86% 86% 87% 86% 87% 86% 86% 88% 87% 86% 86% 86% 85% 87% 86% 86% 85% 85% 86% 86% 86% 85% 86% 84% 86% 86% 87% 86% 86% 86% 87% 86% 86% 86% 84% 86% 87% 86% 87% 86% 85% 87% 86% 86% 87% 87% 87% 86% 86% 86% 86% 87% 86% 87% 86% 86%) -> (70/1.6k) -> write(16%)
|
||||
last tile: 13/4578/2628 (z13 85%) https://onthegomap.github.io/planetiler-demo/#13.5/54.04649/21.20361
|
||||
0:25:34 INF [archive:write] - Finished z13 in 56s cpu:53m22s gc:4s avg:57.1, now starting z14
|
||||
0:25:36 INF [archive] - features: [ 1B 37% 6.2M/s ] 212G tiles: [ 85M 2.5M/s ] 28G
|
||||
cpus: 49.6 gc: 6% heap: 7G/32G direct: 54M postGC: 5.7G
|
||||
read(37% 29%) -> merge(60%) -> (585/1.6k) -> encode(73% 73% 73% 72% 73% 72% 74% 72% 73% 73% 71% 73% 73% 74% 73% 73% 73% 73% 72% 73% 72% 73% 73% 74% 73% 74% 73% 72% 73% 72% 73% 73% 73% 73% 73% 72% 74% 72% 72% 71% 73% 73% 73% 71% 74% 74% 73% 73% 73% 71% 74% 73% 72% 74% 73% 73% 73% 73% 73% 73% 73% 73%) -> (780/1.6k) -> write(50%)
|
||||
last tile: 14/4453/1160 (z14 7%) https://onthegomap.github.io/planetiler-demo/#14.5/82.28386/-82.14478
|
||||
0:25:46 INF [archive] - features: [ 1.1B 41% 9.7M/s ] 212G tiles: [ 105M 2M/s ] 31G
|
||||
cpus: 45.3 gc: 5% heap: 18G/32G direct: 54M postGC: 7G
|
||||
read(51% 52%) -> merge(90%) -> (0/1.6k) -> encode(66% 66% 66% 66% 67% 65% 66% 66% 64% 67% 66% 64% 66% 64% 66% 65% 66% 66% 66% 65% 67% 67% 66% 66% 66% 66% 65% 66% 66% 66% 66% 66% 66% 66% 66% 64% 67% 65% 66% 65% 67% 66% 66% 67% 65% 66% 65% 66% 66% 67% 66% 65% 65% 66% 67% 66% 65% 65% 66% 66% 66% 67%) -> (53/1.6k) -> write(47%)
|
||||
last tile: 14/7840/5268 (z14 15%) https://onthegomap.github.io/planetiler-demo/#14.5/53.89786/-7.72339
|
||||
0:25:56 INF [archive] - features: [ 1.2B 45% 10M/s ] 212G tiles: [ 109M 405k/s ] 33G
|
||||
cpus: 41 gc: 5% heap: 20G/32G direct: 54M postGC: 7.2G
|
||||
read(58% 57%) -> merge(95%) -> (0/1.6k) -> encode(59% 60% 60% 59% 60% 58% 59% 59% 59% 59% 59% 59% 59% 59% 59% 60% 60% 60% 59% 60% 60% 59% 61% 60% 60% 60% 60% 60% 58% 59% 59% 60% 58% 59% 59% 59% 60% 60% 60% 60% 59% 59% 61% 58% 60% 59% 60% 60% 59% 60% 58% 60% 59% 58% 60% 59% 59% 60% 58% 60% 60% 59%) -> (83/1.6k) -> write(20%)
|
||||
last tile: 14/7869/7671 (z14 17%) https://onthegomap.github.io/planetiler-demo/#14.5/11.36157/-7.08618
|
||||
0:26:06 INF [archive] - features: [ 1.3B 49% 10M/s ] 212G tiles: [ 114M 480k/s ] 35G
|
||||
cpus: 44.8 gc: 5% heap: 12G/32G direct: 54M postGC: 7.2G
|
||||
read(57% 56%) -> merge(94%) -> (0/1.6k) -> encode(64% 65% 65% 64% 66% 64% 65% 63% 65% 65% 66% 65% 65% 64% 66% 64% 66% 65% 66% 64% 64% 66% 63% 66% 65% 66% 65% 64% 66% 66% 66% 66% 64% 65% 67% 65% 65% 66% 64% 65% 66% 64% 65% 66% 67% 65% 65% 64% 65% 66% 66% 65% 66% 65% 65% 65% 66% 65% 64% 65% 66% 65%) -> (212/1.6k) -> write(23%)
|
||||
last tile: 14/4277/7627 (z14 18%) https://onthegomap.github.io/planetiler-demo/#14.5/12.3078/-86.01196
|
||||
0:26:16 INF [archive] - features: [ 1.4B 52% 10M/s ] 212G tiles: [ 119M 500k/s ] 38G
|
||||
cpus: 48.9 gc: 5% heap: 25G/32G direct: 54M postGC: 7.9G
|
||||
read(58% 58%) -> merge(93%) -> (16/1.6k) -> encode(69% 73% 72% 71% 73% 70% 72% 71% 72% 71% 73% 71% 71% 71% 71% 71% 72% 71% 71% 70% 72% 72% 72% 71% 73% 69% 72% 72% 72% 71% 71% 71% 71% 72% 72% 71% 72% 71% 71% 73% 73% 72% 71% 70% 72% 72% 72% 70% 71% 73% 70% 71% 72% 70% 72% 70% 71% 69% 70% 71% 71% 71%) -> (102/1.6k) -> write(32%)
|
||||
last tile: 14/4009/6240 (z14 20%) https://onthegomap.github.io/planetiler-demo/#14.5/39.35978/-91.90063
|
||||
0:26:26 INF [archive] - features: [ 1.5B 55% 8.4M/s ] 212G tiles: [ 155M 3.6M/s ] 40G
|
||||
cpus: 42.5 gc: 5% heap: 9.4G/32G direct: 54M postGC: 3.9G
|
||||
read(38% 32%) -> merge(81%) -> (0/1.6k) -> encode(60% 59% 61% 62% 62% 60% 62% 61% 60% 61% 58% 61% 61% 61% 60% 61% 60% 60% 61% 61% 61% 61% 59% 61% 61% 61% 59% 61% 61% 59% 60% 61% 59% 61% 61% 60% 61% 60% 59% 61% 61% 62% 60% 59% 60% 61% 60% 59% 60% 60% 61% 60% 60% 61% 61% 61% 62% 61% 61% 61% 61% 61%) -> (73/1.6k) -> write(61%)
|
||||
last tile: 14/6103/13203 (z14 38%) https://onthegomap.github.io/planetiler-demo/#14.5/-73.34991/-45.88989
|
||||
0:26:36 INF [archive] - features: [ 1.6B 59% 9.3M/s ] 212G tiles: [ 179M 2.3M/s ] 42G
|
||||
cpus: 48.3 gc: 6% heap: 13G/32G direct: 54M postGC: 6G
|
||||
read(54% 53%) -> merge(90%) -> (0/1.6k) -> encode(70% 70% 68% 71% 70% 69% 68% 68% 70% 71% 68% 69% 70% 68% 69% 70% 70% 68% 70% 70% 71% 70% 70% 68% 67% 70% 71% 70% 70% 70% 69% 70% 69% 70% 70% 70% 71% 70% 69% 69% 68% 69% 69% 69% 68% 70% 70% 69% 70% 68% 71% 71% 70% 72% 71% 70% 69% 70% 68% 70% 69% 70%) -> (60/1.6k) -> write(54%)
|
||||
last tile: 14/9599/9457 (z14 51%) https://onthegomap.github.io/planetiler-demo/#14.5/-26.77504/30.92651
|
||||
0:26:46 INF [archive] - features: [ 1.7B 63% 10M/s ] 212G tiles: [ 208M 2.8M/s ] 44G
|
||||
cpus: 29.5 gc: 4% heap: 11G/32G direct: 54M postGC: 8G
|
||||
read(45% 46%) -> merge(95%) -> (0/1.6k) -> encode(40% 42% 42% 43% 39% 42% 41% 40% 40% 41% 40% 40% 40% 41% 41% 41% 41% 40% 40% 41% 42% 41% 41% 40% 42% 42% 41% 41% 41% 42% 39% 41% 41% 41% 42% 41% 41% 40% 41% 40% 40% 43% 41% 42% 40% 41% 41% 41% 41% 39% 42% 41% 42% 42% 41% 40% 42% 42% 41% 41% 43% 41%) -> (701/1.6k) -> write(34%)
|
||||
last tile: 14/13069/8830 (z14 73%) https://onthegomap.github.io/planetiler-demo/#14.5/-13.89141/107.17163
|
||||
0:26:56 WAR [archive:encode] - {x=14553 y=6450 z=14} 1312kb uncompressed
|
||||
0:26:57 INF [archive] - features: [ 1.8B 66% 10M/s ] 212G tiles: [ 217M 865k/s ] 46G
|
||||
cpus: 36.2 gc: 6% heap: 9.5G/32G direct: 55M postGC: 4.8G
|
||||
read(54% 53%) -> merge(92%) -> (0/1.6k) -> encode(52% 50% 50% 50% 51% 50% 50% 51% 50% 51% 49% 50% 49% 52% 50% 50% 51% 50% 49% 51% 52% 50% 50% 50% 48% 50% 48% 49% 49% 49% 50% 51% 50% 50% 53% 51% 50% 51% 50% 51% 49% 49% 51% 51% 50% 49% 50% 51% 50% 51% 50% 49% 51% 49% 51% 49% 49% 52% 49% 49% 51% 52%) -> (96/1.6k) -> write(24%)
|
||||
last tile: 14/14519/6368 (z14 76%) https://onthegomap.github.io/planetiler-demo/#14.5/37.15156/139.03198
|
||||
0:27:06 WAR [archive:encode] - {x=13722 y=7013 z=14} 1078kb uncompressed
|
||||
0:27:07 INF [archive] - features: [ 1.8B 70% 8.4M/s ] 212G tiles: [ 225M 800k/s ] 48G
|
||||
cpus: 54.9 gc: 8% heap: 20G/32G direct: 55M postGC: 7.6G
|
||||
read(52% 48%) -> merge(82%) -> (75/1.6k) -> encode(79% 76% 80% 74% 77% 78% 74% 79% 77% 72% 78% 79% 79% 79% 78% 76% 77% 79% 79% 79% 75% 77% 76% 79% 77% 75% 74% 79% 80% 77% 77% 76% 79% 75% 77% 75% 74% 80% 73% 76% 78% 79% 77% 77% 74% 77% 80% 73% 80% 74% 76% 80% 76% 78% 74% 76% 76% 77% 75% 77% 80% 75%) -> (396/1.6k) -> write(52%)
|
||||
last tile: 14/13359/7156 (z14 80%) https://onthegomap.github.io/planetiler-demo/#14.5/22.17723/113.5437
|
||||
0:27:17 INF [archive] - features: [ 2B 73% 10M/s ] 212G tiles: [ 229M 381k/s ] 51G
|
||||
cpus: 43.2 gc: 6% heap: 14G/32G direct: 55M postGC: 6.9G
|
||||
read(53% 54%) -> merge(92%) -> (87/1.6k) -> encode(63% 61% 61% 61% 63% 59% 61% 61% 60% 61% 62% 60% 62% 64% 62% 60% 63% 61% 61% 63% 62% 62% 63% 63% 62% 62% 62% 63% 61% 61% 63% 60% 61% 61% 63% 61% 60% 62% 63% 60% 60% 63% 62% 62% 63% 63% 61% 60% 62% 61% 63% 62% 63% 63% 61% 63% 62% 63% 62% 61% 62% 61%) -> (190/1.6k) -> write(30%)
|
||||
last tile: 14/11587/6784 (z14 82%) https://onthegomap.github.io/planetiler-demo/#14.5/29.52567/74.60815
|
||||
0:27:27 INF [archive] - features: [ 2.1B 77% 10M/s ] 212G tiles: [ 233M 424k/s ] 53G
|
||||
cpus: 46.4 gc: 5% heap: 22G/32G direct: 55M postGC: 6G
|
||||
read(54% 54%) -> merge(94%) -> (0/1.6k) -> encode(69% 69% 67% 67% 68% 69% 68% 67% 67% 66% 69% 67% 69% 68% 66% 66% 68% 68% 68% 69% 67% 68% 69% 65% 67% 65% 66% 67% 68% 67% 66% 67% 68% 69% 68% 68% 67% 68% 67% 68% 67% 68% 69% 68% 67% 68% 66% 66% 68% 67% 67% 68% 67% 67% 68% 68% 68% 69% 66% 68% 67% 67%) -> (46/1.6k) -> write(43%)
|
||||
last tile: 14/9617/6753 (z14 84%) https://onthegomap.github.io/planetiler-demo/#14.5/30.11662/31.32202
|
||||
0:27:37 INF [archive] - features: [ 2.2B 81% 10M/s ] 212G tiles: [ 234M 157k/s ] 56G
|
||||
cpus: 48.4 gc: 5% heap: 9.9G/32G direct: 55M postGC: 6.6G
|
||||
read(73% 75%) -> merge(94%) -> (0/1.6k) -> encode(72% 71% 70% 70% 70% 70% 72% 71% 69% 70% 71% 71% 70% 69% 70% 70% 69% 72% 71% 70% 70% 70% 68% 71% 70% 70% 70% 69% 70% 70% 70% 71% 68% 70% 70% 70% 70% 71% 71% 70% 70% 71% 70% 70% 71% 71% 72% 71% 71% 70% 69% 71% 69% 71% 71% 69% 70% 70% 70% 70% 70% 70%) -> (53/1.6k) -> write(34%)
|
||||
last tile: 14/9080/5877 (z14 85%) https://onthegomap.github.io/planetiler-demo/#14.5/45.25169/19.52271
|
||||
0:27:42 WAR [archive:encode] - {x=8290 y=6119 z=14} 1067kb uncompressed
|
||||
0:27:42 WAR [archive:encode] - {x=8290 y=6118 z=14} 1081kb uncompressed
|
||||
0:27:47 INF [archive] - features: [ 2.3B 85% 10M/s ] 212G tiles: [ 235M 31k/s ] 59G
|
||||
cpus: 39.7 gc: 5% heap: 19G/32G direct: 55M postGC: 6.7G
|
||||
read(75% 77%) -> merge(95%) -> (0/1.6k) -> encode(56% 57% 57% 56% 56% 57% 57% 57% 57% 57% 58% 57% 58% 57% 58% 58% 56% 55% 57% 57% 58% 57% 57% 57% 56% 57% 56% 55% 56% 57% 56% 57% 57% 57% 57% 57% 56% 57% 56% 55% 57% 56% 58% 58% 57% 57% 57% 56% 56% 56% 57% 58% 57% 57% 57% 56% 57% 57% 57% 56% 57% 56%) -> (139/1.6k) -> write(13%)
|
||||
last tile: 14/8298/5636 (z14 85%) https://onthegomap.github.io/planetiler-demo/#14.5/48.85749/2.34009
|
||||
0:27:57 INF [archive] - features: [ 2.4B 89% 10M/s ] 212G tiles: [ 235M 13k/s ] 61G
|
||||
cpus: 35 gc: 4% heap: 12G/32G direct: 55M postGC: 6.7G
|
||||
read(67% 70%) -> merge(96%) -> (0/1.6k) -> encode(50% 50% 49% 50% 50% 51% 49% 49% 50% 49% 50% 49% 50% 50% 50% 50% 51% 50% 50% 51% 49% 49% 51% 50% 49% 49% 50% 49% 50% 50% 50% 49% 50% 50% 50% 50% 49% 49% 50% 50% 50% 50% 49% 48% 50% 49% 49% 50% 50% 49% 50% 50% 50% 49% 51% 50% 51% 50% 51% 51% 49% 50%) -> (34/1.6k) -> write(10%)
|
||||
last tile: 14/8547/5523 (z14 85%) https://onthegomap.github.io/planetiler-demo/#14.5/50.4645/7.81128
|
||||
0:28:07 INF [archive] - features: [ 2.5B 92% 10M/s ] 212G tiles: [ 235M 28k/s ] 62G
|
||||
cpus: 33 gc: 4% heap: 20G/32G direct: 55M postGC: 6.8G
|
||||
read(63% 66%) -> merge(96%) -> (0/1.6k) -> encode(47% 47% 47% 46% 47% 47% 48% 48% 47% 47% 47% 46% 47% 46% 46% 46% 48% 47% 46% 46% 47% 47% 47% 47% 47% 46% 46% 45% 47% 49% 48% 47% 46% 46% 47% 47% 46% 47% 47% 48% 48% 48% 46% 47% 46% 47% 47% 48% 48% 47% 48% 47% 48% 45% 47% 48% 47% 47% 47% 47% 47% 47%) -> (36/1.6k) -> write(10%)
|
||||
last tile: 14/8734/5460 (z14 85%) https://onthegomap.github.io/planetiler-demo/#14.5/51.33748/11.92017
|
||||
0:28:17 INF [archive] - features: [ 2.6B 96% 10M/s ] 212G tiles: [ 236M 126k/s ] 65G
|
||||
cpus: 43.2 gc: 5% heap: 23G/32G direct: 55M postGC: 8.3G
|
||||
read(61% 63%) -> merge(94%) -> (343/1.6k) -> encode(62% 63% 62% 64% 64% 63% 62% 63% 62% 63% 62% 64% 62% 63% 63% 63% 62% 63% 63% 63% 62% 62% 63% 63% 64% 62% 63% 63% 63% 63% 62% 62% 62% 63% 60% 62% 63% 63% 62% 62% 63% 62% 62% 62% 62% 63% 62% 62% 62% 62% 64% 62% 62% 63% 64% 63% 63% 63% 62% 63% 62% 63%) -> (507/1.6k) -> write(23%)
|
||||
last tile: 14/9423/4203 (z14 86%) https://onthegomap.github.io/planetiler-demo/#14.5/65.55391/27.05933
|
||||
0:28:27 INF [archive] - features: [ 2.7B 100% 9.3M/s ] 212G tiles: [ 258M 2.1M/s ] 68G
|
||||
cpus: 48.8 gc: 5% heap: 16G/32G direct: 55M postGC: 9.7G
|
||||
read(47% 51%) -> merge(85%) -> (0/1.6k) -> encode(70% 72% 70% 71% 72% 72% 71% 72% 72% 70% 72% 70% 69% 72% 72% 72% 72% 72% 73% 72% 71% 72% 70% 72% 71% 73% 72% 72% 70% 73% 71% 72% 71% 72% 71% 72% 72% 70% 72% 71% 71% 70% 71% 71% 71% 71% 72% 72% 70% 71% 72% 72% 72% 72% 70% 72% 72% 72% 72% 69% 72% 73%) -> (21/1.6k) -> write(69%)
|
||||
last tile: 14/13710/1873 (z14 95%) https://onthegomap.github.io/planetiler-demo/#14.5/79.8685/121.2561
|
||||
0:28:29 INF [archive:write] - Finished z14 in 2m55s cpu:2h3m45s gc:9s avg:42.5
|
||||
0:28:29 INF [archive:write] - Building directories with 14066 entries per leaf, attempt 1...
|
||||
0:28:36 INF [archive:write] - Built directories with 3501 leaves, 16460B root directory
|
||||
0:28:36 INF [archive:write] - Building directories with 16879 entries per leaf, attempt 2...
|
||||
0:28:37 INF [archive] - features: [ 2.7B 100% 1.2M/s ] 212G tiles: [ 270M 1.1M/s ] 68G
|
||||
cpus: 5.8 gc: 0% heap: 9G/32G direct: 55M postGC: 8.9G
|
||||
read( -% -%) -> merge( -%) -> (0/1.6k) -> encode( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%) -> (0/1.6k) -> write(97%)
|
||||
last tile: 14/16383/0 (z14 100%) https://onthegomap.github.io/planetiler-demo/#14.5/85.05018/179.98901
|
||||
0:28:44 INF [archive:write] - Built directories with 2917 leaves, 14091B root directory
|
||||
0:28:44 INF [archive:write] - Writing metadata and leaf directories...
|
||||
0:28:44 INF [archive:write] - Writing header...
|
||||
0:28:44 INF [archive:write] - # addressed tiles: 270230645
|
||||
0:28:44 INF [archive:write] - # of tile entries: 49231864
|
||||
0:28:44 INF [archive:write] - # of tile contents: 40212132
|
||||
0:28:44 INF [archive:write] - Root directory: 14kB
|
||||
0:28:44 INF [archive:write] - # leaves: 2917
|
||||
0:28:44 INF [archive:write] - Leaf directories: 87MB
|
||||
0:28:44 INF [archive:write] - Avg leaf size: 29kB
|
||||
0:28:44 INF [archive:write] - Total dir bytes: 87MB
|
||||
0:28:44 INF [archive:write] - Average bytes per addressed tile: 0.3225992077989526
|
||||
0:28:44 INF [archive] - features: [ 2.7B 100% 0/s ] 212G tiles: [ 270M 0/s ] 68G
|
||||
cpus: 1.1 gc: 0% heap: 8.9G/32G direct: 141M postGC: 8.9G
|
||||
read( -% -%) -> merge( -%) -> (0/1.6k) -> encode( -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -% -%) -> (0/1.6k) -> write( -%)
|
||||
last tile: 14/16383/0 (z14 100%) https://onthegomap.github.io/planetiler-demo/#14.5/85.05018/179.98901
|
||||
0:28:44 DEB [archive] - Tile stats:
|
||||
0:28:44 DEB [archive] - Biggest tiles (gzipped)
|
||||
1. 14/14553/6450 (751k) https://onthegomap.github.io/planetiler-demo/#14.5/35.70192/139.77905 (poi:988k)
|
||||
2. 14/8290/6118 (675k) https://onthegomap.github.io/planetiler-demo/#14.5/41.40154/2.16431 (poi:536k)
|
||||
3. 14/8290/6119 (661k) https://onthegomap.github.io/planetiler-demo/#14.5/41.38505/2.16431 (poi:611k)
|
||||
4. 14/13722/7013 (616k) https://onthegomap.github.io/planetiler-demo/#14.5/25.05574/121.51978 (poi:684k)
|
||||
5. 14/6437/8362 (592k) https://onthegomap.github.io/planetiler-demo/#14.5/-3.74367/-38.55103 (building:605k)
|
||||
6. 14/7990/6392 (591k) https://onthegomap.github.io/planetiler-demo/#14.5/36.73008/-4.42749 (building:380k)
|
||||
7. 14/13722/7014 (587k) https://onthegomap.github.io/planetiler-demo/#14.5/25.03584/121.51978 (poi:625k)
|
||||
8. 14/14552/6450 (578k) https://onthegomap.github.io/planetiler-demo/#14.5/35.70192/139.75708 (poi:746k)
|
||||
9. 14/6435/8361 (573k) https://onthegomap.github.io/planetiler-demo/#14.5/-3.72175/-38.59497 (building:710k)
|
||||
10. 14/6436/8361 (558k) https://onthegomap.github.io/planetiler-demo/#14.5/-3.72175/-38.573 (building:607k)
|
||||
0:28:44 INF [archive] - Other tiles with large layers
|
||||
14/8414/5384 (313k) https://onthegomap.github.io/planetiler-demo/#14.5/52.36889/4.88892 (housenumber:313k)
|
||||
14/3411/6216 (333k) https://onthegomap.github.io/planetiler-demo/#14.5/39.76632/-105.04028 (landcover:333k)
|
||||
10/236/413 (176k) https://onthegomap.github.io/planetiler-demo/#10.5/32.69474/-96.85547 (landuse:176k)
|
||||
13/1596/3157 (337k) https://onthegomap.github.io/planetiler-demo/#13.5/38.08269/-109.84131 (mountain_peak:337k)
|
||||
5/5/11 (143k) https://onthegomap.github.io/planetiler-demo/#5.5/44.9512/-118.125 (park:143k)
|
||||
3/5/3 (558k) https://onthegomap.github.io/planetiler-demo/#3.5/20.48995/67.5 (place:558k)
|
||||
12/3229/2032 (313k) https://onthegomap.github.io/planetiler-demo/#12.5/1.36218/103.84277 (transportation:313k)
|
||||
14/9618/6751 (179k) https://onthegomap.github.io/planetiler-demo/#14.5/30.15463/31.34399 (transportation_name:179k)
|
||||
12/3415/1774 (166k) https://onthegomap.github.io/planetiler-demo/#12.5/23.36242/120.19043 (water:166k)
|
||||
0:28:44 DEB [archive] - Max tile sizes
|
||||
z0 z1 z2 z3 z4 z5 z6 z7 z8 z9 z10 z11 z12 z13 z14 all
|
||||
boundary 5.4k 37k 43k 25k 19k 24k 18k 14k 14k 28k 23k 17k 31k 18k 9.4k 43k
|
||||
landcover 1.5k 982 8k 4.6k 3.2k 31k 17k 271k 333k 235k 153k 175k 166k 111k 333k 333k
|
||||
place 51k 144k 545k 558k 352k 183k 109k 58k 41k 52k 62k 69k 50k 122k 221k 558k
|
||||
water 8.4k 4.1k 10k 9k 14k 13k 89k 113k 126k 109k 132k 94k 166k 115k 91k 166k
|
||||
water_name 4.5k 15k 22k 14k 12k 7.4k 5k 4.7k 12k 8.6k 5.6k 3.8k 3.1k 9.4k 29k 29k
|
||||
waterway 0 0 0 546 3.7k 1.6k 17k 13k 9.8k 28k 20k 16k 59k 75k 88k 88k
|
||||
landuse 0 0 0 0 2.6k 1.5k 32k 66k 125k 113k 176k 129k 63k 124k 47k 176k
|
||||
park 0 0 0 0 54k 143k 98k 76k 71k 82k 90k 55k 47k 19k 50k 143k
|
||||
transportation 0 0 0 0 60k 107k 62k 122k 88k 135k 91k 67k 313k 187k 128k 313k
|
||||
transportation_name 0 0 0 0 0 0 34k 20k 19k 15k 37k 22k 33k 27k 179k 179k
|
||||
mountain_peak 0 0 0 0 0 0 0 12k 12k 10k 10k 9.5k 9.4k 337k 234k 337k
|
||||
aerodrome_label 0 0 0 0 0 0 0 0 4.1k 2.8k 3.9k 2.9k 2.7k 2.7k 2.7k 4.1k
|
||||
aeroway 0 0 0 0 0 0 0 0 0 0 16k 25k 35k 31k 18k 35k
|
||||
poi 0 0 0 0 0 0 0 0 0 0 0 175 35k 17k 988k 988k
|
||||
building 0 0 0 0 0 0 0 0 0 0 0 0 0 66k 710k 710k
|
||||
housenumber 0 0 0 0 0 0 0 0 0 0 0 0 0 0 313k 313k
|
||||
full tile 71k 200k 623k 591k 401k 349k 270k 396k 370k 343k 272k 204k 378k 341k 1.3M 1.3M
|
||||
gzipped 44k 117k 332k 315k 238k 204k 171k 284k 268k 250k 182k 141k 188k 227k 751k 751k
|
||||
0:28:44 DEB [archive] - Max tile: 1.3M (gzipped: 751k)
|
||||
0:28:44 DEB [archive] - Avg tile: 98k (gzipped: 63k) using weighted average based on OSM traffic
|
||||
0:28:44 DEB [archive] - # tiles: 270,230,645
|
||||
0:28:44 DEB [archive] - # features: 2,727,652,745
|
||||
0:28:44 INF [archive] - Finished in 6m20s cpu:4h54m3s gc:22s avg:46.5
|
||||
0:28:44 INF [archive] - read 2x(43% 2m43s wait:2m9s done:17s)
|
||||
0:28:44 INF [archive] - merge 1x(68% 4m17s wait:1m12s done:17s)
|
||||
0:28:44 INF [archive] - encode 62x(67% 4m16s block:5s wait:1m17s done:17s)
|
||||
0:28:44 INF [archive] - write 1x(24% 1m33s wait:4m11s done:17s)
|
||||
0:28:44 INF - Finished in 28m44s cpu:23h57m11s gc:1m25s avg:50
|
||||
0:28:44 INF - FINISHED!
|
||||
0:28:44 INF -
|
||||
0:28:44 INF - ----------------------------------------
|
||||
0:28:44 INF - data errors:
|
||||
0:28:44 INF - render_snap_fix_input 21,235,795
|
||||
0:28:44 INF - merge_snap_fix_input 2,946
|
||||
0:28:44 INF - feature_polygon_osm_invalid_multipolygon_empty_after_fix 273
|
||||
0:28:44 INF - omt_park_area_osm_invalid_multipolygon_empty_after_fix 26
|
||||
0:28:44 INF - feature_centroid_if_convex_osm_invalid_multipolygon_empty_after_fix 19
|
||||
0:28:44 INF - feature_point_on_surface_osm_invalid_multipolygon_empty_after_fix 5
|
||||
0:28:44 INF - omt_place_island_poly_osm_invalid_multipolygon_empty_after_fix 3
|
||||
0:28:44 INF - feature_centroid_osm_invalid_multipolygon_empty_after_fix 2
|
||||
0:28:44 INF - merge_snap_fix_input2 1
|
||||
0:28:44 INF - merge_snap_fix_input3 1
|
||||
0:28:44 INF - ----------------------------------------
|
||||
0:28:44 INF - overall 28m44s cpu:23h57m11s gc:1m25s avg:50
|
||||
0:28:44 INF - lake_centerlines 2s cpu:8s avg:3.3
|
||||
0:28:44 INF - read 2x(27% 0.7s done:2s)
|
||||
0:28:44 INF - process 62x(0% 0s wait:1s done:1s)
|
||||
0:28:44 INF - write 2x(0% 0s wait:2s)
|
||||
0:28:44 INF - water_polygons 34s cpu:18m42s gc:1s avg:33.2
|
||||
0:28:44 INF - read 2x(19% 6s wait:9s done:18s)
|
||||
0:28:44 INF - process 62x(48% 16s wait:16s)
|
||||
0:28:44 INF - write 2x(62% 21s wait:12s)
|
||||
0:28:44 INF - natural_earth 16s cpu:27s avg:1.7
|
||||
0:28:44 INF - read 2x(36% 6s done:10s)
|
||||
0:28:44 INF - process 62x(1% 0.1s wait:11s done:4s)
|
||||
0:28:44 INF - write 2x(0% 0s wait:12s done:4s)
|
||||
0:28:44 INF - osm_pass1 1m24s cpu:1h10m52s gc:3s avg:50.7
|
||||
0:28:44 INF - read 1x(4% 3s wait:1m6s done:6s)
|
||||
0:28:44 INF - process 63x(77% 1m5s block:12s wait:2s)
|
||||
0:28:44 INF - osm_pass2 17m41s cpu:16h36m26s gc:48s avg:56.4
|
||||
0:28:44 INF - read 1x(0% 3s wait:16m59s done:37s)
|
||||
0:28:44 INF - process 62x(87% 15m20s block:7s wait:6s)
|
||||
0:28:44 INF - write 2x(38% 6m48s wait:10m18s)
|
||||
0:28:44 INF - boundaries 13s cpu:16s avg:1.3
|
||||
0:28:44 INF - agg_stop 0.7s cpu:1s avg:2.1
|
||||
0:28:44 INF - sort 2m cpu:56m gc:10s avg:28.1
|
||||
0:28:44 INF - worker 5x(44% 53s wait:32s done:2s)
|
||||
0:28:44 INF - archive 6m20s cpu:4h54m3s gc:22s avg:46.5
|
||||
0:28:44 INF - read 2x(43% 2m43s wait:2m9s done:17s)
|
||||
0:28:44 INF - merge 1x(68% 4m17s wait:1m12s done:17s)
|
||||
0:28:44 INF - encode 62x(67% 4m16s block:5s wait:1m17s done:17s)
|
||||
0:28:44 INF - write 1x(24% 1m33s wait:4m11s done:17s)
|
||||
0:28:44 INF - ----------------------------------------
|
||||
0:28:44 INF - archive 68GB
|
||||
0:28:44 INF - features 212GB
|
Plik diff jest za duży
Load Diff
Plik diff jest za duży
Load Diff
Plik diff jest za duży
Load Diff
|
@ -1,58 +0,0 @@
|
|||
# Planetiler Basemap Profile
|
||||
|
||||
This basemap profile is based on [OpenMapTiles](https://github.com/openmaptiles/openmaptiles) v3.12.2.
|
||||
See [README.md](../README.md) in the parent directory for instructions on how to run.
|
||||
|
||||
## Differences from OpenMapTiles
|
||||
|
||||
- Road name abbreviations are not implemented yet in the `transportation_name` layer
|
||||
- `agg_stop` tag not implemented yet in the `poi` layer
|
||||
- `brunnel` tag is excluded from `transportation_name` layer to avoid breaking apart long `transportation_name`
|
||||
lines, to revert this behavior set `--transportation-name-brunnel=true`
|
||||
- `rank` field on `mountain_peak` linestrings only has 3 levels (1: has wikipedia page and name, 2: has name, 3: no name
|
||||
or wikipedia page or name)
|
||||
|
||||
## Code Layout
|
||||
|
||||
[Generate.java](./src/main/java/com/onthegomap/planetiler/basemap/Generate.java) generates code in
|
||||
the [generated](./src/main/java/com/onthegomap/planetiler/basemap/generated) package from an OpenMapTiles tag in GitHub:
|
||||
|
||||
- [OpenMapTilesSchema](./src/main/java/com/onthegomap/planetiler/basemap/generated/OpenMapTilesSchema.java)
|
||||
contains an interface for each layer with constants for the name, attributes, and allowed values for each tag in that
|
||||
layer
|
||||
- [Tables](./src/main/java/com/onthegomap/planetiler/basemap/generated/Tables.java)
|
||||
contains a record for each table that OpenMapTiles [imposm3](https://github.com/omniscale/imposm3) configuration
|
||||
generates (along with the tag-filtering expression) so layers can listen on instances of those records instead of
|
||||
doing the tag filtering and parsing themselves
|
||||
|
||||
The [layers](./src/main/java/com/onthegomap/planetiler/basemap/layers) package contains a port of the SQL logic to
|
||||
generate each layer from OpenMapTiles. Layers define how source features (or parsed imposm3 table rows) map to vector
|
||||
tile features, and logic for post-processing tile geometries.
|
||||
|
||||
[BasemapProfile](./src/main/java/com/onthegomap/planetiler/basemap/BasemapProfile.java) dispatches source features to
|
||||
layer handlers and merges the results.
|
||||
|
||||
[BasemapMain](./src/main/java/com/onthegomap/planetiler/basemap/BasemapMain.java) is the main driver that registers
|
||||
source data and output location.
|
||||
|
||||
## Regenerating Code
|
||||
|
||||
To run `Generate.java`, use [scripts/regenerate-openmaptiles.sh](../scripts/regenerate-openmaptiles.sh) script with the
|
||||
OpenMapTiles release tag:
|
||||
|
||||
```bash
|
||||
./scripts/regenerate-openmaptiles.sh v3.12.2
|
||||
```
|
||||
|
||||
Then follow the instructions it prints for reformatting generated code.
|
||||
|
||||
## License and Attribution
|
||||
|
||||
OpenMapTiles code is licensed under the BSD 3-Clause License, which appears at the top of any file ported from
|
||||
OpenMapTiles.
|
||||
|
||||
The OpenMapTiles schema (or "look and feel") is licensed under [CC-BY 4.0](http://creativecommons.org/licenses/by/4.0/),
|
||||
so any map derived from that schema
|
||||
must [visibly credit OpenMapTiles](https://github.com/openmaptiles/openmaptiles/blob/master/LICENSE.md#design-license-cc-by-40)
|
||||
. It also uses OpenStreetMap data, so you
|
||||
must [visibly credit OpenStreetMap contributors](https://www.openstreetmap.org/copyright).
|
|
@ -1,52 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap;
|
||||
|
||||
import com.onthegomap.planetiler.Planetiler;
|
||||
import com.onthegomap.planetiler.basemap.generated.OpenMapTilesSchema;
|
||||
import com.onthegomap.planetiler.config.Arguments;
|
||||
import java.nio.file.Path;
|
||||
|
||||
/**
|
||||
* Main entrypoint for generating a map using the basemap schema.
|
||||
*/
|
||||
public class BasemapMain {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
run(Arguments.fromArgsOrConfigFile(args));
|
||||
}
|
||||
|
||||
static void run(Arguments arguments) throws Exception {
|
||||
Path dataDir = Path.of("data");
|
||||
Path sourcesDir = dataDir.resolve("sources");
|
||||
// use --area=... argument, AREA=... env var or area=... in config to set the region of the world to use
|
||||
// will be ignored if osm_path or osm_url are set
|
||||
String area = arguments.getString(
|
||||
"area",
|
||||
"name of the extract to download if osm_url/osm_path not specified (i.e. 'monaco' 'rhode island' 'australia' or 'planet')",
|
||||
"monaco"
|
||||
);
|
||||
|
||||
Planetiler.create(arguments)
|
||||
.setDefaultLanguages(OpenMapTilesSchema.LANGUAGES)
|
||||
.fetchWikidataNameTranslations(sourcesDir.resolve("wikidata_names.json"))
|
||||
// defer creation of the profile because it depends on data from the runner
|
||||
.setProfile(BasemapProfile::new)
|
||||
// override any of these with arguments: --osm_path=... or --osm_url=...
|
||||
// or OSM_PATH=... OSM_URL=... environmental argument
|
||||
// or osm_path=... osm_url=... in a config file
|
||||
.addShapefileSource("EPSG:3857", BasemapProfile.LAKE_CENTERLINE_SOURCE,
|
||||
sourcesDir.resolve("lake_centerline.shp.zip"),
|
||||
"https://github.com/lukasmartinelli/osm-lakelines/releases/download/v0.9/lake_centerline.shp.zip")
|
||||
.addShapefileSource(BasemapProfile.WATER_POLYGON_SOURCE,
|
||||
sourcesDir.resolve("water-polygons-split-3857.zip"),
|
||||
"https://osmdata.openstreetmap.de/download/water-polygons-split-3857.zip")
|
||||
.addNaturalEarthSource(BasemapProfile.NATURAL_EARTH_SOURCE,
|
||||
sourcesDir.resolve("natural_earth_vector.sqlite.zip"),
|
||||
"https://naciscdn.org/naturalearth/packages/natural_earth_vector.sqlite.zip")
|
||||
.addOsmSource(BasemapProfile.OSM_SOURCE,
|
||||
sourcesDir.resolve(area.replaceAll("[^a-zA-Z]+", "_") + ".osm.pbf"),
|
||||
"planet".equalsIgnoreCase(area) ? ("aws:latest") : ("geofabrik:" + area))
|
||||
// override with --mbtiles=... argument or MBTILES=... env var or mbtiles=... in a config file
|
||||
.setOutput("mbtiles", dataDir.resolve("output.mbtiles"))
|
||||
.run();
|
||||
}
|
||||
}
|
|
@ -1,251 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap;
|
||||
|
||||
import static com.onthegomap.planetiler.geo.GeoUtils.EMPTY_LINE;
|
||||
import static com.onthegomap.planetiler.geo.GeoUtils.EMPTY_POINT;
|
||||
import static com.onthegomap.planetiler.geo.GeoUtils.EMPTY_POLYGON;
|
||||
|
||||
import com.onthegomap.planetiler.FeatureCollector;
|
||||
import com.onthegomap.planetiler.ForwardingProfile;
|
||||
import com.onthegomap.planetiler.Planetiler;
|
||||
import com.onthegomap.planetiler.Profile;
|
||||
import com.onthegomap.planetiler.basemap.generated.OpenMapTilesSchema;
|
||||
import com.onthegomap.planetiler.basemap.generated.Tables;
|
||||
import com.onthegomap.planetiler.basemap.layers.Transportation;
|
||||
import com.onthegomap.planetiler.basemap.layers.TransportationName;
|
||||
import com.onthegomap.planetiler.config.PlanetilerConfig;
|
||||
import com.onthegomap.planetiler.expression.MultiExpression;
|
||||
import com.onthegomap.planetiler.reader.SimpleFeature;
|
||||
import com.onthegomap.planetiler.reader.SourceFeature;
|
||||
import com.onthegomap.planetiler.reader.osm.OsmElement;
|
||||
import com.onthegomap.planetiler.stats.Stats;
|
||||
import com.onthegomap.planetiler.util.Translations;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Delegates the logic for generating a map to individual implementations in the {@code layers} package.
|
||||
* <p>
|
||||
* Layer implementations extend these interfaces to subscribe to elements from different sources:
|
||||
* <ul>
|
||||
* <li>{@link LakeCenterlineProcessor}</li>
|
||||
* <li>{@link NaturalEarthProcessor}</li>
|
||||
* <li>{@link OsmWaterPolygonProcessor}</li>
|
||||
* <li>{@link OsmAllProcessor} to process every OSM feature</li>
|
||||
* <li>{@link OsmRelationPreprocessor} to process every OSM relation during first pass through OSM file</li>
|
||||
* <li>A {@link Tables.RowHandler} implementation in {@code Tables.java} to process input features filtered and parsed
|
||||
* according to the imposm3 mappings defined in the OpenMapTiles schema. Each element corresponds to a row in the
|
||||
* table that imposm3 would have generated, with generated methods for accessing the data that would have been in each
|
||||
* column</li>
|
||||
* </ul>
|
||||
* Layers can also subscribe to notifications when we finished processing an input source by implementing
|
||||
* {@link FinishHandler} or post-process features in that layer before rendering the output tile by implementing
|
||||
* {@link FeaturePostProcessor}.
|
||||
*/
|
||||
public class BasemapProfile extends ForwardingProfile {
|
||||
|
||||
// IDs used in stats and logs for each input source, as well as argument/config file overrides to source locations
|
||||
public static final String LAKE_CENTERLINE_SOURCE = "lake_centerlines";
|
||||
public static final String WATER_POLYGON_SOURCE = "water_polygons";
|
||||
public static final String NATURAL_EARTH_SOURCE = "natural_earth";
|
||||
public static final String OSM_SOURCE = "osm";
|
||||
/** Index to efficiently find the imposm3 "table row" constructor from an OSM element based on its tags. */
|
||||
private final MultiExpression.Index<RowDispatch> osmMappings;
|
||||
/** Index variant that filters out any table only used by layers that implement IgnoreWikidata class. */
|
||||
private final MultiExpression.Index<Boolean> wikidataMappings;
|
||||
|
||||
public BasemapProfile(Planetiler runner) {
|
||||
this(runner.translations(), runner.config(), runner.stats());
|
||||
}
|
||||
|
||||
public BasemapProfile(Translations translations, PlanetilerConfig config, Stats stats) {
|
||||
List<String> onlyLayers = config.arguments().getList("only_layers", "Include only certain layers", List.of());
|
||||
List<String> excludeLayers = config.arguments().getList("exclude_layers", "Exclude certain layers", List.of());
|
||||
|
||||
// register release/finish/feature postprocessor/osm relationship handler methods...
|
||||
List<Handler> layers = new ArrayList<>();
|
||||
Transportation transportationLayer = null;
|
||||
TransportationName transportationNameLayer = null;
|
||||
for (Layer layer : OpenMapTilesSchema.createInstances(translations, config, stats)) {
|
||||
if ((onlyLayers.isEmpty() || onlyLayers.contains(layer.name())) && !excludeLayers.contains(layer.name())) {
|
||||
layers.add(layer);
|
||||
registerHandler(layer);
|
||||
if (layer instanceof TransportationName transportationName) {
|
||||
transportationNameLayer = transportationName;
|
||||
}
|
||||
}
|
||||
if (layer instanceof Transportation transportation) {
|
||||
transportationLayer = transportation;
|
||||
}
|
||||
}
|
||||
|
||||
// special-case: transportation_name layer depends on transportation layer
|
||||
if (transportationNameLayer != null) {
|
||||
transportationNameLayer.needsTransportationLayer(transportationLayer);
|
||||
if (!layers.contains(transportationLayer)) {
|
||||
layers.add(transportationLayer);
|
||||
registerHandler(transportationLayer);
|
||||
}
|
||||
}
|
||||
|
||||
// register per-source input element handlers
|
||||
for (Handler handler : layers) {
|
||||
if (handler instanceof NaturalEarthProcessor processor) {
|
||||
registerSourceHandler(NATURAL_EARTH_SOURCE,
|
||||
(source, features) -> processor.processNaturalEarth(source.getSourceLayer(), source, features));
|
||||
}
|
||||
if (handler instanceof OsmWaterPolygonProcessor processor) {
|
||||
registerSourceHandler(WATER_POLYGON_SOURCE, processor::processOsmWater);
|
||||
}
|
||||
if (handler instanceof LakeCenterlineProcessor processor) {
|
||||
registerSourceHandler(LAKE_CENTERLINE_SOURCE, processor::processLakeCenterline);
|
||||
}
|
||||
if (handler instanceof OsmAllProcessor processor) {
|
||||
registerSourceHandler(OSM_SOURCE, processor::processAllOsm);
|
||||
}
|
||||
}
|
||||
|
||||
// pre-process layers to build efficient indexes for matching OSM elements based on matching expressions
|
||||
// Map from imposm3 table row class to the layers that implement its handler.
|
||||
var handlerMap = Tables.generateDispatchMap(layers);
|
||||
osmMappings = Tables.MAPPINGS
|
||||
.mapResults(constructor -> {
|
||||
var handlers = handlerMap.getOrDefault(constructor.rowClass(), List.of()).stream()
|
||||
.map(r -> {
|
||||
@SuppressWarnings("unchecked") var handler = (Tables.RowHandler<Tables.Row>) r.handler();
|
||||
return handler;
|
||||
})
|
||||
.toList();
|
||||
return new RowDispatch(constructor.create(), handlers);
|
||||
}).simplify().index();
|
||||
wikidataMappings = Tables.MAPPINGS
|
||||
.mapResults(constructor ->
|
||||
handlerMap.getOrDefault(constructor.rowClass(), List.of()).stream()
|
||||
.anyMatch(handler -> !IgnoreWikidata.class.isAssignableFrom(handler.handlerClass()))
|
||||
).filterResults(b -> b).simplify().index();
|
||||
|
||||
// register a handler for all OSM elements that forwards to imposm3 "table row" handler methods
|
||||
// based on efficient pre-processed index
|
||||
if (!osmMappings.isEmpty()) {
|
||||
registerSourceHandler(OSM_SOURCE, (source, features) -> {
|
||||
for (var match : getTableMatches(source)) {
|
||||
RowDispatch rowDispatch = match.match();
|
||||
var row = rowDispatch.constructor.create(source, match.keys().get(0));
|
||||
for (Tables.RowHandler<Tables.Row> handler : rowDispatch.handlers()) {
|
||||
handler.process(row, features);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/** Returns the imposm3 table row constructors that match an input element's tags. */
|
||||
public List<MultiExpression.Match<RowDispatch>> getTableMatches(SourceFeature input) {
|
||||
return osmMappings.getMatchesWithTriggers(input);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean caresAboutWikidataTranslation(OsmElement elem) {
|
||||
var tags = elem.tags();
|
||||
if (elem instanceof OsmElement.Node) {
|
||||
return wikidataMappings.getOrElse(SimpleFeature.create(EMPTY_POINT, tags), false);
|
||||
} else if (elem instanceof OsmElement.Way) {
|
||||
return wikidataMappings.getOrElse(SimpleFeature.create(EMPTY_POLYGON, tags), false)
|
||||
|| wikidataMappings.getOrElse(SimpleFeature.create(EMPTY_LINE, tags), false);
|
||||
} else if (elem instanceof OsmElement.Relation) {
|
||||
return wikidataMappings.getOrElse(SimpleFeature.create(EMPTY_POLYGON, tags), false);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Pass-through constants generated from the OpenMapTiles vector schema
|
||||
*/
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return OpenMapTilesSchema.NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String description() {
|
||||
return OpenMapTilesSchema.DESCRIPTION;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String attribution() {
|
||||
return OpenMapTilesSchema.ATTRIBUTION;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String version() {
|
||||
return OpenMapTilesSchema.VERSION;
|
||||
}
|
||||
|
||||
/**
|
||||
* Layers should implement this interface to subscribe to elements from <a href="https://www.naturalearthdata.com/">natural
|
||||
* earth</a>.
|
||||
*/
|
||||
public interface NaturalEarthProcessor {
|
||||
|
||||
/**
|
||||
* Process an element from {@code table} in the<a href="https://www.naturalearthdata.com/">natural earth
|
||||
* source</a>.
|
||||
*
|
||||
* @see Profile#processFeature(SourceFeature, FeatureCollector)
|
||||
*/
|
||||
void processNaturalEarth(String table, SourceFeature feature, FeatureCollector features);
|
||||
}
|
||||
|
||||
/**
|
||||
* Layers should implement this interface to subscribe to elements from <a href="https://github.com/lukasmartinelli/osm-lakelines">OSM
|
||||
* lake centerlines source</a>.
|
||||
*/
|
||||
public interface LakeCenterlineProcessor {
|
||||
|
||||
/**
|
||||
* Process an element from the <a href="https://github.com/lukasmartinelli/osm-lakelines">OSM lake centerlines
|
||||
* source</a>
|
||||
*
|
||||
* @see Profile#processFeature(SourceFeature, FeatureCollector)
|
||||
*/
|
||||
void processLakeCenterline(SourceFeature feature, FeatureCollector features);
|
||||
}
|
||||
|
||||
/**
|
||||
* Layers should implement this interface to subscribe to elements from <a href="https://osmdata.openstreetmap.de/data/water-polygons.html">OSM
|
||||
* water polygons source</a>.
|
||||
*/
|
||||
public interface OsmWaterPolygonProcessor {
|
||||
|
||||
/**
|
||||
* Process an element from the <a href="https://osmdata.openstreetmap.de/data/water-polygons.html">OSM water
|
||||
* polygons source</a>
|
||||
*
|
||||
* @see Profile#processFeature(SourceFeature, FeatureCollector)
|
||||
*/
|
||||
void processOsmWater(SourceFeature feature, FeatureCollector features);
|
||||
}
|
||||
|
||||
/** Layers should implement this interface to subscribe to every OSM element. */
|
||||
public interface OsmAllProcessor {
|
||||
|
||||
/**
|
||||
* Process an OSM element during the second pass through the OSM data file.
|
||||
*
|
||||
* @see Profile#processFeature(SourceFeature, FeatureCollector)
|
||||
*/
|
||||
void processAllOsm(SourceFeature feature, FeatureCollector features);
|
||||
}
|
||||
|
||||
/**
|
||||
* Layers should implement to indicate they do not need wikidata name translations to avoid downloading more
|
||||
* translations than are needed.
|
||||
*/
|
||||
public interface IgnoreWikidata {}
|
||||
|
||||
private static record RowDispatch(
|
||||
Tables.Constructor constructor,
|
||||
List<Tables.RowHandler<Tables.Row>> handlers
|
||||
) {}
|
||||
}
|
|
@ -1,758 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap;
|
||||
|
||||
import static com.onthegomap.planetiler.expression.Expression.*;
|
||||
import static java.util.stream.Collectors.joining;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.google.common.base.CaseFormat;
|
||||
import com.onthegomap.planetiler.config.Arguments;
|
||||
import com.onthegomap.planetiler.config.PlanetilerConfig;
|
||||
import com.onthegomap.planetiler.expression.Expression;
|
||||
import com.onthegomap.planetiler.expression.MultiExpression;
|
||||
import com.onthegomap.planetiler.util.Downloader;
|
||||
import com.onthegomap.planetiler.util.FileUtils;
|
||||
import com.onthegomap.planetiler.util.Format;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
import java.util.stream.Stream;
|
||||
import org.commonmark.parser.Parser;
|
||||
import org.commonmark.renderer.html.HtmlRenderer;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.yaml.snakeyaml.LoaderOptions;
|
||||
import org.yaml.snakeyaml.Yaml;
|
||||
|
||||
/**
|
||||
* Generates code in the {@code generated} package from the OpenMapTiles schema crawled from a tag or branch in the <a
|
||||
* href="https://github.com/openmaptiles/openmaptiles">OpenMapTiles GitHub repo</a>.
|
||||
* <p>
|
||||
* {@code OpenMapTilesSchema.java} contains the output layer definitions (i.e. attributes and allowed values) so that
|
||||
* layer implementations in {@code layers} package can reference them instead of hard-coding.
|
||||
* <p>
|
||||
* {@code Tables.java} contains the <a href="https://github.com/omniscale/imposm3">imposm3</a> table definitions from
|
||||
* mapping.yaml files in the OpenMapTiles repo. Layers in the {@code layer} package can extend the {@code Handler}
|
||||
* nested class for a table definition to "subscribe" to OSM elements that imposm3 would put in that table.
|
||||
* <p>
|
||||
* To run use {@code ./scripts/regenerate-openmaptiles.sh}
|
||||
*/
|
||||
public class Generate {
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(Generate.class);
|
||||
private static final ObjectMapper mapper = new ObjectMapper();
|
||||
private static final Yaml yaml;
|
||||
private static final String LINE_SEPARATOR = System.lineSeparator();
|
||||
private static final String GENERATED_FILE_HEADER = """
|
||||
/*
|
||||
Copyright (c) 2021, MapTiler.com & OpenMapTiles contributors.
|
||||
All rights reserved.
|
||||
|
||||
Code license: BSD 3-Clause License
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Design license: CC-BY 4.0
|
||||
|
||||
See https://github.com/openmaptiles/openmaptiles/blob/master/LICENSE.md for details on usage
|
||||
*/
|
||||
// AUTOGENERATED BY Generate.java -- DO NOT MODIFY
|
||||
""";
|
||||
private static final Parser parser = Parser.builder().build();
|
||||
private static final HtmlRenderer renderer = HtmlRenderer.builder().build();
|
||||
|
||||
static {
|
||||
// bump the default limit of 50
|
||||
var options = new LoaderOptions();
|
||||
options.setMaxAliasesForCollections(1_000);
|
||||
yaml = new Yaml(options);
|
||||
}
|
||||
|
||||
private static <T> T loadAndParseYaml(String url, PlanetilerConfig config, Class<T> clazz) throws IOException {
|
||||
LOGGER.info("reading " + url);
|
||||
try (var stream = Downloader.openStream(url, config)) {
|
||||
// Jackson yaml parsing does not handle anchors and references, so first parse the input
|
||||
// using SnakeYAML, then parse SnakeYAML's output using Jackson to get it into our records.
|
||||
Map<String, Object> parsed = yaml.load(stream);
|
||||
return mapper.convertValue(parsed, clazz);
|
||||
}
|
||||
}
|
||||
|
||||
static <T> T parseYaml(String string, Class<T> clazz) {
|
||||
// Jackson yaml parsing does not handle anchors and references, so first parse the input
|
||||
// using SnakeYAML, then parse SnakeYAML's output using Jackson to get it into our records.
|
||||
Map<String, Object> parsed = yaml.load(string);
|
||||
return mapper.convertValue(parsed, clazz);
|
||||
}
|
||||
|
||||
static JsonNode parseYaml(String string) {
|
||||
return string == null ? null : parseYaml(string, JsonNode.class);
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
Arguments arguments = Arguments.fromArgsOrConfigFile(args);
|
||||
PlanetilerConfig planetilerConfig = PlanetilerConfig.from(arguments);
|
||||
String tag = arguments.getString("tag", "openmaptiles tag to use", "v3.12.2");
|
||||
String base = "https://raw.githubusercontent.com/openmaptiles/openmaptiles/" + tag + "/";
|
||||
|
||||
// start crawling from openmaptiles.yaml
|
||||
// then crawl schema from each layers/<layer>/<layer>.yaml file that it references
|
||||
// then crawl table definitions from each layers/<layer>/mapping.yaml file that the layer references
|
||||
String rootUrl = base + "openmaptiles.yaml";
|
||||
OpenmaptilesConfig config = loadAndParseYaml(rootUrl, planetilerConfig, OpenmaptilesConfig.class);
|
||||
|
||||
List<LayerConfig> layers = new ArrayList<>();
|
||||
Set<String> imposm3MappingFiles = new LinkedHashSet<>();
|
||||
for (String layerFile : config.tileset.layers) {
|
||||
String layerURL = base + layerFile;
|
||||
LayerConfig layer = loadAndParseYaml(layerURL, planetilerConfig, LayerConfig.class);
|
||||
layers.add(layer);
|
||||
for (Datasource datasource : layer.datasources) {
|
||||
if ("imposm3".equals(datasource.type)) {
|
||||
String mappingPath = Path.of(layerFile).resolveSibling(datasource.mapping_file).normalize().toString();
|
||||
imposm3MappingFiles.add(base + mappingPath);
|
||||
} else {
|
||||
LOGGER.warn("Unknown datasource type: " + datasource.type);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, Imposm3Table> tables = new LinkedHashMap<>();
|
||||
for (String uri : imposm3MappingFiles) {
|
||||
Imposm3Mapping layer = loadAndParseYaml(uri, planetilerConfig, Imposm3Mapping.class);
|
||||
tables.putAll(layer.tables);
|
||||
}
|
||||
|
||||
String packageName = "com.onthegomap.planetiler.basemap.generated";
|
||||
String[] packageParts = packageName.split("\\.");
|
||||
Path output = Path.of("planetiler-basemap", "src", "main", "java")
|
||||
.resolve(Path.of(packageParts[0], Arrays.copyOfRange(packageParts, 1, packageParts.length)));
|
||||
|
||||
FileUtils.deleteDirectory(output);
|
||||
Files.createDirectories(output);
|
||||
|
||||
emitLayerSchemaDefinitions(config.tileset, layers, packageName, output, tag);
|
||||
emitTableDefinitions(tables, packageName, output, tag);
|
||||
LOGGER.info(
|
||||
"Done generating code in 'generated' package, now run IntelliJ 'Reformat Code' operation with 'Optimize imports' and 'Cleanup code' options selected.");
|
||||
}
|
||||
|
||||
/** Generates {@code OpenMapTilesSchema.java} */
|
||||
private static void emitLayerSchemaDefinitions(OpenmaptilesTileSet info, List<LayerConfig> layers, String packageName,
|
||||
Path output, String tag)
|
||||
throws IOException {
|
||||
StringBuilder schemaClass = new StringBuilder();
|
||||
schemaClass.append("""
|
||||
%s
|
||||
package %s;
|
||||
|
||||
import static com.onthegomap.planetiler.expression.Expression.*;
|
||||
import com.onthegomap.planetiler.config.PlanetilerConfig;
|
||||
import com.onthegomap.planetiler.stats.Stats;
|
||||
import com.onthegomap.planetiler.expression.MultiExpression;
|
||||
import com.onthegomap.planetiler.basemap.Layer;
|
||||
import com.onthegomap.planetiler.util.Translations;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* All vector tile layer definitions, attributes, and allowed values generated from the
|
||||
* <a href="https://github.com/openmaptiles/openmaptiles/blob/%s/openmaptiles.yaml">OpenMapTiles vector tile schema %s</a>.
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public class OpenMapTilesSchema {
|
||||
public static final String NAME = %s;
|
||||
public static final String DESCRIPTION = %s;
|
||||
public static final String VERSION = %s;
|
||||
public static final String ATTRIBUTION = %s;
|
||||
public static final List<String> LANGUAGES = List.of(%s);
|
||||
|
||||
/** Returns a list of expected layer implementation instances from the {@code layers} package. */
|
||||
public static List<Layer> createInstances(Translations translations, PlanetilerConfig config, Stats stats) {
|
||||
return List.of(
|
||||
%s
|
||||
);
|
||||
}
|
||||
"""
|
||||
.formatted(
|
||||
GENERATED_FILE_HEADER,
|
||||
packageName,
|
||||
escapeJavadoc(tag),
|
||||
escapeJavadoc(tag),
|
||||
Format.quote(info.name),
|
||||
Format.quote(info.description),
|
||||
Format.quote(info.version),
|
||||
Format.quote(info.attribution),
|
||||
info.languages.stream().map(Format::quote).collect(joining(", ")),
|
||||
layers.stream()
|
||||
.map(
|
||||
l -> "new com.onthegomap.planetiler.basemap.layers.%s(translations, config, stats)"
|
||||
.formatted(lowerUnderscoreToUpperCamel(l.layer.id)))
|
||||
.collect(joining("," + LINE_SEPARATOR))
|
||||
.indent(6).trim()
|
||||
));
|
||||
for (var layer : layers) {
|
||||
String layerCode = generateCodeForLayer(tag, layer);
|
||||
schemaClass.append(layerCode);
|
||||
}
|
||||
|
||||
schemaClass.append("}");
|
||||
Files.writeString(output.resolve("OpenMapTilesSchema.java"), schemaClass);
|
||||
}
|
||||
|
||||
private static String generateCodeForLayer(String tag, LayerConfig layer) {
|
||||
String layerName = layer.layer.id;
|
||||
String className = lowerUnderscoreToUpperCamel(layerName);
|
||||
|
||||
StringBuilder fields = new StringBuilder();
|
||||
StringBuilder fieldValues = new StringBuilder();
|
||||
StringBuilder fieldMappings = new StringBuilder();
|
||||
|
||||
layer.layer.fields.forEach((name, value) -> {
|
||||
JsonNode valuesNode = value.get("values");
|
||||
List<String> valuesForComment = valuesNode == null ? List.of() : valuesNode.isArray() ?
|
||||
iterToList(valuesNode.elements()).stream().map(Objects::toString).toList() :
|
||||
iterToList(valuesNode.fieldNames());
|
||||
String javadocDescription = markdownToJavadoc(getFieldDescription(value));
|
||||
fields.append("""
|
||||
%s
|
||||
public static final String %s = %s;
|
||||
""".formatted(
|
||||
valuesForComment.isEmpty() ? "/** %s */".formatted(javadocDescription) : """
|
||||
|
||||
/**
|
||||
* %s
|
||||
* <p>
|
||||
* allowed values:
|
||||
* <ul>
|
||||
* %s
|
||||
* </ul>
|
||||
*/
|
||||
""".stripTrailing().formatted(javadocDescription,
|
||||
valuesForComment.stream().map(v -> "<li>" + v).collect(joining(LINE_SEPARATOR + " * "))),
|
||||
name.toUpperCase(Locale.ROOT),
|
||||
Format.quote(name)
|
||||
).indent(4));
|
||||
|
||||
List<String> values = valuesNode == null ? List.of() : valuesNode.isArray() ?
|
||||
iterToList(valuesNode.elements()).stream().filter(JsonNode::isTextual).map(JsonNode::textValue)
|
||||
.map(t -> t.replaceAll(" .*", "")).toList() :
|
||||
iterToList(valuesNode.fieldNames());
|
||||
if (values.size() > 0) {
|
||||
fieldValues.append(values.stream()
|
||||
.map(v -> "public static final String %s = %s;"
|
||||
.formatted(name.toUpperCase(Locale.ROOT) + "_" + v.toUpperCase(Locale.ROOT).replace('-', '_'),
|
||||
Format.quote(v)))
|
||||
.collect(joining(LINE_SEPARATOR)).indent(2).strip()
|
||||
.indent(4));
|
||||
fieldValues.append("public static final Set<String> %s = Set.of(%s);".formatted(
|
||||
name.toUpperCase(Locale.ROOT) + "_VALUES",
|
||||
values.stream().map(Format::quote).collect(joining(", "))
|
||||
).indent(4));
|
||||
}
|
||||
|
||||
if (valuesNode != null && valuesNode.isObject()) {
|
||||
MultiExpression<String> mapping = generateFieldMapping(valuesNode);
|
||||
fieldMappings.append(" public static final MultiExpression<String> %s = %s;%n"
|
||||
.formatted(lowerUnderscoreToUpperCamel(name), generateJavaCode(mapping)));
|
||||
}
|
||||
});
|
||||
|
||||
return """
|
||||
/**
|
||||
* %s
|
||||
*
|
||||
* Generated from <a href="https://github.com/openmaptiles/openmaptiles/blob/%s/layers/%s/%s.yaml">%s.yaml</a>
|
||||
*/
|
||||
public interface %s extends Layer {
|
||||
double BUFFER_SIZE = %s;
|
||||
String LAYER_NAME = %s;
|
||||
@Override
|
||||
default String name() {
|
||||
return LAYER_NAME;
|
||||
}
|
||||
/** Attribute names for map elements in the %s layer. */
|
||||
final class Fields {
|
||||
%s
|
||||
}
|
||||
/** Attribute values for map elements in the %s layer. */
|
||||
final class FieldValues {
|
||||
%s
|
||||
}
|
||||
/** Complex mappings to generate attribute values from OSM element tags in the %s layer. */
|
||||
final class FieldMappings {
|
||||
%s
|
||||
}
|
||||
}
|
||||
""".formatted(
|
||||
markdownToJavadoc(layer.layer.description),
|
||||
escapeJavadoc(tag),
|
||||
escapeJavadoc(layerName),
|
||||
escapeJavadoc(layerName),
|
||||
escapeJavadoc(layerName),
|
||||
className,
|
||||
layer.layer.buffer_size,
|
||||
Format.quote(layerName),
|
||||
escapeJavadoc(layerName),
|
||||
fields.toString().strip(),
|
||||
escapeJavadoc(layerName),
|
||||
fieldValues.toString().strip(),
|
||||
escapeJavadoc(layerName),
|
||||
fieldMappings.toString().strip()
|
||||
).indent(2);
|
||||
}
|
||||
|
||||
/** Generates {@code Tables.java} */
|
||||
private static void emitTableDefinitions(Map<String, Imposm3Table> tables, String packageName, Path output,
|
||||
String tag)
|
||||
throws IOException {
|
||||
StringBuilder tablesClass = new StringBuilder();
|
||||
tablesClass.append("""
|
||||
%s
|
||||
package %s;
|
||||
|
||||
import static com.onthegomap.planetiler.expression.Expression.*;
|
||||
|
||||
import com.onthegomap.planetiler.expression.Expression;
|
||||
import com.onthegomap.planetiler.expression.MultiExpression;
|
||||
import com.onthegomap.planetiler.FeatureCollector;
|
||||
import com.onthegomap.planetiler.reader.SourceFeature;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* OSM element parsers generated from the <a href="https://github.com/omniscale/imposm3">imposm3</a> table definitions
|
||||
* in the <a href="https://github.com/openmaptiles/openmaptiles/blob/%s/openmaptiles.yaml">OpenMapTiles vector tile schema</a>.
|
||||
*
|
||||
* These filter and parse the raw OSM key/value attribute pairs on tags into records with fields that match the
|
||||
* columns in the tables that imposm3 would generate. Layer implementations can "subscribe" to elements from each
|
||||
* "table" but implementing the table's {@code Handler} interface and use the element's typed API to access
|
||||
* attributes.
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public class Tables {
|
||||
/** A parsed OSM element that would appear in a "row" of the imposm3 table. */
|
||||
public interface Row {
|
||||
|
||||
/** Returns the original OSM element. */
|
||||
SourceFeature source();
|
||||
}
|
||||
|
||||
/** A functional interface that the constructor of a new table row can be coerced to. */
|
||||
@FunctionalInterface
|
||||
public interface Constructor {
|
||||
|
||||
Row create(SourceFeature source, String mappingKey);
|
||||
}
|
||||
|
||||
/** The {@code rowClass} of an imposm3 table row and its constructor coerced to a {@link Constructor}. */
|
||||
public static record RowClassAndConstructor(
|
||||
Class<? extends Row> rowClass,
|
||||
Constructor create
|
||||
) {}
|
||||
|
||||
/** A functional interface that the typed handler method that a layer implementation can be coerced to. */
|
||||
@FunctionalInterface
|
||||
public interface RowHandler<T extends Row> {
|
||||
|
||||
/** Process a typed element according to the profile. */
|
||||
void process(T element, FeatureCollector features);
|
||||
}
|
||||
|
||||
/** The {@code handlerClass} of a layer handler and it's {@code process} method coerced to a {@link RowHandler}. */
|
||||
public static record RowHandlerAndClass<T extends Row>(
|
||||
Class<?> handlerClass,
|
||||
RowHandler<T> handler
|
||||
) {}
|
||||
""".formatted(GENERATED_FILE_HEADER, packageName, escapeJavadoc(tag)));
|
||||
|
||||
List<String> classNames = new ArrayList<>();
|
||||
Map<String, String> fieldNameToType = new TreeMap<>();
|
||||
for (var entry : tables.entrySet()) {
|
||||
String key = entry.getKey();
|
||||
Imposm3Table table = entry.getValue();
|
||||
List<OsmTableField> fields = parseTableFields(table);
|
||||
for (var field : fields) {
|
||||
String existing = fieldNameToType.get(field.name);
|
||||
if (existing == null) {
|
||||
fieldNameToType.put(field.name, field.clazz);
|
||||
} else if (!existing.equals(field.clazz)) {
|
||||
throw new IllegalArgumentException(
|
||||
"Field " + field.name + " has both " + existing + " and " + field.clazz + " types");
|
||||
}
|
||||
}
|
||||
Expression mappingExpression = parseImposm3MappingExpression(table);
|
||||
String mapping = """
|
||||
/** Imposm3 "mapping" to filter OSM elements that should appear in this "table". */
|
||||
public static final Expression MAPPING = %s;
|
||||
""".formatted(
|
||||
mappingExpression
|
||||
);
|
||||
String tableName = "osm_" + key;
|
||||
String className = lowerUnderscoreToUpperCamel(tableName);
|
||||
if (!"relation_member".equals(table.type)) {
|
||||
classNames.add(className);
|
||||
|
||||
tablesClass.append("""
|
||||
/** An OSM element that would appear in the {@code %s} table generated by imposm3. */
|
||||
public static record %s(%s) implements Row, %s {
|
||||
public %s(SourceFeature source, String mappingKey) {
|
||||
this(%s);
|
||||
}
|
||||
%s
|
||||
/**
|
||||
* Interface for layer implementations to extend to subscribe to OSM elements filtered and parsed as
|
||||
* {@link %s}.
|
||||
*/
|
||||
public interface Handler {
|
||||
void process(%s element, FeatureCollector features);
|
||||
}
|
||||
}
|
||||
""".formatted(
|
||||
tableName,
|
||||
escapeJavadoc(className),
|
||||
fields.stream().map(c -> "@Override " + c.clazz + " " + lowerUnderscoreToLowerCamel(c.name))
|
||||
.collect(joining(", ")),
|
||||
fields.stream().map(c -> lowerUnderscoreToUpperCamel("with_" + c.name))
|
||||
.collect(joining(", ")),
|
||||
className,
|
||||
fields.stream().map(c -> c.extractCode).collect(joining(", ")),
|
||||
mapping,
|
||||
escapeJavadoc(className),
|
||||
className
|
||||
).indent(2));
|
||||
}
|
||||
}
|
||||
|
||||
tablesClass.append(fieldNameToType.entrySet().stream().map(e -> {
|
||||
String attrName = lowerUnderscoreToLowerCamel(e.getKey());
|
||||
String type = e.getValue();
|
||||
String interfaceName = lowerUnderscoreToUpperCamel("with_" + e.getKey());
|
||||
return """
|
||||
/** Rows with a %s %s attribute. */
|
||||
public interface %s {
|
||||
%s %s();
|
||||
}
|
||||
""".formatted(
|
||||
escapeJavadoc(type),
|
||||
escapeJavadoc(attrName),
|
||||
interfaceName,
|
||||
type,
|
||||
attrName);
|
||||
}).collect(joining(LINE_SEPARATOR)).indent(2));
|
||||
|
||||
tablesClass.append("""
|
||||
/** Index to efficiently choose which imposm3 "tables" an element should appear in based on its attributes. */
|
||||
public static final MultiExpression<RowClassAndConstructor> MAPPINGS = MultiExpression.of(List.of(
|
||||
%s
|
||||
));
|
||||
""".formatted(
|
||||
classNames.stream().map(
|
||||
className -> "MultiExpression.entry(new RowClassAndConstructor(%s.class, %s::new), %s.MAPPING)".formatted(
|
||||
className, className, className))
|
||||
.collect(joining("," + LINE_SEPARATOR)).indent(2).strip()
|
||||
).indent(2));
|
||||
|
||||
String handlerCondition = classNames.stream().map(className ->
|
||||
"""
|
||||
if (handler instanceof %s.Handler typedHandler) {
|
||||
result.computeIfAbsent(%s.class, cls -> new ArrayList<>()).add(new RowHandlerAndClass<>(typedHandler.getClass(), typedHandler::process));
|
||||
}""".formatted(className, className)
|
||||
).collect(joining(LINE_SEPARATOR));
|
||||
tablesClass.append("""
|
||||
/**
|
||||
* Returns a map from imposm3 "table row" class to the layers that have a handler for it from a list of layer
|
||||
* implementations.
|
||||
*/
|
||||
public static Map<Class<? extends Row>, List<RowHandlerAndClass<?>>> generateDispatchMap(List<?> handlers) {
|
||||
Map<Class<? extends Row>, List<RowHandlerAndClass<?>>> result = new HashMap<>();
|
||||
for (var handler : handlers) {
|
||||
%s
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
""".formatted(handlerCondition.indent(6).trim()));
|
||||
Files.writeString(output.resolve("Tables.java"), tablesClass);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an {@link Expression} that implements the same logic as the <a href="https://imposm.org/docs/imposm3/latest/mapping.html">Imposm3
|
||||
* Data Mapping</a> definition for a table.
|
||||
*/
|
||||
static Expression parseImposm3MappingExpression(Imposm3Table table) {
|
||||
if (table.type_mappings != null) {
|
||||
return or(
|
||||
table.type_mappings.entrySet().stream().map(entry ->
|
||||
parseImposm3MappingExpression(entry.getKey(), entry.getValue(), table.filters)
|
||||
).toList()
|
||||
).simplify();
|
||||
} else {
|
||||
return parseImposm3MappingExpression(table.type, table.mapping, table.filters);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an {@link Expression} that implements the same logic as the <a href="https://imposm.org/docs/imposm3/latest/mapping.html#filters">Imposm3
|
||||
* Data Mapping filters</a> for a table.
|
||||
*/
|
||||
static Expression parseImposm3MappingExpression(String type, JsonNode mapping, Imposm3Filters filters) {
|
||||
return and(
|
||||
or(parseFieldMappingExpression(mapping).toList()),
|
||||
and(
|
||||
filters == null || filters.require == null ? List.of() : parseFieldMappingExpression(filters.require).toList()),
|
||||
not(or(
|
||||
filters == null || filters.reject == null ? List.of() : parseFieldMappingExpression(filters.reject).toList())),
|
||||
matchType(type.replaceAll("s$", ""))
|
||||
).simplify();
|
||||
}
|
||||
|
||||
private static List<OsmTableField> parseTableFields(Imposm3Table tableDefinition) {
|
||||
List<OsmTableField> result = new ArrayList<>();
|
||||
boolean relationMember = "relation_member".equals(tableDefinition.type);
|
||||
for (Imposm3Column col : tableDefinition.columns) {
|
||||
if (relationMember && col.from_member) {
|
||||
// layers process relation info that they need manually
|
||||
continue;
|
||||
}
|
||||
switch (col.type) {
|
||||
case "id", "validated_geometry", "area", "hstore_tags", "geometry" -> {
|
||||
// do nothing - already on source feature
|
||||
}
|
||||
case "member_id", "member_role", "member_type", "member_index" -> {
|
||||
// do nothing
|
||||
}
|
||||
case "mapping_key" -> result
|
||||
.add(new OsmTableField("String", col.name, "mappingKey"));
|
||||
case "mapping_value" -> result
|
||||
.add(new OsmTableField("String", col.name, "source.getString(mappingKey)"));
|
||||
case "string" -> result
|
||||
.add(new OsmTableField("String", col.name,
|
||||
"source.getString(\"%s\")".formatted(Objects.requireNonNull(col.key, col.toString()))));
|
||||
case "bool" -> result
|
||||
.add(new OsmTableField("boolean", col.name,
|
||||
"source.getBoolean(\"%s\")".formatted(Objects.requireNonNull(col.key, col.toString()))));
|
||||
case "integer" -> result
|
||||
.add(new OsmTableField("long", col.name,
|
||||
"source.getLong(\"%s\")".formatted(Objects.requireNonNull(col.key, col.toString()))));
|
||||
case "wayzorder" -> result.add(new OsmTableField("int", col.name, "source.getWayZorder()"));
|
||||
case "direction" -> result.add(new OsmTableField("int", col.name,
|
||||
"source.getDirection(\"%s\")".formatted(Objects.requireNonNull(col.key, col.toString()))));
|
||||
default -> throw new IllegalArgumentException("Unhandled column: " + col.type);
|
||||
}
|
||||
}
|
||||
result.add(new OsmTableField("SourceFeature", "source", "source"));
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a {@link MultiExpression} to efficiently determine the value for an output vector tile feature (i.e.
|
||||
* "class") based on the "field mapping" defined in the layer schema definition.
|
||||
*/
|
||||
static MultiExpression<String> generateFieldMapping(JsonNode valuesNode) {
|
||||
MultiExpression<String> mapping = MultiExpression.of(new ArrayList<>());
|
||||
valuesNode.fields().forEachRemaining(entry -> {
|
||||
String field = entry.getKey();
|
||||
JsonNode node = entry.getValue();
|
||||
Expression expression = or(parseFieldMappingExpression(node).toList()).simplify();
|
||||
if (!expression.equals(or()) && !expression.equals(and())) {
|
||||
mapping.expressions().add(MultiExpression.entry(field, expression));
|
||||
}
|
||||
});
|
||||
return mapping;
|
||||
}
|
||||
|
||||
private static Stream<Expression> parseFieldMappingExpression(JsonNode node) {
|
||||
if (node.isObject()) {
|
||||
List<String> keys = iterToList(node.fieldNames());
|
||||
if (keys.contains("__AND__")) {
|
||||
if (keys.size() > 1) {
|
||||
throw new IllegalArgumentException("Cannot combine __AND__ with others");
|
||||
}
|
||||
return Stream.of(and(parseFieldMappingExpression(node.get("__AND__")).toList()));
|
||||
} else if (keys.contains("__OR__")) {
|
||||
if (keys.size() > 1) {
|
||||
throw new IllegalArgumentException("Cannot combine __OR__ with others");
|
||||
}
|
||||
return Stream.of(or(parseFieldMappingExpression(node.get("__OR__")).toList()));
|
||||
} else {
|
||||
return iterToList(node.fields()).stream().map(entry -> {
|
||||
String field = entry.getKey();
|
||||
List<String> value = toFlatList(entry.getValue()).map(JsonNode::textValue).filter(Objects::nonNull).toList();
|
||||
return value.isEmpty() || value.contains("__any__") ? matchField(field) : matchAny(field, value);
|
||||
});
|
||||
}
|
||||
} else if (node.isArray()) {
|
||||
return iterToList(node.elements()).stream().flatMap(Generate::parseFieldMappingExpression);
|
||||
} else if (node.isNull()) {
|
||||
return Stream.empty();
|
||||
} else {
|
||||
throw new IllegalArgumentException("parseExpression input not handled: " + node);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a flattened list of all the elements in nested arrays from {@code node}.
|
||||
* <p>
|
||||
* For example: {@code [[[a, b], c], [d]} becomes {@code [a, b, c, d]}
|
||||
* <p>
|
||||
* And {@code a} becomes {@code [a]}
|
||||
*/
|
||||
private static Stream<JsonNode> toFlatList(JsonNode node) {
|
||||
return node.isArray() ? iterToList(node.elements()).stream().flatMap(Generate::toFlatList) : Stream.of(node);
|
||||
}
|
||||
|
||||
/** Returns java code that will recreate an {@link MultiExpression} identical to {@code mapping}. */
|
||||
private static String generateJavaCode(MultiExpression<String> mapping) {
|
||||
return "MultiExpression.of(List.of(" + mapping.expressions().stream()
|
||||
.map(s -> "MultiExpression.entry(%s, %s)".formatted(Format.quote(s.result()), s.expression()))
|
||||
.collect(joining(", ")) + "))";
|
||||
}
|
||||
|
||||
private static String lowerUnderscoreToLowerCamel(String name) {
|
||||
return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, name);
|
||||
}
|
||||
|
||||
private static String lowerUnderscoreToUpperCamel(String name) {
|
||||
return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name);
|
||||
}
|
||||
|
||||
private static <T> List<T> iterToList(Iterator<T> iter) {
|
||||
List<T> result = new ArrayList<>();
|
||||
iter.forEachRemaining(result::add);
|
||||
return result;
|
||||
}
|
||||
|
||||
/** Renders {@code markdown} as HTML and returns comment text safe to insert in generated javadoc. */
|
||||
private static String markdownToJavadoc(String markdown) {
|
||||
return Stream.of(markdown.strip().split("[\r\n][\r\n]+"))
|
||||
.map(p -> parser.parse(p.strip()))
|
||||
.map(node -> escapeJavadoc(renderer.render(node)))
|
||||
.map(p -> p.replaceAll("(^<p>|</p>$)", "").strip())
|
||||
.collect(joining(LINE_SEPARATOR + "<p>" + LINE_SEPARATOR));
|
||||
}
|
||||
|
||||
/** Returns {@code comment} text safe to insert in generated javadoc. */
|
||||
private static String escapeJavadoc(String comment) {
|
||||
return comment.strip().replaceAll("[\n\r*\\s]+", " ");
|
||||
}
|
||||
|
||||
private static String getFieldDescription(JsonNode value) {
|
||||
if (value.isTextual()) {
|
||||
return value.textValue();
|
||||
} else {
|
||||
return value.get("description").textValue();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Models for deserializing yaml into:
|
||||
*/
|
||||
|
||||
private record OpenmaptilesConfig(
|
||||
OpenmaptilesTileSet tileset
|
||||
) {}
|
||||
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
private record OpenmaptilesTileSet(
|
||||
List<String> layers,
|
||||
String version,
|
||||
String attribution,
|
||||
String name,
|
||||
String description,
|
||||
List<String> languages
|
||||
) {}
|
||||
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
private record LayerDetails(
|
||||
String id,
|
||||
String description,
|
||||
Map<String, JsonNode> fields,
|
||||
double buffer_size
|
||||
) {}
|
||||
|
||||
private record Datasource(
|
||||
String type,
|
||||
String mapping_file
|
||||
) {}
|
||||
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
private record LayerConfig(
|
||||
LayerDetails layer,
|
||||
List<Datasource> datasources
|
||||
) {}
|
||||
|
||||
private record Imposm3Column(
|
||||
String type,
|
||||
String name,
|
||||
String key,
|
||||
boolean from_member
|
||||
) {}
|
||||
|
||||
record Imposm3Filters(
|
||||
JsonNode reject,
|
||||
JsonNode require
|
||||
) {}
|
||||
|
||||
record Imposm3Table(
|
||||
String type,
|
||||
@JsonProperty("_resolve_wikidata") boolean resolveWikidata,
|
||||
List<Imposm3Column> columns,
|
||||
Imposm3Filters filters,
|
||||
JsonNode mapping,
|
||||
Map<String, JsonNode> type_mappings,
|
||||
@JsonProperty("relation_types") List<String> relationTypes
|
||||
) {}
|
||||
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
private record Imposm3Mapping(
|
||||
Map<String, Imposm3Table> tables
|
||||
) {}
|
||||
|
||||
private record OsmTableField(
|
||||
String clazz,
|
||||
String name,
|
||||
String extractCode
|
||||
) {}
|
||||
}
|
|
@ -1,8 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap;
|
||||
|
||||
import com.onthegomap.planetiler.ForwardingProfile;
|
||||
|
||||
/** Interface for all vector tile layer implementations that {@link BasemapProfile} delegates to. */
|
||||
public interface Layer extends
|
||||
ForwardingProfile.Handler,
|
||||
ForwardingProfile.HandlerForLayer {}
|
Plik diff jest za duży
Load Diff
Plik diff jest za duży
Load Diff
|
@ -1,82 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2021, MapTiler.com & OpenMapTiles contributors.
|
||||
All rights reserved.
|
||||
|
||||
Code license: BSD 3-Clause License
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Design license: CC-BY 4.0
|
||||
|
||||
See https://github.com/openmaptiles/openmaptiles/blob/master/LICENSE.md for details on usage
|
||||
*/
|
||||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import static com.onthegomap.planetiler.basemap.util.Utils.nullIfEmpty;
|
||||
import static com.onthegomap.planetiler.basemap.util.Utils.nullOrEmpty;
|
||||
|
||||
import com.onthegomap.planetiler.FeatureCollector;
|
||||
import com.onthegomap.planetiler.basemap.generated.OpenMapTilesSchema;
|
||||
import com.onthegomap.planetiler.basemap.generated.Tables;
|
||||
import com.onthegomap.planetiler.basemap.util.LanguageUtils;
|
||||
import com.onthegomap.planetiler.basemap.util.Utils;
|
||||
import com.onthegomap.planetiler.config.PlanetilerConfig;
|
||||
import com.onthegomap.planetiler.expression.MultiExpression;
|
||||
import com.onthegomap.planetiler.stats.Stats;
|
||||
import com.onthegomap.planetiler.util.Translations;
|
||||
|
||||
/**
|
||||
* Defines the logic for generating map elements in the {@code aerodrome_label} layer from source features.
|
||||
* <p>
|
||||
* This class is ported to Java from <a href="https://github.com/openmaptiles/openmaptiles/tree/master/layers/aerodrome_label">OpenMapTiles
|
||||
* aerodrome_layer sql files</a>.
|
||||
*/
|
||||
public class AerodromeLabel implements
|
||||
OpenMapTilesSchema.AerodromeLabel,
|
||||
Tables.OsmAerodromeLabelPoint.Handler {
|
||||
|
||||
private final MultiExpression.Index<String> classLookup;
|
||||
private final Translations translations;
|
||||
|
||||
public AerodromeLabel(Translations translations, PlanetilerConfig config, Stats stats) {
|
||||
this.classLookup = FieldMappings.Class.index();
|
||||
this.translations = translations;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmAerodromeLabelPoint element, FeatureCollector features) {
|
||||
String clazz = classLookup.getOrElse(element.source(), FieldValues.CLASS_OTHER);
|
||||
boolean important = !nullOrEmpty(element.iata()) && FieldValues.CLASS_INTERNATIONAL.equals(clazz);
|
||||
features.centroid(LAYER_NAME)
|
||||
.setBufferPixels(BUFFER_SIZE)
|
||||
.setMinZoom(important ? 8 : 10)
|
||||
.putAttrs(LanguageUtils.getNames(element.source().tags(), translations))
|
||||
.putAttrs(Utils.elevationTags(element.ele()))
|
||||
.setAttr(Fields.IATA, nullIfEmpty(element.iata()))
|
||||
.setAttr(Fields.ICAO, nullIfEmpty(element.icao()))
|
||||
.setAttr(Fields.CLASS, clazz);
|
||||
}
|
||||
}
|
|
@ -1,84 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2021, MapTiler.com & OpenMapTiles contributors.
|
||||
All rights reserved.
|
||||
|
||||
Code license: BSD 3-Clause License
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Design license: CC-BY 4.0
|
||||
|
||||
See https://github.com/openmaptiles/openmaptiles/blob/master/LICENSE.md for details on usage
|
||||
*/
|
||||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import com.onthegomap.planetiler.FeatureCollector;
|
||||
import com.onthegomap.planetiler.basemap.generated.OpenMapTilesSchema;
|
||||
import com.onthegomap.planetiler.basemap.generated.Tables;
|
||||
import com.onthegomap.planetiler.config.PlanetilerConfig;
|
||||
import com.onthegomap.planetiler.stats.Stats;
|
||||
import com.onthegomap.planetiler.util.Translations;
|
||||
|
||||
/**
|
||||
* Defines the logic for generating map elements in the {@code aeroway} layer from source features.
|
||||
* <p>
|
||||
* This class is ported to Java from <a href="https://github.com/openmaptiles/openmaptiles/tree/master/layers/aeroway">OpenMapTiles
|
||||
* aeroway sql files</a>.
|
||||
*/
|
||||
public class Aeroway implements
|
||||
OpenMapTilesSchema.Aeroway,
|
||||
Tables.OsmAerowayLinestring.Handler,
|
||||
Tables.OsmAerowayPolygon.Handler,
|
||||
Tables.OsmAerowayPoint.Handler {
|
||||
|
||||
public Aeroway(Translations translations, PlanetilerConfig config, Stats stats) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmAerowayPolygon element, FeatureCollector features) {
|
||||
features.polygon(LAYER_NAME)
|
||||
.setMinZoom(10)
|
||||
.setMinPixelSize(2)
|
||||
.setAttr(Fields.CLASS, element.aeroway())
|
||||
.setAttr(Fields.REF, element.ref());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmAerowayLinestring element, FeatureCollector features) {
|
||||
features.line(LAYER_NAME)
|
||||
.setMinZoom(10)
|
||||
.setAttr(Fields.CLASS, element.aeroway())
|
||||
.setAttr(Fields.REF, element.ref());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmAerowayPoint element, FeatureCollector features) {
|
||||
features.point(LAYER_NAME)
|
||||
.setMinZoom(14)
|
||||
.setAttr(Fields.CLASS, element.aeroway())
|
||||
.setAttr(Fields.REF, element.ref());
|
||||
}
|
||||
}
|
|
@ -1,472 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2021, MapTiler.com & OpenMapTiles contributors.
|
||||
All rights reserved.
|
||||
|
||||
Code license: BSD 3-Clause License
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Design license: CC-BY 4.0
|
||||
|
||||
See https://github.com/openmaptiles/openmaptiles/blob/master/LICENSE.md for details on usage
|
||||
*/
|
||||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import static com.onthegomap.planetiler.util.MemoryEstimator.CLASS_HEADER_BYTES;
|
||||
import static com.onthegomap.planetiler.util.MemoryEstimator.POINTER_BYTES;
|
||||
import static com.onthegomap.planetiler.util.MemoryEstimator.estimateSize;
|
||||
import static java.util.stream.Collectors.counting;
|
||||
import static java.util.stream.Collectors.groupingBy;
|
||||
|
||||
import com.carrotsearch.hppc.LongObjectMap;
|
||||
import com.graphhopper.coll.GHLongObjectHashMap;
|
||||
import com.onthegomap.planetiler.FeatureCollector;
|
||||
import com.onthegomap.planetiler.FeatureMerge;
|
||||
import com.onthegomap.planetiler.VectorTile;
|
||||
import com.onthegomap.planetiler.basemap.BasemapProfile;
|
||||
import com.onthegomap.planetiler.basemap.generated.OpenMapTilesSchema;
|
||||
import com.onthegomap.planetiler.config.PlanetilerConfig;
|
||||
import com.onthegomap.planetiler.geo.GeoUtils;
|
||||
import com.onthegomap.planetiler.geo.GeometryException;
|
||||
import com.onthegomap.planetiler.reader.SimpleFeature;
|
||||
import com.onthegomap.planetiler.reader.SourceFeature;
|
||||
import com.onthegomap.planetiler.reader.osm.OsmElement;
|
||||
import com.onthegomap.planetiler.reader.osm.OsmRelationInfo;
|
||||
import com.onthegomap.planetiler.stats.Stats;
|
||||
import com.onthegomap.planetiler.util.Format;
|
||||
import com.onthegomap.planetiler.util.MemoryEstimator;
|
||||
import com.onthegomap.planetiler.util.Parse;
|
||||
import com.onthegomap.planetiler.util.Translations;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
import org.locationtech.jts.geom.Coordinate;
|
||||
import org.locationtech.jts.geom.Geometry;
|
||||
import org.locationtech.jts.geom.LineString;
|
||||
import org.locationtech.jts.geom.Point;
|
||||
import org.locationtech.jts.geom.TopologyException;
|
||||
import org.locationtech.jts.geom.prep.PreparedGeometry;
|
||||
import org.locationtech.jts.geom.prep.PreparedGeometryFactory;
|
||||
import org.locationtech.jts.operation.linemerge.LineMerger;
|
||||
import org.locationtech.jts.operation.polygonize.Polygonizer;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* Defines the logic for generating map elements for country, state, and town boundaries in the {@code boundary} layer
|
||||
* from source features.
|
||||
* <p>
|
||||
* This class is ported to Java from <a href="https://github.com/openmaptiles/openmaptiles/tree/master/layers/boundary">OpenMapTiles
|
||||
* boundary sql files</a>.
|
||||
*/
|
||||
public class Boundary implements
|
||||
OpenMapTilesSchema.Boundary,
|
||||
BasemapProfile.NaturalEarthProcessor,
|
||||
BasemapProfile.OsmRelationPreprocessor,
|
||||
BasemapProfile.OsmAllProcessor,
|
||||
BasemapProfile.FeaturePostProcessor,
|
||||
BasemapProfile.FinishHandler {
|
||||
|
||||
/*
|
||||
* Uses natural earth at lower zoom levels and OpenStreetMap at higher zoom levels.
|
||||
*
|
||||
* For OpenStreetMap data at higher zoom levels:
|
||||
* 1) Preprocess relations on the first pass to extract info for relations where
|
||||
* type=boundary and boundary=administrative and store the admin_level for
|
||||
* later.
|
||||
* 2) When processing individual ways, take the minimum (most important) admin
|
||||
* level of every relation they are a part of and use that as the admin level
|
||||
* for the way.
|
||||
* 3) If boundary_country_names argument is true and the way is part of a country
|
||||
* (admin_level=2) boundary, then hold onto it for later
|
||||
* 4) When we finish processing the OSM source, build country polygons from the
|
||||
* saved ways and use that to determine which country is on the left and right
|
||||
* side of each way, then emit the way with ADM0_L and ADM0_R keys set.
|
||||
* 5) Before emitting boundary lines, merge linestrings with the same tags.
|
||||
*/
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(Boundary.class);
|
||||
private static final double COUNTRY_TEST_OFFSET = GeoUtils.metersToPixelAtEquator(0, 10) / 256d;
|
||||
private final Stats stats;
|
||||
private final boolean addCountryNames;
|
||||
// may be updated concurrently by multiple threads
|
||||
private final Map<Long, String> regionNames = new ConcurrentHashMap<>();
|
||||
// need to synchronize updates to these shared data structures:
|
||||
private final Map<Long, List<Geometry>> regionGeometries = new HashMap<>();
|
||||
private final Map<CountryBoundaryComponent, List<Geometry>> boundariesToMerge = new HashMap<>();
|
||||
private final PlanetilerConfig config;
|
||||
|
||||
public Boundary(Translations translations, PlanetilerConfig config, Stats stats) {
|
||||
this.config = config;
|
||||
this.addCountryNames = config.arguments().getBoolean(
|
||||
"boundary_country_names",
|
||||
"boundary layer: add left/right codes of neighboring countries",
|
||||
true
|
||||
);
|
||||
this.stats = stats;
|
||||
}
|
||||
|
||||
private static boolean isDisputed(Map<String, Object> tags) {
|
||||
return Parse.bool(tags.get("disputed")) ||
|
||||
Parse.bool(tags.get("dispute")) ||
|
||||
"dispute".equals(tags.get("border_status")) ||
|
||||
tags.containsKey("disputed_by") ||
|
||||
tags.containsKey("claimed_by");
|
||||
}
|
||||
|
||||
private static String editName(String name) {
|
||||
return name == null ? null : name.replace(" at ", "")
|
||||
.replaceAll("\\s+", "")
|
||||
.replace("Extentof", "");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void release() {
|
||||
regionGeometries.clear();
|
||||
boundariesToMerge.clear();
|
||||
regionNames.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processNaturalEarth(String table, SourceFeature feature, FeatureCollector features) {
|
||||
boolean disputed = feature.getString("featurecla", "").startsWith("Disputed");
|
||||
record BoundaryInfo(int adminLevel, int minzoom, int maxzoom) {}
|
||||
BoundaryInfo info = switch (table) {
|
||||
case "ne_110m_admin_0_boundary_lines_land" -> new BoundaryInfo(2, 0, 0);
|
||||
case "ne_50m_admin_0_boundary_lines_land" -> new BoundaryInfo(2, 1, 3);
|
||||
case "ne_10m_admin_0_boundary_lines_land" -> feature.hasTag("featurecla", "Lease Limit") ? null
|
||||
: new BoundaryInfo(2, 4, 4);
|
||||
case "ne_10m_admin_1_states_provinces_lines" -> {
|
||||
Double minZoom = Parse.parseDoubleOrNull(feature.getTag("min_zoom"));
|
||||
yield minZoom != null && minZoom <= 7 ? new BoundaryInfo(4, 1, 4) :
|
||||
minZoom != null && minZoom <= 7.7 ? new BoundaryInfo(4, 4, 4) :
|
||||
null;
|
||||
}
|
||||
default -> null;
|
||||
};
|
||||
if (info != null) {
|
||||
features.line(LAYER_NAME).setBufferPixels(BUFFER_SIZE)
|
||||
.setZoomRange(info.minzoom, info.maxzoom)
|
||||
.setMinPixelSizeAtAllZooms(0)
|
||||
.setAttr(Fields.ADMIN_LEVEL, info.adminLevel)
|
||||
.setAttr(Fields.MARITIME, 0)
|
||||
.setAttr(Fields.DISPUTED, disputed ? 1 : 0);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<OsmRelationInfo> preprocessOsmRelation(OsmElement.Relation relation) {
|
||||
if (relation.hasTag("type", "boundary") &&
|
||||
relation.hasTag("admin_level") &&
|
||||
relation.hasTag("boundary", "administrative")) {
|
||||
Integer adminLevelValue = Parse.parseRoundInt(relation.getTag("admin_level"));
|
||||
String code = relation.getString("ISO3166-1:alpha3");
|
||||
if (adminLevelValue != null && adminLevelValue >= 2 && adminLevelValue <= 10) {
|
||||
boolean disputed = isDisputed(relation.tags());
|
||||
if (code != null) {
|
||||
regionNames.put(relation.id(), code);
|
||||
}
|
||||
return List.of(new BoundaryRelation(
|
||||
relation.id(),
|
||||
adminLevelValue,
|
||||
disputed,
|
||||
relation.getString("name"),
|
||||
disputed ? relation.getString("claimed_by") : null,
|
||||
code
|
||||
));
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processAllOsm(SourceFeature feature, FeatureCollector features) {
|
||||
if (!feature.canBeLine()) {
|
||||
return;
|
||||
}
|
||||
var relationInfos = feature.relationInfo(BoundaryRelation.class);
|
||||
if (!relationInfos.isEmpty()) {
|
||||
int minAdminLevel = Integer.MAX_VALUE;
|
||||
String disputedName = null, claimedBy = null;
|
||||
Set<Long> regionIds = new HashSet<>();
|
||||
boolean disputed = false;
|
||||
// aggregate all borders this way is a part of - take the lowest
|
||||
// admin level, and assume it is disputed if any relation is disputed.
|
||||
for (var info : relationInfos) {
|
||||
BoundaryRelation rel = info.relation();
|
||||
disputed |= rel.disputed;
|
||||
if (rel.adminLevel < minAdminLevel) {
|
||||
minAdminLevel = rel.adminLevel;
|
||||
}
|
||||
if (rel.disputed) {
|
||||
disputedName = disputedName == null ? rel.name : disputedName;
|
||||
claimedBy = claimedBy == null ? rel.claimedBy : claimedBy;
|
||||
}
|
||||
if (minAdminLevel == 2 && regionNames.containsKey(info.relation().id)) {
|
||||
regionIds.add(info.relation().id);
|
||||
}
|
||||
}
|
||||
|
||||
if (minAdminLevel <= 10) {
|
||||
boolean wayIsDisputed = isDisputed(feature.tags());
|
||||
disputed |= wayIsDisputed;
|
||||
if (wayIsDisputed) {
|
||||
disputedName = disputedName == null ? feature.getString("name") : disputedName;
|
||||
claimedBy = claimedBy == null ? feature.getString("claimed_by") : claimedBy;
|
||||
}
|
||||
boolean maritime = feature.getBoolean("maritime") ||
|
||||
feature.hasTag("natural", "coastline") ||
|
||||
feature.hasTag("boundary_type", "maritime");
|
||||
int minzoom =
|
||||
(maritime && minAdminLevel == 2) ? 4 :
|
||||
minAdminLevel <= 4 ? 5 :
|
||||
minAdminLevel <= 6 ? 9 :
|
||||
minAdminLevel <= 8 ? 11 : 12;
|
||||
if (addCountryNames && !regionIds.isEmpty()) {
|
||||
// save for later
|
||||
try {
|
||||
CountryBoundaryComponent component = new CountryBoundaryComponent(
|
||||
minAdminLevel,
|
||||
disputed,
|
||||
maritime,
|
||||
minzoom,
|
||||
feature.line(),
|
||||
regionIds,
|
||||
claimedBy,
|
||||
disputedName
|
||||
);
|
||||
// multiple threads may update this concurrently
|
||||
synchronized (this) {
|
||||
boundariesToMerge.computeIfAbsent(component.groupingKey(), key -> new ArrayList<>()).add(component.line);
|
||||
for (var info : relationInfos) {
|
||||
var rel = info.relation();
|
||||
if (rel.adminLevel <= 2) {
|
||||
regionGeometries.computeIfAbsent(rel.id, id -> new ArrayList<>()).add(component.line);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (GeometryException e) {
|
||||
LOGGER.warn("Cannot extract boundary line from " + feature);
|
||||
}
|
||||
} else {
|
||||
features.line(LAYER_NAME).setBufferPixels(BUFFER_SIZE)
|
||||
.setAttr(Fields.ADMIN_LEVEL, minAdminLevel)
|
||||
.setAttr(Fields.DISPUTED, disputed ? 1 : 0)
|
||||
.setAttr(Fields.MARITIME, maritime ? 1 : 0)
|
||||
.setMinPixelSizeAtAllZooms(0)
|
||||
.setMinZoom(minzoom)
|
||||
.setAttr(Fields.CLAIMED_BY, claimedBy)
|
||||
.setAttr(Fields.DISPUTED_NAME, editName(disputedName));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void finish(String sourceName, FeatureCollector.Factory featureCollectors,
|
||||
Consumer<FeatureCollector.Feature> emit) {
|
||||
if (BasemapProfile.OSM_SOURCE.equals(sourceName)) {
|
||||
var timer = stats.startStage("boundaries");
|
||||
LongObjectMap<PreparedGeometry> countryBoundaries = prepareRegionPolygons();
|
||||
|
||||
for (var entry : boundariesToMerge.entrySet()) {
|
||||
CountryBoundaryComponent key = entry.getKey();
|
||||
LineMerger merger = new LineMerger();
|
||||
for (Geometry geom : entry.getValue()) {
|
||||
merger.add(geom);
|
||||
}
|
||||
entry.getValue().clear();
|
||||
for (Object merged : merger.getMergedLineStrings()) {
|
||||
if (merged instanceof LineString lineString) {
|
||||
BorderingRegions borderingRegions = getBorderingRegions(countryBoundaries, key.regions, lineString);
|
||||
|
||||
var features = featureCollectors.get(SimpleFeature.fromWorldGeometry(lineString));
|
||||
features.line(LAYER_NAME).setBufferPixels(BUFFER_SIZE)
|
||||
.setAttr(Fields.ADMIN_LEVEL, key.adminLevel)
|
||||
.setAttr(Fields.DISPUTED, key.disputed ? 1 : 0)
|
||||
.setAttr(Fields.MARITIME, key.maritime ? 1 : 0)
|
||||
.setAttr(Fields.CLAIMED_BY, key.claimedBy)
|
||||
.setAttr(Fields.DISPUTED_NAME, key.disputed ? editName(key.name) : null)
|
||||
.setAttr(Fields.ADM0_L, borderingRegions.left == null ? null : regionNames.get(borderingRegions.left))
|
||||
.setAttr(Fields.ADM0_R, borderingRegions.right == null ? null : regionNames.get(borderingRegions.right))
|
||||
.setMinPixelSizeAtAllZooms(0)
|
||||
.setMinZoom(key.minzoom);
|
||||
for (var feature : features) {
|
||||
emit.accept(feature);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
timer.stop();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<VectorTile.Feature> postProcess(int zoom, List<VectorTile.Feature> items) {
|
||||
double minLength = config.minFeatureSize(zoom);
|
||||
double tolerance = config.tolerance(zoom);
|
||||
return FeatureMerge.mergeLineStrings(items, attrs -> minLength, tolerance, BUFFER_SIZE);
|
||||
}
|
||||
|
||||
/** Returns the left and right country for {@code lineString}. */
|
||||
private BorderingRegions getBorderingRegions(
|
||||
LongObjectMap<PreparedGeometry> countryBoundaries,
|
||||
Set<Long> allRegions,
|
||||
LineString lineString
|
||||
) {
|
||||
Set<Long> validRegions = allRegions.stream()
|
||||
.filter(countryBoundaries::containsKey)
|
||||
.collect(Collectors.toSet());
|
||||
if (validRegions.isEmpty()) {
|
||||
return BorderingRegions.empty();
|
||||
}
|
||||
List<Long> rights = new ArrayList<>();
|
||||
List<Long> lefts = new ArrayList<>();
|
||||
int steps = 10;
|
||||
for (int i = 0; i < steps; i++) {
|
||||
double ratio = (double) (i + 1) / (steps + 2);
|
||||
Point right = GeoUtils.pointAlongOffset(lineString, ratio, COUNTRY_TEST_OFFSET);
|
||||
Point left = GeoUtils.pointAlongOffset(lineString, ratio, -COUNTRY_TEST_OFFSET);
|
||||
for (Long regionId : validRegions) {
|
||||
PreparedGeometry geom = countryBoundaries.get(regionId);
|
||||
if (geom != null) {
|
||||
if (geom.contains(right)) {
|
||||
rights.add(regionId);
|
||||
} else if (geom.contains(left)) {
|
||||
lefts.add(regionId);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var right = mode(rights);
|
||||
if (right != null) {
|
||||
lefts.removeAll(List.of(right));
|
||||
}
|
||||
var left = mode(lefts);
|
||||
|
||||
if (left == null && right == null) {
|
||||
Coordinate point = GeoUtils.worldToLatLonCoords(GeoUtils.pointAlongOffset(lineString, 0.5, 0)).getCoordinate();
|
||||
LOGGER.warn("no left or right country for border between OSM country relations: %s around %s"
|
||||
.formatted(
|
||||
validRegions,
|
||||
Format.osmDebugUrl(10, point)
|
||||
));
|
||||
}
|
||||
|
||||
return new BorderingRegions(left, right);
|
||||
}
|
||||
|
||||
/** Returns a map from region ID to prepared geometry optimized for {@code contains} queries. */
|
||||
private LongObjectMap<PreparedGeometry> prepareRegionPolygons() {
|
||||
LOGGER.info("Creating polygons for " + regionGeometries.size() + " boundaries");
|
||||
LongObjectMap<PreparedGeometry> countryBoundaries = new GHLongObjectHashMap<>();
|
||||
for (var entry : regionGeometries.entrySet()) {
|
||||
Long regionId = entry.getKey();
|
||||
Polygonizer polygonizer = new Polygonizer();
|
||||
polygonizer.add(entry.getValue());
|
||||
try {
|
||||
Geometry combined = polygonizer.getGeometry().union();
|
||||
if (combined.isEmpty()) {
|
||||
LOGGER.warn("Unable to form closed polygon for OSM relation " + regionId
|
||||
+ " (likely missing edges)");
|
||||
} else {
|
||||
countryBoundaries.put(regionId, PreparedGeometryFactory.prepare(combined));
|
||||
}
|
||||
} catch (TopologyException e) {
|
||||
LOGGER
|
||||
.warn("Unable to build boundary polygon for OSM relation " + regionId + ": " + e.getMessage());
|
||||
}
|
||||
}
|
||||
LOGGER.info("Finished creating " + countryBoundaries.size() + " country polygons");
|
||||
return countryBoundaries;
|
||||
}
|
||||
|
||||
/** Returns most frequently-occurring element in {@code list}. */
|
||||
private static Long mode(List<Long> list) {
|
||||
return list.stream()
|
||||
.collect(groupingBy(Function.identity(), counting())).entrySet().stream()
|
||||
.max(Map.Entry.comparingByValue())
|
||||
.map(Map.Entry::getKey)
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
private static record BorderingRegions(Long left, Long right) {
|
||||
|
||||
public static BorderingRegions empty() {
|
||||
return new BorderingRegions(null, null);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Minimal set of information extracted from a boundary relation to be used when processing each way in that
|
||||
* relation.
|
||||
*/
|
||||
private static record BoundaryRelation(
|
||||
long id,
|
||||
int adminLevel,
|
||||
boolean disputed,
|
||||
String name,
|
||||
String claimedBy,
|
||||
String iso3166alpha3
|
||||
) implements OsmRelationInfo {
|
||||
|
||||
@Override
|
||||
public long estimateMemoryUsageBytes() {
|
||||
return CLASS_HEADER_BYTES
|
||||
+ MemoryEstimator.estimateSizeLong(id)
|
||||
+ MemoryEstimator.estimateSizeInt(adminLevel)
|
||||
+ estimateSize(disputed)
|
||||
+ POINTER_BYTES + estimateSize(name)
|
||||
+ POINTER_BYTES + estimateSize(claimedBy)
|
||||
+ POINTER_BYTES + estimateSize(iso3166alpha3);
|
||||
}
|
||||
}
|
||||
|
||||
/** Information to hold onto from processing a way in a boundary relation to determine the left/right region ID later. */
|
||||
private static record CountryBoundaryComponent(
|
||||
int adminLevel,
|
||||
boolean disputed,
|
||||
boolean maritime,
|
||||
int minzoom,
|
||||
Geometry line,
|
||||
Set<Long> regions,
|
||||
String claimedBy,
|
||||
String name
|
||||
) {
|
||||
|
||||
CountryBoundaryComponent groupingKey() {
|
||||
return new CountryBoundaryComponent(adminLevel, disputed, maritime, minzoom, null, regions, claimedBy, name);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,192 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2021, MapTiler.com & OpenMapTiles contributors.
|
||||
All rights reserved.
|
||||
|
||||
Code license: BSD 3-Clause License
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Design license: CC-BY 4.0
|
||||
|
||||
See https://github.com/openmaptiles/openmaptiles/blob/master/LICENSE.md for details on usage
|
||||
*/
|
||||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import static com.onthegomap.planetiler.basemap.util.Utils.coalesce;
|
||||
import static com.onthegomap.planetiler.util.MemoryEstimator.CLASS_HEADER_BYTES;
|
||||
import static com.onthegomap.planetiler.util.Parse.parseDoubleOrNull;
|
||||
import static java.util.Map.entry;
|
||||
|
||||
import com.onthegomap.planetiler.FeatureCollector;
|
||||
import com.onthegomap.planetiler.FeatureMerge;
|
||||
import com.onthegomap.planetiler.VectorTile;
|
||||
import com.onthegomap.planetiler.basemap.BasemapProfile;
|
||||
import com.onthegomap.planetiler.basemap.generated.OpenMapTilesSchema;
|
||||
import com.onthegomap.planetiler.basemap.generated.Tables;
|
||||
import com.onthegomap.planetiler.config.PlanetilerConfig;
|
||||
import com.onthegomap.planetiler.geo.GeometryException;
|
||||
import com.onthegomap.planetiler.reader.osm.OsmElement;
|
||||
import com.onthegomap.planetiler.reader.osm.OsmRelationInfo;
|
||||
import com.onthegomap.planetiler.stats.Stats;
|
||||
import com.onthegomap.planetiler.util.MemoryEstimator;
|
||||
import com.onthegomap.planetiler.util.Translations;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Defines the logic for generating map elements for buildings in the {@code building} layer from source features.
|
||||
* <p>
|
||||
* This class is ported to Java from <a href="https://github.com/openmaptiles/openmaptiles/tree/master/layers/building">OpenMapTiles
|
||||
* building sql files</a>.
|
||||
*/
|
||||
public class Building implements
|
||||
OpenMapTilesSchema.Building,
|
||||
Tables.OsmBuildingPolygon.Handler,
|
||||
BasemapProfile.FeaturePostProcessor,
|
||||
BasemapProfile.OsmRelationPreprocessor {
|
||||
|
||||
/*
|
||||
* Emit all buildings from OSM data at z14.
|
||||
*
|
||||
* At z13, emit all buildings at process-time, but then at tile render-time,
|
||||
* merge buildings that are overlapping or almost touching into combined
|
||||
* buildings so that entire city blocks show up as a single building polygon.
|
||||
*
|
||||
* THIS IS VERY EXPENSIVE! Merging buildings at z13 adds about 50% to the
|
||||
* total map generation time. To disable it, set building_merge_z13 argument
|
||||
* to false.
|
||||
*/
|
||||
|
||||
private static final Map<String, String> MATERIAL_COLORS = Map.ofEntries(
|
||||
entry("cement_block", "#6a7880"),
|
||||
entry("brick", "#bd8161"),
|
||||
entry("plaster", "#dadbdb"),
|
||||
entry("wood", "#d48741"),
|
||||
entry("concrete", "#d3c2b0"),
|
||||
entry("metal", "#b7b1a6"),
|
||||
entry("stone", "#b4a995"),
|
||||
entry("mud", "#9d8b75"),
|
||||
entry("steel", "#b7b1a6"), // same as metal
|
||||
entry("glass", "#5a81a0"),
|
||||
entry("traditional", "#bd8161"), // same as brick
|
||||
entry("masonry", "#bd8161"), // same as brick
|
||||
entry("Brick", "#bd8161"), // same as brick
|
||||
entry("tin", "#b7b1a6"), // same as metal
|
||||
entry("timber_framing", "#b3b0a9"),
|
||||
entry("sandstone", "#b4a995"), // same as stone
|
||||
entry("clay", "#9d8b75") // same as mud
|
||||
);
|
||||
private final boolean mergeZ13Buildings;
|
||||
|
||||
public Building(Translations translations, PlanetilerConfig config, Stats stats) {
|
||||
this.mergeZ13Buildings = config.arguments().getBoolean(
|
||||
"building_merge_z13",
|
||||
"building layer: merge nearby buildings at z13",
|
||||
true
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<OsmRelationInfo> preprocessOsmRelation(OsmElement.Relation relation) {
|
||||
if (relation.hasTag("type", "building")) {
|
||||
return List.of(new BuildingRelationInfo(relation.id()));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmBuildingPolygon element, FeatureCollector features) {
|
||||
Boolean hide3d = null;
|
||||
var relations = element.source().relationInfo(BuildingRelationInfo.class);
|
||||
for (var relation : relations) {
|
||||
if ("outline".equals(relation.role())) {
|
||||
hide3d = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
String color = element.colour();
|
||||
if (color == null && element.material() != null) {
|
||||
color = MATERIAL_COLORS.get(element.material());
|
||||
}
|
||||
if (color != null) {
|
||||
color = color.toLowerCase(Locale.ROOT);
|
||||
}
|
||||
|
||||
Double height = coalesce(
|
||||
parseDoubleOrNull(element.height()),
|
||||
parseDoubleOrNull(element.buildingheight())
|
||||
);
|
||||
Double minHeight = coalesce(
|
||||
parseDoubleOrNull(element.minHeight()),
|
||||
parseDoubleOrNull(element.buildingminHeight())
|
||||
);
|
||||
Double levels = coalesce(
|
||||
parseDoubleOrNull(element.levels()),
|
||||
parseDoubleOrNull(element.buildinglevels())
|
||||
);
|
||||
Double minLevels = coalesce(
|
||||
parseDoubleOrNull(element.minLevel()),
|
||||
parseDoubleOrNull(element.buildingminLevel())
|
||||
);
|
||||
|
||||
int renderHeight = (int) Math.ceil(height != null ? height
|
||||
: levels != null ? (levels * 3.66) : 5);
|
||||
int renderMinHeight = (int) Math.floor(minHeight != null ? minHeight
|
||||
: minLevels != null ? (minLevels * 3.66) : 0);
|
||||
|
||||
if (renderHeight < 3660 && renderMinHeight < 3660) {
|
||||
var feature = features.polygon(LAYER_NAME).setBufferPixels(BUFFER_SIZE)
|
||||
.setMinZoom(13)
|
||||
.setMinPixelSize(2)
|
||||
.setAttrWithMinzoom(Fields.RENDER_HEIGHT, renderHeight, 14)
|
||||
.setAttrWithMinzoom(Fields.RENDER_MIN_HEIGHT, renderMinHeight, 14)
|
||||
.setAttrWithMinzoom(Fields.COLOUR, color, 14)
|
||||
.setAttrWithMinzoom(Fields.HIDE_3D, hide3d, 14)
|
||||
.setSortKey(renderHeight);
|
||||
if (mergeZ13Buildings) {
|
||||
feature
|
||||
.setMinPixelSize(0.1)
|
||||
.setPixelTolerance(0.25);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<VectorTile.Feature> postProcess(int zoom,
|
||||
List<VectorTile.Feature> items) throws GeometryException {
|
||||
return (mergeZ13Buildings && zoom == 13) ? FeatureMerge.mergeNearbyPolygons(items, 4, 4, 0.5, 0.5) : items;
|
||||
}
|
||||
|
||||
private static record BuildingRelationInfo(long id) implements OsmRelationInfo {
|
||||
|
||||
@Override
|
||||
public long estimateMemoryUsageBytes() {
|
||||
return CLASS_HEADER_BYTES + MemoryEstimator.estimateSizeLong(id);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,65 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2021, MapTiler.com & OpenMapTiles contributors.
|
||||
All rights reserved.
|
||||
|
||||
Code license: BSD 3-Clause License
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Design license: CC-BY 4.0
|
||||
|
||||
See https://github.com/openmaptiles/openmaptiles/blob/master/LICENSE.md for details on usage
|
||||
*/
|
||||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import com.onthegomap.planetiler.FeatureCollector;
|
||||
import com.onthegomap.planetiler.basemap.generated.OpenMapTilesSchema;
|
||||
import com.onthegomap.planetiler.basemap.generated.Tables;
|
||||
import com.onthegomap.planetiler.config.PlanetilerConfig;
|
||||
import com.onthegomap.planetiler.stats.Stats;
|
||||
import com.onthegomap.planetiler.util.Translations;
|
||||
|
||||
/**
|
||||
* Defines the logic for generating map elements in the {@code housenumber} layer from source features.
|
||||
* <p>
|
||||
* This class is ported to Java from <a href="https://github.com/openmaptiles/openmaptiles/tree/master/layers/housenumber">OpenMapTiles
|
||||
* housenumber sql files</a>.
|
||||
*/
|
||||
public class Housenumber implements
|
||||
OpenMapTilesSchema.Housenumber,
|
||||
Tables.OsmHousenumberPoint.Handler {
|
||||
|
||||
public Housenumber(Translations translations, PlanetilerConfig config, Stats stats) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmHousenumberPoint element, FeatureCollector features) {
|
||||
features.centroidIfConvex(LAYER_NAME)
|
||||
.setBufferPixels(BUFFER_SIZE)
|
||||
.setAttr(Fields.HOUSENUMBER, element.housenumber())
|
||||
.setMinZoom(14);
|
||||
}
|
||||
}
|
|
@ -1,182 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2021, MapTiler.com & OpenMapTiles contributors.
|
||||
All rights reserved.
|
||||
|
||||
Code license: BSD 3-Clause License
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Design license: CC-BY 4.0
|
||||
|
||||
See https://github.com/openmaptiles/openmaptiles/blob/master/LICENSE.md for details on usage
|
||||
*/
|
||||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import com.onthegomap.planetiler.FeatureCollector;
|
||||
import com.onthegomap.planetiler.FeatureMerge;
|
||||
import com.onthegomap.planetiler.VectorTile;
|
||||
import com.onthegomap.planetiler.basemap.BasemapProfile;
|
||||
import com.onthegomap.planetiler.basemap.generated.OpenMapTilesSchema;
|
||||
import com.onthegomap.planetiler.basemap.generated.Tables;
|
||||
import com.onthegomap.planetiler.config.PlanetilerConfig;
|
||||
import com.onthegomap.planetiler.expression.MultiExpression;
|
||||
import com.onthegomap.planetiler.geo.GeometryException;
|
||||
import com.onthegomap.planetiler.reader.SourceFeature;
|
||||
import com.onthegomap.planetiler.stats.Stats;
|
||||
import com.onthegomap.planetiler.util.Translations;
|
||||
import com.onthegomap.planetiler.util.ZoomFunction;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Defines the logic for generating map elements for natural land cover polygons like ice, sand, and forest in the
|
||||
* {@code landcover} layer from source features.
|
||||
* <p>
|
||||
* This class is ported to Java from <a href="https://github.com/openmaptiles/openmaptiles/tree/master/layers/landcover">OpenMapTiles
|
||||
* landcover sql files</a>.
|
||||
*/
|
||||
public class Landcover implements
|
||||
OpenMapTilesSchema.Landcover,
|
||||
BasemapProfile.NaturalEarthProcessor,
|
||||
Tables.OsmLandcoverPolygon.Handler,
|
||||
BasemapProfile.FeaturePostProcessor {
|
||||
|
||||
/*
|
||||
* Large ice areas come from natural earth and the rest come from OpenStreetMap at higher zoom
|
||||
* levels. At render-time, postProcess() merges polygons into larger connected area based
|
||||
* on the number of points in the original area. Since postProcess() only has visibility into
|
||||
* features on a single tile, process() needs to pass the number of points the original feature
|
||||
* had through using a temporary "_numpoints" attribute.
|
||||
*/
|
||||
|
||||
public static final ZoomFunction<Number> MIN_PIXEL_SIZE_THRESHOLDS = ZoomFunction.fromMaxZoomThresholds(Map.of(
|
||||
13, 8,
|
||||
10, 4,
|
||||
9, 2
|
||||
));
|
||||
private static final String TEMP_NUM_POINTS_ATTR = "_numpoints";
|
||||
private static final Set<String> WOOD_OR_FOREST = Set.of(
|
||||
FieldValues.SUBCLASS_WOOD,
|
||||
FieldValues.SUBCLASS_FOREST
|
||||
);
|
||||
private final MultiExpression.Index<String> classMapping;
|
||||
|
||||
public Landcover(Translations translations, PlanetilerConfig config, Stats stats) {
|
||||
this.classMapping = FieldMappings.Class.index();
|
||||
}
|
||||
|
||||
private String getClassFromSubclass(String subclass) {
|
||||
return subclass == null ? null : classMapping.getOrElse(Map.of(Fields.SUBCLASS, subclass), null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processNaturalEarth(String table, SourceFeature feature,
|
||||
FeatureCollector features) {
|
||||
record LandcoverInfo(String subclass, int minzoom, int maxzoom) {}
|
||||
LandcoverInfo info = switch (table) {
|
||||
case "ne_110m_glaciated_areas" -> new LandcoverInfo(FieldValues.SUBCLASS_GLACIER, 0, 1);
|
||||
case "ne_50m_glaciated_areas" -> new LandcoverInfo(FieldValues.SUBCLASS_GLACIER, 2, 4);
|
||||
case "ne_10m_glaciated_areas" -> new LandcoverInfo(FieldValues.SUBCLASS_GLACIER, 5, 6);
|
||||
case "ne_50m_antarctic_ice_shelves_polys" -> new LandcoverInfo("ice_shelf", 2, 4);
|
||||
case "ne_10m_antarctic_ice_shelves_polys" -> new LandcoverInfo("ice_shelf", 5, 6);
|
||||
default -> null;
|
||||
};
|
||||
if (info != null) {
|
||||
String clazz = getClassFromSubclass(info.subclass);
|
||||
if (clazz != null) {
|
||||
features.polygon(LAYER_NAME).setBufferPixels(BUFFER_SIZE)
|
||||
.setAttr(Fields.CLASS, clazz)
|
||||
.setAttr(Fields.SUBCLASS, info.subclass)
|
||||
.setZoomRange(info.minzoom, info.maxzoom);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmLandcoverPolygon element, FeatureCollector features) {
|
||||
String subclass = element.subclass();
|
||||
String clazz = getClassFromSubclass(subclass);
|
||||
if (clazz != null) {
|
||||
features.polygon(LAYER_NAME).setBufferPixels(BUFFER_SIZE)
|
||||
.setMinPixelSizeOverrides(MIN_PIXEL_SIZE_THRESHOLDS)
|
||||
.setAttr(Fields.CLASS, clazz)
|
||||
.setAttr(Fields.SUBCLASS, subclass)
|
||||
.setNumPointsAttr(TEMP_NUM_POINTS_ATTR)
|
||||
.setMinZoom(WOOD_OR_FOREST.contains(subclass) ? 9 : 7);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<VectorTile.Feature> postProcess(int zoom, List<VectorTile.Feature> items) throws GeometryException {
|
||||
if (zoom < 7 || zoom > 13) {
|
||||
for (var item : items) {
|
||||
item.attrs().remove(TEMP_NUM_POINTS_ATTR);
|
||||
}
|
||||
return items;
|
||||
} else { // z7-13
|
||||
// merging only merges polygons with the same attributes, so use this temporary key
|
||||
// to separate features into layers that will be merged separately
|
||||
String tempGroupKey = "_group";
|
||||
List<VectorTile.Feature> result = new ArrayList<>();
|
||||
List<VectorTile.Feature> toMerge = new ArrayList<>();
|
||||
for (var item : items) {
|
||||
Map<String, Object> attrs = item.attrs();
|
||||
Object numPointsObj = attrs.remove(TEMP_NUM_POINTS_ATTR);
|
||||
Object subclassObj = attrs.get(Fields.SUBCLASS);
|
||||
if (numPointsObj instanceof Number num && subclassObj instanceof String subclass) {
|
||||
long numPoints = num.longValue();
|
||||
if (zoom >= 10) {
|
||||
if (WOOD_OR_FOREST.contains(subclass) && numPoints < 300) {
|
||||
attrs.put(tempGroupKey, "<300");
|
||||
toMerge.add(item);
|
||||
} else { // don't merge
|
||||
result.add(item);
|
||||
}
|
||||
} else if (zoom == 9) {
|
||||
if (WOOD_OR_FOREST.contains(subclass)) {
|
||||
attrs.put(tempGroupKey, numPoints < 300 ? "<300" : ">300");
|
||||
toMerge.add(item);
|
||||
} else { // don't merge
|
||||
result.add(item);
|
||||
}
|
||||
} else { // zoom between 7 and 8
|
||||
toMerge.add(item);
|
||||
}
|
||||
} else {
|
||||
result.add(item);
|
||||
}
|
||||
}
|
||||
var merged = FeatureMerge.mergeOverlappingPolygons(toMerge, 4);
|
||||
for (var item : merged) {
|
||||
item.attrs().remove(tempGroupKey);
|
||||
}
|
||||
result.addAll(merged);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,113 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2021, MapTiler.com & OpenMapTiles contributors.
|
||||
All rights reserved.
|
||||
|
||||
Code license: BSD 3-Clause License
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Design license: CC-BY 4.0
|
||||
|
||||
See https://github.com/openmaptiles/openmaptiles/blob/master/LICENSE.md for details on usage
|
||||
*/
|
||||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import static com.onthegomap.planetiler.basemap.util.Utils.coalesce;
|
||||
import static com.onthegomap.planetiler.basemap.util.Utils.nullIfEmpty;
|
||||
|
||||
import com.onthegomap.planetiler.FeatureCollector;
|
||||
import com.onthegomap.planetiler.basemap.BasemapProfile;
|
||||
import com.onthegomap.planetiler.basemap.generated.OpenMapTilesSchema;
|
||||
import com.onthegomap.planetiler.basemap.generated.Tables;
|
||||
import com.onthegomap.planetiler.config.PlanetilerConfig;
|
||||
import com.onthegomap.planetiler.reader.SourceFeature;
|
||||
import com.onthegomap.planetiler.stats.Stats;
|
||||
import com.onthegomap.planetiler.util.Parse;
|
||||
import com.onthegomap.planetiler.util.Translations;
|
||||
import com.onthegomap.planetiler.util.ZoomFunction;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Defines the logic for generating map elements for man-made land use polygons like cemeteries, zoos, and hospitals in
|
||||
* the {@code landuse} layer from source features.
|
||||
* <p>
|
||||
* This class is ported to Java from <a href="https://github.com/openmaptiles/openmaptiles/tree/master/layers/landuse">OpenMapTiles
|
||||
* landuse sql files</a>.
|
||||
*/
|
||||
public class Landuse implements
|
||||
OpenMapTilesSchema.Landuse,
|
||||
BasemapProfile.NaturalEarthProcessor,
|
||||
Tables.OsmLandusePolygon.Handler {
|
||||
|
||||
private static final ZoomFunction<Number> MIN_PIXEL_SIZE_THRESHOLDS = ZoomFunction.fromMaxZoomThresholds(Map.of(
|
||||
13, 4,
|
||||
7, 2,
|
||||
6, 1
|
||||
));
|
||||
private static final Set<String> Z6_CLASSES = Set.of(
|
||||
FieldValues.CLASS_RESIDENTIAL,
|
||||
FieldValues.CLASS_SUBURB,
|
||||
FieldValues.CLASS_QUARTER,
|
||||
FieldValues.CLASS_NEIGHBOURHOOD
|
||||
);
|
||||
|
||||
public Landuse(Translations translations, PlanetilerConfig config, Stats stats) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processNaturalEarth(String table, SourceFeature feature, FeatureCollector features) {
|
||||
if ("ne_50m_urban_areas".equals(table)) {
|
||||
Double scalerank = Parse.parseDoubleOrNull(feature.getTag("scalerank"));
|
||||
if (scalerank != null && scalerank <= 2) {
|
||||
features.polygon(LAYER_NAME).setBufferPixels(BUFFER_SIZE)
|
||||
.setAttr(Fields.CLASS, FieldValues.CLASS_RESIDENTIAL)
|
||||
.setZoomRange(4, 5);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmLandusePolygon element, FeatureCollector features) {
|
||||
String clazz = coalesce(
|
||||
nullIfEmpty(element.landuse()),
|
||||
nullIfEmpty(element.amenity()),
|
||||
nullIfEmpty(element.leisure()),
|
||||
nullIfEmpty(element.tourism()),
|
||||
nullIfEmpty(element.place()),
|
||||
nullIfEmpty(element.waterway())
|
||||
);
|
||||
if (clazz != null) {
|
||||
if ("grave_yard".equals(clazz)) {
|
||||
clazz = FieldValues.CLASS_CEMETERY;
|
||||
}
|
||||
features.polygon(LAYER_NAME).setBufferPixels(BUFFER_SIZE)
|
||||
.setAttr(Fields.CLASS, clazz)
|
||||
.setMinPixelSizeOverrides(MIN_PIXEL_SIZE_THRESHOLDS)
|
||||
.setMinZoom(Z6_CLASSES.contains(clazz) ? 6 : 9);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,202 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2021, MapTiler.com & OpenMapTiles contributors.
|
||||
All rights reserved.
|
||||
|
||||
Code license: BSD 3-Clause License
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Design license: CC-BY 4.0
|
||||
|
||||
See https://github.com/openmaptiles/openmaptiles/blob/master/LICENSE.md for details on usage
|
||||
*/
|
||||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import static com.onthegomap.planetiler.basemap.util.Utils.elevationTags;
|
||||
import static com.onthegomap.planetiler.basemap.util.Utils.nullIfEmpty;
|
||||
|
||||
import com.carrotsearch.hppc.LongIntHashMap;
|
||||
import com.carrotsearch.hppc.LongIntMap;
|
||||
import com.onthegomap.planetiler.FeatureCollector;
|
||||
import com.onthegomap.planetiler.VectorTile;
|
||||
import com.onthegomap.planetiler.basemap.BasemapProfile;
|
||||
import com.onthegomap.planetiler.basemap.generated.OpenMapTilesSchema;
|
||||
import com.onthegomap.planetiler.basemap.generated.Tables;
|
||||
import com.onthegomap.planetiler.basemap.util.LanguageUtils;
|
||||
import com.onthegomap.planetiler.config.PlanetilerConfig;
|
||||
import com.onthegomap.planetiler.geo.GeometryException;
|
||||
import com.onthegomap.planetiler.reader.SourceFeature;
|
||||
import com.onthegomap.planetiler.stats.Stats;
|
||||
import com.onthegomap.planetiler.util.Parse;
|
||||
import com.onthegomap.planetiler.util.Translations;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import org.locationtech.jts.geom.Geometry;
|
||||
import org.locationtech.jts.geom.Point;
|
||||
import org.locationtech.jts.geom.prep.PreparedGeometry;
|
||||
import org.locationtech.jts.geom.prep.PreparedGeometryFactory;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* Defines the logic for generating map elements for mountain peak label points in the {@code mountain_peak} layer from
|
||||
* source features.
|
||||
* <p>
|
||||
* This class is ported to Java from <a href="https://github.com/openmaptiles/openmaptiles/tree/master/layers/mountain_peak">OpenMapTiles
|
||||
* mountain_peak sql files</a>.
|
||||
*/
|
||||
public class MountainPeak implements
|
||||
BasemapProfile.NaturalEarthProcessor,
|
||||
OpenMapTilesSchema.MountainPeak,
|
||||
Tables.OsmPeakPoint.Handler,
|
||||
Tables.OsmMountainLinestring.Handler,
|
||||
BasemapProfile.FeaturePostProcessor {
|
||||
|
||||
/*
|
||||
* Mountain peaks come from OpenStreetMap data and are ranked by importance (based on if they
|
||||
* have a name or wikipedia page) then by elevation. Uses the "label grid" feature to limit
|
||||
* label density by only taking the top 5 most important mountain peaks within each 100x100px
|
||||
* square.
|
||||
*/
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(TransportationName.class);
|
||||
|
||||
private final Translations translations;
|
||||
private final Stats stats;
|
||||
// keep track of areas that prefer feet to meters to set customary_ft=1 (just U.S.)
|
||||
private PreparedGeometry unitedStates = null;
|
||||
private final AtomicBoolean loggedNoUS = new AtomicBoolean(false);
|
||||
|
||||
public MountainPeak(Translations translations, PlanetilerConfig config, Stats stats) {
|
||||
this.translations = translations;
|
||||
this.stats = stats;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processNaturalEarth(String table, SourceFeature feature, FeatureCollector features) {
|
||||
if ("ne_10m_admin_0_countries".equals(table) && feature.hasTag("iso_a2", "US")) {
|
||||
// multiple threads call this method concurrently, US polygon *should* only be found
|
||||
// once, but just to be safe synchronize updates to that field
|
||||
synchronized (this) {
|
||||
try {
|
||||
Geometry boundary = feature.polygon();
|
||||
unitedStates = PreparedGeometryFactory.prepare(boundary);
|
||||
} catch (GeometryException e) {
|
||||
LOGGER.error("Failed to get United States Polygon for mountain_peak layer: " + e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmPeakPoint element, FeatureCollector features) {
|
||||
Integer meters = Parse.parseIntSubstring(element.ele());
|
||||
if (meters != null && Math.abs(meters) < 10_000) {
|
||||
var feature = features.point(LAYER_NAME)
|
||||
.setAttr(Fields.CLASS, element.source().getTag("natural"))
|
||||
.putAttrs(LanguageUtils.getNames(element.source().tags(), translations))
|
||||
.putAttrs(elevationTags(meters))
|
||||
.setSortKeyDescending(
|
||||
meters +
|
||||
(nullIfEmpty(element.wikipedia()) != null ? 10_000 : 0) +
|
||||
(nullIfEmpty(element.name()) != null ? 10_000 : 0)
|
||||
)
|
||||
.setMinZoom(7)
|
||||
// need to use a larger buffer size to allow enough points through to not cut off
|
||||
// any label grid squares which could lead to inconsistent label ranks for a feature
|
||||
// in adjacent tiles. postProcess() will remove anything outside the desired buffer.
|
||||
.setBufferPixels(100)
|
||||
.setPointLabelGridSizeAndLimit(13, 100, 5);
|
||||
|
||||
if (peakInAreaUsingFeet(element)) {
|
||||
feature.setAttr(Fields.CUSTOMARY_FT, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmMountainLinestring element, FeatureCollector features) {
|
||||
// TODO rank is approximate to sort important/named ridges before others, should switch to labelgrid for linestrings later
|
||||
int rank = 3 -
|
||||
(nullIfEmpty(element.wikipedia()) != null ? 1 : 0) -
|
||||
(nullIfEmpty(element.name()) != null ? 1 : 0);
|
||||
features.line(LAYER_NAME)
|
||||
.setAttr(Fields.CLASS, element.source().getTag("natural"))
|
||||
.setAttr(Fields.RANK, rank)
|
||||
.putAttrs(LanguageUtils.getNames(element.source().tags(), translations))
|
||||
.setSortKey(rank)
|
||||
.setMinZoom(13)
|
||||
.setBufferPixels(100);
|
||||
}
|
||||
|
||||
/** Returns true if {@code element} is a point in an area where feet are used insead of meters (the US). */
|
||||
private boolean peakInAreaUsingFeet(Tables.OsmPeakPoint element) {
|
||||
if (unitedStates == null) {
|
||||
if (!loggedNoUS.get() && loggedNoUS.compareAndSet(false, true)) {
|
||||
LOGGER.warn("No US polygon for inferring mountain_peak customary_ft tag");
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
Geometry wayGeometry = element.source().worldGeometry();
|
||||
return unitedStates.intersects(wayGeometry);
|
||||
} catch (GeometryException e) {
|
||||
e.log(stats, "omt_mountain_peak_us_test",
|
||||
"Unable to test mountain_peak against US polygon: " + element.source().id());
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<VectorTile.Feature> postProcess(int zoom, List<VectorTile.Feature> items) {
|
||||
LongIntMap groupCounts = new LongIntHashMap();
|
||||
for (int i = 0; i < items.size(); i++) {
|
||||
VectorTile.Feature feature = items.get(i);
|
||||
int gridrank = groupCounts.getOrDefault(feature.group(), 1);
|
||||
groupCounts.put(feature.group(), gridrank + 1);
|
||||
// now that we have accurate ranks, remove anything outside the desired buffer
|
||||
if (!insideTileBuffer(feature)) {
|
||||
items.set(i, null);
|
||||
} else if (!feature.attrs().containsKey(Fields.RANK)) {
|
||||
feature.attrs().put(Fields.RANK, gridrank);
|
||||
}
|
||||
}
|
||||
return items;
|
||||
}
|
||||
|
||||
private static boolean insideTileBuffer(double xOrY) {
|
||||
return xOrY >= -BUFFER_SIZE && xOrY <= 256 + BUFFER_SIZE;
|
||||
}
|
||||
|
||||
private boolean insideTileBuffer(VectorTile.Feature feature) {
|
||||
try {
|
||||
Geometry geom = feature.geometry().decode();
|
||||
return !(geom instanceof Point point) || (insideTileBuffer(point.getX()) && insideTileBuffer(point.getY()));
|
||||
} catch (GeometryException e) {
|
||||
e.log(stats, "mountain_peak_decode_point", "Error decoding mountain peak point: " + feature.attrs());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,161 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2021, MapTiler.com & OpenMapTiles contributors.
|
||||
All rights reserved.
|
||||
|
||||
Code license: BSD 3-Clause License
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Design license: CC-BY 4.0
|
||||
|
||||
See https://github.com/openmaptiles/openmaptiles/blob/master/LICENSE.md for details on usage
|
||||
*/
|
||||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import static com.onthegomap.planetiler.basemap.util.Utils.coalesce;
|
||||
import static com.onthegomap.planetiler.basemap.util.Utils.nullIfEmpty;
|
||||
import static com.onthegomap.planetiler.collection.FeatureGroup.SORT_KEY_BITS;
|
||||
|
||||
import com.carrotsearch.hppc.LongIntHashMap;
|
||||
import com.carrotsearch.hppc.LongIntMap;
|
||||
import com.onthegomap.planetiler.FeatureCollector;
|
||||
import com.onthegomap.planetiler.FeatureMerge;
|
||||
import com.onthegomap.planetiler.VectorTile;
|
||||
import com.onthegomap.planetiler.basemap.BasemapProfile;
|
||||
import com.onthegomap.planetiler.basemap.generated.OpenMapTilesSchema;
|
||||
import com.onthegomap.planetiler.basemap.generated.Tables;
|
||||
import com.onthegomap.planetiler.basemap.util.LanguageUtils;
|
||||
import com.onthegomap.planetiler.config.PlanetilerConfig;
|
||||
import com.onthegomap.planetiler.geo.GeoUtils;
|
||||
import com.onthegomap.planetiler.geo.GeometryException;
|
||||
import com.onthegomap.planetiler.geo.GeometryType;
|
||||
import com.onthegomap.planetiler.stats.Stats;
|
||||
import com.onthegomap.planetiler.util.SortKey;
|
||||
import com.onthegomap.planetiler.util.Translations;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* Defines the logic for generating map elements for designated parks polygons and their label points in the {@code
|
||||
* park} layer from source features.
|
||||
* <p>
|
||||
* This class is ported to Java from <a href="https://github.com/openmaptiles/openmaptiles/tree/master/layers/park">OpenMapTiles
|
||||
* park sql files</a>.
|
||||
*/
|
||||
public class Park implements
|
||||
OpenMapTilesSchema.Park,
|
||||
Tables.OsmParkPolygon.Handler,
|
||||
BasemapProfile.FeaturePostProcessor {
|
||||
|
||||
// constants for packing the minimum zoom ordering of park labels into the sort-key field
|
||||
private static final int PARK_NATIONAL_PARK_BOOST = 1 << (SORT_KEY_BITS - 1);
|
||||
private static final int PARK_WIKIPEDIA_BOOST = 1 << (SORT_KEY_BITS - 2);
|
||||
|
||||
// constants for determining the minimum zoom level for a park label based on its area
|
||||
private static final double WORLD_AREA_FOR_70K_SQUARE_METERS =
|
||||
Math.pow(GeoUtils.metersToPixelAtEquator(0, Math.sqrt(70_000)) / 256d, 2);
|
||||
private static final double LOG2 = Math.log(2);
|
||||
private static final int PARK_AREA_RANGE = 1 << (SORT_KEY_BITS - 3);
|
||||
private static final double SMALLEST_PARK_WORLD_AREA = Math.pow(4, -26); // 2^14 tiles, 2^12 pixels per tile
|
||||
|
||||
private final Translations translations;
|
||||
private final Stats stats;
|
||||
|
||||
public Park(Translations translations, PlanetilerConfig config, Stats stats) {
|
||||
this.stats = stats;
|
||||
this.translations = translations;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmParkPolygon element, FeatureCollector features) {
|
||||
String protectionTitle = element.protectionTitle();
|
||||
if (protectionTitle != null) {
|
||||
protectionTitle = protectionTitle.replace(' ', '_').toLowerCase(Locale.ROOT);
|
||||
}
|
||||
String clazz = coalesce(
|
||||
nullIfEmpty(protectionTitle),
|
||||
nullIfEmpty(element.boundary()),
|
||||
nullIfEmpty(element.leisure())
|
||||
);
|
||||
|
||||
// park shape
|
||||
var outline = features.polygon(LAYER_NAME).setBufferPixels(BUFFER_SIZE)
|
||||
.setAttrWithMinzoom(Fields.CLASS, clazz, 5)
|
||||
.setMinPixelSize(2)
|
||||
.setMinZoom(4);
|
||||
|
||||
// park name label point (if it has one)
|
||||
if (element.name() != null) {
|
||||
try {
|
||||
double area = element.source().area();
|
||||
int minzoom = getMinZoomForArea(area);
|
||||
|
||||
var names = LanguageUtils.getNamesWithoutTranslations(element.source().tags());
|
||||
|
||||
outline.putAttrsWithMinzoom(names, 5);
|
||||
|
||||
features.pointOnSurface(LAYER_NAME).setBufferPixels(256)
|
||||
.setAttr(Fields.CLASS, clazz)
|
||||
.putAttrs(names)
|
||||
.putAttrs(LanguageUtils.getNames(element.source().tags(), translations))
|
||||
.setPointLabelGridPixelSize(14, 100)
|
||||
.setSortKey(SortKey
|
||||
.orderByTruesFirst("national_park".equals(clazz))
|
||||
.thenByTruesFirst(element.source().hasTag("wikipedia") || element.source().hasTag("wikidata"))
|
||||
.thenByLog(area, 1d, SMALLEST_PARK_WORLD_AREA, 1 << (SORT_KEY_BITS - 2) - 1)
|
||||
.get()
|
||||
).setMinZoom(minzoom);
|
||||
} catch (GeometryException e) {
|
||||
e.log(stats, "omt_park_area", "Unable to get park area for " + element.source().id());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private int getMinZoomForArea(double area) {
|
||||
// sql filter: area > 70000*2^(20-zoom_level)
|
||||
// simplifies to: zoom_level > 20 - log(area / 70000) / log(2)
|
||||
int minzoom = (int) Math.floor(20 - Math.log(area / WORLD_AREA_FOR_70K_SQUARE_METERS) / LOG2);
|
||||
minzoom = Math.min(14, Math.max(5, minzoom));
|
||||
return minzoom;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<VectorTile.Feature> postProcess(int zoom, List<VectorTile.Feature> items) throws GeometryException {
|
||||
// infer the "rank" attribute from point ordering within each label grid square
|
||||
LongIntMap counts = new LongIntHashMap();
|
||||
for (VectorTile.Feature feature : items) {
|
||||
if (feature.geometry().geomType() == GeometryType.POINT && feature.hasGroup()) {
|
||||
int count = counts.getOrDefault(feature.group(), 0) + 1;
|
||||
feature.attrs().put("rank", count);
|
||||
counts.put(feature.group(), count);
|
||||
}
|
||||
}
|
||||
if (zoom <= 4) {
|
||||
items = FeatureMerge.mergeOverlappingPolygons(items, 0);
|
||||
}
|
||||
return items;
|
||||
}
|
||||
}
|
|
@ -1,428 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2021, MapTiler.com & OpenMapTiles contributors.
|
||||
All rights reserved.
|
||||
|
||||
Code license: BSD 3-Clause License
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Design license: CC-BY 4.0
|
||||
|
||||
See https://github.com/openmaptiles/openmaptiles/blob/master/LICENSE.md for details on usage
|
||||
*/
|
||||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import static com.onthegomap.planetiler.basemap.util.Utils.coalesce;
|
||||
import static com.onthegomap.planetiler.basemap.util.Utils.nullIfEmpty;
|
||||
import static com.onthegomap.planetiler.basemap.util.Utils.nullOrEmpty;
|
||||
import static com.onthegomap.planetiler.collection.FeatureGroup.SORT_KEY_BITS;
|
||||
|
||||
import com.carrotsearch.hppc.LongIntHashMap;
|
||||
import com.carrotsearch.hppc.LongIntMap;
|
||||
import com.onthegomap.planetiler.FeatureCollector;
|
||||
import com.onthegomap.planetiler.VectorTile;
|
||||
import com.onthegomap.planetiler.basemap.BasemapProfile;
|
||||
import com.onthegomap.planetiler.basemap.generated.OpenMapTilesSchema;
|
||||
import com.onthegomap.planetiler.basemap.generated.Tables;
|
||||
import com.onthegomap.planetiler.basemap.util.LanguageUtils;
|
||||
import com.onthegomap.planetiler.config.PlanetilerConfig;
|
||||
import com.onthegomap.planetiler.geo.GeoUtils;
|
||||
import com.onthegomap.planetiler.geo.GeometryException;
|
||||
import com.onthegomap.planetiler.geo.PointIndex;
|
||||
import com.onthegomap.planetiler.geo.PolygonIndex;
|
||||
import com.onthegomap.planetiler.reader.SourceFeature;
|
||||
import com.onthegomap.planetiler.stats.Stats;
|
||||
import com.onthegomap.planetiler.util.Parse;
|
||||
import com.onthegomap.planetiler.util.SortKey;
|
||||
import com.onthegomap.planetiler.util.Translations;
|
||||
import com.onthegomap.planetiler.util.ZoomFunction;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.DoubleStream;
|
||||
import java.util.stream.Stream;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.locationtech.jts.geom.Point;
|
||||
|
||||
/**
|
||||
* Defines the logic for generating label points for populated places like continents, countries, cities, and towns in
|
||||
* the {@code place} layer from source features.
|
||||
* <p>
|
||||
* This class is ported to Java from <a href="https://github.com/openmaptiles/openmaptiles/tree/master/layers/place">OpenMapTiles
|
||||
* place sql files</a>.
|
||||
*/
|
||||
public class Place implements
|
||||
OpenMapTilesSchema.Place,
|
||||
BasemapProfile.NaturalEarthProcessor,
|
||||
Tables.OsmContinentPoint.Handler,
|
||||
Tables.OsmCountryPoint.Handler,
|
||||
Tables.OsmStatePoint.Handler,
|
||||
Tables.OsmIslandPoint.Handler,
|
||||
Tables.OsmIslandPolygon.Handler,
|
||||
Tables.OsmCityPoint.Handler,
|
||||
BasemapProfile.FeaturePostProcessor {
|
||||
|
||||
/*
|
||||
* Place labels locations and names come from OpenStreetMap, but we also join with natural
|
||||
* earth state/country geographic areas and city point labels to give a hint for what rank
|
||||
* and minimum zoom level to use for those points.
|
||||
*/
|
||||
|
||||
private static final TreeMap<Double, Integer> ISLAND_AREA_RANKS = new TreeMap<>(Map.of(
|
||||
Double.MAX_VALUE, 3,
|
||||
squareMetersToWorldArea(40_000_000), 4,
|
||||
squareMetersToWorldArea(15_000_000), 5,
|
||||
squareMetersToWorldArea(1_000_000), 6
|
||||
));
|
||||
private static final double MIN_ISLAND_WORLD_AREA = Math.pow(4, -26); // 2^14 tiles, 2^12 pixels per tile
|
||||
private static final double CITY_JOIN_DISTANCE = GeoUtils.metersToPixelAtEquator(0, 50_000) / 256d;
|
||||
// constants for packing place label precedence into the sort-key field
|
||||
private static final double MAX_CITY_POPULATION = 100_000_000d;
|
||||
private static final Set<String> MAJOR_CITY_PLACES = Set.of("city", "town", "village");
|
||||
private static final ZoomFunction<Number> LABEL_GRID_LIMITS = ZoomFunction.fromMaxZoomThresholds(Map.of(
|
||||
8, 4,
|
||||
9, 8,
|
||||
10, 12,
|
||||
12, 14
|
||||
), 0);
|
||||
private final Translations translations;
|
||||
private final Stats stats;
|
||||
// spatial indexes for joining natural earth place labels with their corresponding points
|
||||
// from openstreetmap
|
||||
private PolygonIndex<NaturalEarthRegion> countries = PolygonIndex.create();
|
||||
private PolygonIndex<NaturalEarthRegion> states = PolygonIndex.create();
|
||||
private PointIndex<NaturalEarthPoint> cities = PointIndex.create();
|
||||
|
||||
public Place(Translations translations, PlanetilerConfig config, Stats stats) {
|
||||
this.translations = translations;
|
||||
this.stats = stats;
|
||||
}
|
||||
|
||||
/** Returns the portion of the world that {@code squareMeters} covers where 1 is the entire planet. */
|
||||
private static double squareMetersToWorldArea(double squareMeters) {
|
||||
double oneSideMeters = Math.sqrt(squareMeters);
|
||||
double oneSideWorld = GeoUtils.metersToPixelAtEquator(0, oneSideMeters) / 256d;
|
||||
return Math.pow(oneSideWorld, 2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Packs place precedence ordering ({@code rank asc, place asc, population desc, name.length asc}) into an integer for
|
||||
* the sort-key field.
|
||||
*/
|
||||
static int getSortKey(Integer rank, PlaceType place, long population, String name) {
|
||||
return SortKey
|
||||
// ORDER BY "rank" ASC NULLS LAST,
|
||||
.orderByInt(rank == null ? 15 : rank, 0, 15) // 4 bits
|
||||
// place ASC NULLS LAST,
|
||||
.thenByInt(place == null ? 15 : place.ordinal(), 0, 15) // 4 bits
|
||||
// population DESC NULLS LAST,
|
||||
.thenByLog(population, MAX_CITY_POPULATION, 1, 1 << (SORT_KEY_BITS - 13) - 1)
|
||||
// length(name) ASC
|
||||
.thenByInt(name == null ? 0 : name.length(), 0, 31) // 5 bits
|
||||
.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void release() {
|
||||
countries = null;
|
||||
states = null;
|
||||
cities = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processNaturalEarth(String table, SourceFeature feature, FeatureCollector features) {
|
||||
// store data from natural earth to help with ranks and min zoom levels when actually
|
||||
// emitting features from openstreetmap data.
|
||||
try {
|
||||
switch (table) {
|
||||
case "ne_10m_admin_0_countries" -> countries.put(feature.worldGeometry(), new NaturalEarthRegion(
|
||||
feature.getString("name"), 6,
|
||||
feature.getLong("scalerank"),
|
||||
feature.getLong("labelrank")
|
||||
));
|
||||
case "ne_10m_admin_1_states_provinces" -> {
|
||||
Double scalerank = Parse.parseDoubleOrNull(feature.getTag("scalerank"));
|
||||
Double labelrank = Parse.parseDoubleOrNull(feature.getTag("labelrank"));
|
||||
if (scalerank != null && scalerank <= 6 && labelrank != null && labelrank <= 7) {
|
||||
states.put(feature.worldGeometry(), new NaturalEarthRegion(
|
||||
feature.getString("name"), 6,
|
||||
scalerank,
|
||||
labelrank,
|
||||
feature.getLong("datarank")
|
||||
));
|
||||
}
|
||||
}
|
||||
case "ne_10m_populated_places" -> cities.put(feature.worldGeometry(), new NaturalEarthPoint(
|
||||
feature.getString("name"),
|
||||
feature.getString("wikidataid"),
|
||||
(int) feature.getLong("scalerank"),
|
||||
Stream.of("name", "namealt", "meganame", "gn_ascii", "nameascii").map(feature::getString)
|
||||
.filter(Objects::nonNull)
|
||||
.map(s -> s.toLowerCase(Locale.ROOT))
|
||||
.collect(Collectors.toSet())
|
||||
));
|
||||
}
|
||||
} catch (GeometryException e) {
|
||||
e.log(stats, "omt_place_ne",
|
||||
"Error getting geometry for natural earth feature " + table + " " + feature.getTag("ogc_fid"));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmContinentPoint element, FeatureCollector features) {
|
||||
if (!nullOrEmpty(element.name())) {
|
||||
features.point(LAYER_NAME).setBufferPixels(BUFFER_SIZE)
|
||||
.putAttrs(LanguageUtils.getNames(element.source().tags(), translations))
|
||||
.setAttr(Fields.CLASS, FieldValues.CLASS_CONTINENT)
|
||||
.setAttr(Fields.RANK, 1)
|
||||
.putAttrs(LanguageUtils.getNames(element.source().tags(), translations))
|
||||
.setZoomRange(0, 3);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmCountryPoint element, FeatureCollector features) {
|
||||
if (nullOrEmpty(element.name())) {
|
||||
return;
|
||||
}
|
||||
String isoA2 = coalesce(
|
||||
nullIfEmpty(element.countryCodeIso31661Alpha2()),
|
||||
nullIfEmpty(element.iso31661Alpha2()),
|
||||
nullIfEmpty(element.iso31661())
|
||||
);
|
||||
if (isoA2 == null) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
// set country rank to 6, unless there is a match in natural earth that indicates it
|
||||
// should be lower
|
||||
int rank = 7;
|
||||
NaturalEarthRegion country = countries.get(element.source().worldGeometry().getCentroid());
|
||||
var names = LanguageUtils.getNames(element.source().tags(), translations);
|
||||
|
||||
if (country != null) {
|
||||
if (nullOrEmpty(names.get(Fields.NAME_EN))) {
|
||||
names.put(Fields.NAME_EN, country.name);
|
||||
}
|
||||
rank = country.rank;
|
||||
}
|
||||
|
||||
rank = Math.min(6, Math.max(1, rank));
|
||||
|
||||
features.point(LAYER_NAME).setBufferPixels(BUFFER_SIZE)
|
||||
.putAttrs(names)
|
||||
.setAttr(Fields.ISO_A2, isoA2)
|
||||
.setAttr(Fields.CLASS, FieldValues.CLASS_COUNTRY)
|
||||
.setAttr(Fields.RANK, rank)
|
||||
.setMinZoom(rank - 1)
|
||||
.setSortKey(rank);
|
||||
} catch (GeometryException e) {
|
||||
e.log(stats, "omt_place_country",
|
||||
"Unable to get point for OSM country " + element.source().id());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmStatePoint element, FeatureCollector features) {
|
||||
try {
|
||||
// want the containing (not nearest) state polygon since we pre-filter the states in the polygon index
|
||||
// use natural earth to filter out any spurious states, and to set the rank field
|
||||
NaturalEarthRegion state = states.getOnlyContaining(element.source().worldGeometry().getCentroid());
|
||||
if (state != null) {
|
||||
var names = LanguageUtils.getNames(element.source().tags(), translations);
|
||||
if (nullOrEmpty(names.get(Fields.NAME_EN))) {
|
||||
names.put(Fields.NAME_EN, state.name);
|
||||
}
|
||||
int rank = Math.min(6, Math.max(1, state.rank));
|
||||
|
||||
features.point(LAYER_NAME).setBufferPixels(BUFFER_SIZE)
|
||||
.putAttrs(names)
|
||||
.setAttr(Fields.CLASS, element.place())
|
||||
.setAttr(Fields.RANK, rank)
|
||||
.setMinZoom(2)
|
||||
.setSortKey(rank);
|
||||
}
|
||||
} catch (GeometryException e) {
|
||||
e.log(stats, "omt_place_state",
|
||||
"Unable to get point for OSM state " + element.source().id());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmIslandPolygon element, FeatureCollector features) {
|
||||
try {
|
||||
double area = element.source().area();
|
||||
int rank = ISLAND_AREA_RANKS.ceilingEntry(area).getValue();
|
||||
int minzoom = rank <= 3 ? 8 : rank <= 4 ? 9 : 10;
|
||||
|
||||
features.pointOnSurface(LAYER_NAME).setBufferPixels(BUFFER_SIZE)
|
||||
.putAttrs(LanguageUtils.getNames(element.source().tags(), translations))
|
||||
.setAttr(Fields.CLASS, "island")
|
||||
.setAttr(Fields.RANK, rank)
|
||||
.setMinZoom(minzoom)
|
||||
.setSortKey(SortKey.orderByLog(area, 1d, MIN_ISLAND_WORLD_AREA).get());
|
||||
} catch (GeometryException e) {
|
||||
e.log(stats, "omt_place_island_poly",
|
||||
"Unable to get point for OSM island polygon " + element.source().id());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmIslandPoint element, FeatureCollector features) {
|
||||
features.point(LAYER_NAME).setBufferPixels(BUFFER_SIZE)
|
||||
.putAttrs(LanguageUtils.getNames(element.source().tags(), translations))
|
||||
.setAttr(Fields.CLASS, "island")
|
||||
.setAttr(Fields.RANK, 7)
|
||||
.setMinZoom(12);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmCityPoint element, FeatureCollector features) {
|
||||
Integer rank = null;
|
||||
if (MAJOR_CITY_PLACES.contains(element.place())) {
|
||||
// only for major cities, attempt to find a nearby natural earth label with a similar
|
||||
// name and use that to set a rank from OSM that causes the label to be shown at lower
|
||||
// zoom levels
|
||||
try {
|
||||
Point point = element.source().worldGeometry().getCentroid();
|
||||
List<NaturalEarthPoint> neCities = cities.getWithin(point, CITY_JOIN_DISTANCE);
|
||||
String rawName = coalesce(element.name(), "");
|
||||
String name = coalesce(rawName, "").toLowerCase(Locale.ROOT);
|
||||
String nameEn = coalesce(element.nameEn(), "").toLowerCase(Locale.ROOT);
|
||||
String normalizedName = StringUtils.stripAccents(rawName);
|
||||
String wikidata = element.source().getString("wikidata", "");
|
||||
for (var neCity : neCities) {
|
||||
if (wikidata.equals(neCity.wikidata) ||
|
||||
neCity.names.contains(name) ||
|
||||
neCity.names.contains(nameEn) ||
|
||||
normalizedName.equals(neCity.name)) {
|
||||
rank = neCity.scaleRank <= 5 ? neCity.scaleRank + 1 : neCity.scaleRank;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (GeometryException e) {
|
||||
e.log(stats, "omt_place_city",
|
||||
"Unable to get point for OSM city " + element.source().id());
|
||||
}
|
||||
}
|
||||
|
||||
String capital = element.capital();
|
||||
|
||||
PlaceType placeType = PlaceType.forName(element.place());
|
||||
|
||||
int minzoom = rank != null && rank == 1 ? 2 :
|
||||
rank != null && rank <= 8 ? Math.max(3, rank - 1) :
|
||||
placeType.ordinal() <= PlaceType.TOWN.ordinal() ? 7 :
|
||||
placeType.ordinal() <= PlaceType.VILLAGE.ordinal() ? 8 :
|
||||
placeType.ordinal() <= PlaceType.SUBURB.ordinal() ? 11 : 14;
|
||||
|
||||
var feature = features.point(LAYER_NAME).setBufferPixels(BUFFER_SIZE)
|
||||
.putAttrs(LanguageUtils.getNames(element.source().tags(), translations))
|
||||
.setAttr(Fields.CLASS, element.place())
|
||||
.setAttr(Fields.RANK, rank)
|
||||
.setMinZoom(minzoom)
|
||||
.setSortKey(getSortKey(rank, placeType, element.population(), element.name()))
|
||||
.setPointLabelGridPixelSize(12, 128);
|
||||
|
||||
if (rank == null) {
|
||||
feature.setPointLabelGridLimit(LABEL_GRID_LIMITS);
|
||||
}
|
||||
|
||||
if ("2".equals(capital) || "yes".equals(capital)) {
|
||||
feature.setAttr(Fields.CAPITAL, 2);
|
||||
} else if ("4".equals(capital)) {
|
||||
feature.setAttr(Fields.CAPITAL, 4);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<VectorTile.Feature> postProcess(int zoom, List<VectorTile.Feature> items) {
|
||||
// infer the rank field from ordering of the place labels with each label grid square
|
||||
LongIntMap groupCounts = new LongIntHashMap();
|
||||
for (VectorTile.Feature feature : items) {
|
||||
int gridrank = groupCounts.getOrDefault(feature.group(), 1);
|
||||
groupCounts.put(feature.group(), gridrank + 1);
|
||||
if (!feature.attrs().containsKey(Fields.RANK)) {
|
||||
feature.attrs().put(Fields.RANK, 10 + gridrank);
|
||||
}
|
||||
}
|
||||
return items;
|
||||
}
|
||||
|
||||
/** Ordering defines the precedence of place classes. */
|
||||
enum PlaceType {
|
||||
CITY("city"),
|
||||
TOWN("town"),
|
||||
VILLAGE("village"),
|
||||
HAMLET("hamlet"),
|
||||
SUBURB("suburb"),
|
||||
QUARTER("quarter"),
|
||||
NEIGHBORHOOD("neighbourhood"),
|
||||
ISOLATED_DWELLING("isolated_dwelling"),
|
||||
UNKNOWN("unknown");
|
||||
|
||||
private static final Map<String, PlaceType> byName = new HashMap<>();
|
||||
|
||||
static {
|
||||
for (PlaceType place : values()) {
|
||||
byName.put(place.name, place);
|
||||
}
|
||||
}
|
||||
|
||||
private final String name;
|
||||
|
||||
PlaceType(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public static PlaceType forName(String name) {
|
||||
return byName.getOrDefault(name, UNKNOWN);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Information extracted from a natural earth geographic region that will be inspected when joining with OpenStreetMap
|
||||
* data.
|
||||
*/
|
||||
private static record NaturalEarthRegion(String name, int rank) {
|
||||
|
||||
NaturalEarthRegion(String name, int maxRank, double... ranks) {
|
||||
this(name, (int) Math.ceil(DoubleStream.of(ranks).average().orElse(maxRank)));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Information extracted from a natural earth place label that will be inspected when joining with OpenStreetMap
|
||||
* data.
|
||||
*/
|
||||
private static record NaturalEarthPoint(String name, String wikidata, int scaleRank, Set<String> names) {}
|
||||
}
|
||||
|
|
@ -1,195 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2021, MapTiler.com & OpenMapTiles contributors.
|
||||
All rights reserved.
|
||||
|
||||
Code license: BSD 3-Clause License
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Design license: CC-BY 4.0
|
||||
|
||||
See https://github.com/openmaptiles/openmaptiles/blob/master/LICENSE.md for details on usage
|
||||
*/
|
||||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import static com.onthegomap.planetiler.basemap.util.Utils.coalesce;
|
||||
import static com.onthegomap.planetiler.basemap.util.Utils.nullIfEmpty;
|
||||
import static com.onthegomap.planetiler.basemap.util.Utils.nullIfLong;
|
||||
import static com.onthegomap.planetiler.basemap.util.Utils.nullOrEmpty;
|
||||
import static java.util.Map.entry;
|
||||
|
||||
import com.carrotsearch.hppc.LongIntHashMap;
|
||||
import com.carrotsearch.hppc.LongIntMap;
|
||||
import com.onthegomap.planetiler.FeatureCollector;
|
||||
import com.onthegomap.planetiler.VectorTile;
|
||||
import com.onthegomap.planetiler.basemap.BasemapProfile;
|
||||
import com.onthegomap.planetiler.basemap.generated.OpenMapTilesSchema;
|
||||
import com.onthegomap.planetiler.basemap.generated.Tables;
|
||||
import com.onthegomap.planetiler.basemap.util.LanguageUtils;
|
||||
import com.onthegomap.planetiler.config.PlanetilerConfig;
|
||||
import com.onthegomap.planetiler.expression.MultiExpression;
|
||||
import com.onthegomap.planetiler.stats.Stats;
|
||||
import com.onthegomap.planetiler.util.Parse;
|
||||
import com.onthegomap.planetiler.util.Translations;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Defines the logic for generating map elements for things like shops, parks, and schools in the {@code poi} layer from
|
||||
* source features.
|
||||
* <p>
|
||||
* This class is ported to Java from <a href="https://github.com/openmaptiles/openmaptiles/tree/master/layers/poi">OpenMapTiles
|
||||
* poi sql files</a>.
|
||||
*/
|
||||
public class Poi implements
|
||||
OpenMapTilesSchema.Poi,
|
||||
Tables.OsmPoiPoint.Handler,
|
||||
Tables.OsmPoiPolygon.Handler,
|
||||
BasemapProfile.FeaturePostProcessor {
|
||||
|
||||
/*
|
||||
* process() creates the raw POI feature from OSM elements and postProcess()
|
||||
* assigns the feature rank from order in the tile at render-time.
|
||||
*/
|
||||
|
||||
private static final Map<String, Integer> CLASS_RANKS = Map.ofEntries(
|
||||
entry(FieldValues.CLASS_HOSPITAL, 20),
|
||||
entry(FieldValues.CLASS_RAILWAY, 40),
|
||||
entry(FieldValues.CLASS_BUS, 50),
|
||||
entry(FieldValues.CLASS_ATTRACTION, 70),
|
||||
entry(FieldValues.CLASS_HARBOR, 75),
|
||||
entry(FieldValues.CLASS_COLLEGE, 80),
|
||||
entry(FieldValues.CLASS_SCHOOL, 85),
|
||||
entry(FieldValues.CLASS_STADIUM, 90),
|
||||
entry("zoo", 95),
|
||||
entry(FieldValues.CLASS_TOWN_HALL, 100),
|
||||
entry(FieldValues.CLASS_CAMPSITE, 110),
|
||||
entry(FieldValues.CLASS_CEMETERY, 115),
|
||||
entry(FieldValues.CLASS_PARK, 120),
|
||||
entry(FieldValues.CLASS_LIBRARY, 130),
|
||||
entry("police", 135),
|
||||
entry(FieldValues.CLASS_POST, 140),
|
||||
entry(FieldValues.CLASS_GOLF, 150),
|
||||
entry(FieldValues.CLASS_SHOP, 400),
|
||||
entry(FieldValues.CLASS_GROCERY, 500),
|
||||
entry(FieldValues.CLASS_FAST_FOOD, 600),
|
||||
entry(FieldValues.CLASS_CLOTHING_STORE, 700),
|
||||
entry(FieldValues.CLASS_BAR, 800)
|
||||
);
|
||||
private final MultiExpression.Index<String> classMapping;
|
||||
private final Translations translations;
|
||||
|
||||
public Poi(Translations translations, PlanetilerConfig config, Stats stats) {
|
||||
this.classMapping = FieldMappings.Class.index();
|
||||
this.translations = translations;
|
||||
}
|
||||
|
||||
static int poiClassRank(String clazz) {
|
||||
return CLASS_RANKS.getOrDefault(clazz, 1_000);
|
||||
}
|
||||
|
||||
private String poiClass(String subclass, String mappingKey) {
|
||||
subclass = coalesce(subclass, "");
|
||||
return classMapping.getOrElse(Map.of(
|
||||
"subclass", subclass,
|
||||
"mapping_key", coalesce(mappingKey, "")
|
||||
), subclass);
|
||||
}
|
||||
|
||||
private int minzoom(String subclass, String mappingKey) {
|
||||
boolean lowZoom = ("station".equals(subclass) && "railway".equals(mappingKey)) ||
|
||||
"halt".equals(subclass) || "ferry_terminal".equals(subclass);
|
||||
return lowZoom ? 12 : 14;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmPoiPoint element, FeatureCollector features) {
|
||||
// TODO handle uic_ref => agg_stop
|
||||
setupPoiFeature(element, features.point(LAYER_NAME));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmPoiPolygon element, FeatureCollector features) {
|
||||
setupPoiFeature(element, features.centroidIfConvex(LAYER_NAME));
|
||||
}
|
||||
|
||||
private <T extends
|
||||
Tables.WithSubclass &
|
||||
Tables.WithStation &
|
||||
Tables.WithFunicular &
|
||||
Tables.WithSport &
|
||||
Tables.WithInformation &
|
||||
Tables.WithReligion &
|
||||
Tables.WithMappingKey &
|
||||
Tables.WithName &
|
||||
Tables.WithIndoor &
|
||||
Tables.WithLayer &
|
||||
Tables.WithSource>
|
||||
void setupPoiFeature(T element, FeatureCollector.Feature output) {
|
||||
String rawSubclass = element.subclass();
|
||||
if ("station".equals(rawSubclass) && "subway".equals(element.station())) {
|
||||
rawSubclass = "subway";
|
||||
}
|
||||
if ("station".equals(rawSubclass) && "yes".equals(element.funicular())) {
|
||||
rawSubclass = "halt";
|
||||
}
|
||||
|
||||
String subclass = switch (rawSubclass) {
|
||||
case "information" -> nullIfEmpty(element.information());
|
||||
case "place_of_worship" -> nullIfEmpty(element.religion());
|
||||
case "pitch" -> nullIfEmpty(element.sport());
|
||||
default -> rawSubclass;
|
||||
};
|
||||
String poiClass = poiClass(rawSubclass, element.mappingKey());
|
||||
int poiClassRank = poiClassRank(poiClass);
|
||||
int rankOrder = poiClassRank + ((nullOrEmpty(element.name())) ? 2000 : 0);
|
||||
|
||||
output.setBufferPixels(BUFFER_SIZE)
|
||||
.setAttr(Fields.CLASS, poiClass)
|
||||
.setAttr(Fields.SUBCLASS, subclass)
|
||||
.setAttr(Fields.LAYER, nullIfLong(element.layer(), 0))
|
||||
.setAttr(Fields.LEVEL, Parse.parseLongOrNull(element.source().getTag("level")))
|
||||
.setAttr(Fields.INDOOR, element.indoor() ? 1 : null)
|
||||
.putAttrs(LanguageUtils.getNames(element.source().tags(), translations))
|
||||
.setPointLabelGridPixelSize(14, 64)
|
||||
.setSortKey(rankOrder)
|
||||
.setMinZoom(minzoom(element.subclass(), element.mappingKey()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<VectorTile.Feature> postProcess(int zoom, List<VectorTile.Feature> items) {
|
||||
// infer the "rank" field from the order of features within each label grid square
|
||||
LongIntMap groupCounts = new LongIntHashMap();
|
||||
for (VectorTile.Feature feature : items) {
|
||||
int gridrank = groupCounts.getOrDefault(feature.group(), 1);
|
||||
groupCounts.put(feature.group(), gridrank + 1);
|
||||
if (!feature.attrs().containsKey(Fields.RANK)) {
|
||||
feature.attrs().put(Fields.RANK, gridrank);
|
||||
}
|
||||
}
|
||||
return items;
|
||||
}
|
||||
}
|
|
@ -1,568 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2021, MapTiler.com & OpenMapTiles contributors.
|
||||
All rights reserved.
|
||||
|
||||
Code license: BSD 3-Clause License
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Design license: CC-BY 4.0
|
||||
|
||||
See https://github.com/openmaptiles/openmaptiles/blob/master/LICENSE.md for details on usage
|
||||
*/
|
||||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import static com.onthegomap.planetiler.basemap.util.Utils.*;
|
||||
import static com.onthegomap.planetiler.util.MemoryEstimator.CLASS_HEADER_BYTES;
|
||||
import static com.onthegomap.planetiler.util.MemoryEstimator.POINTER_BYTES;
|
||||
import static com.onthegomap.planetiler.util.MemoryEstimator.estimateSize;
|
||||
import static java.util.Map.entry;
|
||||
|
||||
import com.onthegomap.planetiler.FeatureCollector;
|
||||
import com.onthegomap.planetiler.FeatureMerge;
|
||||
import com.onthegomap.planetiler.VectorTile;
|
||||
import com.onthegomap.planetiler.basemap.BasemapProfile;
|
||||
import com.onthegomap.planetiler.basemap.generated.OpenMapTilesSchema;
|
||||
import com.onthegomap.planetiler.basemap.generated.Tables;
|
||||
import com.onthegomap.planetiler.config.PlanetilerConfig;
|
||||
import com.onthegomap.planetiler.expression.MultiExpression;
|
||||
import com.onthegomap.planetiler.geo.GeoUtils;
|
||||
import com.onthegomap.planetiler.geo.GeometryException;
|
||||
import com.onthegomap.planetiler.reader.SourceFeature;
|
||||
import com.onthegomap.planetiler.reader.osm.OsmElement;
|
||||
import com.onthegomap.planetiler.reader.osm.OsmReader;
|
||||
import com.onthegomap.planetiler.reader.osm.OsmRelationInfo;
|
||||
import com.onthegomap.planetiler.stats.Stats;
|
||||
import com.onthegomap.planetiler.util.MemoryEstimator;
|
||||
import com.onthegomap.planetiler.util.Parse;
|
||||
import com.onthegomap.planetiler.util.Translations;
|
||||
import com.onthegomap.planetiler.util.ZoomFunction;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import org.locationtech.jts.geom.Geometry;
|
||||
import org.locationtech.jts.geom.LineString;
|
||||
import org.locationtech.jts.geom.prep.PreparedGeometry;
|
||||
import org.locationtech.jts.geom.prep.PreparedGeometryFactory;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* Defines the logic for generating map elements for roads, shipways, railroads, and paths in the {@code transportation}
|
||||
* layer from source features.
|
||||
* <p>
|
||||
* This class is ported to Java from <a href="https://github.com/openmaptiles/openmaptiles/tree/master/layers/transportation">OpenMapTiles
|
||||
* transportation sql files</a>.
|
||||
*/
|
||||
public class Transportation implements
|
||||
OpenMapTilesSchema.Transportation,
|
||||
Tables.OsmAerialwayLinestring.Handler,
|
||||
Tables.OsmHighwayLinestring.Handler,
|
||||
Tables.OsmRailwayLinestring.Handler,
|
||||
Tables.OsmShipwayLinestring.Handler,
|
||||
Tables.OsmHighwayPolygon.Handler,
|
||||
BasemapProfile.NaturalEarthProcessor,
|
||||
BasemapProfile.FeaturePostProcessor,
|
||||
BasemapProfile.OsmRelationPreprocessor,
|
||||
BasemapProfile.IgnoreWikidata {
|
||||
|
||||
/*
|
||||
* Generates the shape for roads, trails, ferries, railways with detailed
|
||||
* attributes for rendering, but not any names. The transportation_name
|
||||
* layer includes names, but less detailed attributes.
|
||||
*/
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(Transportation.class);
|
||||
private static final Pattern GREAT_BRITAIN_REF_NETWORK_PATTERN = Pattern.compile("^[AM][0-9AM()]+");
|
||||
private static final MultiExpression.Index<String> classMapping = FieldMappings.Class.index();
|
||||
private static final Set<String> RAILWAY_RAIL_VALUES = Set.of(
|
||||
FieldValues.SUBCLASS_RAIL,
|
||||
FieldValues.SUBCLASS_NARROW_GAUGE,
|
||||
FieldValues.SUBCLASS_PRESERVED,
|
||||
FieldValues.SUBCLASS_FUNICULAR
|
||||
);
|
||||
private static final Set<String> RAILWAY_TRANSIT_VALUES = Set.of(
|
||||
FieldValues.SUBCLASS_SUBWAY,
|
||||
FieldValues.SUBCLASS_LIGHT_RAIL,
|
||||
FieldValues.SUBCLASS_MONORAIL,
|
||||
FieldValues.SUBCLASS_TRAM
|
||||
);
|
||||
private static final Set<String> SERVICE_VALUES = Set.of(
|
||||
FieldValues.SERVICE_SPUR,
|
||||
FieldValues.SERVICE_YARD,
|
||||
FieldValues.SERVICE_SIDING,
|
||||
FieldValues.SERVICE_CROSSOVER,
|
||||
FieldValues.SERVICE_DRIVEWAY,
|
||||
FieldValues.SERVICE_ALLEY,
|
||||
FieldValues.SERVICE_PARKING_AISLE
|
||||
);
|
||||
private static final Set<String> SURFACE_UNPAVED_VALUES = Set.of(
|
||||
"unpaved", "compacted", "dirt", "earth", "fine_gravel", "grass", "grass_paver", "gravel", "gravel_turf", "ground",
|
||||
"ice", "mud", "pebblestone", "salt", "sand", "snow", "woodchips"
|
||||
);
|
||||
private static final Set<String> SURFACE_PAVED_VALUES = Set.of(
|
||||
"paved", "asphalt", "cobblestone", "concrete", "concrete:lanes", "concrete:plates", "metal",
|
||||
"paving_stones", "sett", "unhewn_cobblestone", "wood"
|
||||
);
|
||||
private static final Set<String> ACCESS_NO_VALUES = Set.of(
|
||||
"private", "no"
|
||||
);
|
||||
private static final ZoomFunction.MeterToPixelThresholds MIN_LENGTH = ZoomFunction.meterThresholds()
|
||||
.put(7, 50)
|
||||
.put(6, 100)
|
||||
.put(5, 500)
|
||||
.put(4, 1_000);
|
||||
// ORDER BY network_type, network, LENGTH(ref), ref)
|
||||
private static final Comparator<RouteRelation> RELATION_ORDERING = Comparator
|
||||
.<RouteRelation>comparingInt(
|
||||
r -> r.networkType() != null ? r.networkType.ordinal() : Integer.MAX_VALUE)
|
||||
.thenComparing(routeRelation -> coalesce(routeRelation.network(), ""))
|
||||
.thenComparingInt(r -> r.ref().length())
|
||||
.thenComparing(RouteRelation::ref);
|
||||
private final AtomicBoolean loggedNoGb = new AtomicBoolean(false);
|
||||
private final boolean z13Paths;
|
||||
private PreparedGeometry greatBritain = null;
|
||||
private final Map<String, Integer> MINZOOMS;
|
||||
private final Stats stats;
|
||||
private final PlanetilerConfig config;
|
||||
|
||||
public Transportation(Translations translations, PlanetilerConfig config, Stats stats) {
|
||||
this.config = config;
|
||||
this.stats = stats;
|
||||
z13Paths = config.arguments().getBoolean(
|
||||
"transportation_z13_paths",
|
||||
"transportation(_name) layer: show all paths on z13",
|
||||
false
|
||||
);
|
||||
MINZOOMS = Map.ofEntries(
|
||||
entry(FieldValues.CLASS_PATH, z13Paths ? 13 : 14),
|
||||
entry(FieldValues.CLASS_TRACK, 14),
|
||||
entry(FieldValues.CLASS_SERVICE, 13),
|
||||
entry(FieldValues.CLASS_MINOR, 13),
|
||||
entry(FieldValues.CLASS_RACEWAY, 12),
|
||||
entry(FieldValues.CLASS_TERTIARY, 11),
|
||||
entry(FieldValues.CLASS_BUSWAY, 11),
|
||||
entry(FieldValues.CLASS_SECONDARY, 9),
|
||||
entry(FieldValues.CLASS_PRIMARY, 7),
|
||||
entry(FieldValues.CLASS_TRUNK, 5),
|
||||
entry(FieldValues.CLASS_MOTORWAY, 4)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processNaturalEarth(String table, SourceFeature feature,
|
||||
FeatureCollector features) {
|
||||
if ("ne_10m_admin_0_countries".equals(table) && feature.hasTag("iso_a2", "GB")) {
|
||||
// multiple threads call this method concurrently, GB polygon *should* only be found
|
||||
// once, but just to be safe synchronize updates to that field
|
||||
synchronized (this) {
|
||||
try {
|
||||
Geometry boundary = feature.polygon().buffer(GeoUtils.metersToPixelAtEquator(0, 10_000) / 256d);
|
||||
greatBritain = PreparedGeometryFactory.prepare(boundary);
|
||||
} catch (GeometryException e) {
|
||||
LOGGER.error("Failed to get Great Britain Polygon: " + e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Returns a value for {@code surface} tag constrained to a small set of known values from raw OSM data. */
|
||||
private static String surface(String value) {
|
||||
return value == null ? null : SURFACE_PAVED_VALUES.contains(value) ? FieldValues.SURFACE_PAVED :
|
||||
SURFACE_UNPAVED_VALUES.contains(value) ? FieldValues.SURFACE_UNPAVED : null;
|
||||
}
|
||||
|
||||
/** Returns a value for {@code access} tag constrained to a small set of known values from raw OSM data. */
|
||||
private static String access(String value) {
|
||||
return value == null ? null : ACCESS_NO_VALUES.contains(value) ? "no" : null;
|
||||
}
|
||||
|
||||
/** Returns a value for {@code service} tag constrained to a small set of known values from raw OSM data. */
|
||||
private static String service(String value) {
|
||||
return (value == null || !SERVICE_VALUES.contains(value)) ? null : value;
|
||||
}
|
||||
|
||||
private static String railwayClass(String value) {
|
||||
return value == null ? null :
|
||||
RAILWAY_RAIL_VALUES.contains(value) ? "rail" :
|
||||
RAILWAY_TRANSIT_VALUES.contains(value) ? "transit" : null;
|
||||
}
|
||||
|
||||
static String highwayClass(String highway, String publicTransport, String construction, String manMade) {
|
||||
return (!nullOrEmpty(highway) || !nullOrEmpty(publicTransport)) ? classMapping.getOrElse(Map.of(
|
||||
"highway", coalesce(highway, ""),
|
||||
"public_transport", coalesce(publicTransport, ""),
|
||||
"construction", coalesce(construction, "")
|
||||
), null) : isBridgeOrPier(manMade) ? manMade : null;
|
||||
}
|
||||
|
||||
static String highwaySubclass(String highwayClass, String publicTransport, String highway) {
|
||||
return FieldValues.CLASS_PATH.equals(highwayClass) ? coalesce(nullIfEmpty(publicTransport), highway) : null;
|
||||
}
|
||||
|
||||
static boolean isFootwayOrSteps(String highway) {
|
||||
return "footway".equals(highway) || "steps".equals(highway);
|
||||
}
|
||||
|
||||
static boolean isLink(String highway) {
|
||||
return highway != null && highway.endsWith("_link");
|
||||
}
|
||||
|
||||
private static boolean isResidentialOrUnclassified(String highway) {
|
||||
return "residential".equals(highway) || "unclassified".equals(highway);
|
||||
}
|
||||
|
||||
private static boolean isDrivewayOrParkingAisle(String service) {
|
||||
return FieldValues.SERVICE_PARKING_AISLE.equals(service) || FieldValues.SERVICE_DRIVEWAY.equals(service);
|
||||
}
|
||||
|
||||
private static boolean isBridgeOrPier(String manMade) {
|
||||
return "bridge".equals(manMade) || "pier".equals(manMade);
|
||||
}
|
||||
|
||||
enum RouteNetwork {
|
||||
|
||||
US_INTERSTATE("us-interstate"),
|
||||
US_HIGHWAY("us-highway"),
|
||||
US_STATE("us-state"),
|
||||
CA_TRANSCANADA("ca-transcanada"),
|
||||
GB_MOTORWAY("gb-motorway"),
|
||||
GB_TRUNK("gb-trunk");
|
||||
|
||||
final String name;
|
||||
|
||||
RouteNetwork(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<OsmRelationInfo> preprocessOsmRelation(OsmElement.Relation relation) {
|
||||
if (relation.hasTag("route", "road", "hiking")) {
|
||||
RouteNetwork networkType = null;
|
||||
String network = relation.getString("network");
|
||||
String ref = relation.getString("ref");
|
||||
|
||||
if ("US:I".equals(network)) {
|
||||
networkType = RouteNetwork.US_INTERSTATE;
|
||||
} else if ("US:US".equals(network)) {
|
||||
networkType = RouteNetwork.US_HIGHWAY;
|
||||
} else if (network != null && network.length() == 5 && network.startsWith("US:")) {
|
||||
networkType = RouteNetwork.US_STATE;
|
||||
} else if (network != null && network.startsWith("CA:transcanada")) {
|
||||
networkType = RouteNetwork.CA_TRANSCANADA;
|
||||
}
|
||||
|
||||
int rank = switch (coalesce(network, "")) {
|
||||
case "iwn", "nwn", "rwn" -> 1;
|
||||
case "lwn" -> 2;
|
||||
default -> (relation.hasTag("osmc:symbol") || relation.hasTag("colour")) ? 2 : 3;
|
||||
};
|
||||
|
||||
if (network != null || rank < 3) {
|
||||
return List.of(new RouteRelation(coalesce(ref, ""), network, networkType, (byte) rank, relation.id()));
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
List<RouteRelation> getRouteRelations(Tables.OsmHighwayLinestring element) {
|
||||
String ref = element.ref();
|
||||
List<OsmReader.RelationMember<RouteRelation>> relations = element.source().relationInfo(RouteRelation.class);
|
||||
List<RouteRelation> result = new ArrayList<>(relations.size() + 1);
|
||||
for (var relationMember : relations) {
|
||||
var relation = relationMember.relation();
|
||||
// avoid duplicates - list should be very small and usually only one
|
||||
if (!result.contains(relation)) {
|
||||
result.add(relation);
|
||||
}
|
||||
}
|
||||
if (ref != null) {
|
||||
// GB doesn't use regular relations like everywhere else, so if we are
|
||||
// in GB then use a naming convention instead.
|
||||
Matcher refMatcher = GREAT_BRITAIN_REF_NETWORK_PATTERN.matcher(ref);
|
||||
if (refMatcher.find()) {
|
||||
if (greatBritain == null) {
|
||||
if (!loggedNoGb.get() && loggedNoGb.compareAndSet(false, true)) {
|
||||
LOGGER.warn("No GB polygon for inferring route network types");
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
Geometry wayGeometry = element.source().worldGeometry();
|
||||
if (greatBritain.intersects(wayGeometry)) {
|
||||
Transportation.RouteNetwork networkType =
|
||||
"motorway".equals(element.highway()) ? Transportation.RouteNetwork.GB_MOTORWAY
|
||||
: Transportation.RouteNetwork.GB_TRUNK;
|
||||
String network = "motorway".equals(element.highway()) ? "omt-gb-motorway" : "omt-gb-trunk";
|
||||
result.add(new RouteRelation(refMatcher.group(), network, networkType, (byte) -1,
|
||||
0));
|
||||
}
|
||||
} catch (GeometryException e) {
|
||||
e.log(stats, "omt_transportation_name_gb_test",
|
||||
"Unable to test highway against GB route network: " + element.source().id());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Collections.sort(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
RouteRelation getRouteRelation(Tables.OsmHighwayLinestring element) {
|
||||
List<RouteRelation> all = getRouteRelations(element);
|
||||
return all.isEmpty() ? null : all.get(0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmHighwayLinestring element, FeatureCollector features) {
|
||||
if (element.isArea()) {
|
||||
return;
|
||||
}
|
||||
|
||||
RouteRelation routeRelation = getRouteRelation(element);
|
||||
RouteNetwork networkType = routeRelation != null ? routeRelation.networkType : null;
|
||||
|
||||
String highway = element.highway();
|
||||
String highwayClass = highwayClass(element.highway(), element.publicTransport(), element.construction(),
|
||||
element.manMade());
|
||||
String service = service(element.service());
|
||||
if (highwayClass != null) {
|
||||
if (isPierPolygon(element)) {
|
||||
return;
|
||||
}
|
||||
int minzoom = getMinzoom(element, highwayClass);
|
||||
|
||||
boolean highwayRamp = isLink(highway);
|
||||
Integer rampAboveZ12 = (highwayRamp || element.isRamp()) ? 1 : null;
|
||||
Integer rampBelowZ12 = highwayRamp ? 1 : null;
|
||||
|
||||
FeatureCollector.Feature feature = features.line(LAYER_NAME).setBufferPixels(BUFFER_SIZE)
|
||||
// main attributes at all zoom levels (used for grouping <= z8)
|
||||
.setAttr(Fields.CLASS, highwayClass)
|
||||
.setAttr(Fields.SUBCLASS, highwaySubclass(highwayClass, element.publicTransport(), highway))
|
||||
.setAttr(Fields.BRUNNEL, brunnel(element.isBridge(), element.isTunnel(), element.isFord()))
|
||||
.setAttr(Fields.NETWORK, networkType != null ? networkType.name : null)
|
||||
// z8+
|
||||
.setAttrWithMinzoom(Fields.EXPRESSWAY, element.expressway() && !"motorway".equals(highway) ? 1 : null, 8)
|
||||
// z9+
|
||||
.setAttrWithMinzoom(Fields.LAYER, nullIfLong(element.layer(), 0), 9)
|
||||
.setAttrWithMinzoom(Fields.BICYCLE, nullIfEmpty(element.bicycle()), 9)
|
||||
.setAttrWithMinzoom(Fields.FOOT, nullIfEmpty(element.foot()), 9)
|
||||
.setAttrWithMinzoom(Fields.HORSE, nullIfEmpty(element.horse()), 9)
|
||||
.setAttrWithMinzoom(Fields.MTB_SCALE, nullIfEmpty(element.mtbScale()), 9)
|
||||
.setAttrWithMinzoom(Fields.ACCESS, access(element.access()), 9)
|
||||
.setAttrWithMinzoom(Fields.TOLL, element.toll() ? 1 : null, 9)
|
||||
// sometimes z9+, sometimes z12+
|
||||
.setAttr(Fields.RAMP, minzoom >= 12 ? rampAboveZ12 :
|
||||
((ZoomFunction<Integer>) z -> z < 9 ? null : z >= 12 ? rampAboveZ12 : rampBelowZ12))
|
||||
// z12+
|
||||
.setAttrWithMinzoom(Fields.SERVICE, service, 12)
|
||||
.setAttrWithMinzoom(Fields.ONEWAY, nullIfInt(element.isOneway(), 0), 12)
|
||||
.setAttrWithMinzoom(Fields.SURFACE, surface(element.surface()), 12)
|
||||
.setMinPixelSize(0) // merge during post-processing, then limit by size
|
||||
.setSortKey(element.zOrder())
|
||||
.setMinZoom(minzoom);
|
||||
|
||||
if (isFootwayOrSteps(highway)) {
|
||||
feature
|
||||
.setAttr(Fields.LEVEL, Parse.parseLongOrNull(element.source().getTag("level")))
|
||||
.setAttr(Fields.INDOOR, element.indoor() ? 1 : null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int getMinzoom(Tables.OsmHighwayLinestring element, String highwayClass) {
|
||||
List<RouteRelation> routeRelations = getRouteRelations(element);
|
||||
int routeRank = 3;
|
||||
for (var rel : routeRelations) {
|
||||
if (rel.intRank() < routeRank) {
|
||||
routeRank = rel.intRank();
|
||||
}
|
||||
}
|
||||
String highway = element.highway();
|
||||
|
||||
int minzoom;
|
||||
if ("pier".equals(element.manMade())) {
|
||||
minzoom = 13;
|
||||
} else if (isResidentialOrUnclassified(highway)) {
|
||||
minzoom = 12;
|
||||
} else {
|
||||
String baseClass = highwayClass.replace("_construction", "");
|
||||
minzoom = switch (baseClass) {
|
||||
case FieldValues.CLASS_SERVICE -> isDrivewayOrParkingAisle(service(element.service())) ? 14 : 13;
|
||||
case FieldValues.CLASS_TRACK, FieldValues.CLASS_PATH -> routeRank == 1 ? 12 :
|
||||
(z13Paths || !nullOrEmpty(element.name()) || routeRank <= 2 || !nullOrEmpty(element.sacScale())) ? 13 : 14;
|
||||
default -> MINZOOMS.get(baseClass);
|
||||
};
|
||||
}
|
||||
|
||||
if (isLink(highway)) {
|
||||
minzoom = Math.max(minzoom, 9);
|
||||
}
|
||||
return minzoom;
|
||||
}
|
||||
|
||||
private boolean isPierPolygon(Tables.OsmHighwayLinestring element) {
|
||||
if ("pier".equals(element.manMade())) {
|
||||
try {
|
||||
if (element.source().worldGeometry() instanceof LineString lineString && lineString.isClosed()) {
|
||||
// ignore this because it's a polygon
|
||||
return true;
|
||||
}
|
||||
} catch (GeometryException e) {
|
||||
e.log(stats, "omt_transportation_pier",
|
||||
"Unable to decode pier geometry for " + element.source().id());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmRailwayLinestring element, FeatureCollector features) {
|
||||
String railway = element.railway();
|
||||
String clazz = railwayClass(railway);
|
||||
if (clazz != null) {
|
||||
String service = nullIfEmpty(element.service());
|
||||
int minzoom;
|
||||
if (service != null) {
|
||||
minzoom = 14;
|
||||
} else if (FieldValues.SUBCLASS_RAIL.equals(railway)) {
|
||||
minzoom = "main".equals(element.usage()) ? 8 : 10;
|
||||
} else if (FieldValues.SUBCLASS_NARROW_GAUGE.equals(railway)) {
|
||||
minzoom = 10;
|
||||
} else if (FieldValues.SUBCLASS_LIGHT_RAIL.equals(railway)) {
|
||||
minzoom = 11;
|
||||
} else {
|
||||
minzoom = 14;
|
||||
}
|
||||
features.line(LAYER_NAME).setBufferPixels(BUFFER_SIZE)
|
||||
.setAttr(Fields.CLASS, clazz)
|
||||
.setAttr(Fields.SUBCLASS, railway)
|
||||
.setAttr(Fields.SERVICE, service(service))
|
||||
.setAttr(Fields.ONEWAY, nullIfInt(element.isOneway(), 0))
|
||||
.setAttr(Fields.RAMP, element.isRamp() ? 1L : null)
|
||||
.setAttrWithMinzoom(Fields.BRUNNEL, brunnel(element.isBridge(), element.isTunnel(), element.isFord()), 10)
|
||||
.setAttrWithMinzoom(Fields.LAYER, nullIfLong(element.layer(), 0), 9)
|
||||
.setSortKey(element.zOrder())
|
||||
.setMinPixelSize(0) // merge during post-processing, then limit by size
|
||||
.setMinZoom(minzoom);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmAerialwayLinestring element, FeatureCollector features) {
|
||||
features.line(LAYER_NAME).setBufferPixels(BUFFER_SIZE)
|
||||
.setAttr(Fields.CLASS, "aerialway")
|
||||
.setAttr(Fields.SUBCLASS, element.aerialway())
|
||||
.setAttr(Fields.SERVICE, service(element.service()))
|
||||
.setAttr(Fields.ONEWAY, nullIfInt(element.isOneway(), 0))
|
||||
.setAttr(Fields.RAMP, element.isRamp() ? 1L : null)
|
||||
.setAttr(Fields.BRUNNEL, brunnel(element.isBridge(), element.isTunnel(), element.isFord()))
|
||||
.setAttr(Fields.LAYER, nullIfLong(element.layer(), 0))
|
||||
.setSortKey(element.zOrder())
|
||||
.setMinPixelSize(0) // merge during post-processing, then limit by size
|
||||
.setMinZoom(12);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmShipwayLinestring element, FeatureCollector features) {
|
||||
features.line(LAYER_NAME).setBufferPixels(BUFFER_SIZE)
|
||||
.setAttr(Fields.CLASS, element.shipway()) // "ferry"
|
||||
// no subclass
|
||||
.setAttr(Fields.SERVICE, service(element.service()))
|
||||
.setAttr(Fields.ONEWAY, nullIfInt(element.isOneway(), 0))
|
||||
.setAttr(Fields.RAMP, element.isRamp() ? 1L : null)
|
||||
.setAttr(Fields.BRUNNEL, brunnel(element.isBridge(), element.isTunnel(), element.isFord()))
|
||||
.setAttr(Fields.LAYER, nullIfLong(element.layer(), 0))
|
||||
.setSortKey(element.zOrder())
|
||||
.setMinPixelSize(0) // merge during post-processing, then limit by size
|
||||
.setMinZoom(11);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmHighwayPolygon element, FeatureCollector features) {
|
||||
String manMade = element.manMade();
|
||||
if (isBridgeOrPier(manMade) ||
|
||||
// only allow closed ways where area=yes, and multipolygons
|
||||
// and ignore underground pedestrian areas
|
||||
(!element.source().canBeLine() && element.layer() >= 0)) {
|
||||
String highwayClass = highwayClass(element.highway(), element.publicTransport(), null, element.manMade());
|
||||
if (highwayClass != null) {
|
||||
features.polygon(LAYER_NAME).setBufferPixels(BUFFER_SIZE)
|
||||
.setAttr(Fields.CLASS, highwayClass)
|
||||
.setAttr(Fields.SUBCLASS, highwaySubclass(highwayClass, element.publicTransport(), element.highway()))
|
||||
.setAttr(Fields.BRUNNEL, brunnel("bridge".equals(manMade), false, false))
|
||||
.setAttr(Fields.LAYER, nullIfLong(element.layer(), 0))
|
||||
.setSortKey(element.zOrder())
|
||||
.setMinZoom(13);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<VectorTile.Feature> postProcess(int zoom, List<VectorTile.Feature> items) {
|
||||
double tolerance = config.tolerance(zoom);
|
||||
double minLength = coalesce(MIN_LENGTH.apply(zoom), 0).doubleValue();
|
||||
// TODO preserve direction for one-way?
|
||||
return FeatureMerge.mergeLineStrings(items, minLength, tolerance, BUFFER_SIZE);
|
||||
}
|
||||
|
||||
/** Information extracted from route relations to use when processing ways in that relation. */
|
||||
record RouteRelation(
|
||||
String ref,
|
||||
String network,
|
||||
RouteNetwork networkType,
|
||||
byte rank,
|
||||
@Override long id
|
||||
) implements OsmRelationInfo, Comparable<RouteRelation> {
|
||||
|
||||
@Override
|
||||
public long estimateMemoryUsageBytes() {
|
||||
return CLASS_HEADER_BYTES +
|
||||
MemoryEstimator.estimateSize(rank) +
|
||||
POINTER_BYTES + estimateSize(ref) +
|
||||
POINTER_BYTES + estimateSize(network) +
|
||||
POINTER_BYTES + // networkType
|
||||
MemoryEstimator.estimateSizeLong(id);
|
||||
}
|
||||
|
||||
public int intRank() {
|
||||
return rank;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(RouteRelation o) {
|
||||
return RELATION_ORDERING.compare(this, o);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,371 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2021, MapTiler.com & OpenMapTiles contributors.
|
||||
All rights reserved.
|
||||
|
||||
Code license: BSD 3-Clause License
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Design license: CC-BY 4.0
|
||||
|
||||
See https://github.com/openmaptiles/openmaptiles/blob/master/LICENSE.md for details on usage
|
||||
*/
|
||||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import static com.onthegomap.planetiler.basemap.layers.Transportation.highwayClass;
|
||||
import static com.onthegomap.planetiler.basemap.layers.Transportation.highwaySubclass;
|
||||
import static com.onthegomap.planetiler.basemap.layers.Transportation.isFootwayOrSteps;
|
||||
import static com.onthegomap.planetiler.basemap.util.Utils.*;
|
||||
|
||||
import com.carrotsearch.hppc.LongArrayList;
|
||||
import com.carrotsearch.hppc.LongByteHashMap;
|
||||
import com.carrotsearch.hppc.LongByteMap;
|
||||
import com.onthegomap.planetiler.FeatureCollector;
|
||||
import com.onthegomap.planetiler.FeatureMerge;
|
||||
import com.onthegomap.planetiler.ForwardingProfile;
|
||||
import com.onthegomap.planetiler.VectorTile;
|
||||
import com.onthegomap.planetiler.basemap.BasemapProfile;
|
||||
import com.onthegomap.planetiler.basemap.generated.OpenMapTilesSchema;
|
||||
import com.onthegomap.planetiler.basemap.generated.Tables;
|
||||
import com.onthegomap.planetiler.basemap.util.LanguageUtils;
|
||||
import com.onthegomap.planetiler.config.PlanetilerConfig;
|
||||
import com.onthegomap.planetiler.reader.osm.OsmElement;
|
||||
import com.onthegomap.planetiler.stats.Stats;
|
||||
import com.onthegomap.planetiler.util.Parse;
|
||||
import com.onthegomap.planetiler.util.Translations;
|
||||
import com.onthegomap.planetiler.util.ZoomFunction;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
|
||||
/**
|
||||
* Defines the logic for generating map elements for road, shipway, rail, and path names in the {@code
|
||||
* transportation_name} layer from source features.
|
||||
* <p>
|
||||
* This class is ported to Java from <a href="https://github.com/openmaptiles/openmaptiles/tree/master/layers/transportation_name">OpenMapTiles
|
||||
* transportation_name sql files</a>.
|
||||
*/
|
||||
public class TransportationName implements
|
||||
OpenMapTilesSchema.TransportationName,
|
||||
Tables.OsmHighwayPoint.Handler,
|
||||
Tables.OsmHighwayLinestring.Handler,
|
||||
Tables.OsmAerialwayLinestring.Handler,
|
||||
Tables.OsmShipwayLinestring.Handler,
|
||||
BasemapProfile.FeaturePostProcessor,
|
||||
BasemapProfile.IgnoreWikidata,
|
||||
ForwardingProfile.OsmNodePreprocessor,
|
||||
ForwardingProfile.OsmWayPreprocessor {
|
||||
|
||||
/*
|
||||
* Generate road names from OSM data. Route networkType and ref are copied
|
||||
* from relations that roads are a part of - except in Great Britain which
|
||||
* uses a naming convention instead of relations.
|
||||
*
|
||||
* The goal is to make name linestrings as long as possible to give clients
|
||||
* the best chance of showing road names at different zoom levels, so do not
|
||||
* limit linestrings by length at process time and merge them at tile
|
||||
* render-time.
|
||||
*
|
||||
* Any 3-way nodes and intersections break line merging so set the
|
||||
* transportation_name_limit_merge argument to true to add temporary
|
||||
* "is link" and "relation" keys to prevent opposite directions of a
|
||||
* divided highway or on/off ramps from getting merged for main highways.
|
||||
*/
|
||||
|
||||
// extra temp key used to group on/off-ramps separately from main highways
|
||||
private static final String LINK_TEMP_KEY = "__islink";
|
||||
private static final String RELATION_ID_TEMP_KEY = "__relid";
|
||||
|
||||
private static final ZoomFunction.MeterToPixelThresholds MIN_LENGTH = ZoomFunction.meterThresholds()
|
||||
.put(6, 20_000)
|
||||
.put(7, 20_000)
|
||||
.put(8, 14_000)
|
||||
.put(9, 8_000)
|
||||
.put(10, 8_000)
|
||||
.put(11, 8_000);
|
||||
private static final List<String> CONCURRENT_ROUTE_KEYS = List.of(
|
||||
Fields.ROUTE_1,
|
||||
Fields.ROUTE_2,
|
||||
Fields.ROUTE_3,
|
||||
Fields.ROUTE_4,
|
||||
Fields.ROUTE_5,
|
||||
Fields.ROUTE_6
|
||||
);
|
||||
private final boolean brunnel;
|
||||
private final boolean sizeForShield;
|
||||
private final boolean limitMerge;
|
||||
private final PlanetilerConfig config;
|
||||
private Transportation transportation;
|
||||
private final LongByteMap motorwayJunctionHighwayClasses = new LongByteHashMap();
|
||||
|
||||
public TransportationName(Translations translations, PlanetilerConfig config, Stats stats) {
|
||||
this.config = config;
|
||||
this.brunnel = config.arguments().getBoolean(
|
||||
"transportation_name_brunnel",
|
||||
"transportation_name layer: set to false to omit brunnel and help merge long highways",
|
||||
false
|
||||
);
|
||||
this.sizeForShield = config.arguments().getBoolean(
|
||||
"transportation_name_size_for_shield",
|
||||
"transportation_name layer: allow road names on shorter segments (ie. they will have a shield)",
|
||||
false
|
||||
);
|
||||
this.limitMerge = config.arguments().getBoolean(
|
||||
"transportation_name_limit_merge",
|
||||
"transportation_name layer: limit merge so we don't combine different relations to help merge long highways",
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
public void needsTransportationLayer(Transportation transportation) {
|
||||
this.transportation = transportation;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void preprocessOsmNode(OsmElement.Node node) {
|
||||
if (node.hasTag("highway", "motorway_junction")) {
|
||||
motorwayJunctionHighwayClasses.put(node.id(), HighwayClass.UNKNOWN.value);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void preprocessOsmWay(OsmElement.Way way) {
|
||||
String highway = way.getString("highway");
|
||||
if (highway != null) {
|
||||
HighwayClass cls = HighwayClass.from(highway);
|
||||
if (cls != HighwayClass.UNKNOWN) {
|
||||
LongArrayList nodes = way.nodes();
|
||||
for (int i = 0; i < nodes.size(); i++) {
|
||||
long node = nodes.get(i);
|
||||
if (motorwayJunctionHighwayClasses.containsKey(node)) {
|
||||
byte oldValue = motorwayJunctionHighwayClasses.get(node);
|
||||
byte newValue = cls.value;
|
||||
if (newValue > oldValue) {
|
||||
motorwayJunctionHighwayClasses.put(node, newValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmHighwayPoint element, FeatureCollector features) {
|
||||
long id = element.source().id();
|
||||
byte value = motorwayJunctionHighwayClasses.getOrDefault(id, (byte) -1);
|
||||
if (value > 0) {
|
||||
HighwayClass cls = HighwayClass.from(value);
|
||||
if (cls != HighwayClass.UNKNOWN) {
|
||||
String subclass = FieldValues.SUBCLASS_JUNCTION;
|
||||
String ref = element.ref();
|
||||
|
||||
features.point(LAYER_NAME)
|
||||
.setBufferPixels(BUFFER_SIZE)
|
||||
.putAttrs(LanguageUtils.getNamesWithoutTranslations(element.source().tags()))
|
||||
.setAttr(Fields.REF, ref)
|
||||
.setAttr(Fields.REF_LENGTH, ref != null ? ref.length() : null)
|
||||
.setAttr(Fields.CLASS, highwayClass(cls.highwayValue, null, null, null))
|
||||
.setAttr(Fields.SUBCLASS, subclass)
|
||||
.setAttr(Fields.LAYER, nullIfLong(element.layer(), 0))
|
||||
.setSortKeyDescending(element.zOrder())
|
||||
.setMinZoom(10);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmHighwayLinestring element, FeatureCollector features) {
|
||||
String ref = element.ref();
|
||||
List<Transportation.RouteRelation> relations = transportation.getRouteRelations(element);
|
||||
Transportation.RouteRelation relation = relations.isEmpty() ? null : relations.get(0);
|
||||
if (relation != null && nullIfEmpty(relation.ref()) != null) {
|
||||
ref = relation.ref();
|
||||
}
|
||||
|
||||
String name = nullIfEmpty(element.name());
|
||||
ref = nullIfEmpty(ref);
|
||||
String highway = nullIfEmpty(element.highway());
|
||||
|
||||
String highwayClass = highwayClass(element.highway(), null, element.construction(), element.manMade());
|
||||
if (element.isArea() || highway == null || highwayClass == null || (name == null && ref == null)) {
|
||||
return;
|
||||
}
|
||||
|
||||
boolean isLink = Transportation.isLink(highway);
|
||||
String baseClass = highwayClass.replace("_construction", "");
|
||||
|
||||
int minzoom = FieldValues.CLASS_TRUNK.equals(baseClass) ? 8 :
|
||||
FieldValues.CLASS_MOTORWAY.equals(baseClass) ? 6 :
|
||||
isLink ? 13 : 12; // fallback - get from line minzoom, but floor at 12
|
||||
|
||||
// inherit min zoom threshold from visible road, and ensure we never show a label on a road that's not visible yet.
|
||||
minzoom = Math.max(minzoom, transportation.getMinzoom(element, highwayClass));
|
||||
|
||||
FeatureCollector.Feature feature = features.line(LAYER_NAME)
|
||||
.setBufferPixels(BUFFER_SIZE)
|
||||
.setBufferPixelOverrides(MIN_LENGTH)
|
||||
// TODO abbreviate road names - can't port osml10n because it is AGPL
|
||||
.putAttrs(LanguageUtils.getNamesWithoutTranslations(element.source().tags()))
|
||||
.setAttr(Fields.REF, ref)
|
||||
.setAttr(Fields.REF_LENGTH, ref != null ? ref.length() : null)
|
||||
.setAttr(Fields.NETWORK,
|
||||
(relation != null && relation.networkType() != null) ? relation.networkType().name
|
||||
: !nullOrEmpty(ref) ? "road" : null)
|
||||
.setAttr(Fields.CLASS, highwayClass)
|
||||
.setAttr(Fields.SUBCLASS, highwaySubclass(highwayClass, null, highway))
|
||||
.setMinPixelSize(0)
|
||||
.setSortKey(element.zOrder())
|
||||
.setMinZoom(minzoom);
|
||||
|
||||
// populate route_1, route_2, ... tags
|
||||
for (int i = 0; i < Math.min(CONCURRENT_ROUTE_KEYS.size(), relations.size()); i++) {
|
||||
Transportation.RouteRelation routeRelation = relations.get(i);
|
||||
feature.setAttr(CONCURRENT_ROUTE_KEYS.get(i), routeRelation.network() == null ? null :
|
||||
routeRelation.network() + "=" + coalesce(routeRelation.ref(), ""));
|
||||
}
|
||||
|
||||
if (brunnel) {
|
||||
feature.setAttr(Fields.BRUNNEL, brunnel(element.isBridge(), element.isTunnel(), element.isFord()));
|
||||
}
|
||||
|
||||
/*
|
||||
* to help group roads into longer segments, add temporary tags to limit which segments get grouped together. Since
|
||||
* a divided highway typically has a separate relation for each direction, this ends up keeping segments going
|
||||
* opposite directions group getting grouped together and confusing the line merging process
|
||||
*/
|
||||
if (limitMerge) {
|
||||
feature
|
||||
.setAttr(LINK_TEMP_KEY, isLink ? 1 : 0)
|
||||
.setAttr(RELATION_ID_TEMP_KEY, relation == null ? null : relation.id());
|
||||
}
|
||||
|
||||
if (isFootwayOrSteps(highway)) {
|
||||
feature
|
||||
.setAttrWithMinzoom(Fields.LAYER, nullIfLong(element.layer(), 0), 12)
|
||||
.setAttrWithMinzoom(Fields.LEVEL, Parse.parseLongOrNull(element.source().getTag("level")), 12)
|
||||
.setAttrWithMinzoom(Fields.INDOOR, element.indoor() ? 1 : null, 12);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmAerialwayLinestring element, FeatureCollector features) {
|
||||
if (!nullOrEmpty(element.name())) {
|
||||
features.line(LAYER_NAME)
|
||||
.setBufferPixels(BUFFER_SIZE)
|
||||
.setBufferPixelOverrides(MIN_LENGTH)
|
||||
.putAttrs(LanguageUtils.getNamesWithoutTranslations(element.source().tags()))
|
||||
.setAttr(Fields.CLASS, "aerialway")
|
||||
.setAttr(Fields.SUBCLASS, element.aerialway())
|
||||
.setMinPixelSize(0)
|
||||
.setSortKey(element.zOrder())
|
||||
.setMinZoom(12);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmShipwayLinestring element, FeatureCollector features) {
|
||||
if (!nullOrEmpty(element.name())) {
|
||||
features.line(LAYER_NAME)
|
||||
.setBufferPixels(BUFFER_SIZE)
|
||||
.setBufferPixelOverrides(MIN_LENGTH)
|
||||
.putAttrs(LanguageUtils.getNamesWithoutTranslations(element.source().tags()))
|
||||
.setAttr(Fields.CLASS, element.shipway())
|
||||
.setMinPixelSize(0)
|
||||
.setSortKey(element.zOrder())
|
||||
.setMinZoom(12);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<VectorTile.Feature> postProcess(int zoom, List<VectorTile.Feature> items) {
|
||||
double tolerance = config.tolerance(zoom);
|
||||
double minLength = coalesce(MIN_LENGTH.apply(zoom), 0).doubleValue();
|
||||
// TODO tolerances:
|
||||
// z6: (tolerance: 500)
|
||||
// z7: (tolerance: 200)
|
||||
// z8: (tolerance: 120)
|
||||
// z9-11: (tolerance: 50)
|
||||
Function<Map<String, Object>, Double> lengthLimitCalculator =
|
||||
zoom >= 14 ? (p -> 0d) :
|
||||
minLength > 0 ? (p -> minLength) :
|
||||
this::getMinLengthForName;
|
||||
var result = FeatureMerge.mergeLineStrings(items, lengthLimitCalculator, tolerance, BUFFER_SIZE);
|
||||
if (limitMerge) {
|
||||
// remove temp keys that were just used to improve line merging
|
||||
for (var feature : result) {
|
||||
feature.attrs().remove(LINK_TEMP_KEY);
|
||||
feature.attrs().remove(RELATION_ID_TEMP_KEY);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/** Returns the minimum pixel length that a name will fit into. */
|
||||
private double getMinLengthForName(Map<String, Object> attrs) {
|
||||
Object ref = attrs.get(Fields.REF);
|
||||
Object name = coalesce(attrs.get(Fields.NAME), ref);
|
||||
return (sizeForShield && ref instanceof String) ? 6 :
|
||||
name instanceof String str ? str.length() * 6 : Double.MAX_VALUE;
|
||||
}
|
||||
|
||||
private enum HighwayClass {
|
||||
MOTORWAY("motorway", 6),
|
||||
TRUNK("trunk", 5),
|
||||
PRIMARY("primary", 4),
|
||||
SECONDARY("secondary", 3),
|
||||
TERTIARY("tertiary", 2),
|
||||
UNCLASSIFIED("unclassified", 1),
|
||||
UNKNOWN("", 0);
|
||||
|
||||
private static final Map<String, HighwayClass> indexByString = new HashMap<>();
|
||||
private static final Map<Byte, HighwayClass> indexByByte = new HashMap<>();
|
||||
final byte value;
|
||||
final String highwayValue;
|
||||
|
||||
HighwayClass(String highwayValue, int id) {
|
||||
this.highwayValue = highwayValue;
|
||||
this.value = (byte) id;
|
||||
}
|
||||
|
||||
static {
|
||||
Arrays.stream(values()).forEach(cls -> {
|
||||
indexByString.put(cls.highwayValue, cls);
|
||||
indexByByte.put(cls.value, cls);
|
||||
});
|
||||
}
|
||||
|
||||
static HighwayClass from(String highway) {
|
||||
return indexByString.getOrDefault(highway, UNKNOWN);
|
||||
}
|
||||
|
||||
static HighwayClass from(byte value) {
|
||||
return indexByByte.getOrDefault(value, UNKNOWN);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,117 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2021, MapTiler.com & OpenMapTiles contributors.
|
||||
All rights reserved.
|
||||
|
||||
Code license: BSD 3-Clause License
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Design license: CC-BY 4.0
|
||||
|
||||
See https://github.com/openmaptiles/openmaptiles/blob/master/LICENSE.md for details on usage
|
||||
*/
|
||||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import com.onthegomap.planetiler.FeatureCollector;
|
||||
import com.onthegomap.planetiler.basemap.BasemapProfile;
|
||||
import com.onthegomap.planetiler.basemap.generated.OpenMapTilesSchema;
|
||||
import com.onthegomap.planetiler.basemap.generated.Tables;
|
||||
import com.onthegomap.planetiler.basemap.util.Utils;
|
||||
import com.onthegomap.planetiler.config.PlanetilerConfig;
|
||||
import com.onthegomap.planetiler.expression.MultiExpression;
|
||||
import com.onthegomap.planetiler.reader.SourceFeature;
|
||||
import com.onthegomap.planetiler.stats.Stats;
|
||||
import com.onthegomap.planetiler.util.Translations;
|
||||
|
||||
/**
|
||||
* Defines the logic for generating map elements for oceans and lakes in the {@code water} layer from source features.
|
||||
* <p>
|
||||
* This class is ported to Java from <a href="https://github.com/openmaptiles/openmaptiles/tree/master/layers/water">OpenMapTiles
|
||||
* water sql files</a>.
|
||||
*/
|
||||
public class Water implements
|
||||
OpenMapTilesSchema.Water,
|
||||
Tables.OsmWaterPolygon.Handler,
|
||||
BasemapProfile.NaturalEarthProcessor,
|
||||
BasemapProfile.OsmWaterPolygonProcessor {
|
||||
|
||||
/*
|
||||
* At low zoom levels, use natural earth for oceans and major lakes, and at high zoom levels
|
||||
* use OpenStreetMap data. OpenStreetMap data contains smaller bodies of water, but not
|
||||
* large ocean polygons. For oceans, use https://osmdata.openstreetmap.de/data/water-polygons.html
|
||||
* which infers ocean polygons by preprocessing all coastline elements.
|
||||
*/
|
||||
|
||||
private final MultiExpression.Index<String> classMapping;
|
||||
|
||||
public Water(Translations translations, PlanetilerConfig config, Stats stats) {
|
||||
this.classMapping = FieldMappings.Class.index();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processNaturalEarth(String table, SourceFeature feature, FeatureCollector features) {
|
||||
record WaterInfo(int minZoom, int maxZoom, String clazz) {}
|
||||
WaterInfo info = switch (table) {
|
||||
case "ne_110m_ocean" -> new WaterInfo(0, 1, FieldValues.CLASS_OCEAN);
|
||||
case "ne_50m_ocean" -> new WaterInfo(2, 4, FieldValues.CLASS_OCEAN);
|
||||
case "ne_10m_ocean" -> new WaterInfo(5, 5, FieldValues.CLASS_OCEAN);
|
||||
|
||||
case "ne_110m_lakes" -> new WaterInfo(0, 1, FieldValues.CLASS_LAKE);
|
||||
case "ne_50m_lakes" -> new WaterInfo(2, 3, FieldValues.CLASS_LAKE);
|
||||
case "ne_10m_lakes" -> new WaterInfo(4, 5, FieldValues.CLASS_LAKE);
|
||||
default -> null;
|
||||
};
|
||||
if (info != null) {
|
||||
features.polygon(LAYER_NAME)
|
||||
.setBufferPixels(BUFFER_SIZE)
|
||||
.setZoomRange(info.minZoom, info.maxZoom)
|
||||
.setAttr(Fields.CLASS, info.clazz);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processOsmWater(SourceFeature feature, FeatureCollector features) {
|
||||
features.polygon(LAYER_NAME)
|
||||
.setBufferPixels(BUFFER_SIZE)
|
||||
.setAttr(Fields.CLASS, FieldValues.CLASS_OCEAN)
|
||||
.setMinZoom(6);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmWaterPolygon element, FeatureCollector features) {
|
||||
if (!"bay".equals(element.natural())) {
|
||||
String clazz = "riverbank".equals(element.waterway()) ? FieldValues.CLASS_RIVER :
|
||||
classMapping.getOrElse(element.source(), FieldValues.CLASS_LAKE);
|
||||
features.polygon(LAYER_NAME)
|
||||
.setBufferPixels(BUFFER_SIZE)
|
||||
.setMinPixelSizeBelowZoom(11, 2)
|
||||
.setMinZoom(6)
|
||||
.setAttr(Fields.INTERMITTENT, element.isIntermittent() ? 1 : 0)
|
||||
.setAttrWithMinzoom(Fields.BRUNNEL, Utils.brunnel(element.isBridge(), element.isTunnel()), 12)
|
||||
.setAttr(Fields.CLASS, clazz);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,195 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2021, MapTiler.com & OpenMapTiles contributors.
|
||||
All rights reserved.
|
||||
|
||||
Code license: BSD 3-Clause License
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Design license: CC-BY 4.0
|
||||
|
||||
See https://github.com/openmaptiles/openmaptiles/blob/master/LICENSE.md for details on usage
|
||||
*/
|
||||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import static com.onthegomap.planetiler.basemap.util.Utils.nullIfEmpty;
|
||||
|
||||
import com.carrotsearch.hppc.LongObjectMap;
|
||||
import com.graphhopper.coll.GHLongObjectHashMap;
|
||||
import com.onthegomap.planetiler.FeatureCollector;
|
||||
import com.onthegomap.planetiler.basemap.BasemapProfile;
|
||||
import com.onthegomap.planetiler.basemap.generated.OpenMapTilesSchema;
|
||||
import com.onthegomap.planetiler.basemap.generated.Tables;
|
||||
import com.onthegomap.planetiler.basemap.util.LanguageUtils;
|
||||
import com.onthegomap.planetiler.config.PlanetilerConfig;
|
||||
import com.onthegomap.planetiler.geo.GeoUtils;
|
||||
import com.onthegomap.planetiler.geo.GeometryException;
|
||||
import com.onthegomap.planetiler.reader.SourceFeature;
|
||||
import com.onthegomap.planetiler.stats.Stats;
|
||||
import com.onthegomap.planetiler.util.Parse;
|
||||
import com.onthegomap.planetiler.util.Translations;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentSkipListMap;
|
||||
import org.locationtech.jts.geom.Geometry;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* Defines the logic for generating map elements for ocean and lake names in the {@code water_name} layer from source
|
||||
* features.
|
||||
* <p>
|
||||
* This class is ported to Java from <a href="https://github.com/openmaptiles/openmaptiles/tree/master/layers/water_name">OpenMapTiles
|
||||
* water_name sql files</a>.
|
||||
*/
|
||||
public class WaterName implements
|
||||
OpenMapTilesSchema.WaterName,
|
||||
Tables.OsmMarinePoint.Handler,
|
||||
Tables.OsmWaterPolygon.Handler,
|
||||
BasemapProfile.NaturalEarthProcessor,
|
||||
BasemapProfile.LakeCenterlineProcessor {
|
||||
|
||||
/*
|
||||
* Labels for lakes and oceans come primarily from OpenStreetMap data, but we also join
|
||||
* with the lake centerlines source to get linestring geometries for prominent lakes.
|
||||
* We also join with natural earth to make certain important lake/ocean labels visible
|
||||
* at lower zoom levels.
|
||||
*/
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(WaterName.class);
|
||||
private static final double WORLD_AREA_FOR_70K_SQUARE_METERS =
|
||||
Math.pow(GeoUtils.metersToPixelAtEquator(0, Math.sqrt(70_000)) / 256d, 2);
|
||||
private static final double LOG2 = Math.log(2);
|
||||
private final Translations translations;
|
||||
// need to synchronize updates from multiple threads
|
||||
private final LongObjectMap<Geometry> lakeCenterlines = new GHLongObjectHashMap<>();
|
||||
// may be updated concurrently by multiple threads
|
||||
private final ConcurrentSkipListMap<String, Integer> importantMarinePoints = new ConcurrentSkipListMap<>();
|
||||
private final Stats stats;
|
||||
|
||||
public WaterName(Translations translations, PlanetilerConfig config, Stats stats) {
|
||||
this.translations = translations;
|
||||
this.stats = stats;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void release() {
|
||||
lakeCenterlines.release();
|
||||
importantMarinePoints.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processLakeCenterline(SourceFeature feature, FeatureCollector features) {
|
||||
// TODO pull lake centerline computation into planetiler?
|
||||
long osmId = Math.abs(feature.getLong("OSM_ID"));
|
||||
if (osmId == 0L) {
|
||||
LOGGER.warn("Bad lake centerline. Tags: " + feature.tags());
|
||||
} else {
|
||||
try {
|
||||
// multiple threads call this concurrently
|
||||
synchronized (this) {
|
||||
lakeCenterlines.put(osmId, feature.worldGeometry());
|
||||
}
|
||||
} catch (GeometryException e) {
|
||||
e.log(stats, "omt_water_name_lakeline", "Bad lake centerline: " + feature);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processNaturalEarth(String table, SourceFeature feature, FeatureCollector features) {
|
||||
// use natural earth named polygons just as a source of name to zoom-level mappings for later
|
||||
if ("ne_10m_geography_marine_polys".equals(table)) {
|
||||
String name = feature.getString("name");
|
||||
Integer scalerank = Parse.parseIntOrNull(feature.getTag("scalerank"));
|
||||
if (name != null && scalerank != null) {
|
||||
name = name.replaceAll("\\s+", " ").trim().toLowerCase();
|
||||
importantMarinePoints.put(name, scalerank);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmMarinePoint element, FeatureCollector features) {
|
||||
if (!element.name().isBlank()) {
|
||||
String place = element.place();
|
||||
var source = element.source();
|
||||
// use name from OSM, but get min zoom from natural earth based on fuzzy name match...
|
||||
Integer rank = Parse.parseIntOrNull(source.getTag("rank"));
|
||||
String name = element.name().toLowerCase();
|
||||
Integer nerank;
|
||||
if ((nerank = importantMarinePoints.get(name)) != null) {
|
||||
rank = nerank;
|
||||
} else if ((nerank = importantMarinePoints.get(source.getString("name:en", "").toLowerCase())) != null) {
|
||||
rank = nerank;
|
||||
} else if ((nerank = importantMarinePoints.get(source.getString("name:es", "").toLowerCase())) != null) {
|
||||
rank = nerank;
|
||||
} else {
|
||||
Map.Entry<String, Integer> next = importantMarinePoints.ceilingEntry(name);
|
||||
if (next != null && next.getKey().startsWith(name)) {
|
||||
rank = next.getValue();
|
||||
}
|
||||
}
|
||||
int minZoom = "ocean".equals(place) ? 0 : rank != null ? rank : 8;
|
||||
features.point(LAYER_NAME)
|
||||
.setBufferPixels(BUFFER_SIZE)
|
||||
.putAttrs(LanguageUtils.getNames(source.tags(), translations))
|
||||
.setAttr(Fields.CLASS, place)
|
||||
.setAttr(Fields.INTERMITTENT, element.isIntermittent() ? 1 : 0)
|
||||
.setMinZoom(minZoom);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmWaterPolygon element, FeatureCollector features) {
|
||||
if (nullIfEmpty(element.name()) != null) {
|
||||
try {
|
||||
Geometry centerlineGeometry = lakeCenterlines.get(element.source().id());
|
||||
FeatureCollector.Feature feature;
|
||||
int minzoom = 9;
|
||||
if (centerlineGeometry != null) {
|
||||
// prefer lake centerline if it exists
|
||||
feature = features.geometry(LAYER_NAME, centerlineGeometry)
|
||||
.setMinPixelSizeBelowZoom(13, 6 * element.name().length());
|
||||
} else {
|
||||
// otherwise just use a label point inside the lake
|
||||
feature = features.pointOnSurface(LAYER_NAME);
|
||||
Geometry geometry = element.source().worldGeometry();
|
||||
double area = geometry.getArea();
|
||||
minzoom = (int) Math.floor(20 - Math.log(area / WORLD_AREA_FOR_70K_SQUARE_METERS) / LOG2);
|
||||
minzoom = Math.min(14, Math.max(9, minzoom));
|
||||
}
|
||||
feature
|
||||
.setAttr(Fields.CLASS, FieldValues.CLASS_LAKE)
|
||||
.setBufferPixels(BUFFER_SIZE)
|
||||
.putAttrs(LanguageUtils.getNames(element.source().tags(), translations))
|
||||
.setAttr(Fields.INTERMITTENT, element.isIntermittent() ? 1 : 0)
|
||||
.setMinZoom(minzoom);
|
||||
} catch (GeometryException e) {
|
||||
e.log(stats, "omt_water_polygon", "Unable to get geometry for water polygon " + element.source().id());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,228 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2021, MapTiler.com & OpenMapTiles contributors.
|
||||
All rights reserved.
|
||||
|
||||
Code license: BSD 3-Clause License
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Design license: CC-BY 4.0
|
||||
|
||||
See https://github.com/openmaptiles/openmaptiles/blob/master/LICENSE.md for details on usage
|
||||
*/
|
||||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import static com.onthegomap.planetiler.basemap.util.Utils.nullIfEmpty;
|
||||
|
||||
import com.carrotsearch.hppc.LongObjectHashMap;
|
||||
import com.google.common.util.concurrent.AtomicDouble;
|
||||
import com.graphhopper.coll.GHLongObjectHashMap;
|
||||
import com.onthegomap.planetiler.FeatureCollector;
|
||||
import com.onthegomap.planetiler.FeatureMerge;
|
||||
import com.onthegomap.planetiler.VectorTile;
|
||||
import com.onthegomap.planetiler.basemap.BasemapProfile;
|
||||
import com.onthegomap.planetiler.basemap.generated.OpenMapTilesSchema;
|
||||
import com.onthegomap.planetiler.basemap.generated.Tables;
|
||||
import com.onthegomap.planetiler.basemap.util.LanguageUtils;
|
||||
import com.onthegomap.planetiler.basemap.util.Utils;
|
||||
import com.onthegomap.planetiler.config.PlanetilerConfig;
|
||||
import com.onthegomap.planetiler.geo.GeometryException;
|
||||
import com.onthegomap.planetiler.reader.SourceFeature;
|
||||
import com.onthegomap.planetiler.reader.osm.OsmElement;
|
||||
import com.onthegomap.planetiler.reader.osm.OsmReader;
|
||||
import com.onthegomap.planetiler.reader.osm.OsmRelationInfo;
|
||||
import com.onthegomap.planetiler.stats.Stats;
|
||||
import com.onthegomap.planetiler.util.Translations;
|
||||
import com.onthegomap.planetiler.util.ZoomFunction;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Defines the logic for generating river map elements in the {@code waterway} layer from source features.
|
||||
* <p>
|
||||
* This class is ported to Java from <a href="https://github.com/openmaptiles/openmaptiles/tree/master/layers/waterway">OpenMapTiles
|
||||
* waterway sql files</a>.
|
||||
*/
|
||||
public class Waterway implements
|
||||
OpenMapTilesSchema.Waterway,
|
||||
Tables.OsmWaterwayLinestring.Handler,
|
||||
BasemapProfile.FeaturePostProcessor,
|
||||
BasemapProfile.NaturalEarthProcessor,
|
||||
BasemapProfile.OsmRelationPreprocessor,
|
||||
BasemapProfile.OsmAllProcessor {
|
||||
|
||||
/*
|
||||
* Uses Natural Earth at lower zoom-levels and OpenStreetMap at higher zoom levels.
|
||||
*
|
||||
* For OpenStreetMap, attempts to merge disconnected linestrings with the same name
|
||||
* at lower zoom levels so that clients can more easily render the name. We also
|
||||
* limit their length at merge-time which only has visibilty into that feature in a
|
||||
* single tile, so at render-time we need to allow through features far enough outside
|
||||
* the tile boundary enough to not accidentally filter out a long river only because a
|
||||
* short segment of it goes through this tile.
|
||||
*/
|
||||
|
||||
private static final Map<String, Integer> CLASS_MINZOOM = Map.of(
|
||||
"river", 12,
|
||||
"canal", 12,
|
||||
|
||||
"stream", 13,
|
||||
"drain", 13,
|
||||
"ditch", 13
|
||||
);
|
||||
private static final String TEMP_REL_ID_ADDR = "_relid";
|
||||
|
||||
private final Translations translations;
|
||||
private final PlanetilerConfig config;
|
||||
private final Stats stats;
|
||||
private final LongObjectHashMap<AtomicDouble> riverRelationLengths = new GHLongObjectHashMap<>();
|
||||
|
||||
public Waterway(Translations translations, PlanetilerConfig config, Stats stats) {
|
||||
this.config = config;
|
||||
this.translations = translations;
|
||||
this.stats = stats;
|
||||
}
|
||||
|
||||
private static final ZoomFunction.MeterToPixelThresholds MIN_PIXEL_LENGTHS = ZoomFunction.meterThresholds()
|
||||
.put(6, 500_000)
|
||||
.put(7, 400_000)
|
||||
.put(8, 300_000)
|
||||
.put(9, 8_000)
|
||||
.put(10, 4_000)
|
||||
.put(11, 1_000);
|
||||
|
||||
// zoom-level 3-5 come from natural earth
|
||||
|
||||
@Override
|
||||
public void processNaturalEarth(String table, SourceFeature feature, FeatureCollector features) {
|
||||
if (feature.hasTag("featurecla", "River")) {
|
||||
record ZoomRange(int min, int max) {}
|
||||
ZoomRange zoom = switch (table) {
|
||||
case "ne_110m_rivers_lake_centerlines" -> new ZoomRange(3, 3);
|
||||
case "ne_50m_rivers_lake_centerlines" -> new ZoomRange(4, 5);
|
||||
default -> null;
|
||||
};
|
||||
if (zoom != null) {
|
||||
features.line(LAYER_NAME)
|
||||
.setBufferPixels(BUFFER_SIZE)
|
||||
.setAttr(Fields.CLASS, FieldValues.CLASS_RIVER)
|
||||
.setZoomRange(zoom.min, zoom.max);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// zoom-level 6-8 come from OSM river relations
|
||||
|
||||
private record WaterwayRelation(
|
||||
long id,
|
||||
Map<String, Object> names
|
||||
) implements OsmRelationInfo {}
|
||||
|
||||
@Override
|
||||
public List<OsmRelationInfo> preprocessOsmRelation(OsmElement.Relation relation) {
|
||||
if (relation.hasTag("waterway", "river") && !Utils.nullOrEmpty(relation.getString("name"))) {
|
||||
riverRelationLengths.put(relation.id(), new AtomicDouble());
|
||||
return List.of(new WaterwayRelation(relation.id(), LanguageUtils.getNames(relation.tags(), translations)));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processAllOsm(SourceFeature feature, FeatureCollector features) {
|
||||
List<OsmReader.RelationMember<WaterwayRelation>> waterways = feature.relationInfo(WaterwayRelation.class);
|
||||
if (waterways != null && !waterways.isEmpty() && feature.canBeLine()) {
|
||||
for (var waterway : waterways) {
|
||||
String role = waterway.role();
|
||||
if (Utils.nullOrEmpty(role) || "main_stream".equals(role)) {
|
||||
long relId = waterway.relation().id();
|
||||
try {
|
||||
AtomicDouble counter = riverRelationLengths.get(relId);
|
||||
if (counter != null) {
|
||||
counter.addAndGet(feature.length());
|
||||
}
|
||||
} catch (GeometryException e) {
|
||||
e.log(stats, "waterway_decode", "Unable to get waterway length for " + feature.id());
|
||||
}
|
||||
features.line(LAYER_NAME)
|
||||
.setAttr(TEMP_REL_ID_ADDR, relId)
|
||||
.setBufferPixels(BUFFER_SIZE)
|
||||
.setAttr(Fields.CLASS, FieldValues.CLASS_RIVER)
|
||||
.putAttrs(waterway.relation().names())
|
||||
.setZoomRange(6, 8)
|
||||
.setMinPixelSize(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// zoom-level 9+ come from OSM river ways
|
||||
|
||||
@Override
|
||||
public void process(Tables.OsmWaterwayLinestring element, FeatureCollector features) {
|
||||
String waterway = element.waterway();
|
||||
String name = nullIfEmpty(element.name());
|
||||
boolean important = "river".equals(waterway) && name != null;
|
||||
int minzoom = important ? 9 : CLASS_MINZOOM.getOrDefault(element.waterway(), 14);
|
||||
features.line(LAYER_NAME)
|
||||
.setBufferPixels(BUFFER_SIZE)
|
||||
.setAttr(Fields.CLASS, element.waterway())
|
||||
.putAttrs(LanguageUtils.getNames(element.source().tags(), translations))
|
||||
.setMinZoom(minzoom)
|
||||
// details only at higher zoom levels so that named rivers can be merged more aggressively
|
||||
.setAttrWithMinzoom(Fields.BRUNNEL, Utils.brunnel(element.isBridge(), element.isTunnel()), 12)
|
||||
.setAttrWithMinzoom(Fields.INTERMITTENT, element.isIntermittent() ? 1 : 0, 12)
|
||||
// at lower zoom levels, we'll merge linestrings and limit length/clip afterwards
|
||||
.setBufferPixelOverrides(MIN_PIXEL_LENGTHS).setMinPixelSizeBelowZoom(11, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<VectorTile.Feature> postProcess(int zoom, List<VectorTile.Feature> items) {
|
||||
if (zoom >= 6 && zoom <= 8) {
|
||||
// remove ways for river relations if relation is not long enough
|
||||
double minSizeAtZoom = MIN_PIXEL_LENGTHS.apply(zoom).doubleValue() / Math.pow(2, zoom) / 256d;
|
||||
for (int i = 0; i < items.size(); i++) {
|
||||
Object relIdObj = items.get(i).attrs().remove(TEMP_REL_ID_ADDR);
|
||||
if (relIdObj instanceof Long relId && riverRelationLengths.get(relId).get() < minSizeAtZoom) {
|
||||
items.set(i, null);
|
||||
}
|
||||
}
|
||||
return FeatureMerge.mergeLineStrings(
|
||||
items,
|
||||
config.minFeatureSize(zoom),
|
||||
config.tolerance(zoom),
|
||||
BUFFER_SIZE
|
||||
);
|
||||
} else if (zoom >= 9 && zoom <= 11) {
|
||||
return FeatureMerge.mergeLineStrings(
|
||||
items,
|
||||
MIN_PIXEL_LENGTHS.apply(zoom).doubleValue(),
|
||||
config.tolerance(zoom),
|
||||
BUFFER_SIZE
|
||||
);
|
||||
}
|
||||
return items;
|
||||
}
|
||||
}
|
|
@ -1,170 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2021, MapTiler.com & OpenMapTiles contributors.
|
||||
All rights reserved.
|
||||
|
||||
Code license: BSD 3-Clause License
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Design license: CC-BY 4.0
|
||||
|
||||
See https://github.com/openmaptiles/openmaptiles/blob/master/LICENSE.md for details on usage
|
||||
*/
|
||||
package com.onthegomap.planetiler.basemap.util;
|
||||
|
||||
import static com.onthegomap.planetiler.basemap.util.Utils.coalesce;
|
||||
import static com.onthegomap.planetiler.basemap.util.Utils.nullIfEmpty;
|
||||
|
||||
import com.onthegomap.planetiler.util.Translations;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/**
|
||||
* Utilities to extract common name fields (name, name_en, name_de, name:latin, name:nonlatin, name_int) that the
|
||||
* OpenMapTiles schema uses across any map element with a name.
|
||||
* <p>
|
||||
* Ported from <a href="https://github.com/openmaptiles/openmaptiles-tools/blob/master/sql/zzz_language.sql">openmaptiles-tools</a>.
|
||||
*/
|
||||
public class LanguageUtils {
|
||||
|
||||
private static final Pattern NONLATIN = Pattern
|
||||
.compile("[^\\x{0000}-\\x{024f}\\x{1E00}-\\x{1EFF}\\x{0300}-\\x{036f}\\x{0259}]");
|
||||
private static final Pattern LETTER = Pattern.compile("[A-Za-zÀ-ÖØ-öø-ÿĀ-ɏ]+");
|
||||
private static final Pattern EMPTY_PARENS = Pattern.compile("(\\([ -.]*\\)|\\[[ -.]*])");
|
||||
private static final Pattern LEADING_TRAILING_JUNK = Pattern.compile("(^\\s*([./-]\\s*)*|(\\s+[./-])*\\s*$)");
|
||||
private static final Pattern WHITESPACE = Pattern.compile("\\s+");
|
||||
private static final Set<String> EN_DE_NAME_KEYS = Set.of("name:en", "name:de");
|
||||
|
||||
private static void putIfNotEmpty(Map<String, Object> dest, String key, Object value) {
|
||||
if (value != null && !value.equals("")) {
|
||||
dest.put(key, value);
|
||||
}
|
||||
}
|
||||
|
||||
private static String string(Object obj) {
|
||||
return nullIfEmpty(obj == null ? null : obj.toString());
|
||||
}
|
||||
|
||||
static boolean containsOnlyLatinCharacters(String string) {
|
||||
return string != null && !NONLATIN.matcher(string).find();
|
||||
}
|
||||
|
||||
private static String transliteratedName(Map<String, Object> tags) {
|
||||
return Translations.transliterate(string(tags.get("name")));
|
||||
}
|
||||
|
||||
static String removeLatinCharacters(String name) {
|
||||
if (name == null) {
|
||||
return null;
|
||||
}
|
||||
var matcher = LETTER.matcher(name);
|
||||
if (matcher.find()) {
|
||||
String result = matcher.replaceAll("");
|
||||
// if the name was "<nonlatin text> (<latin description)"
|
||||
// or "<nonlatin text> - <latin description>"
|
||||
// then remove any of those extra characters now
|
||||
result = EMPTY_PARENS.matcher(result).replaceAll("");
|
||||
result = LEADING_TRAILING_JUNK.matcher(result).replaceAll("");
|
||||
return WHITESPACE.matcher(result).replaceAll(" ");
|
||||
}
|
||||
return name.trim();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a map with default name attributes (name, name_en, name_de, name:latin, name:nonlatin, name_int) that every
|
||||
* element should have, derived from name, int_name, name:en, and name:de tags on the input element.
|
||||
*
|
||||
* <ul>
|
||||
* <li>name is the original name value from the element</li>
|
||||
* <li>name_en is the original name:en value from the element, or name if missing</li>
|
||||
* <li>name_de is the original name:de value from the element, or name/ name_en if missing</li>
|
||||
* <li>name:latin is the first of name, int_name, or any name: attribute that contains only latin characters</li>
|
||||
* <li>name:nonlatin is any nonlatin part of name if present</li>
|
||||
* <li>name_int is the first of int_name name:en name:latin name</li>
|
||||
* </ul>
|
||||
*/
|
||||
public static Map<String, Object> getNamesWithoutTranslations(Map<String, Object> tags) {
|
||||
return getNames(tags, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a map with default name attributes that {@link #getNamesWithoutTranslations(Map)} adds, but also
|
||||
* translations for every language that {@code translations} is configured to handle.
|
||||
*/
|
||||
public static Map<String, Object> getNames(Map<String, Object> tags, Translations translations) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
|
||||
String name = string(tags.get("name"));
|
||||
String intName = string(tags.get("int_name"));
|
||||
String nameEn = string(tags.get("name:en"));
|
||||
String nameDe = string(tags.get("name:de"));
|
||||
|
||||
boolean isLatin = containsOnlyLatinCharacters(name);
|
||||
String latin = isLatin ? name
|
||||
: Stream.concat(Stream.of(nameEn, intName, nameDe), getAllNameTranslationsBesidesEnglishAndGerman(tags))
|
||||
.filter(LanguageUtils::containsOnlyLatinCharacters)
|
||||
.findFirst().orElse(null);
|
||||
if (latin == null && translations != null && translations.getShouldTransliterate()) {
|
||||
latin = transliteratedName(tags);
|
||||
}
|
||||
String nonLatin = isLatin ? null : removeLatinCharacters(name);
|
||||
if (coalesce(nonLatin, "").equals(latin)) {
|
||||
nonLatin = null;
|
||||
}
|
||||
|
||||
putIfNotEmpty(result, "name", name);
|
||||
putIfNotEmpty(result, "name_en", coalesce(nameEn, name));
|
||||
putIfNotEmpty(result, "name_de", coalesce(nameDe, name, nameEn));
|
||||
putIfNotEmpty(result, "name:latin", latin);
|
||||
putIfNotEmpty(result, "name:nonlatin", nonLatin);
|
||||
putIfNotEmpty(result, "name_int", coalesce(
|
||||
intName,
|
||||
nameEn,
|
||||
latin,
|
||||
name
|
||||
));
|
||||
|
||||
if (translations != null) {
|
||||
translations.addTranslations(result, tags);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private static Stream<String> getAllNameTranslationsBesidesEnglishAndGerman(Map<String, Object> tags) {
|
||||
return tags.entrySet().stream()
|
||||
.filter(e -> {
|
||||
String key = e.getKey();
|
||||
return key.startsWith("name:") && !EN_DE_NAME_KEYS.contains(key);
|
||||
})
|
||||
.map(Map.Entry::getValue)
|
||||
.map(LanguageUtils::string);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,78 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap.util;
|
||||
|
||||
import com.onthegomap.planetiler.util.Parse;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Common utilities for working with data and the OpenMapTiles schema in {@code layers} implementations.
|
||||
*/
|
||||
public class Utils {
|
||||
|
||||
public static <T> T coalesce(T a, T b) {
|
||||
return a != null ? a : b;
|
||||
}
|
||||
|
||||
public static <T> T coalesce(T a, T b, T c) {
|
||||
return a != null ? a : b != null ? b : c;
|
||||
}
|
||||
|
||||
public static <T> T coalesce(T a, T b, T c, T d) {
|
||||
return a != null ? a : b != null ? b : c != null ? c : d;
|
||||
}
|
||||
|
||||
public static <T> T coalesce(T a, T b, T c, T d, T e) {
|
||||
return a != null ? a : b != null ? b : c != null ? c : d != null ? d : e;
|
||||
}
|
||||
|
||||
public static <T> T coalesce(T a, T b, T c, T d, T e, T f) {
|
||||
return a != null ? a : b != null ? b : c != null ? c : d != null ? d : e != null ? e : f;
|
||||
}
|
||||
|
||||
/** Boxes {@code a} into an {@link Integer}, or {@code null} if {@code a} is {@code nullValue}. */
|
||||
public static Long nullIfLong(long a, long nullValue) {
|
||||
return a == nullValue ? null : a;
|
||||
}
|
||||
|
||||
/** Boxes {@code a} into a {@link Long}, or {@code null} if {@code a} is {@code nullValue}. */
|
||||
public static Integer nullIfInt(int a, int nullValue) {
|
||||
return a == nullValue ? null : a;
|
||||
}
|
||||
|
||||
/** Returns {@code a}, or null if {@code a} is "". */
|
||||
public static String nullIfEmpty(String a) {
|
||||
return (a == null || a.isEmpty()) ? null : a;
|
||||
}
|
||||
|
||||
/** Returns true if {@code a} is null, or its {@link Object#toString()} value is "". */
|
||||
public static boolean nullOrEmpty(Object a) {
|
||||
return a == null || a.toString().isEmpty();
|
||||
}
|
||||
|
||||
/** Returns a map with {@code ele} (meters) and {ele_ft} attributes from an elevation in meters. */
|
||||
public static Map<String, Object> elevationTags(int meters) {
|
||||
return Map.of(
|
||||
"ele", meters,
|
||||
"ele_ft", (int) Math.round(meters * 3.2808399)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a map with {@code ele} (meters) and {ele_ft} attributes from an elevation string in meters, if {@code
|
||||
* meters} can be parsed as a valid number.
|
||||
*/
|
||||
public static Map<String, Object> elevationTags(String meters) {
|
||||
Integer ele = Parse.parseIntSubstring(meters);
|
||||
return ele == null ? Map.of() : elevationTags(ele);
|
||||
}
|
||||
|
||||
/** Returns "bridge" or "tunnel" string used for "brunnel" attribute by OpenMapTiles schema. */
|
||||
public static String brunnel(boolean isBridge, boolean isTunnel) {
|
||||
return brunnel(isBridge, isTunnel, false);
|
||||
}
|
||||
|
||||
/** Returns "bridge" or "tunnel" or "ford" string used for "brunnel" attribute by OpenMapTiles schema. */
|
||||
public static String brunnel(boolean isBridge, boolean isTunnel, boolean isFord) {
|
||||
return isBridge ? "bridge" : isTunnel ? "tunnel" : isFord ? "ford" : null;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,38 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import com.onthegomap.planetiler.config.PlanetilerConfig;
|
||||
import com.onthegomap.planetiler.reader.osm.OsmElement;
|
||||
import com.onthegomap.planetiler.stats.Stats;
|
||||
import com.onthegomap.planetiler.util.Translations;
|
||||
import com.onthegomap.planetiler.util.Wikidata;
|
||||
import java.util.List;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class BasemapProfileTest {
|
||||
|
||||
private final Wikidata.WikidataTranslations wikidataTranslations = new Wikidata.WikidataTranslations();
|
||||
private final Translations translations = Translations.defaultProvider(List.of("en", "es", "de"))
|
||||
.addTranslationProvider(wikidataTranslations);
|
||||
private final BasemapProfile profile = new BasemapProfile(translations, PlanetilerConfig.defaults(),
|
||||
Stats.inMemory());
|
||||
|
||||
@Test
|
||||
public void testCaresAboutWikidata() {
|
||||
var node = new OsmElement.Node(1, 1, 1);
|
||||
node.setTag("aeroway", "gate");
|
||||
assertTrue(profile.caresAboutWikidataTranslation(node));
|
||||
|
||||
node.setTag("aeroway", "other");
|
||||
assertFalse(profile.caresAboutWikidataTranslation(node));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDoesntCareAboutWikidataForRoads() {
|
||||
var way = new OsmElement.Way(1);
|
||||
way.setTag("highway", "footway");
|
||||
assertFalse(profile.caresAboutWikidataTranslation(way));
|
||||
}
|
||||
}
|
|
@ -1,225 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap;
|
||||
|
||||
import static com.onthegomap.planetiler.TestUtils.assertContains;
|
||||
import static com.onthegomap.planetiler.TestUtils.assertFeatureNear;
|
||||
import static com.onthegomap.planetiler.basemap.util.VerifyMonaco.MONACO_BOUNDS;
|
||||
import static com.onthegomap.planetiler.util.Gzip.gunzip;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.DynamicTest.dynamicTest;
|
||||
|
||||
import com.onthegomap.planetiler.TestUtils;
|
||||
import com.onthegomap.planetiler.VectorTile;
|
||||
import com.onthegomap.planetiler.basemap.util.VerifyMonaco;
|
||||
import com.onthegomap.planetiler.config.Arguments;
|
||||
import com.onthegomap.planetiler.mbtiles.Mbtiles;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Stream;
|
||||
import org.junit.jupiter.api.AfterAll;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.DynamicTest;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.TestFactory;
|
||||
import org.junit.jupiter.api.io.TempDir;
|
||||
import org.locationtech.jts.geom.Geometry;
|
||||
import org.locationtech.jts.geom.LineString;
|
||||
import org.locationtech.jts.geom.Point;
|
||||
import org.locationtech.jts.geom.Polygon;
|
||||
|
||||
/**
|
||||
* End-to-end tests for basemap generation.
|
||||
* <p>
|
||||
* Generates an entire map for the smallest openstreetmap extract available (Monaco) and asserts that expected output
|
||||
* features exist
|
||||
*/
|
||||
public class BasemapTest {
|
||||
|
||||
@TempDir
|
||||
static Path tmpDir;
|
||||
private static Mbtiles mbtiles;
|
||||
|
||||
@BeforeAll
|
||||
public static void runPlanetiler() throws Exception {
|
||||
Path dbPath = tmpDir.resolve("output.mbtiles");
|
||||
BasemapMain.run(Arguments.of(
|
||||
// Override input source locations
|
||||
"osm_path", TestUtils.pathToResource("monaco-latest.osm.pbf"),
|
||||
"natural_earth_path", TestUtils.pathToResource("natural_earth_vector.sqlite.zip"),
|
||||
"water_polygons_path", TestUtils.pathToResource("water-polygons-split-3857.zip"),
|
||||
// no centerlines in monaco - so fake it out with an empty source
|
||||
"lake_centerlines_path", TestUtils.pathToResource("water-polygons-split-3857.zip"),
|
||||
|
||||
// Override temp dir location
|
||||
"tmp", tmpDir.toString(),
|
||||
|
||||
// Override output location
|
||||
"mbtiles", dbPath.toString()
|
||||
));
|
||||
mbtiles = Mbtiles.newReadOnlyDatabase(dbPath);
|
||||
}
|
||||
|
||||
@AfterAll
|
||||
public static void close() throws IOException {
|
||||
mbtiles.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMetadata() {
|
||||
Map<String, String> metadata = mbtiles.metadata().getAll();
|
||||
assertEquals("OpenMapTiles", metadata.get("name"));
|
||||
assertEquals("0", metadata.get("minzoom"));
|
||||
assertEquals("14", metadata.get("maxzoom"));
|
||||
assertEquals("baselayer", metadata.get("type"));
|
||||
assertEquals("pbf", metadata.get("format"));
|
||||
assertEquals("7.40921,43.72335,7.44864,43.75169", metadata.get("bounds"));
|
||||
assertEquals("7.42892,43.73752,14", metadata.get("center"));
|
||||
assertContains("openmaptiles.org", metadata.get("description"));
|
||||
assertContains("openmaptiles.org", metadata.get("attribution"));
|
||||
assertContains("www.openstreetmap.org/copyright", metadata.get("attribution"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void ensureValidGeometries() throws Exception {
|
||||
Set<Mbtiles.TileEntry> parsedTiles = TestUtils.getAllTiles(mbtiles);
|
||||
for (var tileEntry : parsedTiles) {
|
||||
var decoded = VectorTile.decode(gunzip(tileEntry.bytes()));
|
||||
for (VectorTile.Feature feature : decoded) {
|
||||
TestUtils.validateGeometry(feature.geometry().decode());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testContainsOceanPolyons() {
|
||||
assertFeatureNear(mbtiles, "water", Map.of(
|
||||
"class", "ocean"
|
||||
), 7.4484, 43.70783, 0, 14);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testContainsCountryName() {
|
||||
assertFeatureNear(mbtiles, "place", Map.of(
|
||||
"class", "country",
|
||||
"iso_a2", "MC",
|
||||
"name", "Monaco"
|
||||
), 7.42769, 43.73235, 2, 14);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testContainsSuburb() {
|
||||
assertFeatureNear(mbtiles, "place", Map.of(
|
||||
"name", "Les Moneghetti",
|
||||
"class", "suburb"
|
||||
), 7.41746, 43.73638, 11, 14);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testContainsBuildings() {
|
||||
assertFeatureNear(mbtiles, "building", Map.of(), 7.41919, 43.73401, 13, 14);
|
||||
assertNumFeatures("building", Map.of(), 14, 1316, Polygon.class);
|
||||
assertNumFeatures("building", Map.of(), 13, 196, Polygon.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testContainsHousenumber() {
|
||||
assertFeatureNear(mbtiles, "housenumber", Map.of(
|
||||
"housenumber", "27"
|
||||
), 7.42117, 43.73652, 14, 14);
|
||||
assertNumFeatures("housenumber", Map.of(), 14, 274, Point.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBoundary() {
|
||||
assertFeatureNear(mbtiles, "boundary", Map.of(
|
||||
"admin_level", 2L,
|
||||
"maritime", 1L,
|
||||
"disputed", 0L
|
||||
), 7.41884, 43.72396, 4, 14);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAeroway() {
|
||||
assertNumFeatures("aeroway", Map.of(
|
||||
"class", "heliport"
|
||||
), 14, 1, Polygon.class);
|
||||
assertNumFeatures("aeroway", Map.of(
|
||||
"class", "helipad"
|
||||
), 14, 11, Polygon.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLandcover() {
|
||||
assertNumFeatures("landcover", Map.of(
|
||||
"class", "grass",
|
||||
"subclass", "park"
|
||||
), 14, 20, Polygon.class);
|
||||
assertNumFeatures("landcover", Map.of(
|
||||
"class", "grass",
|
||||
"subclass", "garden"
|
||||
), 14, 33, Polygon.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPoi() {
|
||||
assertNumFeatures("poi", Map.of(
|
||||
"class", "restaurant",
|
||||
"subclass", "restaurant"
|
||||
), 14, 217, Point.class);
|
||||
assertNumFeatures("poi", Map.of(
|
||||
"class", "art_gallery",
|
||||
"subclass", "artwork"
|
||||
), 14, 132, Point.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLanduse() {
|
||||
assertNumFeatures("landuse", Map.of(
|
||||
"class", "residential"
|
||||
), 14, 8, Polygon.class);
|
||||
assertNumFeatures("landuse", Map.of(
|
||||
"class", "hospital"
|
||||
), 14, 4, Polygon.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTransportation() {
|
||||
assertNumFeatures("transportation", Map.of(
|
||||
"class", "path",
|
||||
"subclass", "footway"
|
||||
), 14, 909, LineString.class);
|
||||
assertNumFeatures("transportation", Map.of(
|
||||
"class", "primary"
|
||||
), 14, 170, LineString.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTransportationName() {
|
||||
assertNumFeatures("transportation_name", Map.of(
|
||||
"name", "Boulevard du Larvotto",
|
||||
"class", "primary"
|
||||
), 14, 12, LineString.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWaterway() {
|
||||
assertNumFeatures("waterway", Map.of(
|
||||
"class", "stream"
|
||||
), 14, 6, LineString.class);
|
||||
}
|
||||
|
||||
@TestFactory
|
||||
public Stream<DynamicTest> testVerifyChecks() {
|
||||
return VerifyMonaco.verify(mbtiles).results().stream()
|
||||
.map(check -> dynamicTest(check.name(), () -> {
|
||||
check.error().ifPresent(Assertions::fail);
|
||||
}));
|
||||
}
|
||||
|
||||
private static void assertNumFeatures(String layer, Map<String, Object> attrs, int zoom,
|
||||
int expected, Class<? extends Geometry> clazz) {
|
||||
TestUtils.assertNumFeatures(mbtiles, layer, zoom, attrs, MONACO_BOUNDS, expected, clazz);
|
||||
}
|
||||
}
|
|
@ -1,228 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap;
|
||||
|
||||
import static com.onthegomap.planetiler.basemap.Generate.parseYaml;
|
||||
import static com.onthegomap.planetiler.expression.Expression.*;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.DynamicTest.dynamicTest;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.onthegomap.planetiler.expression.Expression;
|
||||
import com.onthegomap.planetiler.expression.MultiExpression;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Stream;
|
||||
import org.junit.jupiter.api.DynamicTest;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.TestFactory;
|
||||
|
||||
public class GenerateTest {
|
||||
|
||||
@Test
|
||||
public void testParseSimple() {
|
||||
MultiExpression<String> parsed = Generate.generateFieldMapping(parseYaml("""
|
||||
output:
|
||||
key: value
|
||||
key2:
|
||||
- value2
|
||||
- '%value3%'
|
||||
"""));
|
||||
assertEquals(MultiExpression.of(List.of(
|
||||
MultiExpression.entry("output", or(
|
||||
matchAny("key", "value"),
|
||||
matchAny("key2", "value2", "%value3%")
|
||||
))
|
||||
)), parsed);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParseAnd() {
|
||||
MultiExpression<String> parsed = Generate.generateFieldMapping(parseYaml("""
|
||||
output:
|
||||
__AND__:
|
||||
key1: val1
|
||||
key2: val2
|
||||
"""));
|
||||
assertEquals(MultiExpression.of(List.of(
|
||||
MultiExpression.entry("output", and(
|
||||
matchAny("key1", "val1"),
|
||||
matchAny("key2", "val2")
|
||||
))
|
||||
)), parsed);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParseAndWithOthers() {
|
||||
MultiExpression<String> parsed = Generate.generateFieldMapping(parseYaml("""
|
||||
output:
|
||||
- key0: val0
|
||||
- __AND__:
|
||||
key1: val1
|
||||
key2: val2
|
||||
"""));
|
||||
assertEquals(MultiExpression.of(List.of(
|
||||
MultiExpression.entry("output", or(
|
||||
matchAny("key0", "val0"),
|
||||
and(
|
||||
matchAny("key1", "val1"),
|
||||
matchAny("key2", "val2")
|
||||
)
|
||||
))
|
||||
)), parsed);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParseAndContainingOthers() {
|
||||
MultiExpression<String> parsed = Generate.generateFieldMapping(parseYaml("""
|
||||
output:
|
||||
__AND__:
|
||||
- key1: val1
|
||||
- __OR__:
|
||||
key2: val2
|
||||
key3: val3
|
||||
"""));
|
||||
assertEquals(MultiExpression.of(List.of(
|
||||
MultiExpression.entry("output", and(
|
||||
matchAny("key1", "val1"),
|
||||
or(
|
||||
matchAny("key2", "val2"),
|
||||
matchAny("key3", "val3")
|
||||
)
|
||||
))
|
||||
)), parsed);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParseContainsKey() {
|
||||
MultiExpression<String> parsed = Generate.generateFieldMapping(parseYaml("""
|
||||
output:
|
||||
key1: val1
|
||||
key2:
|
||||
"""));
|
||||
assertEquals(MultiExpression.of(List.of(
|
||||
MultiExpression.entry("output", or(
|
||||
matchAny("key1", "val1"),
|
||||
matchField("key2")
|
||||
))
|
||||
)), parsed);
|
||||
}
|
||||
|
||||
@TestFactory
|
||||
public Stream<DynamicTest> testParseImposm3Mapping() {
|
||||
record TestCase(String name, String mapping, String require, String reject, Expression expected) {
|
||||
|
||||
TestCase(String mapping, Expression expected) {
|
||||
this(mapping, mapping, null, null, expected);
|
||||
}
|
||||
}
|
||||
return Stream.of(
|
||||
new TestCase(
|
||||
"key: val", matchAny("key", "val")
|
||||
),
|
||||
new TestCase(
|
||||
"key: [val1, val2]", matchAny("key", "val1", "val2")
|
||||
),
|
||||
new TestCase(
|
||||
"key: [\"__any__\"]", matchField("key")
|
||||
),
|
||||
new TestCase("reject",
|
||||
"key: val",
|
||||
"mustkey: mustval",
|
||||
null,
|
||||
and(
|
||||
matchAny("key", "val"),
|
||||
matchAny("mustkey", "mustval")
|
||||
)
|
||||
),
|
||||
new TestCase("require",
|
||||
"key: val",
|
||||
null,
|
||||
"badkey: badval",
|
||||
and(
|
||||
matchAny("key", "val"),
|
||||
not(matchAny("badkey", "badval"))
|
||||
)
|
||||
),
|
||||
new TestCase("require and reject complex",
|
||||
"""
|
||||
key: val
|
||||
key2:
|
||||
- val1
|
||||
- val2
|
||||
""",
|
||||
"""
|
||||
mustkey: mustval
|
||||
mustkey2:
|
||||
- mustval1
|
||||
- mustval2
|
||||
""",
|
||||
"""
|
||||
notkey: notval
|
||||
notkey2:
|
||||
- notval1
|
||||
- notval2
|
||||
""",
|
||||
and(
|
||||
or(
|
||||
matchAny("key", "val"),
|
||||
matchAny("key2", "val1", "val2")
|
||||
),
|
||||
matchAny("mustkey", "mustval"),
|
||||
matchAny("mustkey2", "mustval1", "mustval2"),
|
||||
not(matchAny("notkey", "notval")),
|
||||
not(matchAny("notkey2", "notval1", "notval2"))
|
||||
)
|
||||
)
|
||||
).map(test -> dynamicTest(test.name, () -> {
|
||||
Expression parsed = Generate
|
||||
.parseImposm3MappingExpression("point", parseYaml(test.mapping), new Generate.Imposm3Filters(
|
||||
parseYaml(test.reject),
|
||||
parseYaml(test.require)
|
||||
));
|
||||
assertEquals(test.expected, parsed.replace(matchType("point"), TRUE).simplify());
|
||||
}));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTypeMappingTopLevelType() {
|
||||
Expression parsed = Generate
|
||||
.parseImposm3MappingExpression("point", parseYaml("""
|
||||
key: val
|
||||
"""), new Generate.Imposm3Filters(null, null));
|
||||
assertEquals(and(
|
||||
matchAny("key", "val"),
|
||||
matchType("point")
|
||||
), parsed);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTypeMappings() {
|
||||
Map<String, JsonNode> props = new LinkedHashMap<>();
|
||||
props.put("points", parseYaml("""
|
||||
key: val
|
||||
"""));
|
||||
props.put("polygons", parseYaml("""
|
||||
key2: val2
|
||||
"""));
|
||||
Expression parsed = Generate
|
||||
.parseImposm3MappingExpression(new Generate.Imposm3Table(
|
||||
"geometry",
|
||||
false,
|
||||
List.of(),
|
||||
null,
|
||||
null,
|
||||
props,
|
||||
List.of()
|
||||
));
|
||||
assertEquals(or(
|
||||
and(
|
||||
matchAny("key", "val"),
|
||||
matchType("point")
|
||||
),
|
||||
and(
|
||||
matchAny("key2", "val2"),
|
||||
matchType("polygon")
|
||||
)
|
||||
), parsed);
|
||||
}
|
||||
}
|
|
@ -1,236 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import static com.onthegomap.planetiler.TestUtils.assertSubmap;
|
||||
import static com.onthegomap.planetiler.TestUtils.newLineString;
|
||||
import static com.onthegomap.planetiler.TestUtils.newPoint;
|
||||
import static com.onthegomap.planetiler.TestUtils.rectangle;
|
||||
import static com.onthegomap.planetiler.basemap.BasemapProfile.OSM_SOURCE;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.fail;
|
||||
|
||||
import com.onthegomap.planetiler.FeatureCollector;
|
||||
import com.onthegomap.planetiler.TestUtils;
|
||||
import com.onthegomap.planetiler.VectorTile;
|
||||
import com.onthegomap.planetiler.basemap.BasemapProfile;
|
||||
import com.onthegomap.planetiler.config.PlanetilerConfig;
|
||||
import com.onthegomap.planetiler.geo.GeoUtils;
|
||||
import com.onthegomap.planetiler.geo.GeometryException;
|
||||
import com.onthegomap.planetiler.reader.SimpleFeature;
|
||||
import com.onthegomap.planetiler.reader.SourceFeature;
|
||||
import com.onthegomap.planetiler.reader.osm.OsmReader;
|
||||
import com.onthegomap.planetiler.reader.osm.OsmRelationInfo;
|
||||
import com.onthegomap.planetiler.stats.Stats;
|
||||
import com.onthegomap.planetiler.util.Translations;
|
||||
import com.onthegomap.planetiler.util.Wikidata;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.StreamSupport;
|
||||
|
||||
public abstract class AbstractLayerTest {
|
||||
|
||||
final Wikidata.WikidataTranslations wikidataTranslations = new Wikidata.WikidataTranslations();
|
||||
final Translations translations = Translations.defaultProvider(List.of("en", "es", "de"))
|
||||
.addTranslationProvider(wikidataTranslations);
|
||||
|
||||
final PlanetilerConfig params = PlanetilerConfig.defaults();
|
||||
final BasemapProfile profile = new BasemapProfile(translations, PlanetilerConfig.defaults(),
|
||||
Stats.inMemory());
|
||||
final Stats stats = Stats.inMemory();
|
||||
final FeatureCollector.Factory featureCollectorFactory = new FeatureCollector.Factory(params, stats);
|
||||
|
||||
static void assertFeatures(int zoom, List<Map<String, Object>> expected, Iterable<FeatureCollector.Feature> actual) {
|
||||
List<FeatureCollector.Feature> actualList = StreamSupport.stream(actual.spliterator(), false).toList();
|
||||
assertEquals(expected.size(), actualList.size(), () -> "size: " + actualList);
|
||||
for (int i = 0; i < expected.size(); i++) {
|
||||
assertSubmap(expected.get(i), TestUtils.toMap(actualList.get(i), zoom));
|
||||
}
|
||||
}
|
||||
|
||||
static void assertDescending(int... vals) {
|
||||
for (int i = 1; i < vals.length; i++) {
|
||||
if (vals[i - 1] < vals[i]) {
|
||||
fail("element at " + (i - 1) + " is less than element at " + i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void assertAscending(int... vals) {
|
||||
for (int i = 1; i < vals.length; i++) {
|
||||
if (vals[i - 1] > vals[i]) {
|
||||
fail(
|
||||
Arrays.toString(vals) +
|
||||
System.lineSeparator() + "element at " + (i - 1) + " (" + vals[i - 1] + ") is greater than element at " + i
|
||||
+ " (" + vals[i] + ")");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
VectorTile.Feature pointFeature(String layer, Map<String, Object> map, int group) {
|
||||
return new VectorTile.Feature(
|
||||
layer,
|
||||
1,
|
||||
VectorTile.encodeGeometry(newPoint(0, 0)),
|
||||
new HashMap<>(map),
|
||||
group
|
||||
);
|
||||
}
|
||||
|
||||
FeatureCollector process(SourceFeature feature) {
|
||||
var collector = featureCollectorFactory.get(feature);
|
||||
profile.processFeature(feature, collector);
|
||||
return collector;
|
||||
}
|
||||
|
||||
void assertCoversZoomRange(int minzoom, int maxzoom, String layer, FeatureCollector... featureCollectors) {
|
||||
Map<?, ?>[] zooms = new Map[Math.max(15, maxzoom + 1)];
|
||||
for (var features : featureCollectors) {
|
||||
for (var feature : features) {
|
||||
if (feature.getLayer().equals(layer)) {
|
||||
for (int zoom = feature.getMinZoom(); zoom <= feature.getMaxZoom(); zoom++) {
|
||||
Map<String, Object> map = TestUtils.toMap(feature, zoom);
|
||||
if (zooms[zoom] != null) {
|
||||
fail("Multiple features at z" + zoom + ":" + System.lineSeparator() + zooms[zoom] + "\n" + map);
|
||||
}
|
||||
zooms[zoom] = map;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int zoom = 0; zoom <= 14; zoom++) {
|
||||
if (zoom < minzoom || zoom > maxzoom) {
|
||||
if (zooms[zoom] != null) {
|
||||
fail("Expected nothing at z" + zoom + " but found: " + zooms[zoom]);
|
||||
}
|
||||
} else {
|
||||
if (zooms[zoom] == null) {
|
||||
fail("No feature at z" + zoom);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SourceFeature pointFeature(Map<String, Object> props) {
|
||||
return SimpleFeature.create(
|
||||
newPoint(0, 0),
|
||||
new HashMap<>(props),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
0
|
||||
);
|
||||
}
|
||||
|
||||
SourceFeature lineFeature(Map<String, Object> props) {
|
||||
return SimpleFeature.create(
|
||||
newLineString(0, 0, 1, 1),
|
||||
new HashMap<>(props),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
0
|
||||
);
|
||||
}
|
||||
|
||||
SourceFeature closedWayFeature(Map<String, Object> props) {
|
||||
return SimpleFeature.createFakeOsmFeature(
|
||||
newLineString(0, 0, 1, 0, 1, 1, 0, 1, 0, 0),
|
||||
new HashMap<>(props),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
0,
|
||||
null
|
||||
);
|
||||
}
|
||||
|
||||
SourceFeature polygonFeatureWithArea(double area, Map<String, Object> props) {
|
||||
return SimpleFeature.create(
|
||||
GeoUtils.worldToLatLonCoords(rectangle(0, Math.sqrt(area))),
|
||||
new HashMap<>(props),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
0
|
||||
);
|
||||
}
|
||||
|
||||
SourceFeature polygonFeature(Map<String, Object> props) {
|
||||
return polygonFeatureWithArea(1, props);
|
||||
}
|
||||
|
||||
|
||||
protected SimpleFeature lineFeatureWithRelation(List<OsmRelationInfo> relationInfos,
|
||||
Map<String, Object> map) {
|
||||
return SimpleFeature.createFakeOsmFeature(
|
||||
newLineString(0, 0, 1, 1),
|
||||
map,
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
0,
|
||||
(relationInfos == null ? List.<OsmRelationInfo>of() : relationInfos).stream()
|
||||
.map(r -> new OsmReader.RelationMember<>("", r)).toList()
|
||||
);
|
||||
}
|
||||
|
||||
protected void testMergesLinestrings(Map<String, Object> attrs, String layer,
|
||||
double length, int zoom) throws GeometryException {
|
||||
var line1 = new VectorTile.Feature(
|
||||
layer,
|
||||
1,
|
||||
VectorTile.encodeGeometry(newLineString(0, 0, length / 2, 0)),
|
||||
attrs,
|
||||
0
|
||||
);
|
||||
var line2 = new VectorTile.Feature(
|
||||
layer,
|
||||
1,
|
||||
VectorTile.encodeGeometry(newLineString(length / 2, 0, length, 0)),
|
||||
attrs,
|
||||
0
|
||||
);
|
||||
var connected = new VectorTile.Feature(
|
||||
layer,
|
||||
1,
|
||||
VectorTile.encodeGeometry(newLineString(0, 0, length, 0)),
|
||||
attrs,
|
||||
0
|
||||
);
|
||||
|
||||
assertEquals(
|
||||
List.of(connected),
|
||||
profile.postProcessLayerFeatures(layer, zoom, List.of(line1, line2))
|
||||
);
|
||||
}
|
||||
|
||||
protected void testDoesNotMergeLinestrings(Map<String, Object> attrs, String layer,
|
||||
double length, int zoom) throws GeometryException {
|
||||
var line1 = new VectorTile.Feature(
|
||||
layer,
|
||||
1,
|
||||
VectorTile.encodeGeometry(newLineString(0, 0, length / 2, 0)),
|
||||
attrs,
|
||||
0
|
||||
);
|
||||
var line2 = new VectorTile.Feature(
|
||||
layer,
|
||||
1,
|
||||
VectorTile.encodeGeometry(newLineString(length / 2, 0, length, 0)),
|
||||
attrs,
|
||||
0
|
||||
);
|
||||
|
||||
assertEquals(
|
||||
List.of(line1, line2),
|
||||
profile.postProcessLayerFeatures(layer, zoom, List.of(line1, line2))
|
||||
);
|
||||
}
|
||||
|
||||
public static Map<String, Object> mapOf(Object... args) {
|
||||
assert args.length % 2 == 0;
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
for (int i = 0; i < args.length; i += 2) {
|
||||
String key = args[i].toString();
|
||||
Object value = args[i + 1];
|
||||
result.put(key, value == null ? "<null>" : value);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
|
@ -1,126 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class AerodromeLabelTest extends AbstractLayerTest {
|
||||
|
||||
@BeforeEach
|
||||
public void setupWikidataTranslation() {
|
||||
wikidataTranslations.put(123, "es", "es wd name");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIntlWithIata() {
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "international",
|
||||
"ele", 100,
|
||||
"ele_ft", 328,
|
||||
"name", "osm name",
|
||||
"name:es", "es wd name",
|
||||
|
||||
"_layer", "aerodrome_label",
|
||||
"_type", "point",
|
||||
"_minzoom", 8,
|
||||
"_maxzoom", 14,
|
||||
"_buffer", 64d
|
||||
)), process(pointFeature(Map.of(
|
||||
"aeroway", "aerodrome",
|
||||
"name", "osm name",
|
||||
"wikidata", "Q123",
|
||||
"ele", "100",
|
||||
"aerodrome", "international",
|
||||
"iata", "123",
|
||||
"icao", "1234"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInternational() {
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "international",
|
||||
"_layer", "aerodrome_label",
|
||||
"_minzoom", 10 // no IATA
|
||||
)), process(pointFeature(Map.of(
|
||||
"aeroway", "aerodrome",
|
||||
"aerodrome_type", "international"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPublic() {
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "public",
|
||||
"_layer", "aerodrome_label",
|
||||
"_minzoom", 10
|
||||
)), process(pointFeature(Map.of(
|
||||
"aeroway", "aerodrome",
|
||||
"aerodrome_type", "public airport"
|
||||
))));
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "public",
|
||||
"_layer", "aerodrome_label"
|
||||
)), process(pointFeature(Map.of(
|
||||
"aeroway", "aerodrome",
|
||||
"aerodrome_type", "civil"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMilitary() {
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "military",
|
||||
"_layer", "aerodrome_label",
|
||||
"_minzoom", 10
|
||||
)), process(pointFeature(Map.of(
|
||||
"aeroway", "aerodrome",
|
||||
"aerodrome_type", "military airport"
|
||||
))));
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "military",
|
||||
"_layer", "aerodrome_label"
|
||||
)), process(pointFeature(Map.of(
|
||||
"aeroway", "aerodrome",
|
||||
"military", "airfield"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPrivate() {
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "private",
|
||||
"_layer", "aerodrome_label",
|
||||
"_minzoom", 10
|
||||
)), process(pointFeature(Map.of(
|
||||
"aeroway", "aerodrome",
|
||||
"aerodrome_type", "private"
|
||||
))));
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "private",
|
||||
"_layer", "aerodrome_label"
|
||||
)), process(pointFeature(Map.of(
|
||||
"aeroway", "aerodrome",
|
||||
"aerodrome", "private"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOther() {
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "other",
|
||||
"_layer", "aerodrome_label",
|
||||
"_minzoom", 10
|
||||
)), process(pointFeature(Map.of(
|
||||
"aeroway", "aerodrome"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIgnoreNonPoints() {
|
||||
assertFeatures(14, List.of(), process(lineFeature(Map.of(
|
||||
"aeroway", "aerodrome"
|
||||
))));
|
||||
}
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class AerowayTest extends AbstractLayerTest {
|
||||
|
||||
@Test
|
||||
public void aerowayGate() {
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "gate",
|
||||
"ref", "123",
|
||||
|
||||
"_layer", "aeroway",
|
||||
"_type", "point",
|
||||
"_minzoom", 14,
|
||||
"_maxzoom", 14,
|
||||
"_buffer", 4d
|
||||
)), process(pointFeature(Map.of(
|
||||
"aeroway", "gate",
|
||||
"ref", "123"
|
||||
))));
|
||||
assertFeatures(14, List.of(), process(lineFeature(Map.of(
|
||||
"aeroway", "gate"
|
||||
))));
|
||||
assertFeatures(14, List.of(), process(polygonFeature(Map.of(
|
||||
"aeroway", "gate"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void aerowayLine() {
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "runway",
|
||||
"ref", "123",
|
||||
|
||||
"_layer", "aeroway",
|
||||
"_type", "line",
|
||||
"_minzoom", 10,
|
||||
"_maxzoom", 14,
|
||||
"_buffer", 4d
|
||||
)), process(lineFeature(Map.of(
|
||||
"aeroway", "runway",
|
||||
"ref", "123"
|
||||
))));
|
||||
assertFeatures(14, List.of(), process(pointFeature(Map.of(
|
||||
"aeroway", "runway"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void aerowayPolygon() {
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "runway",
|
||||
"ref", "123",
|
||||
|
||||
"_layer", "aeroway",
|
||||
"_type", "polygon",
|
||||
"_minzoom", 10,
|
||||
"_maxzoom", 14,
|
||||
"_buffer", 4d
|
||||
)), process(polygonFeature(Map.of(
|
||||
"aeroway", "runway",
|
||||
"ref", "123"
|
||||
))));
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "runway",
|
||||
"ref", "123",
|
||||
"_layer", "aeroway",
|
||||
"_type", "polygon"
|
||||
)), process(polygonFeature(Map.of(
|
||||
"area:aeroway", "runway",
|
||||
"ref", "123"
|
||||
))));
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "heliport",
|
||||
"ref", "123",
|
||||
"_layer", "aeroway",
|
||||
"_type", "polygon"
|
||||
)), process(polygonFeature(Map.of(
|
||||
"aeroway", "heliport",
|
||||
"ref", "123"
|
||||
))));
|
||||
assertFeatures(14, List.of(), process(lineFeature(Map.of(
|
||||
"aeroway", "heliport"
|
||||
))));
|
||||
assertFeatures(14, List.of(), process(pointFeature(Map.of(
|
||||
"aeroway", "heliport"
|
||||
))));
|
||||
}
|
||||
}
|
|
@ -1,641 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import static com.onthegomap.planetiler.TestUtils.newLineString;
|
||||
import static com.onthegomap.planetiler.TestUtils.rectangle;
|
||||
import static com.onthegomap.planetiler.basemap.BasemapProfile.NATURAL_EARTH_SOURCE;
|
||||
import static com.onthegomap.planetiler.basemap.BasemapProfile.OSM_SOURCE;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
|
||||
import com.onthegomap.planetiler.FeatureCollector;
|
||||
import com.onthegomap.planetiler.geo.GeoUtils;
|
||||
import com.onthegomap.planetiler.geo.GeometryException;
|
||||
import com.onthegomap.planetiler.reader.SimpleFeature;
|
||||
import com.onthegomap.planetiler.reader.osm.OsmElement;
|
||||
import com.onthegomap.planetiler.reader.osm.OsmReader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Stream;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class BoundaryTest extends AbstractLayerTest {
|
||||
|
||||
@Test
|
||||
public void testNaturalEarthCountryBoundaries() {
|
||||
assertCoversZoomRange(
|
||||
0, 4, "boundary",
|
||||
process(SimpleFeature.create(
|
||||
newLineString(0, 0, 1, 1),
|
||||
Map.of(),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_110m_admin_0_boundary_lines_land",
|
||||
0
|
||||
)),
|
||||
process(SimpleFeature.create(
|
||||
newLineString(0, 0, 1, 1),
|
||||
Map.of(),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_50m_admin_0_boundary_lines_land",
|
||||
1
|
||||
)),
|
||||
process(SimpleFeature.create(
|
||||
newLineString(0, 0, 1, 1),
|
||||
Map.of(),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_10m_admin_0_boundary_lines_land",
|
||||
2
|
||||
))
|
||||
);
|
||||
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"_layer", "boundary",
|
||||
"_type", "line",
|
||||
"disputed", 0,
|
||||
"maritime", 0,
|
||||
"admin_level", 2,
|
||||
|
||||
"_minzoom", 0,
|
||||
"_buffer", 4d
|
||||
)), process(SimpleFeature.create(
|
||||
newLineString(0, 0, 1, 1),
|
||||
Map.of(
|
||||
"featurecla", "International boundary (verify)"
|
||||
),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_110m_admin_0_boundary_lines_land",
|
||||
0
|
||||
)));
|
||||
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"_layer", "boundary",
|
||||
"_type", "line",
|
||||
"disputed", 1,
|
||||
"maritime", 0,
|
||||
"admin_level", 2,
|
||||
"_buffer", 4d
|
||||
)), process(SimpleFeature.create(
|
||||
newLineString(0, 0, 1, 1),
|
||||
Map.of(
|
||||
"featurecla", "Disputed (please verify)"
|
||||
),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_110m_admin_0_boundary_lines_land",
|
||||
0
|
||||
)));
|
||||
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"_layer", "boundary",
|
||||
"_type", "line",
|
||||
"admin_level", 2
|
||||
)), process(SimpleFeature.create(
|
||||
newLineString(0, 0, 1, 1),
|
||||
Map.of(
|
||||
"featurecla", "International boundary (verify)"
|
||||
),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_50m_admin_0_boundary_lines_land",
|
||||
0
|
||||
)));
|
||||
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"_layer", "boundary",
|
||||
"_type", "line",
|
||||
"admin_level", 2
|
||||
)), process(SimpleFeature.create(
|
||||
newLineString(0, 0, 1, 1),
|
||||
Map.of(
|
||||
"featurecla", "International boundary (verify)"
|
||||
),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_10m_admin_0_boundary_lines_land",
|
||||
0
|
||||
)));
|
||||
|
||||
assertFeatures(0, List.of(), process(SimpleFeature.create(
|
||||
newLineString(0, 0, 1, 1),
|
||||
Map.of(
|
||||
"featurecla", "Lease Limit"
|
||||
),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_10m_admin_0_boundary_lines_land",
|
||||
0
|
||||
)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNaturalEarthStateBoundaries() {
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"_layer", "boundary",
|
||||
"_type", "line",
|
||||
"disputed", 0,
|
||||
"maritime", 0,
|
||||
"admin_level", 4,
|
||||
|
||||
"_minzoom", 1,
|
||||
"_maxzoom", 4,
|
||||
"_buffer", 4d
|
||||
)), process(SimpleFeature.create(
|
||||
newLineString(0, 0, 1, 1),
|
||||
Map.of(
|
||||
"min_zoom", 7d
|
||||
),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_10m_admin_1_states_provinces_lines",
|
||||
0
|
||||
)));
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"_layer", "boundary",
|
||||
"_type", "line",
|
||||
"disputed", 0,
|
||||
"maritime", 0,
|
||||
"admin_level", 4,
|
||||
|
||||
"_minzoom", 4,
|
||||
"_maxzoom", 4,
|
||||
"_buffer", 4d
|
||||
)), process(SimpleFeature.create(
|
||||
newLineString(0, 0, 1, 1),
|
||||
Map.of(
|
||||
"min_zoom", 7.6d
|
||||
),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_10m_admin_1_states_provinces_lines",
|
||||
0
|
||||
)));
|
||||
|
||||
assertFeatures(0, List.of(), process(SimpleFeature.create(
|
||||
newLineString(0, 0, 1, 1),
|
||||
Map.of(
|
||||
"min_zoom", 7.9d
|
||||
),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_10m_admin_1_states_provinces_lines",
|
||||
0
|
||||
)));
|
||||
|
||||
assertFeatures(0, List.of(), process(SimpleFeature.create(
|
||||
newLineString(0, 0, 1, 1),
|
||||
Map.of(),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_10m_admin_1_states_provinces_lines",
|
||||
0
|
||||
)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMergesDisconnectedLineFeatures() throws GeometryException {
|
||||
testMergesLinestrings(Map.of("admin_level", 2), Boundary.LAYER_NAME, 10, 13);
|
||||
testMergesLinestrings(Map.of("admin_level", 2), Boundary.LAYER_NAME, 10, 14);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOsmTownBoundary() {
|
||||
var relation = new OsmElement.Relation(1);
|
||||
relation.setTag("type", "boundary");
|
||||
relation.setTag("admin_level", "10");
|
||||
relation.setTag("boundary", "administrative");
|
||||
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"_layer", "boundary",
|
||||
"_type", "line",
|
||||
"disputed", 0,
|
||||
"maritime", 0,
|
||||
"admin_level", 10,
|
||||
|
||||
"_minzoom", 12,
|
||||
"_maxzoom", 14,
|
||||
"_buffer", 4d,
|
||||
"_minpixelsize", 0d
|
||||
)), process(lineFeatureWithRelation(
|
||||
profile.preprocessOsmRelation(relation),
|
||||
Map.of())));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOsmBoundaryLevelTwoAndAHalf() {
|
||||
var relation = new OsmElement.Relation(1);
|
||||
relation.setTag("type", "boundary");
|
||||
relation.setTag("admin_level", "2.5");
|
||||
relation.setTag("boundary", "administrative");
|
||||
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"_layer", "boundary",
|
||||
"_type", "line",
|
||||
"disputed", 0,
|
||||
"maritime", 0,
|
||||
"admin_level", 3,
|
||||
|
||||
"_minzoom", 5,
|
||||
"_maxzoom", 14,
|
||||
"_buffer", 4d,
|
||||
"_minpixelsize", 0d
|
||||
)), process(lineFeatureWithRelation(
|
||||
profile.preprocessOsmRelation(relation),
|
||||
Map.of())));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOsmBoundaryTakesMinAdminLevel() {
|
||||
var relation1 = new OsmElement.Relation(1);
|
||||
relation1.setTag("type", "boundary");
|
||||
relation1.setTag("admin_level", "10");
|
||||
relation1.setTag("name", "Town");
|
||||
relation1.setTag("boundary", "administrative");
|
||||
var relation2 = new OsmElement.Relation(2);
|
||||
relation2.setTag("type", "boundary");
|
||||
relation2.setTag("admin_level", "4");
|
||||
relation2.setTag("name", "State");
|
||||
relation2.setTag("boundary", "administrative");
|
||||
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"_layer", "boundary",
|
||||
"_type", "line",
|
||||
"disputed", 0,
|
||||
"maritime", 0,
|
||||
"admin_level", 4
|
||||
)), process(lineFeatureWithRelation(
|
||||
Stream.concat(
|
||||
profile.preprocessOsmRelation(relation2).stream(),
|
||||
profile.preprocessOsmRelation(relation1).stream()
|
||||
).toList(),
|
||||
Map.of())));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOsmBoundarySetsMaritimeFromWay() {
|
||||
var relation1 = new OsmElement.Relation(1);
|
||||
relation1.setTag("type", "boundary");
|
||||
relation1.setTag("admin_level", "10");
|
||||
relation1.setTag("boundary", "administrative");
|
||||
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"maritime", 1
|
||||
)), process(lineFeatureWithRelation(
|
||||
profile.preprocessOsmRelation(relation1),
|
||||
Map.of(
|
||||
"maritime", "yes"
|
||||
))
|
||||
));
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"maritime", 1
|
||||
)), process(lineFeatureWithRelation(
|
||||
profile.preprocessOsmRelation(relation1),
|
||||
Map.of(
|
||||
"natural", "coastline"
|
||||
))
|
||||
));
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"maritime", 1
|
||||
)), process(lineFeatureWithRelation(
|
||||
profile.preprocessOsmRelation(relation1),
|
||||
Map.of(
|
||||
"boundary_type", "maritime"
|
||||
))
|
||||
));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIgnoresProtectedAreas() {
|
||||
var relation1 = new OsmElement.Relation(1);
|
||||
relation1.setTag("type", "boundary");
|
||||
relation1.setTag("admin_level", "10");
|
||||
relation1.setTag("boundary", "protected_area");
|
||||
|
||||
assertNull(profile.preprocessOsmRelation(relation1));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIgnoresProtectedAdminLevelOver10() {
|
||||
var relation1 = new OsmElement.Relation(1);
|
||||
relation1.setTag("type", "boundary");
|
||||
relation1.setTag("admin_level", "11");
|
||||
relation1.setTag("boundary", "administrative");
|
||||
|
||||
assertNull(profile.preprocessOsmRelation(relation1));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOsmBoundaryDisputed() {
|
||||
var relation = new OsmElement.Relation(1);
|
||||
relation.setTag("type", "boundary");
|
||||
relation.setTag("admin_level", "5");
|
||||
relation.setTag("boundary", "administrative");
|
||||
relation.setTag("disputed", "yes");
|
||||
relation.setTag("name", "Border A - B");
|
||||
relation.setTag("claimed_by", "A");
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"_layer", "boundary",
|
||||
"_type", "line",
|
||||
"disputed_name", "BorderA-B",
|
||||
"claimed_by", "A",
|
||||
|
||||
"disputed", 1,
|
||||
"maritime", 0,
|
||||
"admin_level", 5
|
||||
)), process(lineFeatureWithRelation(
|
||||
profile.preprocessOsmRelation(relation),
|
||||
Map.of())
|
||||
));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOsmBoundaryDisputedFromWay() {
|
||||
var relation = new OsmElement.Relation(1);
|
||||
relation.setTag("type", "boundary");
|
||||
relation.setTag("admin_level", "5");
|
||||
relation.setTag("boundary", "administrative");
|
||||
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"_layer", "boundary",
|
||||
"_type", "line",
|
||||
|
||||
"disputed", 1,
|
||||
"maritime", 0,
|
||||
"admin_level", 5
|
||||
)), process(lineFeatureWithRelation(
|
||||
profile.preprocessOsmRelation(relation),
|
||||
Map.of(
|
||||
"disputed", "yes"
|
||||
))
|
||||
));
|
||||
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"_layer", "boundary",
|
||||
"_type", "line",
|
||||
|
||||
"disputed", 1,
|
||||
"maritime", 0,
|
||||
"admin_level", 5,
|
||||
"claimed_by", "A",
|
||||
"disputed_name", "AB"
|
||||
)), process(lineFeatureWithRelation(
|
||||
profile.preprocessOsmRelation(relation),
|
||||
Map.of(
|
||||
"disputed", "yes",
|
||||
"claimed_by", "A",
|
||||
"name", "AB"
|
||||
))
|
||||
));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCountryBoundaryEmittedIfNoName() {
|
||||
var relation = new OsmElement.Relation(1);
|
||||
relation.setTag("type", "boundary");
|
||||
relation.setTag("admin_level", "2");
|
||||
relation.setTag("boundary", "administrative");
|
||||
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"_layer", "boundary",
|
||||
"_type", "line",
|
||||
|
||||
"disputed", 0,
|
||||
"maritime", 0,
|
||||
"admin_level", 2
|
||||
)), process(lineFeatureWithRelation(
|
||||
profile.preprocessOsmRelation(relation),
|
||||
Map.of())
|
||||
));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCountryLeftRightName() {
|
||||
var country1 = new OsmElement.Relation(1);
|
||||
country1.setTag("type", "boundary");
|
||||
country1.setTag("admin_level", "2");
|
||||
country1.setTag("boundary", "administrative");
|
||||
country1.setTag("ISO3166-1:alpha3", "C1");
|
||||
var country2 = new OsmElement.Relation(2);
|
||||
country2.setTag("type", "boundary");
|
||||
country2.setTag("admin_level", "2");
|
||||
country2.setTag("boundary", "administrative");
|
||||
country2.setTag("ISO3166-1:alpha3", "C2");
|
||||
|
||||
// shared edge
|
||||
assertFeatures(14, List.of(), process(SimpleFeature.createFakeOsmFeature(
|
||||
newLineString(0, 0, 0, 10),
|
||||
Map.of(),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
3,
|
||||
Stream.concat(
|
||||
profile.preprocessOsmRelation(country1).stream(),
|
||||
profile.preprocessOsmRelation(country2).stream()
|
||||
).map(r -> new OsmReader.RelationMember<>("", r)).toList()
|
||||
)
|
||||
));
|
||||
|
||||
// other 2 edges of country 1
|
||||
assertFeatures(14, List.of(), process(SimpleFeature.createFakeOsmFeature(
|
||||
newLineString(0, 0, 5, 10),
|
||||
Map.of(),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
4,
|
||||
profile.preprocessOsmRelation(country1).stream().map(r -> new OsmReader.RelationMember<>("", r))
|
||||
.toList()
|
||||
)
|
||||
));
|
||||
assertFeatures(14, List.of(), process(SimpleFeature.createFakeOsmFeature(
|
||||
newLineString(0, 10, 5, 10),
|
||||
Map.of(),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
4,
|
||||
profile.preprocessOsmRelation(country1).stream().map(r -> new OsmReader.RelationMember<>("", r))
|
||||
.toList()
|
||||
)
|
||||
));
|
||||
|
||||
// other 2 edges of country 2
|
||||
assertFeatures(14, List.of(), process(SimpleFeature.createFakeOsmFeature(
|
||||
newLineString(0, 0, -5, 10),
|
||||
Map.of(),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
4,
|
||||
profile.preprocessOsmRelation(country2).stream().map(r -> new OsmReader.RelationMember<>("", r))
|
||||
.toList()
|
||||
)
|
||||
));
|
||||
assertFeatures(14, List.of(), process(SimpleFeature.createFakeOsmFeature(
|
||||
newLineString(0, 10, -5, 10),
|
||||
Map.of(),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
4,
|
||||
profile.preprocessOsmRelation(country2).stream().map(r -> new OsmReader.RelationMember<>("", r))
|
||||
.toList()
|
||||
)
|
||||
));
|
||||
|
||||
List<FeatureCollector.Feature> features = new ArrayList<>();
|
||||
profile.finish(OSM_SOURCE, new FeatureCollector.Factory(params, stats), features::add);
|
||||
assertEquals(3, features.size());
|
||||
|
||||
// ensure shared edge has country labels on right sides
|
||||
var sharedEdge = features.stream()
|
||||
.filter(c -> c.getAttrsAtZoom(0).containsKey("adm0_l") && c.getAttrsAtZoom(0).containsKey("adm0_r")).findFirst()
|
||||
.get();
|
||||
if (sharedEdge.getGeometry().getCoordinate().y == 0.5) { // going up
|
||||
assertEquals("C1", sharedEdge.getAttrsAtZoom(0).get("adm0_r"));
|
||||
assertEquals("C2", sharedEdge.getAttrsAtZoom(0).get("adm0_l"));
|
||||
} else { // going down
|
||||
assertEquals("C2", sharedEdge.getAttrsAtZoom(0).get("adm0_r"));
|
||||
assertEquals("C1", sharedEdge.getAttrsAtZoom(0).get("adm0_l"));
|
||||
}
|
||||
var c1 = features.stream()
|
||||
.filter(c -> c.getGeometry().getEnvelopeInternal().getMaxX() > 0.5).findFirst()
|
||||
.get();
|
||||
if (c1.getGeometry().getCoordinate().y == 0.5) { // going up
|
||||
assertEquals("C1", c1.getAttrsAtZoom(0).get("adm0_l"));
|
||||
} else { // going down
|
||||
assertEquals("C1", c1.getAttrsAtZoom(0).get("adm0_r"));
|
||||
}
|
||||
var c2 = features.stream()
|
||||
.filter(c -> c.getGeometry().getEnvelopeInternal().getMinX() < 0.5).findFirst()
|
||||
.get();
|
||||
if (c2.getGeometry().getCoordinate().y == 0.5) { // going up
|
||||
assertEquals("C2", c2.getAttrsAtZoom(0).get("adm0_r"));
|
||||
} else { // going down
|
||||
assertEquals("C2", c2.getAttrsAtZoom(0).get("adm0_l"));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCountryBoundaryNotClosed() {
|
||||
var country1 = new OsmElement.Relation(1);
|
||||
country1.setTag("type", "boundary");
|
||||
country1.setTag("admin_level", "2");
|
||||
country1.setTag("boundary", "administrative");
|
||||
country1.setTag("ISO3166-1:alpha3", "C1");
|
||||
|
||||
// shared edge
|
||||
assertFeatures(14, List.of(), process(SimpleFeature.createFakeOsmFeature(
|
||||
newLineString(0, 0, 0, 10, 5, 5),
|
||||
Map.of(),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
3,
|
||||
profile.preprocessOsmRelation(country1).stream().map(r -> new OsmReader.RelationMember<>("", r))
|
||||
.toList()
|
||||
)));
|
||||
|
||||
List<FeatureCollector.Feature> features = new ArrayList<>();
|
||||
profile.finish(OSM_SOURCE, new FeatureCollector.Factory(params, stats), features::add);
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"adm0_r", "<null>",
|
||||
"adm0_l", "<null>",
|
||||
"maritime", 0,
|
||||
"disputed", 0,
|
||||
"admin_level", 2,
|
||||
|
||||
"_layer", "boundary"
|
||||
)), features);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNestedCountry() throws GeometryException {
|
||||
var country1 = new OsmElement.Relation(1);
|
||||
country1.setTag("type", "boundary");
|
||||
country1.setTag("admin_level", "2");
|
||||
country1.setTag("boundary", "administrative");
|
||||
country1.setTag("ISO3166-1:alpha3", "C1");
|
||||
|
||||
assertFeatures(14, List.of(), process(SimpleFeature.createFakeOsmFeature(
|
||||
GeoUtils.polygonToLineString(rectangle(0, 10)),
|
||||
Map.of(),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
3,
|
||||
profile.preprocessOsmRelation(country1).stream().map(r -> new OsmReader.RelationMember<>("", r))
|
||||
.toList()
|
||||
)));
|
||||
assertFeatures(14, List.of(), process(SimpleFeature.createFakeOsmFeature(
|
||||
GeoUtils.polygonToLineString(rectangle(1, 9)),
|
||||
Map.of(),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
3,
|
||||
profile.preprocessOsmRelation(country1).stream().map(r -> new OsmReader.RelationMember<>("", r))
|
||||
.toList()
|
||||
)));
|
||||
|
||||
List<FeatureCollector.Feature> features = new ArrayList<>();
|
||||
profile.finish(OSM_SOURCE, new FeatureCollector.Factory(params, stats), features::add);
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"adm0_l", "C1",
|
||||
"adm0_r", "<null>"
|
||||
), Map.of(
|
||||
"adm0_r", "C1",
|
||||
"adm0_l", "<null>"
|
||||
)), features);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDontLabelBadPolygon() {
|
||||
var country1 = new OsmElement.Relation(1);
|
||||
country1.setTag("type", "boundary");
|
||||
country1.setTag("admin_level", "2");
|
||||
country1.setTag("boundary", "administrative");
|
||||
country1.setTag("ISO3166-1:alpha3", "C1");
|
||||
|
||||
assertFeatures(14, List.of(), process(SimpleFeature.createFakeOsmFeature(
|
||||
GeoUtils.worldToLatLonCoords(newLineString(0, 0, 0.1, 0, 0.1, 0.1, 0.02, 0.1, 0.02, -0.02)),
|
||||
Map.of(),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
3,
|
||||
profile.preprocessOsmRelation(country1).stream().map(r -> new OsmReader.RelationMember<>("", r))
|
||||
.toList()
|
||||
)));
|
||||
|
||||
List<FeatureCollector.Feature> features = new ArrayList<>();
|
||||
profile.finish(OSM_SOURCE, new FeatureCollector.Factory(params, stats), features::add);
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"adm0_l", "<null>",
|
||||
"adm0_r", "<null>"
|
||||
)), features);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIgnoreBadPolygonAndLabelGoodPart() throws GeometryException {
|
||||
var country1 = new OsmElement.Relation(1);
|
||||
country1.setTag("type", "boundary");
|
||||
country1.setTag("admin_level", "2");
|
||||
country1.setTag("boundary", "administrative");
|
||||
country1.setTag("ISO3166-1:alpha3", "C1");
|
||||
|
||||
assertFeatures(14, List.of(), process(SimpleFeature.createFakeOsmFeature(
|
||||
GeoUtils.worldToLatLonCoords(newLineString(0, 0, 0.1, 0, 0.1, 0.1, 0.2, 0.1, 0.2, -0.2)),
|
||||
Map.of(),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
3,
|
||||
profile.preprocessOsmRelation(country1).stream().map(r -> new OsmReader.RelationMember<>("", r))
|
||||
.toList()
|
||||
)));
|
||||
|
||||
assertFeatures(14, List.of(), process(SimpleFeature.createFakeOsmFeature(
|
||||
GeoUtils.worldToLatLonCoords(GeoUtils.polygonToLineString(rectangle(0.2, 0.3))),
|
||||
Map.of(),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
3,
|
||||
profile.preprocessOsmRelation(country1).stream().map(r -> new OsmReader.RelationMember<>("", r))
|
||||
.toList()
|
||||
)));
|
||||
|
||||
List<FeatureCollector.Feature> features = new ArrayList<>();
|
||||
profile.finish(OSM_SOURCE, new FeatureCollector.Factory(params, stats), features::add);
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"adm0_l", "<null>",
|
||||
"adm0_r", "<null>"
|
||||
), Map.of(
|
||||
"adm0_l", "<null>",
|
||||
"adm0_r", "C1"
|
||||
)), features);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,179 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import static com.onthegomap.planetiler.TestUtils.rectangle;
|
||||
import static com.onthegomap.planetiler.basemap.BasemapProfile.OSM_SOURCE;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import com.onthegomap.planetiler.VectorTile;
|
||||
import com.onthegomap.planetiler.geo.GeoUtils;
|
||||
import com.onthegomap.planetiler.geo.GeometryException;
|
||||
import com.onthegomap.planetiler.reader.SimpleFeature;
|
||||
import com.onthegomap.planetiler.reader.osm.OsmElement;
|
||||
import com.onthegomap.planetiler.reader.osm.OsmReader;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class BuildingTest extends AbstractLayerTest {
|
||||
|
||||
@Test
|
||||
public void testBuilding() {
|
||||
assertFeatures(13, List.of(Map.of(
|
||||
"colour", "<null>",
|
||||
"hide_3d", "<null>",
|
||||
"_layer", "building",
|
||||
"_type", "polygon",
|
||||
"_minzoom", 13,
|
||||
"_maxzoom", 14,
|
||||
"_buffer", 4d,
|
||||
"_minpixelsize", 0.1d
|
||||
)), process(polygonFeature(Map.of(
|
||||
"building", "yes"
|
||||
))));
|
||||
assertFeatures(13, List.of(Map.of(
|
||||
"_layer", "building",
|
||||
"_type", "polygon"
|
||||
)), process(polygonFeature(Map.of(
|
||||
"building:part", "yes"
|
||||
))));
|
||||
assertFeatures(13, List.of(), process(polygonFeature(Map.of(
|
||||
"building", "no"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIgnoreUndergroundBuilding() {
|
||||
assertFeatures(14, List.of(), process(polygonFeature(Map.of(
|
||||
"building", "yes",
|
||||
"location", "underground"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAirportBuildings() {
|
||||
assertFeatures(13, List.of(Map.of(
|
||||
"_layer", "building",
|
||||
"_type", "polygon"
|
||||
)), process(polygonFeature(Map.of(
|
||||
"aeroway", "terminal"
|
||||
))));
|
||||
assertFeatures(13, List.of(Map.of(
|
||||
"_layer", "building",
|
||||
"_type", "polygon"
|
||||
)), process(polygonFeature(Map.of(
|
||||
"aeroway", "hangar"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRenderHeights() {
|
||||
assertFeatures(13, List.of(Map.of(
|
||||
"render_height", "<null>",
|
||||
"render_min_height", "<null>"
|
||||
)), process(polygonFeature(Map.of(
|
||||
"building", "yes"
|
||||
))));
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"render_height", 5,
|
||||
"render_min_height", 0
|
||||
)), process(polygonFeature(Map.of(
|
||||
"building", "yes"
|
||||
))));
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"render_height", 12,
|
||||
"render_min_height", 3
|
||||
)), process(polygonFeature(Map.of(
|
||||
"building", "yes",
|
||||
"building:min_height", "3",
|
||||
"building:height", "12"
|
||||
))));
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"render_height", 44,
|
||||
"render_min_height", 10
|
||||
)), process(polygonFeature(Map.of(
|
||||
"building", "yes",
|
||||
"building:min_level", "3",
|
||||
"building:levels", "12"
|
||||
))));
|
||||
assertFeatures(14, List.of(), process(polygonFeature(Map.of(
|
||||
"building", "yes",
|
||||
"building:min_level", "1500",
|
||||
"building:levels", "1500"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOutlineHides3d() {
|
||||
var relation = new OsmElement.Relation(1);
|
||||
relation.setTag("type", "building");
|
||||
|
||||
var relationInfos = profile.preprocessOsmRelation(relation).stream()
|
||||
.map(i -> new OsmReader.RelationMember<>("outline", i)).toList();
|
||||
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"_layer", "building",
|
||||
"hide_3d", true
|
||||
)), process(SimpleFeature.createFakeOsmFeature(
|
||||
GeoUtils.worldToLatLonCoords(rectangle(0, Math.sqrt(1))),
|
||||
Map.of(
|
||||
"building", "yes"
|
||||
),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
0,
|
||||
relationInfos
|
||||
)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMergePolygonsZ13() throws GeometryException {
|
||||
var poly1 = new VectorTile.Feature(
|
||||
Building.LAYER_NAME,
|
||||
1,
|
||||
VectorTile.encodeGeometry(rectangle(10, 20)),
|
||||
Map.of(),
|
||||
0
|
||||
);
|
||||
var poly2 = new VectorTile.Feature(
|
||||
Building.LAYER_NAME,
|
||||
1,
|
||||
VectorTile.encodeGeometry(rectangle(20, 10, 22, 20)),
|
||||
Map.of(),
|
||||
0
|
||||
);
|
||||
|
||||
assertEquals(
|
||||
2,
|
||||
profile.postProcessLayerFeatures(Building.LAYER_NAME, 14, List.of(poly1, poly2)).size()
|
||||
);
|
||||
assertEquals(
|
||||
1,
|
||||
profile.postProcessLayerFeatures(Building.LAYER_NAME, 13, List.of(poly1, poly2)).size()
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testColor() {
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"colour", "#ff0000"
|
||||
)), process(polygonFeature(Map.of(
|
||||
"building", "yes",
|
||||
"building:colour", "#ff0000",
|
||||
"building:material", "brick"
|
||||
))));
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"colour", "#bd8161"
|
||||
)), process(polygonFeature(Map.of(
|
||||
"building", "yes",
|
||||
"building:building", "yes",
|
||||
"building:material", "brick"
|
||||
))));
|
||||
assertFeatures(13, List.of(Map.of(
|
||||
"colour", "<null>"
|
||||
)), process(polygonFeature(Map.of(
|
||||
"building", "yes",
|
||||
"building:building", "yes",
|
||||
"building:colour", "#ff0000"
|
||||
))));
|
||||
}
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class HousenumberTest extends AbstractLayerTest {
|
||||
|
||||
@Test
|
||||
public void testHousenumber() {
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"_layer", "housenumber",
|
||||
"_type", "point",
|
||||
"_minzoom", 14,
|
||||
"_maxzoom", 14,
|
||||
"_buffer", 8d
|
||||
)), process(pointFeature(Map.of(
|
||||
"addr:housenumber", "10"
|
||||
))));
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"_layer", "housenumber",
|
||||
"_type", "point",
|
||||
"_minzoom", 14,
|
||||
"_maxzoom", 14,
|
||||
"_buffer", 8d
|
||||
)), process(polygonFeature(Map.of(
|
||||
"addr:housenumber", "10"
|
||||
))));
|
||||
}
|
||||
}
|
|
@ -1,209 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import static com.onthegomap.planetiler.TestUtils.rectangle;
|
||||
import static com.onthegomap.planetiler.basemap.BasemapProfile.NATURAL_EARTH_SOURCE;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import com.onthegomap.planetiler.VectorTile;
|
||||
import com.onthegomap.planetiler.geo.GeoUtils;
|
||||
import com.onthegomap.planetiler.geo.GeometryException;
|
||||
import com.onthegomap.planetiler.reader.SimpleFeature;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class LandcoverTest extends AbstractLayerTest {
|
||||
|
||||
@Test
|
||||
public void testNaturalEarthGlaciers() {
|
||||
var glacier1 = process(SimpleFeature.create(
|
||||
GeoUtils.worldToLatLonCoords(rectangle(0, Math.sqrt(1))),
|
||||
Map.of(),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_110m_glaciated_areas",
|
||||
0
|
||||
));
|
||||
var glacier2 = process(SimpleFeature.create(
|
||||
GeoUtils.worldToLatLonCoords(rectangle(0, Math.sqrt(1))),
|
||||
Map.of(),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_50m_glaciated_areas",
|
||||
0
|
||||
));
|
||||
var glacier3 = process(SimpleFeature.create(
|
||||
GeoUtils.worldToLatLonCoords(rectangle(0, Math.sqrt(1))),
|
||||
Map.of(),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_10m_glaciated_areas",
|
||||
0
|
||||
));
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"_layer", "landcover",
|
||||
"subclass", "glacier",
|
||||
"class", "ice",
|
||||
"_buffer", 4d
|
||||
)), glacier1);
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"_layer", "landcover",
|
||||
"subclass", "glacier",
|
||||
"class", "ice",
|
||||
"_buffer", 4d
|
||||
)), glacier2);
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"_layer", "landcover",
|
||||
"subclass", "glacier",
|
||||
"class", "ice",
|
||||
"_buffer", 4d
|
||||
)), glacier3);
|
||||
assertCoversZoomRange(0, 6, "landcover",
|
||||
glacier1,
|
||||
glacier2,
|
||||
glacier3
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNaturalEarthAntarcticIceShelves() {
|
||||
var ice1 = process(SimpleFeature.create(
|
||||
GeoUtils.worldToLatLonCoords(rectangle(0, Math.sqrt(1))),
|
||||
Map.of(),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_50m_antarctic_ice_shelves_polys",
|
||||
0
|
||||
));
|
||||
var ice2 = process(SimpleFeature.create(
|
||||
GeoUtils.worldToLatLonCoords(rectangle(0, Math.sqrt(1))),
|
||||
Map.of(),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_10m_antarctic_ice_shelves_polys",
|
||||
0
|
||||
));
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"_layer", "landcover",
|
||||
"subclass", "ice_shelf",
|
||||
"class", "ice",
|
||||
"_buffer", 4d
|
||||
)), ice1);
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"_layer", "landcover",
|
||||
"subclass", "ice_shelf",
|
||||
"class", "ice",
|
||||
"_buffer", 4d
|
||||
)), ice2);
|
||||
assertCoversZoomRange(2, 6, "landcover",
|
||||
ice1,
|
||||
ice2
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOsmLandcover() {
|
||||
assertFeatures(13, List.of(Map.of(
|
||||
"_layer", "landcover",
|
||||
"subclass", "wood",
|
||||
"class", "wood",
|
||||
"_minpixelsize", 8d,
|
||||
"_numpointsattr", "_numpoints",
|
||||
"_minzoom", 9,
|
||||
"_maxzoom", 14
|
||||
)), process(polygonFeature(Map.of(
|
||||
"natural", "wood"
|
||||
))));
|
||||
assertFeatures(12, List.of(Map.of(
|
||||
"_layer", "landcover",
|
||||
"subclass", "forest",
|
||||
"class", "wood",
|
||||
"_minpixelsize", 8d,
|
||||
"_minzoom", 9,
|
||||
"_maxzoom", 14
|
||||
)), process(polygonFeature(Map.of(
|
||||
"landuse", "forest"
|
||||
))));
|
||||
assertFeatures(10, List.of(Map.of(
|
||||
"_layer", "landcover",
|
||||
"subclass", "dune",
|
||||
"class", "sand",
|
||||
"_minpixelsize", 4d,
|
||||
"_minzoom", 7,
|
||||
"_maxzoom", 14
|
||||
)), process(polygonFeature(Map.of(
|
||||
"natural", "dune"
|
||||
))));
|
||||
assertFeatures(10, List.of(), process(polygonFeature(Map.of(
|
||||
"landuse", "park"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMergeForestsBuNumPointsZ9to13() throws GeometryException {
|
||||
Map<String, Object> map = Map.of("subclass", "wood");
|
||||
|
||||
assertMerges(List.of(map, map, map, map, map, map), List.of(
|
||||
// don't merge any
|
||||
feature(rectangle(10, 20), Map.of("_numpoints", 48, "subclass", "wood")),
|
||||
feature(rectangle(10, 20), Map.of("_numpoints", 49, "subclass", "wood")),
|
||||
feature(rectangle(12, 18), Map.of("_numpoints", 50, "subclass", "wood")),
|
||||
feature(rectangle(12, 18), Map.of("_numpoints", 299, "subclass", "wood")),
|
||||
feature(rectangle(12, 18), Map.of("_numpoints", 300, "subclass", "wood")),
|
||||
feature(rectangle(12, 18), Map.of("_numpoints", 301, "subclass", "wood"))
|
||||
), 14);
|
||||
assertMerges(List.of(map, map, map), List.of(
|
||||
// < 300 - merge
|
||||
feature(rectangle(10, 20), Map.of("_numpoints", 48, "subclass", "wood")),
|
||||
feature(rectangle(10, 20), Map.of("_numpoints", 49, "subclass", "wood")),
|
||||
feature(rectangle(12, 18), Map.of("_numpoints", 50, "subclass", "wood")),
|
||||
feature(rectangle(12, 18), Map.of("_numpoints", 299, "subclass", "wood")),
|
||||
// >= 300 - don't merge
|
||||
feature(rectangle(12, 18), Map.of("_numpoints", 300, "subclass", "wood")),
|
||||
feature(rectangle(12, 18), Map.of("_numpoints", 301, "subclass", "wood"))
|
||||
), 13);
|
||||
assertMerges(List.of(map, map), List.of(
|
||||
// < 300 - merge
|
||||
feature(rectangle(10, 20), Map.of("_numpoints", 48, "subclass", "wood")),
|
||||
feature(rectangle(10, 20), Map.of("_numpoints", 49, "subclass", "wood")),
|
||||
feature(rectangle(12, 18), Map.of("_numpoints", 50, "subclass", "wood")),
|
||||
feature(rectangle(12, 18), Map.of("_numpoints", 299, "subclass", "wood")),
|
||||
// >= 300 - merge
|
||||
feature(rectangle(12, 18), Map.of("_numpoints", 300, "subclass", "wood")),
|
||||
feature(rectangle(12, 18), Map.of("_numpoints", 301, "subclass", "wood"))
|
||||
), 9);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMergeNonForestsBelowZ9() throws GeometryException {
|
||||
Map<String, Object> map = Map.of("subclass", "dune");
|
||||
|
||||
assertMerges(List.of(map, map), List.of(
|
||||
feature(rectangle(10, 20), Map.of("_numpoints", 48, "subclass", "dune")),
|
||||
feature(rectangle(12, 18), Map.of("_numpoints", 301, "subclass", "dune"))
|
||||
), 9);
|
||||
assertMerges(List.of(map), List.of(
|
||||
feature(rectangle(10, 20), Map.of("_numpoints", 48, "subclass", "dune")),
|
||||
feature(rectangle(12, 18), Map.of("_numpoints", 301, "subclass", "dune"))
|
||||
), 8);
|
||||
assertMerges(List.of(map, map), List.of(
|
||||
feature(rectangle(10, 20), Map.of("_numpoints", 48, "subclass", "dune")),
|
||||
feature(rectangle(12, 18), Map.of("_numpoints", 301, "subclass", "dune"))
|
||||
), 6);
|
||||
}
|
||||
|
||||
|
||||
private VectorTile.Feature feature(org.locationtech.jts.geom.Polygon geom, Map<String, Object> m) {
|
||||
return new VectorTile.Feature(
|
||||
"landcover",
|
||||
1,
|
||||
VectorTile.encodeGeometry(geom),
|
||||
new HashMap<>(m),
|
||||
0
|
||||
);
|
||||
}
|
||||
|
||||
private void assertMerges(List<Map<String, Object>> expected, List<VectorTile.Feature> in, int zoom)
|
||||
throws GeometryException {
|
||||
assertEquals(expected,
|
||||
profile.postProcessLayerFeatures("landcover", zoom, in).stream().map(
|
||||
VectorTile.Feature::attrs)
|
||||
.toList());
|
||||
}
|
||||
}
|
|
@ -1,94 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import static com.onthegomap.planetiler.TestUtils.rectangle;
|
||||
import static com.onthegomap.planetiler.basemap.BasemapProfile.NATURAL_EARTH_SOURCE;
|
||||
|
||||
import com.onthegomap.planetiler.geo.GeoUtils;
|
||||
import com.onthegomap.planetiler.reader.SimpleFeature;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class LanduseTest extends AbstractLayerTest {
|
||||
|
||||
@Test
|
||||
public void testNaturalEarthUrbanAreas() {
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"_layer", "landuse",
|
||||
"class", "residential",
|
||||
"_buffer", 4d
|
||||
)), process(SimpleFeature.create(
|
||||
GeoUtils.worldToLatLonCoords(rectangle(0, Math.sqrt(1))),
|
||||
Map.of("scalerank", 1.9),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_50m_urban_areas",
|
||||
0
|
||||
)));
|
||||
assertFeatures(0, List.of(), process(SimpleFeature.create(
|
||||
GeoUtils.worldToLatLonCoords(rectangle(0, Math.sqrt(1))),
|
||||
Map.of("scalerank", 2.1),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_50m_urban_areas",
|
||||
0
|
||||
)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOsmLanduse() {
|
||||
assertFeatures(13, List.of(
|
||||
Map.of("_layer", "poi"),
|
||||
Map.of(
|
||||
"_layer", "landuse",
|
||||
"class", "railway",
|
||||
"_minpixelsize", 4d,
|
||||
"_minzoom", 9,
|
||||
"_maxzoom", 14
|
||||
)), process(polygonFeature(Map.of(
|
||||
"landuse", "railway",
|
||||
"amenity", "school"
|
||||
))));
|
||||
assertFeatures(13, List.of(Map.of("_layer", "poi"), Map.of(
|
||||
"_layer", "landuse",
|
||||
"class", "school",
|
||||
"_minpixelsize", 4d,
|
||||
"_minzoom", 9,
|
||||
"_maxzoom", 14
|
||||
)), process(polygonFeature(Map.of(
|
||||
"amenity", "school"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGraveYardBecomesCemetery() {
|
||||
assertFeatures(14, List.of(
|
||||
Map.of("_layer", "poi"),
|
||||
Map.of(
|
||||
"_layer", "landuse",
|
||||
"class", "cemetery"
|
||||
)), process(polygonFeature(Map.of(
|
||||
"amenity", "grave_yard"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOsmLanduseLowerZoom() {
|
||||
assertFeatures(6, List.of(Map.of(
|
||||
"_layer", "landuse",
|
||||
"class", "suburb",
|
||||
"_minzoom", 6,
|
||||
"_maxzoom", 14,
|
||||
"_minpixelsize", 1d
|
||||
)), process(polygonFeature(Map.of(
|
||||
"place", "suburb"
|
||||
))));
|
||||
assertFeatures(7, List.of(Map.of(
|
||||
"_layer", "landuse",
|
||||
"class", "residential",
|
||||
"_minzoom", 6,
|
||||
"_maxzoom", 14,
|
||||
"_minpixelsize", 2d
|
||||
)), process(polygonFeature(Map.of(
|
||||
"landuse", "residential"
|
||||
))));
|
||||
}
|
||||
}
|
|
@ -1,300 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import static com.onthegomap.planetiler.TestUtils.newPoint;
|
||||
import static com.onthegomap.planetiler.TestUtils.rectangle;
|
||||
import static com.onthegomap.planetiler.basemap.BasemapProfile.NATURAL_EARTH_SOURCE;
|
||||
import static com.onthegomap.planetiler.basemap.BasemapProfile.OSM_SOURCE;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.onthegomap.planetiler.VectorTile;
|
||||
import com.onthegomap.planetiler.geo.GeometryException;
|
||||
import com.onthegomap.planetiler.reader.SimpleFeature;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class MountainPeakTest extends AbstractLayerTest {
|
||||
|
||||
@BeforeEach
|
||||
public void setupWikidataTranslation() {
|
||||
wikidataTranslations.put(123, "es", "es wd name");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHappyPath() {
|
||||
var peak = process(pointFeature(Map.of(
|
||||
"natural", "peak",
|
||||
"name", "test",
|
||||
"ele", "100",
|
||||
"wikidata", "Q123"
|
||||
)));
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "peak",
|
||||
"ele", 100,
|
||||
"ele_ft", 328,
|
||||
"customary_ft", "<null>",
|
||||
|
||||
"_layer", "mountain_peak",
|
||||
"_type", "point",
|
||||
"_minzoom", 7,
|
||||
"_maxzoom", 14,
|
||||
"_buffer", 100d
|
||||
)), peak);
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"name:latin", "test",
|
||||
"name", "test",
|
||||
"name:es", "es wd name"
|
||||
)), peak);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLabelGrid() {
|
||||
var peak = process(pointFeature(Map.of(
|
||||
"natural", "peak",
|
||||
"ele", "100"
|
||||
)));
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"_labelgrid_limit", 0
|
||||
)), peak);
|
||||
assertFeatures(13, List.of(Map.of(
|
||||
"_labelgrid_limit", 5,
|
||||
"_labelgrid_size", 100d
|
||||
)), peak);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testVolcano() {
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "volcano"
|
||||
)), process(pointFeature(Map.of(
|
||||
"natural", "volcano",
|
||||
"ele", "100"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSaddle() {
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "saddle"
|
||||
)), process(pointFeature(Map.of(
|
||||
"natural", "saddle",
|
||||
"ele", "100"
|
||||
))));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testNoElevation() {
|
||||
assertFeatures(14, List.of(), process(pointFeature(Map.of(
|
||||
"natural", "volcano"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBogusElevation() {
|
||||
assertFeatures(14, List.of(), process(pointFeature(Map.of(
|
||||
"natural", "volcano",
|
||||
"ele", "11000"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIgnorePeakLines() {
|
||||
assertFeatures(14, List.of(), process(lineFeature(Map.of(
|
||||
"natural", "peak",
|
||||
"name", "name",
|
||||
"ele", "100"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMountainLinestring() {
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "ridge",
|
||||
"name", "Ridge",
|
||||
|
||||
"_layer", "mountain_peak",
|
||||
"_type", "line",
|
||||
"_minzoom", 13,
|
||||
"_maxzoom", 14,
|
||||
"_buffer", 100d
|
||||
)), process(lineFeature(Map.of(
|
||||
"natural", "ridge",
|
||||
"name", "Ridge"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCustomaryFt() {
|
||||
process(SimpleFeature.create(
|
||||
rectangle(0, 0.1),
|
||||
Map.of("iso_a2", "US"),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_10m_admin_0_countries",
|
||||
0
|
||||
));
|
||||
|
||||
// inside US - customary_ft=1
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "volcano",
|
||||
"customary_ft", 1,
|
||||
"ele", 100,
|
||||
"ele_ft", 328
|
||||
)), process(SimpleFeature.create(
|
||||
newPoint(0, 0),
|
||||
new HashMap<>(Map.<String, Object>of(
|
||||
"natural", "volcano",
|
||||
"ele", "100"
|
||||
)),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
0
|
||||
)));
|
||||
|
||||
// outside US - customary_ft omitted
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "volcano",
|
||||
"customary_ft", "<null>",
|
||||
"ele", 100,
|
||||
"ele_ft", 328
|
||||
)), process(SimpleFeature.create(
|
||||
newPoint(1, 1),
|
||||
new HashMap<>(Map.<String, Object>of(
|
||||
"natural", "volcano",
|
||||
"ele", "100"
|
||||
)),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
0
|
||||
)));
|
||||
}
|
||||
|
||||
private int getSortKey(Map<String, Object> tags) {
|
||||
return process(pointFeature(Map.of(
|
||||
"natural", "peak",
|
||||
"ele", "100"
|
||||
))).iterator().next().getSortKey();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSortKey() {
|
||||
assertAscending(
|
||||
getSortKey(Map.of(
|
||||
"natural", "peak",
|
||||
"name", "name",
|
||||
"wikipedia", "wikilink",
|
||||
"ele", "100"
|
||||
)),
|
||||
getSortKey(Map.of(
|
||||
"natural", "peak",
|
||||
"name", "name",
|
||||
"ele", "100"
|
||||
)),
|
||||
getSortKey(Map.of(
|
||||
"natural", "peak",
|
||||
"ele", "100"
|
||||
))
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMountainPeakPostProcessing() throws GeometryException {
|
||||
assertEquals(List.of(), profile.postProcessLayerFeatures(MountainPeak.LAYER_NAME, 13, List.of()));
|
||||
|
||||
assertEquals(List.of(pointFeature(
|
||||
MountainPeak.LAYER_NAME,
|
||||
Map.of("rank", 1),
|
||||
1
|
||||
)), profile.postProcessLayerFeatures(MountainPeak.LAYER_NAME, 13, List.of(pointFeature(
|
||||
MountainPeak.LAYER_NAME,
|
||||
Map.of(),
|
||||
1
|
||||
))));
|
||||
|
||||
assertEquals(List.of(
|
||||
pointFeature(
|
||||
MountainPeak.LAYER_NAME,
|
||||
Map.of("rank", 1, "name", "a"),
|
||||
1
|
||||
), pointFeature(
|
||||
MountainPeak.LAYER_NAME,
|
||||
Map.of("rank", 2, "name", "b"),
|
||||
1
|
||||
), pointFeature(
|
||||
MountainPeak.LAYER_NAME,
|
||||
Map.of("rank", 1, "name", "c"),
|
||||
2
|
||||
)
|
||||
), profile.postProcessLayerFeatures(MountainPeak.LAYER_NAME, 13, List.of(
|
||||
pointFeature(
|
||||
MountainPeak.LAYER_NAME,
|
||||
Map.of("name", "a"),
|
||||
1
|
||||
),
|
||||
pointFeature(
|
||||
MountainPeak.LAYER_NAME,
|
||||
Map.of("name", "b"),
|
||||
1
|
||||
),
|
||||
pointFeature(
|
||||
MountainPeak.LAYER_NAME,
|
||||
Map.of("name", "c"),
|
||||
2
|
||||
)
|
||||
)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMountainPeakPostProcessingLimitsFeaturesOutsideZoom() throws GeometryException {
|
||||
assertEquals(Lists.newArrayList(
|
||||
new VectorTile.Feature(
|
||||
MountainPeak.LAYER_NAME,
|
||||
1,
|
||||
VectorTile.encodeGeometry(newPoint(-64, -64)),
|
||||
Map.of("rank", 1),
|
||||
1
|
||||
),
|
||||
null,
|
||||
new VectorTile.Feature(
|
||||
MountainPeak.LAYER_NAME,
|
||||
3,
|
||||
VectorTile.encodeGeometry(newPoint(256 + 64, 256 + 64)),
|
||||
Map.of("rank", 1),
|
||||
2
|
||||
),
|
||||
null
|
||||
), profile.postProcessLayerFeatures(MountainPeak.LAYER_NAME, 13, Lists.newArrayList(
|
||||
new VectorTile.Feature(
|
||||
MountainPeak.LAYER_NAME,
|
||||
1,
|
||||
VectorTile.encodeGeometry(newPoint(-64, -64)),
|
||||
new HashMap<>(),
|
||||
1
|
||||
),
|
||||
new VectorTile.Feature(
|
||||
MountainPeak.LAYER_NAME,
|
||||
2,
|
||||
VectorTile.encodeGeometry(newPoint(-65, -65)),
|
||||
new HashMap<>(),
|
||||
1
|
||||
),
|
||||
new VectorTile.Feature(
|
||||
MountainPeak.LAYER_NAME,
|
||||
3,
|
||||
VectorTile.encodeGeometry(newPoint(256 + 64, 256 + 64)),
|
||||
new HashMap<>(),
|
||||
2
|
||||
),
|
||||
new VectorTile.Feature(
|
||||
MountainPeak.LAYER_NAME,
|
||||
4,
|
||||
VectorTile.encodeGeometry(newPoint(256 + 65, 256 + 65)),
|
||||
new HashMap<>(),
|
||||
2
|
||||
)
|
||||
)));
|
||||
}
|
||||
}
|
|
@ -1,135 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import com.onthegomap.planetiler.geo.GeoUtils;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class ParkTest extends AbstractLayerTest {
|
||||
|
||||
@Test
|
||||
public void testNationalPark() {
|
||||
assertFeatures(13, List.of(Map.of(
|
||||
"_layer", "park",
|
||||
"_type", "polygon",
|
||||
"class", "national_park",
|
||||
"name", "Grand Canyon National Park",
|
||||
"_minpixelsize", 2d,
|
||||
"_minzoom", 4,
|
||||
"_maxzoom", 14
|
||||
), Map.of(
|
||||
"_layer", "park",
|
||||
"_type", "point",
|
||||
"class", "national_park",
|
||||
"name", "Grand Canyon National Park",
|
||||
"name_int", "Grand Canyon National Park",
|
||||
"name:latin", "Grand Canyon National Park",
|
||||
// "name:es", "es name", // don't include all translations
|
||||
"_minzoom", 5,
|
||||
"_maxzoom", 14
|
||||
)), process(polygonFeature(Map.of(
|
||||
"boundary", "national_park",
|
||||
"name", "Grand Canyon National Park",
|
||||
"name:es", "es name",
|
||||
"protection_title", "National Park",
|
||||
"wikipedia", "en:Grand Canyon National Park"
|
||||
))));
|
||||
|
||||
// needs a name
|
||||
assertFeatures(13, List.of(Map.of(
|
||||
"_layer", "park",
|
||||
"_type", "polygon"
|
||||
)), process(polygonFeature(Map.of(
|
||||
"boundary", "national_park",
|
||||
"protection_title", "National Park"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSmallerPark() {
|
||||
double z11area = Math.pow((GeoUtils.metersToPixelAtEquator(0, Math.sqrt(70_000)) / 256d), 2) * Math.pow(2, 20 - 11);
|
||||
assertFeatures(13, List.of(Map.of(
|
||||
"_layer", "park",
|
||||
"_type", "polygon",
|
||||
"class", "protected_area",
|
||||
"name", "Small park",
|
||||
"_minpixelsize", 2d,
|
||||
"_minzoom", 4,
|
||||
"_maxzoom", 14
|
||||
), Map.of(
|
||||
"_layer", "park",
|
||||
"_type", "point",
|
||||
"class", "protected_area",
|
||||
"name", "Small park",
|
||||
"name_int", "Small park",
|
||||
"_minzoom", 11,
|
||||
"_maxzoom", 14
|
||||
)), process(polygonFeatureWithArea(z11area, Map.of(
|
||||
"boundary", "protected_area",
|
||||
"name", "Small park",
|
||||
"wikipedia", "en:Small park"
|
||||
))));
|
||||
assertFeatures(13, List.of(Map.of(
|
||||
"_layer", "park",
|
||||
"_type", "polygon"
|
||||
), Map.of(
|
||||
"_layer", "park",
|
||||
"_type", "point",
|
||||
"_minzoom", 5,
|
||||
"_maxzoom", 14
|
||||
)), process(polygonFeatureWithArea(1, Map.of(
|
||||
"boundary", "protected_area",
|
||||
"name", "Small park",
|
||||
"wikidata", "Q123"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSortKeys() {
|
||||
assertAscending(
|
||||
getLabelSortKey(1, Map.of(
|
||||
"boundary", "national_park",
|
||||
"name", "a",
|
||||
"wikipedia", "en:park"
|
||||
)),
|
||||
getLabelSortKey(1e-10, Map.of(
|
||||
"boundary", "national_park",
|
||||
"name", "a",
|
||||
"wikipedia", "en:Park"
|
||||
)),
|
||||
getLabelSortKey(1, Map.of(
|
||||
"boundary", "national_park",
|
||||
"name", "a"
|
||||
)),
|
||||
getLabelSortKey(1e-10, Map.of(
|
||||
"boundary", "national_park",
|
||||
"name", "a"
|
||||
)),
|
||||
|
||||
getLabelSortKey(1, Map.of(
|
||||
"boundary", "protected_area",
|
||||
"name", "a",
|
||||
"wikipedia", "en:park"
|
||||
)),
|
||||
getLabelSortKey(1e-10, Map.of(
|
||||
"boundary", "protected_area",
|
||||
"name", "a",
|
||||
"wikipedia", "en:Park"
|
||||
)),
|
||||
getLabelSortKey(1, Map.of(
|
||||
"boundary", "protected_area",
|
||||
"name", "a"
|
||||
)),
|
||||
getLabelSortKey(1e-10, Map.of(
|
||||
"boundary", "protected_area",
|
||||
"name", "a"
|
||||
))
|
||||
);
|
||||
}
|
||||
|
||||
private int getLabelSortKey(double area, Map<String, Object> tags) {
|
||||
var iter = process(polygonFeatureWithArea(area, tags)).iterator();
|
||||
iter.next();
|
||||
return iter.next().getSortKey();
|
||||
}
|
||||
}
|
|
@ -1,523 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import static com.onthegomap.planetiler.TestUtils.newPoint;
|
||||
import static com.onthegomap.planetiler.TestUtils.rectangle;
|
||||
import static com.onthegomap.planetiler.basemap.BasemapProfile.NATURAL_EARTH_SOURCE;
|
||||
import static com.onthegomap.planetiler.basemap.BasemapProfile.OSM_SOURCE;
|
||||
import static com.onthegomap.planetiler.basemap.layers.Place.getSortKey;
|
||||
import static com.onthegomap.planetiler.collection.FeatureGroup.SORT_KEY_MAX;
|
||||
import static com.onthegomap.planetiler.collection.FeatureGroup.SORT_KEY_MIN;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.fail;
|
||||
|
||||
import com.onthegomap.planetiler.geo.GeoUtils;
|
||||
import com.onthegomap.planetiler.geo.GeometryException;
|
||||
import com.onthegomap.planetiler.reader.SimpleFeature;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class PlaceTest extends AbstractLayerTest {
|
||||
|
||||
@Test
|
||||
public void testContinent() {
|
||||
wikidataTranslations.put(49, "es", "América del Norte y América Central");
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"_layer", "place",
|
||||
"class", "continent",
|
||||
"name", "North America",
|
||||
"name:en", "North America",
|
||||
"name:es", "América del Norte y América Central",
|
||||
"name:latin", "North America",
|
||||
"rank", 1,
|
||||
|
||||
"_type", "point",
|
||||
"_minzoom", 0,
|
||||
"_maxzoom", 3
|
||||
)), process(pointFeature(Map.of(
|
||||
"place", "continent",
|
||||
"wikidata", "Q49",
|
||||
"name:es", "América del Norte",
|
||||
"name", "North America",
|
||||
"name:en", "North America"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCountry() {
|
||||
wikidataTranslations.put(30, "es", "Estados Unidos");
|
||||
process(SimpleFeature.create(
|
||||
rectangle(0, 0.25),
|
||||
Map.of(
|
||||
"name", "United States",
|
||||
"scalerank", 0,
|
||||
"labelrank", 2
|
||||
),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_10m_admin_0_countries",
|
||||
0
|
||||
));
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"_layer", "place",
|
||||
"class", "country",
|
||||
"name", "United States of America",
|
||||
"name_en", "United States of America",
|
||||
"name:es", "Estados Unidos",
|
||||
"name:latin", "United States of America",
|
||||
"iso_a2", "US",
|
||||
"rank", 6,
|
||||
|
||||
"_type", "point",
|
||||
"_minzoom", 5
|
||||
)), process(SimpleFeature.create(
|
||||
newPoint(0.5, 0.5),
|
||||
Map.of(
|
||||
"place", "country",
|
||||
"wikidata", "Q30",
|
||||
"name:es", "Estados Unidos de América",
|
||||
"name", "United States of America",
|
||||
"name:en", "United States of America",
|
||||
"country_code_iso3166_1_alpha_2", "US"
|
||||
),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
0
|
||||
)));
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"_layer", "place",
|
||||
"class", "country",
|
||||
"name", "United States of America",
|
||||
"name_en", "United States of America",
|
||||
"name:es", "Estados Unidos",
|
||||
"name:latin", "United States of America",
|
||||
"iso_a2", "US",
|
||||
"rank", 1,
|
||||
|
||||
"_type", "point",
|
||||
"_minzoom", 0
|
||||
)), process(SimpleFeature.create(
|
||||
newPoint(0.1, 0.1),
|
||||
Map.of(
|
||||
"place", "country",
|
||||
"wikidata", "Q30",
|
||||
"name:es", "Estados Unidos de América",
|
||||
"name", "United States of America",
|
||||
"name:en", "United States of America",
|
||||
"country_code_iso3166_1_alpha_2", "US"
|
||||
),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
0
|
||||
)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testState() {
|
||||
wikidataTranslations.put(771, "es", "Massachusetts es");
|
||||
process(SimpleFeature.create(
|
||||
rectangle(0, 0.25),
|
||||
Map.of(
|
||||
"name", "Massachusetts",
|
||||
"scalerank", 0,
|
||||
"labelrank", 2,
|
||||
"datarank", 1
|
||||
),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_10m_admin_1_states_provinces",
|
||||
0
|
||||
));
|
||||
|
||||
process(SimpleFeature.create(
|
||||
rectangle(0.4, 0.6),
|
||||
Map.of(
|
||||
"name", "Massachusetts - not important",
|
||||
"scalerank", 8,
|
||||
"labelrank", 8,
|
||||
"datarank", 1
|
||||
),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_10m_admin_1_states_provinces",
|
||||
0
|
||||
));
|
||||
|
||||
// no match
|
||||
assertFeatures(0, List.of(), process(SimpleFeature.create(
|
||||
newPoint(1, 1),
|
||||
Map.of(
|
||||
"place", "state",
|
||||
"wikidata", "Q771",
|
||||
"name", "Massachusetts",
|
||||
"name:en", "Massachusetts"
|
||||
),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
0
|
||||
)));
|
||||
|
||||
// unimportant match
|
||||
assertFeatures(0, List.of(), process(SimpleFeature.create(
|
||||
newPoint(0.5, 0.5),
|
||||
Map.of(
|
||||
"place", "state",
|
||||
"wikidata", "Q771",
|
||||
"name", "Massachusetts",
|
||||
"name:en", "Massachusetts"
|
||||
),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
0
|
||||
)));
|
||||
|
||||
// important match
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"_layer", "place",
|
||||
"class", "state",
|
||||
"name", "Massachusetts",
|
||||
"name_en", "Massachusetts",
|
||||
"name:es", "Massachusetts es",
|
||||
"name:latin", "Massachusetts",
|
||||
"rank", 1,
|
||||
|
||||
"_type", "point",
|
||||
"_minzoom", 2
|
||||
)), process(SimpleFeature.create(
|
||||
newPoint(0.1, 0.1),
|
||||
Map.of(
|
||||
"place", "state",
|
||||
"wikidata", "Q771",
|
||||
"name", "Massachusetts",
|
||||
"name:en", "Massachusetts"
|
||||
),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
0
|
||||
)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testProvince() {
|
||||
wikidataTranslations.put(95027, "es", "provincia de Lugo");
|
||||
process(SimpleFeature.create(
|
||||
rectangle(0, 0.25),
|
||||
Map.of(
|
||||
"name", "Nova Scotia",
|
||||
"scalerank", 3,
|
||||
"labelrank", 3,
|
||||
"datarank", 3
|
||||
),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_10m_admin_1_states_provinces",
|
||||
0
|
||||
));
|
||||
|
||||
assertFeatures(4, List.of(Map.of(
|
||||
"_layer", "place",
|
||||
"class", "province",
|
||||
"name", "Lugo",
|
||||
"name:es", "provincia de Lugo",
|
||||
"rank", 3,
|
||||
|
||||
"_type", "point",
|
||||
"_minzoom", 2
|
||||
)), process(SimpleFeature.create(
|
||||
newPoint(0.1, 0.1),
|
||||
Map.of(
|
||||
"place", "province",
|
||||
"wikidata", "Q95027",
|
||||
"name", "Lugo"
|
||||
),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
0
|
||||
)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIslandPoint() {
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"_layer", "place",
|
||||
"class", "island",
|
||||
"name", "Nantucket",
|
||||
"name_en", "Nantucket",
|
||||
"name:latin", "Nantucket",
|
||||
"rank", 7,
|
||||
|
||||
"_type", "point",
|
||||
"_minzoom", 12
|
||||
)), process(pointFeature(
|
||||
Map.of(
|
||||
"place", "island",
|
||||
"name", "Nantucket",
|
||||
"name:en", "Nantucket"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIslandPolygon() {
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"_layer", "place",
|
||||
"class", "island",
|
||||
"name", "Nantucket",
|
||||
"name_en", "Nantucket",
|
||||
"name:latin", "Nantucket",
|
||||
"rank", 3,
|
||||
|
||||
"_type", "point",
|
||||
"_minzoom", 8
|
||||
)), process(polygonFeatureWithArea(1,
|
||||
Map.of(
|
||||
"place", "island",
|
||||
"name", "Nantucket",
|
||||
"name:en", "Nantucket"
|
||||
))));
|
||||
|
||||
double rank4area = Math.pow(GeoUtils.metersToPixelAtEquator(0, Math.sqrt(40_000_000 - 1)) / 256d, 2);
|
||||
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"_layer", "place",
|
||||
"class", "island",
|
||||
"name", "Nantucket",
|
||||
"rank", 4,
|
||||
|
||||
"_type", "point",
|
||||
"_minzoom", 9
|
||||
)), process(polygonFeatureWithArea(rank4area,
|
||||
Map.of(
|
||||
"place", "island",
|
||||
"name", "Nantucket",
|
||||
"name:en", "Nantucket"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPlaceSortKeyRanking() {
|
||||
int[] sortKeys = new int[]{
|
||||
// max
|
||||
getSortKey(0, Place.PlaceType.CITY, 1_000_000_000, "name"),
|
||||
|
||||
getSortKey(0, Place.PlaceType.CITY, 1_000_000_000, "name longer"),
|
||||
getSortKey(0, Place.PlaceType.CITY, 1_000_000_000, "x".repeat(32)),
|
||||
|
||||
getSortKey(0, Place.PlaceType.CITY, 10_000_000, "name"),
|
||||
getSortKey(0, Place.PlaceType.CITY, 0, "name"),
|
||||
|
||||
getSortKey(0, Place.PlaceType.TOWN, 1_000_000_000, "name"),
|
||||
getSortKey(0, Place.PlaceType.ISOLATED_DWELLING, 1_000_000_000, "name"),
|
||||
getSortKey(0, null, 1_000_000_000, "name"),
|
||||
|
||||
getSortKey(1, Place.PlaceType.CITY, 1_000_000_000, "name"),
|
||||
getSortKey(10, Place.PlaceType.CITY, 1_000_000_000, "name"),
|
||||
getSortKey(null, Place.PlaceType.CITY, 1_000_000_000, "name"),
|
||||
|
||||
// min
|
||||
getSortKey(null, null, 0, null),
|
||||
};
|
||||
for (int i = 0; i < sortKeys.length; i++) {
|
||||
if (sortKeys[i] < SORT_KEY_MIN) {
|
||||
fail("Item at index " + i + " is < " + SORT_KEY_MIN + ": " + sortKeys[i]);
|
||||
}
|
||||
if (sortKeys[i] > SORT_KEY_MAX) {
|
||||
fail("Item at index " + i + " is > " + SORT_KEY_MAX + ": " + sortKeys[i]);
|
||||
}
|
||||
}
|
||||
assertAscending(sortKeys);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCountryCapital() {
|
||||
process(SimpleFeature.create(
|
||||
newPoint(0, 0),
|
||||
Map.of(
|
||||
"name", "Washington, D.C.",
|
||||
"scalerank", 0,
|
||||
"wikidataid", "Q61"
|
||||
),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_10m_populated_places",
|
||||
0
|
||||
));
|
||||
assertFeatures(7, List.of(Map.of(
|
||||
"_layer", "place",
|
||||
"class", "city",
|
||||
"name", "Washington, D.C.",
|
||||
"rank", 1,
|
||||
"capital", 2,
|
||||
"_labelgrid_limit", 0,
|
||||
"_labelgrid_size", 128d,
|
||||
|
||||
"_type", "point",
|
||||
"_minzoom", 2
|
||||
)), process(pointFeature(
|
||||
Map.of(
|
||||
"place", "city",
|
||||
"name", "Washington, D.C.",
|
||||
"population", "672228",
|
||||
"wikidata", "Q61",
|
||||
"capital", "yes"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStateCapital() {
|
||||
process(SimpleFeature.create(
|
||||
newPoint(0, 0),
|
||||
Map.of(
|
||||
"name", "Boston",
|
||||
"scalerank", 2,
|
||||
"wikidataid", "Q100"
|
||||
),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_10m_populated_places",
|
||||
0
|
||||
));
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"_layer", "place",
|
||||
"class", "city",
|
||||
"name", "Boston",
|
||||
"rank", 3,
|
||||
"capital", 4,
|
||||
|
||||
"_type", "point",
|
||||
"_minzoom", 3
|
||||
)), process(pointFeature(
|
||||
Map.of(
|
||||
"place", "city",
|
||||
"name", "Boston",
|
||||
"population", "667137",
|
||||
"capital", "4"
|
||||
))));
|
||||
// no match when far away
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"_layer", "place",
|
||||
"class", "city",
|
||||
"name", "Boston",
|
||||
"rank", "<null>"
|
||||
)), process(SimpleFeature.create(
|
||||
newPoint(1, 1),
|
||||
Map.of(
|
||||
"place", "city",
|
||||
"name", "Boston",
|
||||
"wikidata", "Q100",
|
||||
"population", "667137",
|
||||
"capital", "4"
|
||||
),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
0
|
||||
)));
|
||||
// unaccented name match
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"_layer", "place",
|
||||
"class", "city",
|
||||
"rank", 3
|
||||
)), process(pointFeature(
|
||||
Map.of(
|
||||
"place", "city",
|
||||
"name", "Böston",
|
||||
"population", "667137",
|
||||
"capital", "4"
|
||||
))));
|
||||
// wikidata only match
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"_layer", "place",
|
||||
"class", "city",
|
||||
"rank", 3
|
||||
)), process(pointFeature(
|
||||
Map.of(
|
||||
"place", "city",
|
||||
"name", "Other name",
|
||||
"population", "667137",
|
||||
"wikidata", "Q100",
|
||||
"capital", "4"
|
||||
))));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testCityWithoutNaturalEarthMatch() {
|
||||
assertFeatures(7, List.of(Map.of(
|
||||
"_layer", "place",
|
||||
"class", "city",
|
||||
"rank", "<null>",
|
||||
"_minzoom", 7,
|
||||
"_labelgrid_limit", 4,
|
||||
"_labelgrid_size", 128d
|
||||
)), process(pointFeature(
|
||||
Map.of(
|
||||
"place", "city",
|
||||
"name", "City name"
|
||||
))));
|
||||
assertFeatures(13, List.of(Map.of(
|
||||
"_layer", "place",
|
||||
"class", "isolated_dwelling",
|
||||
"rank", "<null>",
|
||||
"_labelgrid_limit", 0,
|
||||
"_labelgrid_size", 0d,
|
||||
"_minzoom", 14
|
||||
)), process(pointFeature(
|
||||
Map.of(
|
||||
"place", "isolated_dwelling",
|
||||
"name", "City name"
|
||||
))));
|
||||
assertFeatures(12, List.of(Map.of(
|
||||
"_layer", "place",
|
||||
"class", "isolated_dwelling",
|
||||
"rank", "<null>",
|
||||
"_labelgrid_limit", 14,
|
||||
"_labelgrid_size", 128d,
|
||||
"_minzoom", 14
|
||||
)), process(pointFeature(
|
||||
Map.of(
|
||||
"place", "isolated_dwelling",
|
||||
"name", "City name"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCitySetRankFromGridrank() throws GeometryException {
|
||||
var layerName = Place.LAYER_NAME;
|
||||
assertEquals(List.of(), profile.postProcessLayerFeatures(layerName, 13, List.of()));
|
||||
|
||||
assertEquals(List.of(pointFeature(
|
||||
layerName,
|
||||
Map.of("rank", 11),
|
||||
1
|
||||
)), profile.postProcessLayerFeatures(layerName, 13, List.of(pointFeature(
|
||||
layerName,
|
||||
Map.of(),
|
||||
1
|
||||
))));
|
||||
|
||||
assertEquals(List.of(
|
||||
pointFeature(
|
||||
layerName,
|
||||
Map.of("rank", 11, "name", "a"),
|
||||
1
|
||||
), pointFeature(
|
||||
layerName,
|
||||
Map.of("rank", 12, "name", "b"),
|
||||
1
|
||||
), pointFeature(
|
||||
layerName,
|
||||
Map.of("rank", 11, "name", "c"),
|
||||
2
|
||||
)
|
||||
), profile.postProcessLayerFeatures(layerName, 13, List.of(
|
||||
pointFeature(
|
||||
layerName,
|
||||
Map.of("name", "a"),
|
||||
1
|
||||
),
|
||||
pointFeature(
|
||||
layerName,
|
||||
Map.of("name", "b"),
|
||||
1
|
||||
),
|
||||
pointFeature(
|
||||
layerName,
|
||||
Map.of("name", "c"),
|
||||
2
|
||||
)
|
||||
)));
|
||||
}
|
||||
}
|
|
@ -1,210 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import com.onthegomap.planetiler.geo.GeometryException;
|
||||
import com.onthegomap.planetiler.reader.SourceFeature;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.ValueSource;
|
||||
|
||||
public class PoiTest extends AbstractLayerTest {
|
||||
|
||||
private SourceFeature feature(boolean area, Map<String, Object> tags) {
|
||||
return area ? polygonFeature(tags) : pointFeature(tags);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFenwayPark() {
|
||||
assertFeatures(7, List.of(Map.of(
|
||||
"_layer", "poi",
|
||||
"class", "stadium",
|
||||
"subclass", "stadium",
|
||||
"name", "Fenway Park",
|
||||
"rank", "<null>",
|
||||
"_minzoom", 14,
|
||||
"_labelgrid_size", 64d
|
||||
)), process(pointFeature(Map.of(
|
||||
"leisure", "stadium",
|
||||
"name", "Fenway Park"
|
||||
))));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ValueSource(booleans = {false, true})
|
||||
public void testFunicularHalt(boolean area) {
|
||||
assertFeatures(7, List.of(Map.of(
|
||||
"_layer", "poi",
|
||||
"class", "railway",
|
||||
"subclass", "halt",
|
||||
"rank", "<null>",
|
||||
"_minzoom", 12
|
||||
)), process(feature(area, Map.of(
|
||||
"railway", "station",
|
||||
"funicular", "yes",
|
||||
"name", "station"
|
||||
))));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ValueSource(booleans = {false, true})
|
||||
public void testSubway(boolean area) {
|
||||
assertFeatures(7, List.of(Map.of(
|
||||
"_layer", "poi",
|
||||
"class", "railway",
|
||||
"subclass", "subway",
|
||||
"rank", "<null>",
|
||||
"_minzoom", 12
|
||||
)), process(feature(area, Map.of(
|
||||
"railway", "station",
|
||||
"station", "subway",
|
||||
"name", "station"
|
||||
))));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ValueSource(booleans = {false, true})
|
||||
public void testPlaceOfWorshipFromReligionTag(boolean area) {
|
||||
assertFeatures(7, List.of(Map.of(
|
||||
"_layer", "poi",
|
||||
"class", "place_of_worship",
|
||||
"subclass", "religion value",
|
||||
"rank", "<null>",
|
||||
"_minzoom", 14
|
||||
)), process(feature(area, Map.of(
|
||||
"amenity", "place_of_worship",
|
||||
"religion", "religion value",
|
||||
"name", "station"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPitchFromSportTag() {
|
||||
assertFeatures(7, List.of(Map.of(
|
||||
"_layer", "poi",
|
||||
"class", "pitch",
|
||||
"subclass", "soccer",
|
||||
"rank", "<null>"
|
||||
)), process(pointFeature(Map.of(
|
||||
"leisure", "pitch",
|
||||
"sport", "soccer",
|
||||
"name", "station"
|
||||
))));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ValueSource(booleans = {false, true})
|
||||
public void testInformation(boolean area) {
|
||||
assertFeatures(7, List.of(Map.of(
|
||||
"_layer", "poi",
|
||||
"class", "information",
|
||||
"subclass", "infotype",
|
||||
"layer", 3L,
|
||||
"level", 2L,
|
||||
"indoor", 1,
|
||||
"rank", "<null>"
|
||||
)), process(feature(area, Map.of(
|
||||
"tourism", "information",
|
||||
"information", "infotype",
|
||||
"name", "station",
|
||||
"layer", "3",
|
||||
"level", "2",
|
||||
"indoor", "yes"
|
||||
))));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ValueSource(booleans = {false, true})
|
||||
public void testFerryTerminal(boolean area) {
|
||||
assertFeatures(7, List.of(Map.of(
|
||||
"_layer", "poi",
|
||||
"class", "ferry_terminal",
|
||||
"subclass", "ferry_terminal",
|
||||
"name", "Water Taxi",
|
||||
"_minzoom", 12
|
||||
)), process(feature(area, Map.of(
|
||||
"amenity", "ferry_terminal",
|
||||
"information", "infotype",
|
||||
"name", "Water Taxi",
|
||||
"layer", "3",
|
||||
"level", "2",
|
||||
"indoor", "yes"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGridRank() throws GeometryException {
|
||||
var layerName = Poi.LAYER_NAME;
|
||||
assertEquals(List.of(), profile.postProcessLayerFeatures(layerName, 13, List.of()));
|
||||
|
||||
assertEquals(List.of(pointFeature(
|
||||
layerName,
|
||||
Map.of("rank", 1),
|
||||
1
|
||||
)), profile.postProcessLayerFeatures(layerName, 14, List.of(pointFeature(
|
||||
layerName,
|
||||
Map.of(),
|
||||
1
|
||||
))));
|
||||
|
||||
assertEquals(List.of(
|
||||
pointFeature(
|
||||
layerName,
|
||||
Map.of("rank", 1, "name", "a"),
|
||||
1
|
||||
), pointFeature(
|
||||
layerName,
|
||||
Map.of("rank", 2, "name", "b"),
|
||||
1
|
||||
), pointFeature(
|
||||
layerName,
|
||||
Map.of("rank", 1, "name", "c"),
|
||||
2
|
||||
)
|
||||
), profile.postProcessLayerFeatures(layerName, 14, List.of(
|
||||
pointFeature(
|
||||
layerName,
|
||||
Map.of("name", "a"),
|
||||
1
|
||||
),
|
||||
pointFeature(
|
||||
layerName,
|
||||
Map.of("name", "b"),
|
||||
1
|
||||
),
|
||||
pointFeature(
|
||||
layerName,
|
||||
Map.of("name", "c"),
|
||||
2
|
||||
)
|
||||
)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEmbassy() {
|
||||
assertFeatures(7, List.of(Map.of(
|
||||
"_layer", "poi",
|
||||
"class", "diplomatic",
|
||||
"subclass", "diplomatic",
|
||||
"name", "The Embassy"
|
||||
)), process(pointFeature(Map.of(
|
||||
"office", "diplomatic",
|
||||
"name", "The Embassy"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLocksmith() {
|
||||
assertFeatures(7, List.of(Map.of(
|
||||
"_layer", "poi",
|
||||
"class", "shop",
|
||||
"subclass", "locksmith",
|
||||
"name", "The Locksmith"
|
||||
)), process(pointFeature(Map.of(
|
||||
"shop", "locksmith",
|
||||
"name", "The Locksmith"
|
||||
))));
|
||||
}
|
||||
}
|
Plik diff jest za duży
Load Diff
|
@ -1,155 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import static com.onthegomap.planetiler.TestUtils.newLineString;
|
||||
import static com.onthegomap.planetiler.TestUtils.rectangle;
|
||||
import static com.onthegomap.planetiler.basemap.BasemapProfile.LAKE_CENTERLINE_SOURCE;
|
||||
import static com.onthegomap.planetiler.basemap.BasemapProfile.NATURAL_EARTH_SOURCE;
|
||||
import static com.onthegomap.planetiler.basemap.BasemapProfile.OSM_SOURCE;
|
||||
|
||||
import com.onthegomap.planetiler.TestUtils;
|
||||
import com.onthegomap.planetiler.geo.GeoUtils;
|
||||
import com.onthegomap.planetiler.reader.SimpleFeature;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class WaterNameTest extends AbstractLayerTest {
|
||||
|
||||
@Test
|
||||
public void testWaterNamePoint() {
|
||||
assertFeatures(11, List.of(Map.of(
|
||||
"_layer", "water"
|
||||
), Map.of(
|
||||
"class", "lake",
|
||||
"name", "waterway",
|
||||
"name:es", "waterway es",
|
||||
"intermittent", 1,
|
||||
|
||||
"_layer", "water_name",
|
||||
"_type", "point",
|
||||
"_minzoom", 9,
|
||||
"_maxzoom", 14
|
||||
)), process(polygonFeatureWithArea(1, Map.of(
|
||||
"name", "waterway",
|
||||
"name:es", "waterway es",
|
||||
"natural", "water",
|
||||
"water", "pond",
|
||||
"intermittent", "1"
|
||||
))));
|
||||
double z11area = Math.pow((GeoUtils.metersToPixelAtEquator(0, Math.sqrt(70_000)) / 256d), 2) * Math.pow(2, 20 - 11);
|
||||
assertFeatures(10, List.of(Map.of(
|
||||
"_layer", "water"
|
||||
), Map.of(
|
||||
"_layer", "water_name",
|
||||
"_type", "point",
|
||||
"_minzoom", 11,
|
||||
"_maxzoom", 14
|
||||
)), process(polygonFeatureWithArea(z11area, Map.of(
|
||||
"name", "waterway",
|
||||
"natural", "water",
|
||||
"water", "pond"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWaterNameLakeline() {
|
||||
assertFeatures(11, List.of(), process(SimpleFeature.create(
|
||||
newLineString(0, 0, 1, 1),
|
||||
new HashMap<>(Map.<String, Object>of(
|
||||
"OSM_ID", -10
|
||||
)),
|
||||
LAKE_CENTERLINE_SOURCE,
|
||||
null,
|
||||
0
|
||||
)));
|
||||
assertFeatures(10, List.of(Map.of(
|
||||
"_layer", "water"
|
||||
), Map.of(
|
||||
"name", "waterway",
|
||||
"name:es", "waterway es",
|
||||
|
||||
"_layer", "water_name",
|
||||
"_type", "line",
|
||||
"_geom", new TestUtils.NormGeometry(GeoUtils.latLonToWorldCoords(newLineString(0, 0, 1, 1))),
|
||||
"_minzoom", 9,
|
||||
"_maxzoom", 14,
|
||||
"_minpixelsize", "waterway".length() * 6d
|
||||
)), process(SimpleFeature.create(
|
||||
GeoUtils.worldToLatLonCoords(rectangle(0, Math.sqrt(1))),
|
||||
new HashMap<>(Map.<String, Object>of(
|
||||
"name", "waterway",
|
||||
"name:es", "waterway es",
|
||||
"natural", "water",
|
||||
"water", "pond"
|
||||
)),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
10
|
||||
)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMarinePoint() {
|
||||
assertFeatures(11, List.of(), process(SimpleFeature.create(
|
||||
newLineString(0, 0, 1, 1),
|
||||
new HashMap<>(Map.<String, Object>of(
|
||||
"scalerank", 1,
|
||||
"name", "Black sea"
|
||||
)),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_10m_geography_marine_polys",
|
||||
0
|
||||
)));
|
||||
|
||||
// name match - use scale rank from NE
|
||||
assertFeatures(10, List.of(Map.of(
|
||||
"name", "Black Sea",
|
||||
"name:es", "Mar Negro",
|
||||
"_layer", "water_name",
|
||||
"_type", "point",
|
||||
"_minzoom", 1,
|
||||
"_maxzoom", 14
|
||||
)), process(pointFeature(Map.of(
|
||||
"rank", 9,
|
||||
"name", "Black Sea",
|
||||
"name:es", "Mar Negro",
|
||||
"place", "sea"
|
||||
))));
|
||||
|
||||
// name match but ocean - use min zoom=0
|
||||
assertFeatures(10, List.of(Map.of(
|
||||
"_layer", "water_name",
|
||||
"_type", "point",
|
||||
"_minzoom", 0,
|
||||
"_maxzoom", 14
|
||||
)), process(pointFeature(Map.of(
|
||||
"rank", 9,
|
||||
"name", "Black Sea",
|
||||
"place", "ocean"
|
||||
))));
|
||||
|
||||
// no name match - use OSM rank
|
||||
assertFeatures(10, List.of(Map.of(
|
||||
"_layer", "water_name",
|
||||
"_type", "point",
|
||||
"_minzoom", 9,
|
||||
"_maxzoom", 14
|
||||
)), process(pointFeature(Map.of(
|
||||
"rank", 9,
|
||||
"name", "Atlantic",
|
||||
"place", "sea"
|
||||
))));
|
||||
|
||||
// no rank at all, default to 8
|
||||
assertFeatures(10, List.of(Map.of(
|
||||
"_layer", "water_name",
|
||||
"_type", "point",
|
||||
"_minzoom", 8,
|
||||
"_maxzoom", 14
|
||||
)), process(pointFeature(Map.of(
|
||||
"name", "Atlantic",
|
||||
"place", "sea"
|
||||
))));
|
||||
}
|
||||
}
|
|
@ -1,258 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import static com.onthegomap.planetiler.TestUtils.rectangle;
|
||||
import static com.onthegomap.planetiler.basemap.BasemapProfile.NATURAL_EARTH_SOURCE;
|
||||
import static com.onthegomap.planetiler.basemap.BasemapProfile.OSM_SOURCE;
|
||||
import static com.onthegomap.planetiler.basemap.BasemapProfile.WATER_POLYGON_SOURCE;
|
||||
|
||||
import com.onthegomap.planetiler.reader.SimpleFeature;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class WaterTest extends AbstractLayerTest {
|
||||
|
||||
|
||||
@Test
|
||||
public void testWaterNaturalEarth() {
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"class", "lake",
|
||||
"intermittent", "<null>",
|
||||
"_layer", "water",
|
||||
"_type", "polygon",
|
||||
"_minzoom", 0
|
||||
)), process(SimpleFeature.create(
|
||||
rectangle(0, 10),
|
||||
Map.of(),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_110m_lakes",
|
||||
0
|
||||
)));
|
||||
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"class", "ocean",
|
||||
"intermittent", "<null>",
|
||||
"_layer", "water",
|
||||
"_type", "polygon",
|
||||
"_minzoom", 0
|
||||
)), process(SimpleFeature.create(
|
||||
rectangle(0, 10),
|
||||
Map.of(),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_110m_ocean",
|
||||
0
|
||||
)));
|
||||
|
||||
assertFeatures(6, List.of(Map.of(
|
||||
"class", "lake",
|
||||
"_layer", "water",
|
||||
"_type", "polygon",
|
||||
"_maxzoom", 5
|
||||
)), process(SimpleFeature.create(
|
||||
rectangle(0, 10),
|
||||
Map.of(),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_10m_lakes",
|
||||
0
|
||||
)));
|
||||
|
||||
assertFeatures(6, List.of(Map.of(
|
||||
"class", "ocean",
|
||||
"_layer", "water",
|
||||
"_type", "polygon",
|
||||
"_maxzoom", 5
|
||||
)), process(SimpleFeature.create(
|
||||
rectangle(0, 10),
|
||||
Map.of(),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_10m_ocean",
|
||||
0
|
||||
)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWaterOsmWaterPolygon() {
|
||||
assertFeatures(0, List.of(Map.of(
|
||||
"class", "ocean",
|
||||
"intermittent", "<null>",
|
||||
"_layer", "water",
|
||||
"_type", "polygon",
|
||||
"_minzoom", 6,
|
||||
"_maxzoom", 14
|
||||
)), process(SimpleFeature.create(
|
||||
rectangle(0, 10),
|
||||
Map.of(),
|
||||
WATER_POLYGON_SOURCE,
|
||||
null,
|
||||
0
|
||||
)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWater() {
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "lake",
|
||||
"_layer", "water",
|
||||
"_type", "polygon",
|
||||
"_minzoom", 6,
|
||||
"_maxzoom", 14
|
||||
)), process(polygonFeature(Map.of(
|
||||
"natural", "water",
|
||||
"water", "reservoir"
|
||||
))));
|
||||
assertFeatures(14, List.of(
|
||||
Map.of("_layer", "poi"),
|
||||
Map.of(
|
||||
"class", "lake",
|
||||
|
||||
"_layer", "water",
|
||||
"_type", "polygon",
|
||||
"_minzoom", 6,
|
||||
"_maxzoom", 14
|
||||
)), process(polygonFeature(Map.of(
|
||||
"leisure", "swimming_pool"
|
||||
))));
|
||||
assertFeatures(14, List.of(), process(polygonFeature(Map.of(
|
||||
"natural", "bay"
|
||||
))));
|
||||
assertFeatures(14, List.of(Map.of()), process(polygonFeature(Map.of(
|
||||
"natural", "water"
|
||||
))));
|
||||
assertFeatures(14, List.of(), process(polygonFeature(Map.of(
|
||||
"natural", "water",
|
||||
"covered", "yes"
|
||||
))));
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "river",
|
||||
"brunnel", "bridge",
|
||||
"intermittent", 1,
|
||||
|
||||
"_layer", "water",
|
||||
"_type", "polygon",
|
||||
"_minzoom", 6,
|
||||
"_maxzoom", 14
|
||||
)), process(polygonFeature(Map.of(
|
||||
"waterway", "riverbank",
|
||||
"bridge", "1",
|
||||
"intermittent", "1"
|
||||
))));
|
||||
assertFeatures(11, List.of(Map.of(
|
||||
"class", "lake",
|
||||
"brunnel", "<null>",
|
||||
"intermittent", 0,
|
||||
|
||||
"_layer", "water",
|
||||
"_type", "polygon",
|
||||
"_minzoom", 6,
|
||||
"_maxzoom", 14,
|
||||
"_minpixelsize", 2d
|
||||
)), process(polygonFeature(Map.of(
|
||||
"landuse", "salt_pond",
|
||||
"bridge", "1"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRiverbank() {
|
||||
assertFeatures(11, List.of(Map.of(
|
||||
"class", "river",
|
||||
"_layer", "water",
|
||||
"_type", "polygon"
|
||||
)), process(polygonFeature(Map.of(
|
||||
"waterway", "riverbank"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRiverk() {
|
||||
assertFeatures(11, List.of(Map.of(
|
||||
"class", "river",
|
||||
"_layer", "water",
|
||||
"_type", "polygon"
|
||||
)), process(polygonFeature(Map.of(
|
||||
"water", "river"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSpring() {
|
||||
assertFeatures(11, List.of(Map.of(
|
||||
"class", "lake",
|
||||
"_layer", "water",
|
||||
"_type", "polygon"
|
||||
)), process(polygonFeature(Map.of(
|
||||
"natural", "spring"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOceanZoomLevels() {
|
||||
assertCoversZoomRange(0, 14, "water",
|
||||
process(SimpleFeature.create(
|
||||
rectangle(0, 10),
|
||||
Map.of(),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_110m_ocean",
|
||||
0
|
||||
)),
|
||||
process(SimpleFeature.create(
|
||||
rectangle(0, 10),
|
||||
Map.of(),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_50m_ocean",
|
||||
0
|
||||
)),
|
||||
process(SimpleFeature.create(
|
||||
rectangle(0, 10),
|
||||
Map.of(),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_10m_ocean",
|
||||
0
|
||||
)),
|
||||
process(SimpleFeature.create(
|
||||
rectangle(0, 10),
|
||||
Map.of(),
|
||||
WATER_POLYGON_SOURCE,
|
||||
null,
|
||||
0
|
||||
))
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLakeZoomLevels() {
|
||||
assertCoversZoomRange(0, 14, "water",
|
||||
process(SimpleFeature.create(
|
||||
rectangle(0, 10),
|
||||
Map.of(),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_110m_lakes",
|
||||
0
|
||||
)),
|
||||
process(SimpleFeature.create(
|
||||
rectangle(0, 10),
|
||||
Map.of(),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_50m_lakes",
|
||||
0
|
||||
)),
|
||||
process(SimpleFeature.create(
|
||||
rectangle(0, 10),
|
||||
Map.of(),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_10m_lakes",
|
||||
0
|
||||
)),
|
||||
process(SimpleFeature.create(
|
||||
rectangle(0, 10),
|
||||
Map.of(
|
||||
"natural", "water",
|
||||
"water", "reservoir"
|
||||
),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
0
|
||||
))
|
||||
);
|
||||
}
|
||||
}
|
|
@ -1,236 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap.layers;
|
||||
|
||||
import static com.onthegomap.planetiler.TestUtils.newLineString;
|
||||
import static com.onthegomap.planetiler.basemap.BasemapProfile.NATURAL_EARTH_SOURCE;
|
||||
import static com.onthegomap.planetiler.basemap.BasemapProfile.OSM_SOURCE;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import com.onthegomap.planetiler.FeatureCollector;
|
||||
import com.onthegomap.planetiler.VectorTile;
|
||||
import com.onthegomap.planetiler.geo.GeometryException;
|
||||
import com.onthegomap.planetiler.reader.SimpleFeature;
|
||||
import com.onthegomap.planetiler.reader.osm.OsmElement;
|
||||
import com.onthegomap.planetiler.reader.osm.OsmReader;
|
||||
import com.onthegomap.planetiler.reader.osm.OsmRelationInfo;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.ValueSource;
|
||||
|
||||
public class WaterwayTest extends AbstractLayerTest {
|
||||
|
||||
@ParameterizedTest
|
||||
@ValueSource(booleans = {false, true})
|
||||
public void testOsmWaterwayRelation(boolean isLongEnough) throws GeometryException {
|
||||
var rel = new OsmElement.Relation(1);
|
||||
rel.setTag("name", "River Relation");
|
||||
rel.setTag("name:es", "ES name");
|
||||
rel.setTag("waterway", "river");
|
||||
|
||||
List<OsmRelationInfo> relationInfos = profile.preprocessOsmRelation(rel);
|
||||
FeatureCollector features = process(SimpleFeature.createFakeOsmFeature(
|
||||
newLineString(0, 0, 0, isLongEnough ? 3 : 1),
|
||||
Map.of(),
|
||||
OSM_SOURCE,
|
||||
null,
|
||||
0,
|
||||
(relationInfos == null ? List.<OsmRelationInfo>of() : relationInfos).stream()
|
||||
.map(r -> new OsmReader.RelationMember<>("", r)).toList()
|
||||
));
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "river",
|
||||
"name", "River Relation",
|
||||
"name:es", "ES name",
|
||||
"_relid", 1L,
|
||||
|
||||
"_layer", "waterway",
|
||||
"_type", "line",
|
||||
"_minzoom", 6,
|
||||
"_maxzoom", 8,
|
||||
"_buffer", 4d
|
||||
)), features);
|
||||
|
||||
// ensure that post-processing combines waterways, and filters out ones that
|
||||
// belong to rivers that are not long enough to be shown
|
||||
var line1 = new VectorTile.Feature(
|
||||
Waterway.LAYER_NAME,
|
||||
1,
|
||||
VectorTile.encodeGeometry(newLineString(0, 0, 10, 0)),
|
||||
mapOf("name", "river", "_relid", 1L),
|
||||
0
|
||||
);
|
||||
var line2 = new VectorTile.Feature(
|
||||
Waterway.LAYER_NAME,
|
||||
1,
|
||||
VectorTile.encodeGeometry(newLineString(10, 0, 20, 0)),
|
||||
mapOf("name", "river", "_relid", 1L),
|
||||
0
|
||||
);
|
||||
var connected = new VectorTile.Feature(
|
||||
Waterway.LAYER_NAME,
|
||||
1,
|
||||
VectorTile.encodeGeometry(newLineString(0, 0, 20, 0)),
|
||||
mapOf("name", "river"),
|
||||
0
|
||||
);
|
||||
|
||||
assertEquals(
|
||||
isLongEnough ? List.of(connected) : List.of(),
|
||||
profile.postProcessLayerFeatures(Waterway.LAYER_NAME, 8, new ArrayList<>(List.of(line1, line2)))
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWaterwayImportantRiverProcess() {
|
||||
var charlesRiver = process(lineFeature(Map.of(
|
||||
"waterway", "river",
|
||||
"name", "charles river",
|
||||
"name:es", "es name"
|
||||
)));
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "river",
|
||||
"name", "charles river",
|
||||
"name:es", "es name",
|
||||
"intermittent", 0,
|
||||
|
||||
"_layer", "waterway",
|
||||
"_type", "line",
|
||||
"_minzoom", 9,
|
||||
"_maxzoom", 14,
|
||||
"_buffer", 4d
|
||||
)), charlesRiver);
|
||||
assertFeatures(11, List.of(Map.of(
|
||||
"class", "river",
|
||||
"name", "charles river",
|
||||
"name:es", "es name",
|
||||
"intermittent", "<null>",
|
||||
"_buffer", 13.082664546679323
|
||||
)), charlesRiver);
|
||||
assertFeatures(10, List.of(Map.of(
|
||||
"class", "river",
|
||||
"_buffer", 26.165329093358647
|
||||
)), charlesRiver);
|
||||
assertFeatures(9, List.of(Map.of(
|
||||
"class", "river",
|
||||
"_buffer", 26.165329093358647
|
||||
)), charlesRiver);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWaterwayImportantRiverPostProcess() throws GeometryException {
|
||||
var line1 = new VectorTile.Feature(
|
||||
Waterway.LAYER_NAME,
|
||||
1,
|
||||
VectorTile.encodeGeometry(newLineString(0, 0, 10, 0)),
|
||||
Map.of("name", "river"),
|
||||
0
|
||||
);
|
||||
var line2 = new VectorTile.Feature(
|
||||
Waterway.LAYER_NAME,
|
||||
1,
|
||||
VectorTile.encodeGeometry(newLineString(10, 0, 20, 0)),
|
||||
Map.of("name", "river"),
|
||||
0
|
||||
);
|
||||
var connected = new VectorTile.Feature(
|
||||
Waterway.LAYER_NAME,
|
||||
1,
|
||||
VectorTile.encodeGeometry(newLineString(0, 0, 20, 0)),
|
||||
Map.of("name", "river"),
|
||||
0
|
||||
);
|
||||
|
||||
assertEquals(
|
||||
List.of(),
|
||||
profile.postProcessLayerFeatures(Waterway.LAYER_NAME, 11, List.of())
|
||||
);
|
||||
assertEquals(
|
||||
List.of(line1, line2),
|
||||
profile.postProcessLayerFeatures(Waterway.LAYER_NAME, 12, List.of(line1, line2))
|
||||
);
|
||||
assertEquals(
|
||||
List.of(connected),
|
||||
profile.postProcessLayerFeatures(Waterway.LAYER_NAME, 11, List.of(line1, line2))
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWaterwaySmaller() {
|
||||
// river with no name is not important
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "river",
|
||||
"brunnel", "bridge",
|
||||
|
||||
"_layer", "waterway",
|
||||
"_type", "line",
|
||||
"_minzoom", 12
|
||||
)), process(lineFeature(Map.of(
|
||||
"waterway", "river",
|
||||
"bridge", "1"
|
||||
))));
|
||||
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "canal",
|
||||
"_layer", "waterway",
|
||||
"_type", "line",
|
||||
"_minzoom", 12
|
||||
)), process(lineFeature(Map.of(
|
||||
"waterway", "canal",
|
||||
"name", "name"
|
||||
))));
|
||||
|
||||
assertFeatures(14, List.of(Map.of(
|
||||
"class", "stream",
|
||||
"_layer", "waterway",
|
||||
"_type", "line",
|
||||
"_minzoom", 13
|
||||
)), process(lineFeature(Map.of(
|
||||
"waterway", "stream",
|
||||
"name", "name"
|
||||
))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWaterwayNaturalEarth() {
|
||||
assertFeatures(3, List.of(Map.of(
|
||||
"class", "river",
|
||||
"name", "<null>",
|
||||
"intermittent", "<null>",
|
||||
|
||||
"_layer", "waterway",
|
||||
"_type", "line",
|
||||
"_minzoom", 3,
|
||||
"_maxzoom", 3
|
||||
)), process(SimpleFeature.create(
|
||||
newLineString(0, 0, 1, 1),
|
||||
Map.of(
|
||||
"featurecla", "River",
|
||||
"name", "name"
|
||||
),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_110m_rivers_lake_centerlines",
|
||||
0
|
||||
)));
|
||||
|
||||
assertFeatures(6, List.of(Map.of(
|
||||
"class", "river",
|
||||
"intermittent", "<null>",
|
||||
|
||||
"_layer", "waterway",
|
||||
"_type", "line",
|
||||
"_minzoom", 4,
|
||||
"_maxzoom", 5
|
||||
)), process(SimpleFeature.create(
|
||||
newLineString(0, 0, 1, 1),
|
||||
Map.of(
|
||||
"featurecla", "River",
|
||||
"name", "name"
|
||||
),
|
||||
NATURAL_EARTH_SOURCE,
|
||||
"ne_50m_rivers_lake_centerlines",
|
||||
0
|
||||
)));
|
||||
}
|
||||
}
|
|
@ -1,193 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap.util;
|
||||
|
||||
import static com.onthegomap.planetiler.TestUtils.assertSubmap;
|
||||
import static com.onthegomap.planetiler.basemap.util.LanguageUtils.containsOnlyLatinCharacters;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
|
||||
import com.onthegomap.planetiler.util.Translations;
|
||||
import com.onthegomap.planetiler.util.Wikidata;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.CsvSource;
|
||||
|
||||
public class LanguageUtilsTest {
|
||||
|
||||
private final Wikidata.WikidataTranslations wikidataTranslations = new Wikidata.WikidataTranslations();
|
||||
private final Translations translations = Translations.defaultProvider(List.of("en", "es", "de"))
|
||||
.addTranslationProvider(wikidataTranslations);
|
||||
|
||||
@Test
|
||||
public void testSimpleExample() {
|
||||
assertSubmap(Map.of(
|
||||
"name", "name",
|
||||
"name_en", "english name",
|
||||
"name_de", "german name"
|
||||
), LanguageUtils.getNames(Map.of(
|
||||
"name", "name",
|
||||
"name:en", "english name",
|
||||
"name:de", "german name"
|
||||
), translations));
|
||||
|
||||
assertSubmap(Map.of(
|
||||
"name", "name",
|
||||
"name_en", "name",
|
||||
"name_de", "german name"
|
||||
), LanguageUtils.getNames(Map.of(
|
||||
"name", "name",
|
||||
"name:de", "german name"
|
||||
), translations));
|
||||
|
||||
assertSubmap(Map.of(
|
||||
"name", "name",
|
||||
"name_en", "english name",
|
||||
"name_de", "name"
|
||||
), LanguageUtils.getNames(Map.of(
|
||||
"name", "name",
|
||||
"name:en", "english name"
|
||||
), translations));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@CsvSource({
|
||||
"abc, true",
|
||||
"5!, true",
|
||||
"5~, true",
|
||||
"é, true",
|
||||
"éś, true",
|
||||
"ɏə, true",
|
||||
"ɐ, false",
|
||||
"ᵿἀ, false",
|
||||
"Ḁỿ, true",
|
||||
"\u02ff\u0370, false",
|
||||
"\u0030\u036f, true",
|
||||
"日本, false",
|
||||
"abc本123, false",
|
||||
})
|
||||
public void testIsLatin(String in, boolean isLatin) {
|
||||
if (!isLatin) {
|
||||
assertFalse(containsOnlyLatinCharacters(in));
|
||||
} else {
|
||||
assertEquals(in, LanguageUtils.getNames(Map.of(
|
||||
"name", in
|
||||
), translations).get("name:latin"));
|
||||
}
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@CsvSource(value = {
|
||||
"abcaāíìś+, null",
|
||||
"abca日āíìś+, 日+",
|
||||
"(abc), null",
|
||||
"日本 (Japan), 日本",
|
||||
"日本 [Japan - Nippon], 日本",
|
||||
" Japan - Nippon (Japan) - Japan - 日本 - Japan - Nippon (Japan), 日本",
|
||||
"Japan - 日本~+ , 日本~+",
|
||||
"Japan / 日本 / Japan , 日本",
|
||||
}, nullValues = "null")
|
||||
public void testRemoveNonLatin(String in, String out) {
|
||||
assertEquals(out, LanguageUtils.getNames(Map.of(
|
||||
"name", in
|
||||
), translations).get("name:nonlatin"));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@CsvSource({
|
||||
"name, a, true",
|
||||
"name:en, a, true",
|
||||
"int_name, a, true",
|
||||
"name:fr, a, true",
|
||||
"name:es, a, true",
|
||||
"name:pt, a, true",
|
||||
"name:de, a, true",
|
||||
"name:ar, ِغَّ, false",
|
||||
"name:it, a, true",
|
||||
"name:jp, ア, false",
|
||||
"name:jp-Latn, a, true",
|
||||
"name:jp_rm, a, true",
|
||||
})
|
||||
public void testLatinFallbacks(String key, String value, boolean use) {
|
||||
assertEquals(use ? value : null, LanguageUtils.getNames(Map.of(
|
||||
key, value
|
||||
), translations).get("name:latin"));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@CsvSource({
|
||||
"キャンパス, kyanpasu",
|
||||
"Αλφαβητικός Κατάλογος, Alphabētikós Katálogos",
|
||||
"биологическом, biologičeskom",
|
||||
})
|
||||
public void testTransliterate(String in, String out) {
|
||||
assertEquals(out, LanguageUtils.getNames(Map.of(
|
||||
"name", in
|
||||
), translations).get("name:latin"));
|
||||
translations.setShouldTransliterate(false);
|
||||
assertNull(LanguageUtils.getNames(Map.of(
|
||||
"name", in
|
||||
), translations).get("name:latin"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUseWikidata() {
|
||||
wikidataTranslations.put(123, "es", "es name");
|
||||
assertSubmap(Map.of(
|
||||
"name:es", "es name"
|
||||
), LanguageUtils.getNames(Map.of(
|
||||
"name", "name",
|
||||
"wikidata", "Q123"
|
||||
), translations));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUseOsm() {
|
||||
assertSubmap(Map.of(
|
||||
"name:es", "es name osm"
|
||||
), LanguageUtils.getNames(Map.of(
|
||||
"name", "name",
|
||||
"wikidata", "Q123",
|
||||
"name:es", "es name osm"
|
||||
), translations));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPreferWikidata() {
|
||||
wikidataTranslations.put(123, "es", "wd es name");
|
||||
assertSubmap(Map.of(
|
||||
"name:es", "wd es name",
|
||||
"name:de", "de name osm"
|
||||
), LanguageUtils.getNames(Map.of(
|
||||
"name", "name",
|
||||
"wikidata", "Q123",
|
||||
"name:es", "es name osm",
|
||||
"name:de", "de name osm"
|
||||
), translations));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDontUseTranslationsWhenNotSpecified() {
|
||||
var result = LanguageUtils.getNamesWithoutTranslations(Map.of(
|
||||
"name", "name",
|
||||
"wikidata", "Q123",
|
||||
"name:es", "es name osm",
|
||||
"name:de", "de name osm"
|
||||
));
|
||||
assertNull(result.get("name:es"));
|
||||
assertNull(result.get("name:de"));
|
||||
assertEquals("name", result.get("name"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIgnoreLanguages() {
|
||||
wikidataTranslations.put(123, "ja", "ja name wd");
|
||||
var result = LanguageUtils.getNamesWithoutTranslations(Map.of(
|
||||
"name", "name",
|
||||
"wikidata", "Q123",
|
||||
"name:ja", "ja name osm"
|
||||
));
|
||||
assertNull(result.get("name:ja"));
|
||||
}
|
||||
}
|
|
@ -1,62 +0,0 @@
|
|||
package com.onthegomap.planetiler.basemap.util;
|
||||
|
||||
import static com.onthegomap.planetiler.geo.GeoUtils.point;
|
||||
import static com.onthegomap.planetiler.util.Gzip.gzip;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import com.onthegomap.planetiler.VectorTile;
|
||||
import com.onthegomap.planetiler.geo.TileCoord;
|
||||
import com.onthegomap.planetiler.mbtiles.Mbtiles;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class VerifyMonacoTest {
|
||||
|
||||
private Mbtiles mbtiles;
|
||||
|
||||
@BeforeEach
|
||||
public void setup() {
|
||||
mbtiles = Mbtiles.newInMemoryDatabase();
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
public void teardown() throws IOException {
|
||||
mbtiles.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEmptyFileInvalid() {
|
||||
assertInvalid(mbtiles);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEmptyTablesInvalid() {
|
||||
mbtiles.createTables().addTileIndex();
|
||||
assertInvalid(mbtiles);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStilInvalidWithOneTile() throws IOException {
|
||||
mbtiles.createTables().addTileIndex();
|
||||
mbtiles.metadata().setName("name");
|
||||
try (var writer = mbtiles.newBatchedTileWriter()) {
|
||||
VectorTile tile = new VectorTile();
|
||||
tile.addLayerFeatures("layer", List.of(new VectorTile.Feature(
|
||||
"layer",
|
||||
1,
|
||||
VectorTile.encodeGeometry(point(0, 0)),
|
||||
Map.of()
|
||||
)));
|
||||
writer.write(TileCoord.ofXYZ(0, 0, 0), gzip(tile.encode()));
|
||||
}
|
||||
assertInvalid(mbtiles);
|
||||
}
|
||||
|
||||
private void assertInvalid(Mbtiles mbtiles) {
|
||||
assertTrue(VerifyMonaco.verify(mbtiles).numErrors() > 0);
|
||||
}
|
||||
}
|
|
@ -9,19 +9,19 @@
|
|||
<parent>
|
||||
<groupId>com.onthegomap.planetiler</groupId>
|
||||
<artifactId>planetiler-parent</artifactId>
|
||||
<version>0.3-SNAPSHOT</version>
|
||||
<version>${revision}</version>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.onthegomap.planetiler</groupId>
|
||||
<artifactId>planetiler-core</artifactId>
|
||||
<version>${project.parent.version}</version>
|
||||
<version>${revision}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.onthegomap.planetiler</groupId>
|
||||
<artifactId>planetiler-basemap</artifactId>
|
||||
<version>${project.parent.version}</version>
|
||||
<groupId>org.openmaptiles</groupId>
|
||||
<artifactId>planetiler-openmaptiles</artifactId>
|
||||
<version>${revision}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
@ -30,7 +30,7 @@
|
|||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-assembly-plugin</artifactId>
|
||||
<version>3.3.0</version>
|
||||
<version>3.7.1</version>
|
||||
<!-- for with-deps assembly descriptor -->
|
||||
<dependencies>
|
||||
<dependency>
|
||||
|
|
|
@ -1,90 +0,0 @@
|
|||
package com.onthegomap.planetiler.benchmarks;
|
||||
|
||||
import com.graphhopper.reader.ReaderElementUtils;
|
||||
import com.graphhopper.reader.ReaderNode;
|
||||
import com.graphhopper.reader.ReaderRelation;
|
||||
import com.graphhopper.reader.ReaderWay;
|
||||
import com.onthegomap.planetiler.basemap.BasemapProfile;
|
||||
import com.onthegomap.planetiler.config.PlanetilerConfig;
|
||||
import com.onthegomap.planetiler.expression.MultiExpression;
|
||||
import com.onthegomap.planetiler.reader.SourceFeature;
|
||||
import com.onthegomap.planetiler.reader.osm.OsmInputFile;
|
||||
import com.onthegomap.planetiler.stats.Stats;
|
||||
import com.onthegomap.planetiler.util.Translations;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
import java.time.Duration;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import org.locationtech.jts.geom.Geometry;
|
||||
|
||||
/**
|
||||
* Performance tests for {@link MultiExpression}. Times how long a sample of elements from an OSM input file take to
|
||||
* match.
|
||||
*/
|
||||
public class BasemapMapping {
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
var profile = new BasemapProfile(Translations.nullProvider(List.of()), PlanetilerConfig.defaults(),
|
||||
Stats.inMemory());
|
||||
var random = new Random(0);
|
||||
var input = new OsmInputFile(Path.of("data", "sources", "north-america_us_massachusetts.pbf"));
|
||||
List<SourceFeature> inputs = new ArrayList<>();
|
||||
input.readTo(readerElem -> {
|
||||
if (random.nextDouble() < 0.2) {
|
||||
if (inputs.size() % 1_000_000 == 0) {
|
||||
System.err.println(inputs.size());
|
||||
}
|
||||
var props = ReaderElementUtils.getTags(readerElem);
|
||||
inputs.add(new SourceFeature(props, "", "", null, readerElem.getId()) {
|
||||
@Override
|
||||
public Geometry latLonGeometry() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Geometry worldGeometry() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPoint() {
|
||||
return readerElem instanceof ReaderNode;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canBePolygon() {
|
||||
return readerElem instanceof ReaderWay || readerElem instanceof ReaderRelation;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canBeLine() {
|
||||
return readerElem instanceof ReaderWay;
|
||||
}
|
||||
});
|
||||
}
|
||||
}, "reader", 3);
|
||||
|
||||
System.err.println("read " + inputs.size() + " elems");
|
||||
|
||||
long startStart = System.nanoTime();
|
||||
long count = -1;
|
||||
while (true) {
|
||||
count++;
|
||||
long start = System.nanoTime();
|
||||
int i = 0;
|
||||
for (SourceFeature in : inputs) {
|
||||
i += profile.getTableMatches(in).size();
|
||||
}
|
||||
if (count == 0) {
|
||||
startStart = System.nanoTime();
|
||||
System.err.println("finished warmup");
|
||||
} else {
|
||||
System.err.println(
|
||||
"took:" + Duration.ofNanos(System.nanoTime() - start).toMillis() + "ms found:" + i + " avg:" + (Duration
|
||||
.ofNanos(System.nanoTime() - startStart).toMillis() / count) + "ms");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,124 @@
|
|||
package com.onthegomap.planetiler.benchmarks;
|
||||
|
||||
import com.google.common.base.Stopwatch;
|
||||
import com.onthegomap.planetiler.config.Arguments;
|
||||
import com.onthegomap.planetiler.geo.TileCoord;
|
||||
import com.onthegomap.planetiler.mbtiles.Mbtiles;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.time.Duration;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class BenchmarkMbtilesRead {
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(BenchmarkMbtilesRead.class);
|
||||
|
||||
private static final String SELECT_RANDOM_COORDS =
|
||||
"select tile_column, tile_row, zoom_level from tiles order by random() limit ?";
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
Arguments arguments = Arguments.fromArgs(args);
|
||||
int repetitions = arguments.getInteger("bench_repetitions", "number of repetitions", 10);
|
||||
int nrTileReads = arguments.getInteger("bench_nr_tile_reads", "number of tiles to read", 500_000);
|
||||
int preWarms = arguments.getInteger("bench_pre_warms", "number of pre warm runs", 3);
|
||||
|
||||
List<Path> mbtilesPaths = arguments.getList("bench_mbtiles", "the mbtiles file to read from", List.of()).stream()
|
||||
.map(Paths::get).toList();
|
||||
|
||||
|
||||
if (mbtilesPaths.isEmpty()) {
|
||||
throw new IllegalArgumentException("pass one or many paths to the same mbtiles file");
|
||||
}
|
||||
|
||||
mbtilesPaths.stream().forEach(p -> {
|
||||
if (!Files.exists(p) || !Files.isRegularFile(p)) {
|
||||
throw new IllegalArgumentException("%s does not exists".formatted(p));
|
||||
}
|
||||
});
|
||||
|
||||
List<TileCoord> randomCoordsToFetchPerRepetition = new LinkedList<>();
|
||||
|
||||
do {
|
||||
try (var db = Mbtiles.newReadOnlyDatabase(mbtilesPaths.getFirst())) {
|
||||
try (var statement = db.connection().prepareStatement(SELECT_RANDOM_COORDS)) {
|
||||
statement.setInt(1, nrTileReads - randomCoordsToFetchPerRepetition.size());
|
||||
var rs = statement.executeQuery();
|
||||
while (rs.next()) {
|
||||
int x = rs.getInt("tile_column");
|
||||
int y = rs.getInt("tile_row");
|
||||
int z = rs.getInt("zoom_level");
|
||||
randomCoordsToFetchPerRepetition.add(TileCoord.ofXYZ(x, (1 << z) - 1 - y, z));
|
||||
}
|
||||
}
|
||||
}
|
||||
} while (randomCoordsToFetchPerRepetition.size() < nrTileReads);
|
||||
|
||||
Map<Path, Double> avgReadOperationsPerSecondPerDb = new HashMap<>();
|
||||
for (Path dbPath : mbtilesPaths) {
|
||||
List<ReadResult> results = new LinkedList<>();
|
||||
|
||||
LOGGER.info("working on {}", dbPath);
|
||||
|
||||
for (int preWarm = 0; preWarm < preWarms; preWarm++) {
|
||||
readEachTile(randomCoordsToFetchPerRepetition, dbPath);
|
||||
}
|
||||
|
||||
for (int rep = 0; rep < repetitions; rep++) {
|
||||
results.add(readEachTile(randomCoordsToFetchPerRepetition, dbPath));
|
||||
}
|
||||
var readOperationsPerSecondStats =
|
||||
results.stream().mapToDouble(ReadResult::readOperationsPerSecond).summaryStatistics();
|
||||
LOGGER.info("readOperationsPerSecondStats: {}", readOperationsPerSecondStats);
|
||||
|
||||
avgReadOperationsPerSecondPerDb.put(dbPath, readOperationsPerSecondStats.getAverage());
|
||||
}
|
||||
|
||||
List<Path> keysSorted = avgReadOperationsPerSecondPerDb.entrySet().stream()
|
||||
.sorted((o1, o2) -> o1.getValue().compareTo(o2.getValue()))
|
||||
.map(Map.Entry::getKey)
|
||||
.toList();
|
||||
|
||||
LOGGER.info("diffs");
|
||||
for (int i = 0; i < keysSorted.size() - 1; i++) {
|
||||
for (int j = i + 1; j < keysSorted.size(); j++) {
|
||||
Path db0 = keysSorted.get(i);
|
||||
double avg0 = avgReadOperationsPerSecondPerDb.get(db0);
|
||||
Path db1 = keysSorted.get(j);
|
||||
double avg1 = avgReadOperationsPerSecondPerDb.get(db1);
|
||||
|
||||
double diff = avg1 * 100 / avg0 - 100;
|
||||
|
||||
LOGGER.info("\"{}\" to \"{}\": avg read operations per second improved by {}%", db0, db1, diff);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static ReadResult readEachTile(List<TileCoord> coordsToFetch, Path dbPath) throws IOException {
|
||||
try (var db = Mbtiles.newReadOnlyDatabase(dbPath)) {
|
||||
db.getTile(0, 0, 0); // trigger prepared statement creation
|
||||
var totalSw = Stopwatch.createStarted();
|
||||
for (var coordToFetch : coordsToFetch) {
|
||||
if (db.getTile(coordToFetch) == null) {
|
||||
throw new IllegalStateException("%s should exist in %s".formatted(coordToFetch, dbPath));
|
||||
}
|
||||
}
|
||||
totalSw.stop();
|
||||
return new ReadResult(totalSw.elapsed(), coordsToFetch.size());
|
||||
}
|
||||
}
|
||||
|
||||
private record ReadResult(Duration duration, int coordsFetchedCount) {
|
||||
double readOperationsPerSecond() {
|
||||
double secondsFractional = duration.toNanos() / 1E9;
|
||||
return coordsFetchedCount / secondsFractional;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,143 @@
|
|||
package com.onthegomap.planetiler.benchmarks;
|
||||
|
||||
import com.google.common.base.Stopwatch;
|
||||
import com.onthegomap.planetiler.archive.TileEncodingResult;
|
||||
import com.onthegomap.planetiler.archive.WriteableTileArchive.TileWriter;
|
||||
import com.onthegomap.planetiler.config.Arguments;
|
||||
import com.onthegomap.planetiler.config.PlanetilerConfig;
|
||||
import com.onthegomap.planetiler.geo.TileCoord;
|
||||
import com.onthegomap.planetiler.mbtiles.Mbtiles;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.DoubleSummaryStatistics;
|
||||
import java.util.OptionalLong;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class BenchmarkMbtilesWriter {
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(BenchmarkMbtilesWriter.class);
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
|
||||
Arguments arguments = Arguments.fromArgs(args);
|
||||
|
||||
int tilesToWrite = arguments.getInteger("bench_tiles_to_write", "number of tiles to write", 1_000_000);
|
||||
int repetitions = arguments.getInteger("bench_repetitions", "number of repetitions", 10);
|
||||
/*
|
||||
* select count(distinct(tile_data_id)) * 100.0 / count(*) from tiles_shallow
|
||||
* => ~8% (Australia)
|
||||
*/
|
||||
int distinctTilesInPercent = arguments.getInteger("bench_distinct_tiles", "distinct tiles in percent", 10);
|
||||
/*
|
||||
* select avg(length(tile_data))
|
||||
* from (select tile_data_id from tiles_shallow group by tile_data_id having count(*) = 1) as x
|
||||
* join tiles_data using(tile_data_id)
|
||||
* => ~785 (Australia)
|
||||
*/
|
||||
int distinctTileDataSize =
|
||||
arguments.getInteger("bench_distinct_tile_data_size", "distinct tile data size in bytes", 800);
|
||||
/*
|
||||
* select avg(length(tile_data))
|
||||
* from (select tile_data_id from tiles_shallow group by tile_data_id having count(*) > 1) as x
|
||||
* join tiles_shallow using(tile_data_id)
|
||||
* join tiles_data using(tile_data_id)
|
||||
* => ~93 (Australia)
|
||||
*/
|
||||
int dupeTileDataSize = arguments.getInteger("bench_dupe_tile_data_size", "dupe tile data size in bytes", 100);
|
||||
/*
|
||||
* select count(*) * 100.0 / sum(usage_count)
|
||||
* from (select tile_data_id, count(*) as usage_count from tiles_shallow group by tile_data_id having count(*) > 1)
|
||||
* => ~0.17% (Australia)
|
||||
*/
|
||||
int dupeSpreadInPercent = arguments.getInteger("bench_dupe_spread", "dupe spread in percent", 10);
|
||||
|
||||
byte[] distinctTileData = createFilledByteArray(distinctTileDataSize);
|
||||
byte[] dupeTileData = createFilledByteArray(dupeTileDataSize);
|
||||
|
||||
PlanetilerConfig config = PlanetilerConfig.from(arguments);
|
||||
|
||||
DoubleSummaryStatistics tileWritesPerSecondsStats = new DoubleSummaryStatistics();
|
||||
|
||||
for (int repetition = 0; repetition < repetitions; repetition++) {
|
||||
|
||||
Path outputPath = getTempOutputPath();
|
||||
try (var mbtiles = Mbtiles.newWriteToFileDatabase(outputPath, config.arguments())) {
|
||||
|
||||
if (mbtiles.skipIndexCreation()) {
|
||||
mbtiles.createTablesWithoutIndexes();
|
||||
} else {
|
||||
mbtiles.createTablesWithIndexes();
|
||||
}
|
||||
|
||||
try (var writer = mbtiles.newTileWriter()) {
|
||||
Stopwatch sw = Stopwatch.createStarted();
|
||||
writeTiles(writer, tilesToWrite, distinctTilesInPercent, distinctTileData, dupeTileData, dupeSpreadInPercent);
|
||||
sw.stop();
|
||||
double secondsFractional = sw.elapsed(TimeUnit.NANOSECONDS) / 1E9;
|
||||
double tileWritesPerSecond = tilesToWrite / secondsFractional;
|
||||
tileWritesPerSecondsStats.accept(tileWritesPerSecond);
|
||||
}
|
||||
|
||||
} finally {
|
||||
Files.delete(outputPath);
|
||||
}
|
||||
}
|
||||
|
||||
LOGGER.info("tileWritesPerSecondsStats: {}", tileWritesPerSecondsStats);
|
||||
}
|
||||
|
||||
|
||||
private static void writeTiles(TileWriter writer, int tilesToWrite, int distinctTilesInPercent,
|
||||
byte[] distinctTileData, byte[] dupeTileData, int dupeSpreadInPercent) {
|
||||
|
||||
int dupesToWrite = (int) Math.round(tilesToWrite * (100 - distinctTilesInPercent) / 100.0);
|
||||
int dupeHashMod = (int) Math.round(dupesToWrite * dupeSpreadInPercent / 100.0);
|
||||
int tilesWritten = 0;
|
||||
int dupeCounter = 0;
|
||||
for (int z = 0; z <= 14; z++) {
|
||||
int maxCoord = 1 << z;
|
||||
for (int x = 0; x < maxCoord; x++) {
|
||||
for (int y = maxCoord - 1; y >= 0; y--) {
|
||||
|
||||
TileCoord coord = TileCoord.ofXYZ(x, y, z);
|
||||
TileEncodingResult toWrite;
|
||||
if (tilesWritten % 100 < distinctTilesInPercent) {
|
||||
toWrite = new TileEncodingResult(coord, distinctTileData, OptionalLong.empty());
|
||||
} else {
|
||||
++dupeCounter;
|
||||
int hash = dupeHashMod == 0 ? 0 : dupeCounter % dupeHashMod;
|
||||
toWrite = new TileEncodingResult(coord, dupeTileData, OptionalLong.of(hash));
|
||||
}
|
||||
|
||||
writer.write(toWrite);
|
||||
|
||||
if (++tilesWritten >= tilesToWrite) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static Path getTempOutputPath() {
|
||||
File f;
|
||||
try {
|
||||
f = File.createTempFile("planetiler", ".mbtiles");
|
||||
} catch (IOException e) {
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
f.deleteOnExit();
|
||||
return f.toPath();
|
||||
}
|
||||
|
||||
private static byte[] createFilledByteArray(int len) {
|
||||
byte[] data = new byte[len];
|
||||
new Random(0).nextBytes(data);
|
||||
return data;
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Ładowanie…
Reference in New Issue