diff --git a/.gitignore b/.gitignore index 80934aa5c..5570f392a 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,9 @@ secrets.properties # This covers new IDEs, like Antigravity .vscode/ **/bin/ -.kotlin/ \ No newline at end of file +.kotlin/ +eval_runs/ +scripts/eval/ +scripts/run_artemis_suite.py +__pycache__/ +*.pyc \ No newline at end of file diff --git a/ApiDemos/project/common-ui/src/main/res/raw/fowler_rattlesnake.gpx b/ApiDemos/project/common-ui/src/main/res/raw/fowler_rattlesnake.gpx new file mode 100644 index 000000000..5da78b33b --- /dev/null +++ b/ApiDemos/project/common-ui/src/main/res/raw/fowler_rattlesnake.gpx @@ -0,0 +1,19101 @@ + + + + + + + + Fowler / Rattlesnake + trail_running + + + 1779.4 + + + + 27 + 88 + 0 + + + + + 1780.4 + + + + 27 + 88 + 0 + + + + + 1781.2 + + + + 27 + 92 + 0 + + + + + 1781.6 + + + + 27 + 94 + 53 + + + + + 1781.8 + + + + 27 + 93 + 0 + + + + + 1782.6 + + + + 27 + 93 + 85 + + + + + 1783.6 + + + + 27 + 94 + 85 + + + + + 1784.8 + + + + 27 + 97 + 90 + + + + + 1785.6 + + + + 27 + 100 + 90 + + + + + 1785.2 + + + + 27 + 103 + 0 + + + + + 1784.6 + + + + 27 + 102 + 0 + + + + + 1784.6 + + + + 27 + 99 + 0 + + + + + 1784.6 + + + + 27 + 98 + 0 + + + + + 1784.6 + + + + 27 + 94 + 0 + + + + + 1784.8 + + + + 27 + 91 + 0 + + + + + 1784.6 + + + + 27 + 94 + 0 + + + + + 1784.8 + + + + 27 + 91 + 0 + + + + + 1784.8 + + + + 27 + 88 + 0 + + + + + 1784.6 + + + + 27 + 88 + 0 + + + + + 1783.8 + + + + 27 + 86 + 0 + + + + + 1783.4 + + + + 27 + 89 + 0 + + + + + 1782.8 + + + + 27 + 89 + 83 + + + + + 1782.6 + + + + 27 + 87 + 82 + + + + + 1782.4 + + + + 27 + 91 + 84 + + + + + 1782.2 + + + + 27 + 95 + 85 + + + + + 1781.8 + + + + 28 + 99 + 86 + + + + + 1781.6 + + + + 28 + 103 + 86 + + + + + 1781.4 + + + + 28 + 106 + 42 + + + + + 1781.4 + + + + 28 + 106 + 42 + + + + + 1781.0 + + + + 28 + 106 + 42 + + + + + 1781.4 + + + + 28 + 103 + 83 + + + + + 1782.2 + + + + 28 + 103 + 86 + + + + + 1782.6 + + + + 28 + 103 + 85 + + + + + 1782.8 + + + + 27 + 106 + 86 + + + + + 1783.2 + + + + 27 + 109 + 87 + + + + + 1783.4 + + + + 27 + 109 + 87 + + + + + 1783.6 + + + + 27 + 111 + 84 + + + + + 1784.2 + + + + 27 + 111 + 86 + + + + + 1785.2 + + + + 27 + 111 + 86 + + + + + 1786.2 + + + + 27 + 113 + 85 + + + + + 1786.4 + + + + 27 + 113 + 85 + + + + + 1787.0 + + + + 27 + 116 + 86 + + + + + 1787.2 + + + + 27 + 117 + 86 + + + + + 1787.6 + + + + 27 + 117 + 86 + + + + + 1788.0 + + + + 27 + 121 + 86 + + + + + 1788.4 + + + + 27 + 124 + 85 + + + + + 1789.2 + + + + 27 + 127 + 86 + + + + + 1789.4 + + + + 27 + 129 + 85 + + + + + 1789.4 + + + + 27 + 129 + 85 + + + + + 1789.6 + + + + 27 + 130 + 86 + + + + + 1789.6 + + + + 27 + 130 + 86 + + + + + 1789.8 + + + + 27 + 131 + 0 + + + + + 1790.2 + + + + 27 + 134 + 0 + + + + + 1790.4 + + + + 27 + 137 + 0 + + + + + 1791.6 + + + + 27 + 138 + 85 + + + + + 1792.8 + + + + 27 + 140 + 86 + + + + + 1793.2 + + + + 27 + 137 + 86 + + + + + 1793.6 + + + + 27 + 137 + 86 + + + + + 1794.0 + + + + 27 + 137 + 86 + + + + + 1794.4 + + + + 27 + 135 + 60 + + + + + 1795.0 + + + + 27 + 136 + 88 + + + + + 1796.2 + + + + 27 + 134 + 87 + + + + + 1797.4 + + + + 27 + 136 + 86 + + + + + 1797.6 + + + + 27 + 136 + 86 + + + + + 1798.6 + + + + 27 + 135 + 86 + + + + + 1799.6 + + + + 27 + 135 + 87 + + + + + 1800.6 + + + + 27 + 135 + 84 + + + + + 1800.8 + + + + 27 + 135 + 84 + + + + + 1801.0 + + + + 27 + 132 + 85 + + + + + 1801.4 + + + + 27 + 135 + 86 + + + + + 1801.6 + + + + 27 + 132 + 85 + + + + + 1801.8 + + + + 27 + 131 + 85 + + + + + 1802.6 + + + + 27 + 134 + 84 + + + + + 1802.8 + + + + 27 + 134 + 84 + + + + + 1803.0 + + + + 27 + 134 + 58 + + + + + 1804.0 + + + + 27 + 135 + 85 + + + + + 1804.6 + + + + 27 + 131 + 85 + + + + + 1805.0 + + + + 27 + 132 + 84 + + + + + 1806.2 + + + + 27 + 131 + 84 + + + + + 1806.4 + + + + 27 + 134 + 84 + + + + + 1806.6 + + + + 27 + 134 + 84 + + + + + 1807.4 + + + + 27 + 136 + 61 + + + + + 1808.0 + + + + 27 + 136 + 61 + + + + + 1808.4 + + + + 27 + 135 + 60 + + + + + 1808.8 + + + + 27 + 133 + 86 + + + + + 1809.6 + + + + 27 + 131 + 85 + + + + + 1809.6 + + + + 27 + 130 + 85 + + + + + 1810.6 + + + + 27 + 127 + 86 + + + + + 1811.0 + + + + 27 + 129 + 86 + + + + + 1811.4 + + + + 27 + 126 + 86 + + + + + 1811.6 + + + + 27 + 126 + 86 + + + + + 1812.6 + + + + 27 + 126 + 86 + + + + + 1813.8 + + + + 27 + 127 + 85 + + + + + 1814.4 + + + + 27 + 128 + 85 + + + + + 1814.6 + + + + 27 + 127 + 85 + + + + + 1815.8 + + + + 27 + 128 + 86 + + + + + 1817.0 + + + + 27 + 129 + 86 + + + + + 1818.0 + + + + 27 + 130 + 86 + + + + + 1818.4 + + + + 27 + 130 + 86 + + + + + 1819.2 + + + + 27 + 131 + 86 + + + + + 1820.0 + + + + 27 + 128 + 85 + + + + + 1820.0 + + + + 27 + 131 + 85 + + + + + 1820.4 + + + + 27 + 133 + 87 + + + + + 1821.4 + + + + 27 + 134 + 85 + + + + + 1821.8 + + + + 27 + 134 + 85 + + + + + 1822.4 + + + + 27 + 133 + 86 + + + + + 1822.6 + + + + 27 + 134 + 86 + + + + + 1823.0 + + + + 27 + 137 + 86 + + + + + 1823.6 + + + + 27 + 142 + 85 + + + + + 1823.6 + + + + 27 + 141 + 85 + + + + + 1823.6 + + + + 27 + 144 + 85 + + + + + 1823.6 + + + + 27 + 145 + 85 + + + + + 1824.6 + + + + 27 + 144 + 85 + + + + + 1824.6 + + + + 27 + 144 + 85 + + + + + 1825.0 + + + + 27 + 148 + 86 + + + + + 1825.6 + + + + 27 + 148 + 86 + + + + + 1826.6 + + + + 27 + 146 + 86 + + + + + 1827.2 + + + + 27 + 146 + 86 + + + + + 1827.8 + + + + 27 + 145 + 86 + + + + + 1828.4 + + + + 27 + 146 + 85 + + + + + 1829.0 + + + + 27 + 148 + 86 + + + + + 1829.4 + + + + 27 + 149 + 86 + + + + + 1830.0 + + + + 27 + 147 + 85 + + + + + 1830.2 + + + + 27 + 146 + 85 + + + + + 1831.2 + + + + 27 + 147 + 85 + + + + + 1831.6 + + + + 27 + 145 + 86 + + + + + 1832.4 + + + + 27 + 143 + 87 + + + + + 1832.6 + + + + 27 + 143 + 87 + + + + + 1833.4 + + + + 27 + 140 + 84 + + + + + 1833.4 + + + + 27 + 143 + 84 + + + + + 1834.4 + + + + 27 + 145 + 87 + + + + + 1835.0 + + + + 27 + 145 + 87 + + + + + 1835.6 + + + + 27 + 146 + 89 + + + + + 1836.0 + + + + 27 + 146 + 89 + + + + + 1836.6 + + + + 27 + 144 + 88 + + + + + 1836.8 + + + + 27 + 145 + 88 + + + + + 1837.0 + + + + 27 + 142 + 86 + + + + + 1837.4 + + + + 27 + 140 + 86 + + + + + 1837.8 + + + + 27 + 144 + 86 + + + + + 1838.0 + + + + 27 + 144 + 86 + + + + + 1838.2 + + + + 27 + 145 + 87 + + + + + 1838.2 + + + + 27 + 145 + 87 + + + + + 1838.6 + + + + 27 + 146 + 86 + + + + + 1838.8 + + + + 27 + 145 + 85 + + + + + 1839.0 + + + + 27 + 145 + 87 + + + + + 1839.8 + + + + 27 + 145 + 86 + + + + + 1840.0 + + + + 27 + 146 + 86 + + + + + 1840.8 + + + + 27 + 144 + 86 + + + + + 1841.4 + + + + 27 + 146 + 87 + + + + + 1842.2 + + + + 27 + 148 + 87 + + + + + 1843.2 + + + + 27 + 146 + 88 + + + + + 1843.6 + + + + 27 + 146 + 88 + + + + + 1844.2 + + + + 27 + 146 + 87 + + + + + 1844.6 + + + + 27 + 146 + 88 + + + + + 1845.2 + + + + 27 + 146 + 87 + + + + + 1846.2 + + + + 27 + 147 + 88 + + + + + 1846.4 + + + + 27 + 147 + 88 + + + + + 1847.6 + + + + 27 + 145 + 86 + + + + + 1847.8 + + + + 27 + 148 + 86 + + + + + 1848.8 + + + + 27 + 149 + 86 + + + + + 1849.8 + + + + 27 + 148 + 86 + + + + + 1850.6 + + + + 27 + 146 + 85 + + + + + 1850.8 + + + + 27 + 147 + 86 + + + + + 1851.8 + + + + 26 + 147 + 86 + + + + + 1851.8 + + + + 26 + 144 + 85 + + + + + 1851.4 + + + + 26 + 143 + 83 + + + + + 1850.8 + + + + 26 + 143 + 84 + + + + + 1850.8 + + + + 26 + 147 + 83 + + + + + 1850.8 + + + + 26 + 146 + 85 + + + + + 1850.6 + + + + 26 + 146 + 85 + + + + + 1850.2 + + + + 26 + 146 + 85 + + + + + 1849.8 + + + + 26 + 143 + 85 + + + + + 1849.8 + + + + 26 + 142 + 83 + + + + + 1849.8 + + + + 26 + 143 + 84 + + + + + 1849.4 + + + + 26 + 144 + 84 + + + + + 1849.6 + + + + 26 + 146 + 85 + + + + + 1850.0 + + + + 26 + 148 + 86 + + + + + 1850.0 + + + + 26 + 145 + 86 + + + + + 1850.2 + + + + 26 + 142 + 85 + + + + + 1850.2 + + + + 26 + 144 + 85 + + + + + 1850.2 + + + + 26 + 141 + 83 + + + + + 1850.2 + + + + 26 + 142 + 84 + + + + + 1850.2 + + + + 26 + 143 + 84 + + + + + 1850.4 + + + + 26 + 143 + 85 + + + + + 1850.8 + + + + 26 + 143 + 86 + + + + + 1851.2 + + + + 26 + 144 + 86 + + + + + 1852.0 + + + + 26 + 147 + 85 + + + + + 1852.2 + + + + 26 + 144 + 84 + + + + + 1852.4 + + + + 26 + 145 + 84 + + + + + 1852.8 + + + + 26 + 144 + 86 + + + + + 1852.6 + + + + 26 + 145 + 87 + + + + + 1852.0 + + + + 26 + 145 + 86 + + + + + 1851.6 + + + + 25 + 141 + 85 + + + + + 1851.4 + + + + 25 + 144 + 85 + + + + + 1851.4 + + + + 25 + 143 + 85 + + + + + 1850.8 + + + + 25 + 142 + 85 + + + + + 1850.8 + + + + 25 + 143 + 85 + + + + + 1850.4 + + + + 25 + 145 + 85 + + + + + 1849.6 + + + + 25 + 145 + 86 + + + + + 1849.6 + + + + 25 + 143 + 85 + + + + + 1850.2 + + + + 25 + 146 + 86 + + + + + 1850.4 + + + + 25 + 143 + 86 + + + + + 1850.8 + + + + 25 + 143 + 86 + + + + + 1851.0 + + + + 25 + 141 + 85 + + + + + 1851.0 + + + + 25 + 139 + 85 + + + + + 1851.2 + + + + 25 + 139 + 86 + + + + + 1851.6 + + + + 25 + 140 + 85 + + + + + 1851.8 + + + + 25 + 140 + 85 + + + + + 1852.4 + + + + 25 + 137 + 85 + + + + + 1852.4 + + + + 25 + 137 + 85 + + + + + 1852.6 + + + + 25 + 142 + 84 + + + + + 1852.6 + + + + 25 + 143 + 85 + + + + + 1852.6 + + + + 25 + 146 + 85 + + + + + 1852.6 + + + + 25 + 147 + 86 + + + + + 1852.8 + + + + 25 + 148 + 86 + + + + + 1853.4 + + + + 25 + 145 + 84 + + + + + 1853.8 + + + + 25 + 145 + 85 + + + + + 1853.8 + + + + 25 + 145 + 86 + + + + + 1854.4 + + + + 25 + 145 + 85 + + + + + 1854.4 + + + + 25 + 142 + 86 + + + + + 1854.8 + + + + 25 + 139 + 85 + + + + + 1854.8 + + + + 25 + 140 + 84 + + + + + 1856.6 + + + + 25 + 142 + 85 + + + + + 1856.8 + + + + 25 + 143 + 85 + + + + + 1856.0 + + + + 25 + 144 + 86 + + + + + 1856.8 + + + + 25 + 144 + 85 + + + + + 1857.2 + + + + 25 + 148 + 87 + + + + + 1857.4 + + + + 25 + 144 + 87 + + + + + 1857.6 + + + + 25 + 144 + 85 + + + + + 1857.6 + + + + 25 + 144 + 85 + + + + + 1858.0 + + + + 25 + 143 + 86 + + + + + 1858.6 + + + + 25 + 143 + 84 + + + + + 1859.2 + + + + 25 + 144 + 83 + + + + + 1859.4 + + + + 25 + 147 + 86 + + + + + 1859.6 + + + + 25 + 146 + 85 + + + + + 1859.6 + + + + 25 + 145 + 85 + + + + + 1859.8 + + + + 25 + 145 + 85 + + + + + 1860.4 + + + + 25 + 142 + 56 + + + + + 1860.6 + + + + 25 + 139 + 0 + + + + + 1860.6 + + + + 25 + 140 + 0 + + + + + 1860.6 + + + + 25 + 138 + 0 + + + + + 1860.8 + + + + 25 + 135 + 0 + + + + + 1860.8 + + + + 25 + 135 + 0 + + + + + 1860.6 + + + + 25 + 131 + 0 + + + + + 1860.6 + + + + 25 + 128 + 51 + + + + + 1860.6 + + + + 25 + 127 + 52 + + + + + 1860.8 + + + + 25 + 124 + 52 + + + + + 1860.8 + + + + 25 + 121 + 51 + + + + + 1860.4 + + + + 25 + 118 + 57 + + + + + 1859.6 + + + + 25 + 116 + 78 + + + + + 1859.0 + + + + 25 + 114 + 82 + + + + + 1859.2 + + + + 25 + 113 + 81 + + + + + 1859.4 + + + + 25 + 113 + 82 + + + + + 1859.4 + + + + 25 + 111 + 80 + + + + + 1859.4 + + + + 25 + 111 + 80 + + + + + 1859.6 + + + + 25 + 111 + 85 + + + + + 1859.6 + + + + 25 + 111 + 85 + + + + + 1859.8 + + + + 25 + 111 + 85 + + + + + 1860.2 + + + + 25 + 114 + 83 + + + + + 1860.2 + + + + 25 + 117 + 83 + + + + + 1860.8 + + + + 25 + 119 + 83 + + + + + 1861.0 + + + + 25 + 120 + 85 + + + + + 1860.2 + + + + 25 + 123 + 79 + + + + + 1860.2 + + + + 25 + 123 + 79 + + + + + 1859.6 + + + + 25 + 123 + 80 + + + + + 1859.4 + + + + 25 + 126 + 85 + + + + + 1859.4 + + + + 25 + 124 + 84 + + + + + 1859.0 + + + + 25 + 127 + 85 + + + + + 1859.0 + + + + 25 + 129 + 85 + + + + + 1859.2 + + + + 25 + 127 + 84 + + + + + 1859.6 + + + + 25 + 127 + 84 + + + + + 1860.6 + + + + 25 + 127 + 41 + + + + + 1860.8 + + + + 25 + 127 + 41 + + + + + 1861.8 + + + + 25 + 127 + 59 + + + + + 1862.0 + + + + 25 + 128 + 58 + + + + + 1862.4 + + + + 25 + 125 + 57 + + + + + 1862.8 + + + + 25 + 126 + 55 + + + + + 1863.0 + + + + 25 + 126 + 61 + + + + + 1863.2 + + + + 25 + 126 + 61 + + + + + 1863.4 + + + + 25 + 126 + 63 + + + + + 1863.4 + + + + 25 + 130 + 80 + + + + + 1863.6 + + + + 25 + 125 + 81 + + + + + 1863.8 + + + + 25 + 126 + 81 + + + + + 1863.8 + + + + 25 + 125 + 82 + + + + + 1863.8 + + + + 25 + 125 + 82 + + + + + 1863.2 + + + + 24 + 128 + 78 + + + + + 1862.8 + + + + 24 + 125 + 74 + + + + + 1862.6 + + + + 24 + 124 + 73 + + + + + 1862.0 + + + + 24 + 124 + 73 + + + + + 1861.6 + + + + 24 + 123 + 73 + + + + + 1861.4 + + + + 24 + 123 + 73 + + + + + 1860.6 + + + + 24 + 124 + 0 + + + + + 1860.4 + + + + 24 + 124 + 76 + + + + + 1860.4 + + + + 24 + 127 + 77 + + + + + 1860.4 + + + + 24 + 124 + 79 + + + + + 1859.4 + + + + 24 + 126 + 82 + + + + + 1858.4 + + + + 24 + 126 + 81 + + + + + 1858.2 + + + + 24 + 129 + 82 + + + + + 1858.0 + + + + 24 + 129 + 83 + + + + + 1858.0 + + + + 24 + 124 + 83 + + + + + 1858.0 + + + + 24 + 125 + 83 + + + + + 1858.2 + + + + 24 + 125 + 83 + + + + + 1859.2 + + + + 24 + 128 + 84 + + + + + 1859.4 + + + + 24 + 127 + 80 + + + + + 1859.4 + + + + 24 + 129 + 80 + + + + + 1859.6 + + + + 24 + 133 + 83 + + + + + 1859.8 + + + + 24 + 132 + 84 + + + + + 1860.0 + + + + 24 + 134 + 84 + + + + + 1860.6 + + + + 24 + 133 + 72 + + + + + 1861.0 + + + + 24 + 135 + 72 + + + + + 1861.6 + + + + 24 + 133 + 59 + + + + + 1861.6 + + + + 24 + 134 + 59 + + + + + 1861.8 + + + + 24 + 128 + 59 + + + + + 1861.8 + + + + 24 + 128 + 59 + + + + + 1862.0 + + + + 24 + 130 + 0 + + + + + 1862.2 + + + + 24 + 131 + 59 + + + + + 1862.8 + + + + 24 + 132 + 59 + + + + + 1863.6 + + + + 24 + 134 + 59 + + + + + 1863.8 + + + + 24 + 133 + 58 + + + + + 1864.0 + + + + 24 + 134 + 58 + + + + + 1864.4 + + + + 24 + 135 + 57 + + + + + 1864.6 + + + + 24 + 135 + 57 + + + + + 1864.8 + + + + 24 + 137 + 56 + + + + + 1864.8 + + + + 24 + 136 + 0 + + + + + 1864.8 + + + + 24 + 134 + 83 + + + + + 1865.2 + + + + 24 + 131 + 59 + + + + + 1865.4 + + + + 24 + 130 + 58 + + + + + 1865.6 + + + + 24 + 127 + 56 + + + + + 1865.8 + + + + 24 + 127 + 56 + + + + + 1865.8 + + + + 24 + 124 + 56 + + + + + 1865.8 + + + + 24 + 123 + 55 + + + + + 1866.0 + + + + 24 + 120 + 55 + + + + + 1866.4 + + + + 24 + 117 + 54 + + + + + 1867.0 + + + + 24 + 117 + 54 + + + + + 1867.2 + + + + 24 + 116 + 57 + + + + + 1867.0 + + + + 24 + 117 + 57 + + + + + 1866.8 + + + + 24 + 116 + 57 + + + + + 1866.8 + + + + 24 + 114 + 57 + + + + + 1866.6 + + + + 24 + 113 + 59 + + + + + 1866.2 + + + + 24 + 112 + 60 + + + + + 1866.0 + + + + 24 + 111 + 60 + + + + + 1865.8 + + + + 24 + 111 + 59 + + + + + 1865.4 + + + + 24 + 108 + 62 + + + + + 1865.2 + + + + 24 + 106 + 63 + + + + + 1865.2 + + + + 24 + 104 + 63 + + + + + 1865.0 + + + + 24 + 105 + 62 + + + + + 1865.0 + + + + 24 + 102 + 61 + + + + + 1864.8 + + + + 24 + 102 + 59 + + + + + 1864.8 + + + + 24 + 105 + 61 + + + + + 1865.0 + + + + 23 + 102 + 0 + + + + + 1865.4 + + + + 23 + 101 + 0 + + + + + 1865.6 + + + + 23 + 100 + 61 + + + + + 1865.8 + + + + 23 + 97 + 61 + + + + + 1866.0 + + + + 23 + 95 + 61 + + + + + 1866.0 + + + + 23 + 90 + 58 + + + + + 1865.8 + + + + 23 + 87 + 58 + + + + + 1865.8 + + + + 23 + 86 + 58 + + + + + 1866.0 + + + + 23 + 85 + 64 + + + + + 1866.6 + + + + 23 + 85 + 86 + + + + + 1867.0 + + + + 23 + 89 + 86 + + + + + 1867.2 + + + + 23 + 91 + 86 + + + + + 1867.2 + + + + 23 + 93 + 86 + + + + + 1867.4 + + + + 23 + 97 + 60 + + + + + 1867.8 + + + + 23 + 96 + 63 + + + + + 1868.0 + + + + 23 + 96 + 0 + + + + + 1868.0 + + + + 23 + 99 + 0 + + + + + 1868.0 + + + + 23 + 99 + 0 + + + + + 1868.0 + + + + 23 + 102 + 61 + + + + + 1868.0 + + + + 23 + 103 + 0 + + + + + 1868.0 + + + + 23 + 103 + 0 + + + + + 1866.8 + + + + 23 + 106 + 81 + + + + + 1866.8 + + + + 23 + 107 + 81 + + + + + 1867.2 + + + + 23 + 106 + 0 + + + + + 1866.8 + + + + 22 + 109 + 0 + + + + + 1866.2 + + + + 22 + 109 + 0 + + + + + 1865.8 + + + + 22 + 106 + 78 + + + + + 1866.0 + + + + 22 + 110 + 81 + + + + + 1866.2 + + + + 22 + 110 + 80 + + + + + 1867.2 + + + + 22 + 111 + 54 + + + + + 1867.6 + + + + 22 + 110 + 58 + + + + + 1868.6 + + + + 22 + 111 + 58 + + + + + 1868.8 + + + + 22 + 111 + 58 + + + + + 1868.8 + + + + 22 + 112 + 58 + + + + + 1869.0 + + + + 22 + 109 + 58 + + + + + 1869.0 + + + + 22 + 112 + 83 + + + + + 1869.0 + + + + 22 + 111 + 83 + + + + + 1869.0 + + + + 22 + 112 + 83 + + + + + 1869.0 + + + + 22 + 113 + 84 + + + + + 1869.6 + + + + 22 + 114 + 84 + + + + + 1870.6 + + + + 22 + 114 + 61 + + + + + 1870.8 + + + + 22 + 112 + 61 + + + + + 1871.2 + + + + 22 + 115 + 58 + + + + + 1870.0 + + + + 22 + 114 + 78 + + + + + 1869.6 + + + + 22 + 114 + 80 + + + + + 1869.0 + + + + 22 + 117 + 79 + + + + + 1868.6 + + + + 22 + 119 + 81 + + + + + 1867.6 + + + + 22 + 122 + 83 + + + + + 1867.4 + + + + 21 + 122 + 84 + + + + + 1866.4 + + + + 21 + 122 + 85 + + + + + 1866.4 + + + + 21 + 119 + 85 + + + + + 1867.2 + + + + 21 + 121 + 83 + + + + + 1866.2 + + + + 21 + 120 + 84 + + + + + 1866.0 + + + + 21 + 121 + 84 + + + + + 1865.8 + + + + 21 + 121 + 84 + + + + + 1866.0 + + + + 21 + 124 + 84 + + + + + 1866.0 + + + + 21 + 123 + 85 + + + + + 1865.8 + + + + 21 + 126 + 85 + + + + + 1865.6 + + + + 21 + 126 + 85 + + + + + 1865.4 + + + + 21 + 126 + 83 + + + + + 1865.4 + + + + 21 + 122 + 83 + + + + + 1865.6 + + + + 21 + 125 + 83 + + + + + 1865.6 + + + + 21 + 128 + 83 + + + + + 1865.6 + + + + 21 + 128 + 84 + + + + + 1865.6 + + + + 20 + 131 + 84 + + + + + 1865.6 + + + + 20 + 132 + 84 + + + + + 1865.4 + + + + 20 + 133 + 84 + + + + + 1865.2 + + + + 20 + 133 + 84 + + + + + 1865.2 + + + + 20 + 133 + 84 + + + + + 1865.4 + + + + 20 + 133 + 84 + + + + + 1865.4 + + + + 20 + 135 + 84 + + + + + 1865.0 + + + + 20 + 132 + 85 + + + + + 1865.0 + + + + 20 + 128 + 84 + + + + + 1865.2 + + + + 20 + 128 + 85 + + + + + 1865.2 + + + + 20 + 131 + 84 + + + + + 1865.0 + + + + 20 + 128 + 84 + + + + + 1864.6 + + + + 20 + 127 + 84 + + + + + 1864.4 + + + + 20 + 126 + 84 + + + + + 1864.2 + + + + 20 + 126 + 84 + + + + + 1864.2 + + + + 20 + 125 + 84 + + + + + 1864.2 + + + + 20 + 122 + 85 + + + + + 1864.2 + + + + 20 + 121 + 85 + + + + + 1864.2 + + + + 20 + 120 + 85 + + + + + 1864.0 + + + + 20 + 120 + 85 + + + + + 1864.2 + + + + 20 + 121 + 85 + + + + + 1864.2 + + + + 20 + 121 + 86 + + + + + 1864.0 + + + + 20 + 120 + 85 + + + + + 1863.8 + + + + 20 + 120 + 84 + + + + + 1863.8 + + + + 20 + 120 + 84 + + + + + 1864.2 + + + + 20 + 119 + 86 + + + + + 1864.0 + + + + 20 + 119 + 85 + + + + + 1864.0 + + + + 20 + 120 + 85 + + + + + 1863.0 + + + + 20 + 121 + 83 + + + + + 1862.6 + + + + 20 + 124 + 84 + + + + + 1862.4 + + + + 20 + 123 + 85 + + + + + 1862.0 + + + + 20 + 124 + 83 + + + + + 1861.6 + + + + 20 + 121 + 84 + + + + + 1860.6 + + + + 20 + 124 + 84 + + + + + 1860.4 + + + + 20 + 127 + 84 + + + + + 1860.4 + + + + 20 + 125 + 84 + + + + + 1860.8 + + + + 20 + 125 + 84 + + + + + 1860.6 + + + + 20 + 124 + 84 + + + + + 1860.2 + + + + 20 + 126 + 84 + + + + + 1860.2 + + + + 20 + 129 + 84 + + + + + 1860.0 + + + + 20 + 132 + 84 + + + + + 1859.6 + + + + 20 + 136 + 85 + + + + + 1859.6 + + + + 20 + 135 + 86 + + + + + 1859.6 + + + + 20 + 135 + 86 + + + + + 1859.8 + + + + 20 + 134 + 84 + + + + + 1859.8 + + + + 20 + 136 + 85 + + + + + 1859.6 + + + + 20 + 136 + 84 + + + + + 1858.6 + + + + 19 + 135 + 84 + + + + + 1858.6 + + + + 19 + 135 + 84 + + + + + 1858.2 + + + + 19 + 133 + 84 + + + + + 1858.2 + + + + 19 + 134 + 84 + + + + + 1859.2 + + + + 19 + 134 + 0 + + + + + 1859.2 + + + + 19 + 137 + 0 + + + + + 1859.2 + + + + 19 + 134 + 0 + + + + + 1859.2 + + + + 19 + 131 + 0 + + + + + 1858.6 + + + + 19 + 129 + 52 + + + + + 1858.0 + + + + 19 + 127 + 86 + + + + + 1857.6 + + + + 19 + 130 + 85 + + + + + 1857.4 + + + + 19 + 128 + 85 + + + + + 1857.4 + + + + 19 + 129 + 84 + + + + + 1857.4 + + + + 19 + 129 + 84 + + + + + 1857.4 + + + + 19 + 129 + 84 + + + + + 1857.4 + + + + 19 + 129 + 84 + + + + + 1857.0 + + + + 19 + 132 + 84 + + + + + 1856.8 + + + + 19 + 135 + 84 + + + + + 1857.0 + + + + 19 + 133 + 84 + + + + + 1857.4 + + + + 19 + 130 + 84 + + + + + 1857.4 + + + + 19 + 131 + 84 + + + + + 1857.4 + + + + 19 + 131 + 84 + + + + + 1857.6 + + + + 19 + 130 + 84 + + + + + 1857.8 + + + + 19 + 131 + 84 + + + + + 1857.6 + + + + 19 + 131 + 84 + + + + + 1857.6 + + + + 19 + 132 + 63 + + + + + 1857.6 + + + + 19 + 130 + 0 + + + + + 1857.4 + + + + 19 + 127 + 0 + + + + + 1857.2 + + + + 19 + 123 + 0 + + + + + 1857.0 + + + + 19 + 124 + 83 + + + + + 1856.8 + + + + 19 + 127 + 85 + + + + + 1856.6 + + + + 19 + 126 + 86 + + + + + 1856.4 + + + + 19 + 126 + 85 + + + + + 1856.0 + + + + 19 + 125 + 83 + + + + + 1855.8 + + + + 19 + 129 + 83 + + + + + 1855.8 + + + + 19 + 133 + 85 + + + + + 1855.6 + + + + 19 + 136 + 84 + + + + + 1855.4 + + + + 19 + 138 + 85 + + + + + 1855.4 + + + + 19 + 141 + 85 + + + + + 1855.8 + + + + 19 + 141 + 84 + + + + + 1855.8 + + + + 19 + 143 + 84 + + + + + 1855.8 + + + + 19 + 142 + 57 + + + + + 1856.0 + + + + 19 + 139 + 58 + + + + + 1856.0 + + + + 19 + 136 + 0 + + + + + 1856.2 + + + + 19 + 135 + 0 + + + + + 1856.0 + + + + 19 + 132 + 0 + + + + + 1856.0 + + + + 19 + 132 + 0 + + + + + 1856.0 + + + + 19 + 129 + 0 + + + + + 1855.8 + + + + 19 + 128 + 0 + + + + + 1855.8 + + + + 19 + 125 + 0 + + + + + 1855.8 + + + + 19 + 122 + 0 + + + + + 1855.4 + + + + 19 + 123 + 0 + + + + + 1855.0 + + + + 19 + 120 + 0 + + + + + 1855.0 + + + + 20 + 117 + 0 + + + + + 1854.8 + + + + 20 + 115 + 0 + + + + + 1854.6 + + + + 20 + 114 + 0 + + + + + 1854.6 + + + + 20 + 114 + 0 + + + + + 1854.6 + + + + 20 + 114 + 0 + + + + + 1854.4 + + + + 20 + 110 + 0 + + + + + 1854.4 + + + + 20 + 112 + 0 + + + + + 1854.4 + + + + 20 + 111 + 0 + + + + + 1854.4 + + + + 20 + 108 + 0 + + + + + 1854.2 + + + + 20 + 107 + 0 + + + + + 1854.0 + + + + 20 + 106 + 0 + + + + + 1854.0 + + + + 20 + 103 + 0 + + + + + 1854.0 + + + + 20 + 104 + 0 + + + + + 1854.0 + + + + 20 + 101 + 0 + + + + + 1854.0 + + + + 20 + 101 + 0 + + + + + 1854.0 + + + + 20 + 100 + 0 + + + + + 1854.0 + + + + 20 + 100 + 0 + + + + + 1853.8 + + + + 20 + 100 + 0 + + + + + 1853.8 + + + + 20 + 97 + 0 + + + + + 1853.8 + + + + 20 + 97 + 0 + + + + + 1854.2 + + + + 20 + 96 + 0 + + + + + 1854.2 + + + + 20 + 96 + 0 + + + + + 1854.2 + + + + 21 + 97 + 0 + + + + + 1854.2 + + + + 21 + 98 + 0 + + + + + 1854.0 + + + + 21 + 98 + 0 + + + + + 1853.8 + + + + 21 + 95 + 0 + + + + + 1853.8 + + + + 21 + 96 + 56 + + + + + 1853.8 + + + + 21 + 96 + 56 + + + + + 1853.6 + + + + 21 + 96 + 57 + + + + + 1854.2 + + + + 21 + 95 + 86 + + + + + 1854.2 + + + + 21 + 99 + 0 + + + + + 1854.2 + + + + 21 + 103 + 0 + + + + + 1854.2 + + + + 21 + 97 + 52 + + + + + 1854.2 + + + + 21 + 99 + 52 + + + + + 1854.2 + + + + 21 + 97 + 54 + + + + + 1854.4 + + + + 21 + 95 + 52 + + + + + 1854.6 + + + + 21 + 93 + 50 + + + + + 1854.6 + + + + 21 + 93 + 50 + + + + + 1854.8 + + + + 21 + 92 + 0 + + + + + 1854.8 + + + + 21 + 91 + 52 + + + + + 1855.2 + + + + 21 + 88 + 56 + + + + + 1855.2 + + + + 21 + 85 + 55 + + + + + 1855.4 + + + + 21 + 87 + 55 + + + + + 1855.4 + + + + 21 + 85 + 87 + + + + + 1855.6 + + + + 21 + 88 + 87 + + + + + 1856.0 + + + + 21 + 90 + 87 + + + + + 1856.2 + + + + 21 + 96 + 86 + + + + + 1856.2 + + + + 21 + 93 + 85 + + + + + 1856.2 + + + + 21 + 97 + 85 + + + + + 1856.2 + + + + 21 + 97 + 85 + + + + + 1856.4 + + + + 21 + 100 + 86 + + + + + 1856.4 + + + + 21 + 104 + 84 + + + + + 1856.6 + + + + 21 + 108 + 87 + + + + + 1856.6 + + + + 21 + 107 + 85 + + + + + 1856.6 + + + + 21 + 111 + 84 + + + + + 1856.8 + + + + 21 + 114 + 83 + + + + + 1857.0 + + + + 21 + 117 + 86 + + + + + 1857.2 + + + + 21 + 120 + 86 + + + + + 1857.2 + + + + 21 + 119 + 86 + + + + + 1857.4 + + + + 21 + 120 + 84 + + + + + 1857.6 + + + + 21 + 120 + 84 + + + + + 1857.8 + + + + 21 + 123 + 84 + + + + + 1857.8 + + + + 21 + 123 + 85 + + + + + 1858.0 + + + + 21 + 124 + 85 + + + + + 1858.2 + + + + 21 + 127 + 85 + + + + + 1858.2 + + + + 21 + 125 + 85 + + + + + 1858.4 + + + + 21 + 128 + 85 + + + + + 1858.6 + + + + 21 + 129 + 85 + + + + + 1859.0 + + + + 21 + 131 + 0 + + + + + 1859.8 + + + + 21 + 133 + 74 + + + + + 1860.6 + + + + 21 + 135 + 72 + + + + + 1860.8 + + + + 21 + 135 + 0 + + + + + 1861.0 + + + + 21 + 135 + 0 + + + + + 1861.0 + + + + 21 + 136 + 0 + + + + + 1861.8 + + + + 21 + 137 + 0 + + + + + 1862.0 + + + + 21 + 137 + 0 + + + + + 1862.2 + + + + 21 + 138 + 0 + + + + + 1862.6 + + + + 21 + 139 + 78 + + + + + 1863.0 + + + + 21 + 139 + 79 + + + + + 1863.2 + + + + 21 + 139 + 79 + + + + + 1863.4 + + + + 21 + 139 + 79 + + + + + 1863.6 + + + + 21 + 139 + 79 + + + + + 1864.0 + + + + 21 + 137 + 79 + + + + + 1864.2 + + + + 21 + 137 + 79 + + + + + 1864.6 + + + + 21 + 137 + 59 + + + + + 1865.0 + + + + 21 + 136 + 59 + + + + + 1865.2 + + + + 21 + 136 + 59 + + + + + 1865.8 + + + + 21 + 136 + 59 + + + + + 1866.2 + + + + 21 + 134 + 0 + + + + + 1866.2 + + + + 21 + 133 + 0 + + + + + 1866.2 + + + + 21 + 131 + 84 + + + + + 1866.2 + + + + 21 + 131 + 84 + + + + + 1866.6 + + + + 21 + 128 + 84 + + + + + 1867.2 + + + + 21 + 127 + 84 + + + + + 1867.4 + + + + 21 + 128 + 84 + + + + + 1867.6 + + + + 21 + 124 + 41 + + + + + 1867.8 + + + + 21 + 129 + 41 + + + + + 1868.2 + + + + 20 + 129 + 41 + + + + + 1868.4 + + + + 20 + 130 + 41 + + + + + 1869.4 + + + + 20 + 132 + 60 + + + + + 1870.0 + + + + 20 + 132 + 52 + + + + + 1870.4 + + + + 20 + 132 + 80 + + + + + 1871.2 + + + + 20 + 132 + 68 + + + + + 1871.4 + + + + 20 + 130 + 0 + + + + + 1872.0 + + + + 20 + 129 + 85 + + + + + 1872.2 + + + + 20 + 129 + 85 + + + + + 1872.6 + + + + 20 + 129 + 86 + + + + + 1873.0 + + + + 20 + 129 + 86 + + + + + 1873.2 + + + + 20 + 129 + 86 + + + + + 1873.6 + + + + 20 + 130 + 85 + + + + + 1873.8 + + + + 20 + 130 + 86 + + + + + 1875.0 + + + + 20 + 130 + 41 + + + + + 1876.2 + + + + 20 + 129 + 0 + + + + + 1876.2 + + + + 20 + 127 + 59 + + + + + 1877.2 + + + + 20 + 127 + 59 + + + + + 1877.8 + + + + 20 + 127 + 0 + + + + + 1878.4 + + + + 20 + 127 + 0 + + + + + 1879.4 + + + + 20 + 126 + 0 + + + + + 1880.6 + + + + 20 + 124 + 52 + + + + + 1880.6 + + + + 20 + 125 + 52 + + + + + 1880.8 + + + + 20 + 124 + 52 + + + + + 1881.0 + + + + 20 + 125 + 52 + + + + + 1881.4 + + + + 20 + 126 + 54 + + + + + 1881.6 + + + + 20 + 125 + 54 + + + + + 1882.6 + + + + 20 + 127 + 55 + + + + + 1882.6 + + + + 20 + 127 + 55 + + + + + 1883.8 + + + + 20 + 127 + 52 + + + + + 1884.0 + + + + 20 + 127 + 52 + + + + + 1884.6 + + + + 20 + 129 + 52 + + + + + 1885.0 + + + + 20 + 129 + 84 + + + + + 1885.2 + + + + 20 + 129 + 84 + + + + + 1886.0 + + + + 20 + 127 + 83 + + + + + 1886.6 + + + + 20 + 126 + 78 + + + + + 1886.8 + + + + 20 + 128 + 59 + + + + + 1887.2 + + + + 20 + 127 + 59 + + + + + 1887.6 + + + + 20 + 127 + 56 + + + + + 1887.8 + + + + 20 + 126 + 54 + + + + + 1887.8 + + + + 20 + 125 + 53 + + + + + 1888.4 + + + + 20 + 124 + 52 + + + + + 1889.0 + + + + 20 + 121 + 54 + + + + + 1889.4 + + + + 20 + 119 + 54 + + + + + 1890.4 + + + + 20 + 118 + 78 + + + + + 1891.0 + + + + 20 + 116 + 82 + + + + + 1891.4 + + + + 20 + 119 + 83 + + + + + 1891.6 + + + + 20 + 117 + 83 + + + + + 1892.2 + + + + 20 + 117 + 83 + + + + + 1892.6 + + + + 20 + 117 + 57 + + + + + 1892.8 + + + + 20 + 117 + 57 + + + + + 1893.2 + + + + 20 + 118 + 55 + + + + + 1893.8 + + + + 20 + 118 + 55 + + + + + 1894.4 + + + + 20 + 120 + 54 + + + + + 1894.8 + + + + 20 + 121 + 52 + + + + + 1894.8 + + + + 20 + 122 + 52 + + + + + 1895.2 + + + + 20 + 122 + 52 + + + + + 1895.8 + + + + 20 + 121 + 52 + + + + + 1896.6 + + + + 20 + 120 + 52 + + + + + 1897.0 + + + + 20 + 120 + 54 + + + + + 1898.0 + + + + 20 + 121 + 52 + + + + + 1898.4 + + + + 20 + 122 + 45 + + + + + 1899.0 + + + + 20 + 122 + 51 + + + + + 1900.2 + + + + 20 + 123 + 0 + + + + + 1901.2 + + + + 20 + 123 + 0 + + + + + 1901.6 + + + + 20 + 121 + 53 + + + + + 1902.4 + + + + 20 + 121 + 55 + + + + + 1903.4 + + + + 20 + 121 + 56 + + + + + 1903.8 + + + + 20 + 120 + 56 + + + + + 1904.6 + + + + 20 + 122 + 53 + + + + + 1905.0 + + + + 20 + 124 + 54 + + + + + 1905.6 + + + + 20 + 125 + 56 + + + + + 1906.2 + + + + 20 + 124 + 56 + + + + + 1906.8 + + + + 20 + 123 + 55 + + + + + 1907.8 + + + + 20 + 123 + 52 + + + + + 1908.2 + + + + 20 + 122 + 52 + + + + + 1909.0 + + + + 20 + 122 + 54 + + + + + 1909.2 + + + + 20 + 123 + 54 + + + + + 1909.4 + + + + 20 + 123 + 54 + + + + + 1910.0 + + + + 20 + 124 + 52 + + + + + 1910.6 + + + + 20 + 124 + 49 + + + + + 1910.6 + + + + 20 + 123 + 49 + + + + + 1911.2 + + + + 20 + 122 + 53 + + + + + 1911.8 + + + + 20 + 122 + 50 + + + + + 1912.4 + + + + 20 + 123 + 56 + + + + + 1912.4 + + + + 20 + 123 + 57 + + + + + 1912.4 + + + + 20 + 120 + 56 + + + + + 1912.4 + + + + 20 + 117 + 58 + + + + + 1912.2 + + + + 20 + 114 + 61 + + + + + 1912.2 + + + + 20 + 113 + 61 + + + + + 1912.2 + + + + 20 + 110 + 60 + + + + + 1912.2 + + + + 20 + 107 + 59 + + + + + 1912.0 + + + + 20 + 104 + 58 + + + + + 1912.0 + + + + 20 + 104 + 58 + + + + + 1912.2 + + + + 20 + 101 + 56 + + + + + 1912.6 + + + + 20 + 102 + 58 + + + + + 1912.8 + + + + 20 + 101 + 56 + + + + + 1913.0 + + + + 20 + 98 + 56 + + + + + 1913.4 + + + + 20 + 99 + 55 + + + + + 1914.0 + + + + 20 + 99 + 55 + + + + + 1914.2 + + + + 20 + 102 + 55 + + + + + 1914.6 + + + + 20 + 104 + 54 + + + + + 1915.0 + + + + 20 + 105 + 56 + + + + + 1915.2 + + + + 20 + 106 + 56 + + + + + 1915.8 + + + + 20 + 107 + 56 + + + + + 1916.4 + + + + 20 + 110 + 53 + + + + + 1916.8 + + + + 20 + 110 + 53 + + + + + 1917.0 + + + + 20 + 110 + 55 + + + + + 1917.8 + + + + 20 + 112 + 58 + + + + + 1918.2 + + + + 20 + 112 + 56 + + + + + 1919.0 + + + + 20 + 114 + 56 + + + + + 1920.0 + + + + 20 + 113 + 58 + + + + + 1920.2 + + + + 20 + 113 + 58 + + + + + 1920.6 + + + + 20 + 114 + 57 + + + + + 1921.2 + + + + 20 + 115 + 55 + + + + + 1921.4 + + + + 20 + 115 + 54 + + + + + 1922.0 + + + + 20 + 115 + 54 + + + + + 1922.2 + + + + 20 + 115 + 55 + + + + + 1922.6 + + + + 20 + 116 + 55 + + + + + 1923.4 + + + + 20 + 118 + 55 + + + + + 1924.0 + + + + 20 + 119 + 55 + + + + + 1924.6 + + + + 20 + 120 + 53 + + + + + 1925.2 + + + + 20 + 121 + 55 + + + + + 1925.8 + + + + 20 + 121 + 55 + + + + + 1926.8 + + + + 20 + 122 + 55 + + + + + 1927.0 + + + + 20 + 122 + 54 + + + + + 1927.8 + + + + 20 + 122 + 54 + + + + + 1928.2 + + + + 20 + 122 + 54 + + + + + 1928.8 + + + + 20 + 123 + 55 + + + + + 1929.6 + + + + 20 + 123 + 54 + + + + + 1930.0 + + + + 20 + 123 + 55 + + + + + 1930.6 + + + + 20 + 121 + 53 + + + + + 1930.8 + + + + 20 + 120 + 52 + + + + + 1931.0 + + + + 20 + 119 + 51 + + + + + 1931.2 + + + + 20 + 119 + 51 + + + + + 1931.8 + + + + 20 + 118 + 49 + + + + + 1932.2 + + + + 20 + 118 + 49 + + + + + 1932.6 + + + + 20 + 120 + 51 + + + + + 1933.4 + + + + 20 + 122 + 51 + + + + + 1934.2 + + + + 20 + 123 + 50 + + + + + 1934.4 + + + + 20 + 123 + 52 + + + + + 1935.2 + + + + 20 + 124 + 55 + + + + + 1935.4 + + + + 20 + 124 + 54 + + + + + 1935.6 + + + + 20 + 124 + 54 + + + + + 1936.4 + + + + 20 + 122 + 56 + + + + + 1936.6 + + + + 20 + 122 + 56 + + + + + 1937.0 + + + + 20 + 119 + 57 + + + + + 1937.6 + + + + 20 + 118 + 56 + + + + + 1937.8 + + + + 20 + 118 + 56 + + + + + 1938.6 + + + + 20 + 118 + 54 + + + + + 1938.8 + + + + 20 + 118 + 52 + + + + + 1939.6 + + + + 20 + 118 + 53 + + + + + 1940.0 + + + + 20 + 119 + 53 + + + + + 1941.0 + + + + 20 + 120 + 54 + + + + + 1941.2 + + + + 20 + 121 + 54 + + + + + 1942.2 + + + + 20 + 120 + 55 + + + + + 1942.4 + + + + 20 + 120 + 56 + + + + + 1942.8 + + + + 20 + 123 + 58 + + + + + 1943.4 + + + + 20 + 120 + 57 + + + + + 1944.2 + + + + 20 + 120 + 56 + + + + + 1944.4 + + + + 20 + 121 + 0 + + + + + 1945.6 + + + + 20 + 121 + 0 + + + + + 1945.6 + + + + 20 + 121 + 55 + + + + + 1946.6 + + + + 20 + 121 + 55 + + + + + 1947.6 + + + + 20 + 120 + 55 + + + + + 1947.8 + + + + 20 + 120 + 55 + + + + + 1949.0 + + + + 20 + 122 + 55 + + + + + 1949.6 + + + + 20 + 123 + 56 + + + + + 1950.0 + + + + 20 + 123 + 56 + + + + + 1950.8 + + + + 20 + 122 + 56 + + + + + 1951.0 + + + + 20 + 121 + 56 + + + + + 1951.0 + + + + 20 + 120 + 55 + + + + + 1951.2 + + + + 20 + 119 + 54 + + + + + 1951.4 + + + + 20 + 117 + 55 + + + + + 1952.2 + + + + 20 + 117 + 52 + + + + + 1953.0 + + + + 20 + 117 + 53 + + + + + 1953.2 + + + + 20 + 117 + 57 + + + + + 1953.4 + + + + 20 + 118 + 57 + + + + + 1953.4 + + + + 20 + 121 + 58 + + + + + 1953.4 + + + + 20 + 122 + 58 + + + + + 1954.4 + + + + 20 + 123 + 48 + + + + + 1954.8 + + + + 20 + 122 + 51 + + + + + 1955.2 + + + + 20 + 121 + 54 + + + + + 1955.6 + + + + 20 + 119 + 54 + + + + + 1956.0 + + + + 20 + 119 + 53 + + + + + 1956.6 + + + + 20 + 118 + 53 + + + + + 1957.2 + + + + 20 + 119 + 49 + + + + + 1957.6 + + + + 20 + 119 + 51 + + + + + 1958.0 + + + + 20 + 120 + 53 + + + + + 1958.8 + + + + 20 + 120 + 54 + + + + + 1959.2 + + + + 20 + 120 + 54 + + + + + 1960.0 + + + + 20 + 120 + 54 + + + + + 1961.0 + + + + 20 + 119 + 54 + + + + + 1962.0 + + + + 20 + 118 + 54 + + + + + 1962.4 + + + + 20 + 113 + 52 + + + + + 1962.6 + + + + 20 + 118 + 51 + + + + + 1962.6 + + + + 20 + 118 + 51 + + + + + 1963.0 + + + + 20 + 118 + 54 + + + + + 1963.4 + + + + 20 + 119 + 54 + + + + + 1963.6 + + + + 20 + 119 + 53 + + + + + 1964.0 + + + + 20 + 118 + 53 + + + + + 1964.4 + + + + 20 + 119 + 52 + + + + + 1964.8 + + + + 20 + 116 + 52 + + + + + 1965.2 + + + + 20 + 118 + 52 + + + + + 1966.0 + + + + 20 + 118 + 54 + + + + + 1966.2 + + + + 20 + 118 + 54 + + + + + 1966.4 + + + + 20 + 119 + 55 + + + + + 1966.4 + + + + 20 + 119 + 55 + + + + + 1967.4 + + + + 20 + 119 + 54 + + + + + 1968.2 + + + + 20 + 119 + 55 + + + + + 1968.4 + + + + 20 + 120 + 55 + + + + + 1968.6 + + + + 20 + 120 + 56 + + + + + 1969.4 + + + + 20 + 121 + 56 + + + + + 1969.6 + + + + 20 + 121 + 57 + + + + + 1970.6 + + + + 20 + 120 + 53 + + + + + 1970.8 + + + + 20 + 120 + 51 + + + + + 1971.6 + + + + 20 + 119 + 55 + + + + + 1972.2 + + + + 20 + 119 + 56 + + + + + 1972.6 + + + + 20 + 119 + 56 + + + + + 1972.8 + + + + 20 + 119 + 55 + + + + + 1973.8 + + + + 20 + 117 + 55 + + + + + 1974.4 + + + + 20 + 115 + 56 + + + + + 1975.0 + + + + 20 + 115 + 52 + + + + + 1975.2 + + + + 20 + 114 + 52 + + + + + 1975.6 + + + + 20 + 114 + 52 + + + + + 1976.2 + + + + 20 + 115 + 52 + + + + + 1976.4 + + + + 20 + 117 + 54 + + + + + 1976.6 + + + + 20 + 119 + 54 + + + + + 1977.2 + + + + 20 + 120 + 52 + + + + + 1977.6 + + + + 20 + 121 + 53 + + + + + 1977.8 + + + + 20 + 121 + 54 + + + + + 1978.0 + + + + 20 + 122 + 55 + + + + + 1978.4 + + + + 20 + 121 + 55 + + + + + 1978.6 + + + + 20 + 121 + 55 + + + + + 1978.8 + + + + 20 + 121 + 55 + + + + + 1979.4 + + + + 20 + 121 + 55 + + + + + 1980.0 + + + + 20 + 119 + 54 + + + + + 1980.2 + + + + 20 + 119 + 54 + + + + + 1980.4 + + + + 20 + 119 + 54 + + + + + 1981.0 + + + + 20 + 119 + 54 + + + + + 1981.2 + + + + 20 + 120 + 54 + + + + + 1981.6 + + + + 20 + 120 + 52 + + + + + 1982.4 + + + + 20 + 119 + 54 + + + + + 1982.6 + + + + 20 + 119 + 53 + + + + + 1982.6 + + + + 20 + 118 + 53 + + + + + 1983.2 + + + + 20 + 118 + 49 + + + + + 1983.8 + + + + 20 + 118 + 49 + + + + + 1984.8 + + + + 20 + 119 + 0 + + + + + 1985.6 + + + + 20 + 117 + 52 + + + + + 1985.8 + + + + 20 + 117 + 52 + + + + + 1987.0 + + + + 20 + 115 + 54 + + + + + 1987.2 + + + + 20 + 115 + 53 + + + + + 1988.2 + + + + 20 + 116 + 52 + + + + + 1989.0 + + + + 20 + 119 + 53 + + + + + 1989.2 + + + + 20 + 120 + 54 + + + + + 1990.4 + + + + 20 + 121 + 52 + + + + + 1991.4 + + + + 20 + 121 + 53 + + + + + 1991.8 + + + + 20 + 120 + 54 + + + + + 1992.4 + + + + 20 + 119 + 53 + + + + + 1993.0 + + + + 20 + 119 + 53 + + + + + 1993.4 + + + + 20 + 119 + 54 + + + + + 1994.2 + + + + 20 + 118 + 53 + + + + + 1994.6 + + + + 20 + 117 + 52 + + + + + 1994.8 + + + + 20 + 117 + 52 + + + + + 1995.6 + + + + 20 + 117 + 51 + + + + + 1996.8 + + + + 20 + 118 + 52 + + + + + 1997.0 + + + + 20 + 118 + 52 + + + + + 1997.8 + + + + 20 + 118 + 51 + + + + + 1998.4 + + + + 20 + 120 + 51 + + + + + 1999.0 + + + + 20 + 120 + 51 + + + + + 1999.6 + + + + 20 + 122 + 52 + + + + + 2000.2 + + + + 20 + 121 + 52 + + + + + 2001.0 + + + + 20 + 118 + 53 + + + + + 2001.2 + + + + 20 + 118 + 53 + + + + + 2001.4 + + + + 20 + 118 + 53 + + + + + 2001.8 + + + + 20 + 117 + 52 + + + + + 2002.2 + + + + 20 + 117 + 51 + + + + + 2002.4 + + + + 20 + 117 + 51 + + + + + 2002.4 + + + + 20 + 117 + 51 + + + + + 2003.4 + + + + 20 + 117 + 55 + + + + + 2003.8 + + + + 20 + 117 + 56 + + + + + 2004.4 + + + + 20 + 118 + 56 + + + + + 2004.6 + + + + 20 + 118 + 56 + + + + + 2005.0 + + + + 20 + 118 + 55 + + + + + 2005.8 + + + + 20 + 120 + 52 + + + + + 2006.0 + + + + 20 + 121 + 54 + + + + + 2007.0 + + + + 20 + 122 + 59 + + + + + 2008.0 + + + + 20 + 122 + 60 + + + + + 2008.2 + + + + 20 + 122 + 58 + + + + + 2009.0 + + + + 20 + 122 + 56 + + + + + 2009.2 + + + + 20 + 124 + 56 + + + + + 2010.0 + + + + 20 + 124 + 58 + + + + + 2010.6 + + + + 20 + 124 + 58 + + + + + 2011.2 + + + + 20 + 122 + 56 + + + + + 2011.8 + + + + 20 + 120 + 58 + + + + + 2012.4 + + + + 20 + 119 + 58 + + + + + 2013.4 + + + + 20 + 118 + 57 + + + + + 2013.4 + + + + 20 + 118 + 57 + + + + + 2014.6 + + + + 20 + 117 + 59 + + + + + 2014.8 + + + + 20 + 117 + 59 + + + + + 2015.6 + + + + 20 + 116 + 60 + + + + + 2016.2 + + + + 20 + 116 + 58 + + + + + 2016.6 + + + + 20 + 116 + 56 + + + + + 2017.4 + + + + 20 + 117 + 56 + + + + + 2017.8 + + + + 20 + 117 + 56 + + + + + 2018.0 + + + + 20 + 118 + 56 + + + + + 2018.2 + + + + 20 + 115 + 56 + + + + + 2018.4 + + + + 20 + 118 + 56 + + + + + 2018.6 + + + + 20 + 118 + 56 + + + + + 2019.0 + + + + 20 + 118 + 56 + + + + + 2019.8 + + + + 20 + 118 + 55 + + + + + 2020.0 + + + + 20 + 117 + 56 + + + + + 2020.4 + + + + 20 + 116 + 58 + + + + + 2020.8 + + + + 20 + 119 + 58 + + + + + 2021.2 + + + + 19 + 117 + 57 + + + + + 2021.4 + + + + 19 + 117 + 56 + + + + + 2022.2 + + + + 19 + 118 + 55 + + + + + 2022.4 + + + + 19 + 119 + 55 + + + + + 2022.6 + + + + 19 + 119 + 54 + + + + + 2023.4 + + + + 19 + 118 + 56 + + + + + 2023.4 + + + + 19 + 118 + 54 + + + + + 2024.4 + + + + 19 + 118 + 0 + + + + + 2024.8 + + + + 19 + 118 + 51 + + + + + 2025.4 + + + + 19 + 117 + 49 + + + + + 2026.2 + + + + 19 + 116 + 50 + + + + + 2026.6 + + + + 20 + 116 + 51 + + + + + 2027.2 + + + + 20 + 116 + 49 + + + + + 2027.6 + + + + 20 + 117 + 48 + + + + + 2028.2 + + + + 20 + 117 + 48 + + + + + 2028.6 + + + + 20 + 117 + 45 + + + + + 2029.0 + + + + 20 + 117 + 48 + + + + + 2029.0 + + + + 20 + 116 + 49 + + + + + 2029.6 + + + + 20 + 116 + 49 + + + + + 2030.0 + + + + 20 + 117 + 50 + + + + + 2030.8 + + + + 20 + 115 + 46 + + + + + 2030.8 + + + + 20 + 115 + 49 + + + + + 2031.2 + + + + 20 + 114 + 0 + + + + + 2031.6 + + + + 20 + 115 + 52 + + + + + 2031.8 + + + + 20 + 115 + 50 + + + + + 2032.4 + + + + 20 + 114 + 48 + + + + + 2032.8 + + + + 20 + 113 + 48 + + + + + 2033.0 + + + + 20 + 112 + 49 + + + + + 2033.4 + + + + 20 + 109 + 52 + + + + + 2033.8 + + + + 20 + 109 + 53 + + + + + 2034.0 + + + + 20 + 109 + 54 + + + + + 2034.6 + + + + 20 + 109 + 56 + + + + + 2034.8 + + + + 20 + 109 + 56 + + + + + 2035.2 + + + + 20 + 110 + 56 + + + + + 2035.8 + + + + 20 + 111 + 55 + + + + + 2036.8 + + + + 20 + 112 + 54 + + + + + 2036.8 + + + + 20 + 111 + 55 + + + + + 2037.8 + + + + 20 + 113 + 55 + + + + + 2038.0 + + + + 20 + 114 + 56 + + + + + 2038.2 + + + + 20 + 114 + 55 + + + + + 2039.0 + + + + 20 + 116 + 55 + + + + + 2039.4 + + + + 20 + 116 + 54 + + + + + 2040.0 + + + + 20 + 116 + 51 + + + + + 2040.6 + + + + 20 + 114 + 52 + + + + + 2041.2 + + + + 20 + 113 + 51 + + + + + 2041.6 + + + + 20 + 113 + 53 + + + + + 2042.2 + + + + 20 + 114 + 54 + + + + + 2043.0 + + + + 20 + 115 + 52 + + + + + 2043.2 + + + + 20 + 115 + 51 + + + + + 2043.4 + + + + 20 + 114 + 51 + + + + + 2044.2 + + + + 20 + 116 + 54 + + + + + 2044.4 + + + + 20 + 116 + 52 + + + + + 2045.0 + + + + 20 + 116 + 56 + + + + + 2045.2 + + + + 20 + 116 + 56 + + + + + 2045.4 + + + + 20 + 116 + 57 + + + + + 2045.4 + + + + 20 + 116 + 56 + + + + + 2046.0 + + + + 20 + 116 + 58 + + + + + 2046.4 + + + + 20 + 119 + 59 + + + + + 2046.6 + + + + 20 + 117 + 58 + + + + + 2046.8 + + + + 20 + 119 + 57 + + + + + 2047.6 + + + + 20 + 120 + 56 + + + + + 2047.8 + + + + 20 + 120 + 56 + + + + + 2048.8 + + + + 20 + 121 + 57 + + + + + 2049.0 + + + + 20 + 120 + 57 + + + + + 2049.2 + + + + 20 + 117 + 58 + + + + + 2049.6 + + + + 20 + 114 + 56 + + + + + 2049.6 + + + + 20 + 114 + 0 + + + + + 2049.6 + + + + 20 + 111 + 49 + + + + + 2049.6 + + + + 20 + 111 + 49 + + + + + 2049.8 + + + + 20 + 110 + 0 + + + + + 2049.8 + + + + 20 + 109 + 58 + + + + + 2049.8 + + + + 20 + 109 + 62 + + + + + 2049.8 + + + + 20 + 107 + 62 + + + + + 2049.6 + + + + 19 + 106 + 62 + + + + + 2049.6 + + + + 19 + 107 + 63 + + + + + 2049.6 + + + + 19 + 107 + 61 + + + + + 2049.4 + + + + 19 + 104 + 83 + + + + + 2049.6 + + + + 19 + 103 + 84 + + + + + 2049.8 + + + + 19 + 100 + 84 + + + + + 2049.8 + + + + 19 + 102 + 84 + + + + + 2050.4 + + + + 19 + 104 + 84 + + + + + 2050.2 + + + + 19 + 109 + 84 + + + + + 2050.4 + + + + 19 + 112 + 84 + + + + + 2050.8 + + + + 19 + 116 + 84 + + + + + 2051.2 + + + + 19 + 117 + 84 + + + + + 2051.4 + + + + 19 + 118 + 84 + + + + + 2051.4 + + + + 19 + 117 + 52 + + + + + 2051.4 + + + + 19 + 117 + 52 + + + + + 2051.0 + + + + 19 + 118 + 0 + + + + + 2051.0 + + + + 19 + 121 + 85 + + + + + 2051.0 + + + + 19 + 123 + 84 + + + + + 2050.6 + + + + 19 + 124 + 84 + + + + + 2050.4 + + + + 19 + 124 + 84 + + + + + 2049.6 + + + + 19 + 123 + 70 + + + + + 2049.4 + + + + 19 + 120 + 70 + + + + + 2049.2 + + + + 19 + 120 + 65 + + + + + 2048.8 + + + + 19 + 117 + 59 + + + + + 2048.6 + + + + 19 + 116 + 58 + + + + + 2048.4 + + + + 19 + 116 + 58 + + + + + 2048.0 + + + + 19 + 115 + 55 + + + + + 2047.8 + + + + 19 + 113 + 49 + + + + + 2047.8 + + + + 19 + 114 + 51 + + + + + 2047.6 + + + + 19 + 111 + 56 + + + + + 2047.4 + + + + 19 + 110 + 56 + + + + + 2047.4 + + + + 19 + 110 + 56 + + + + + 2047.2 + + + + 19 + 108 + 83 + + + + + 2048.2 + + + + 19 + 110 + 42 + + + + + 2048.6 + + + + 19 + 113 + 42 + + + + + 2048.6 + + + + 19 + 114 + 0 + + + + + 2049.2 + + + + 19 + 112 + 84 + + + + + 2049.2 + + + + 19 + 113 + 84 + + + + + 2049.2 + + + + 19 + 116 + 84 + + + + + 2049.4 + + + + 19 + 116 + 84 + + + + + 2049.0 + + + + 19 + 117 + 84 + + + + + 2049.0 + + + + 19 + 117 + 84 + + + + + 2048.8 + + + + 19 + 120 + 83 + + + + + 2048.6 + + + + 19 + 120 + 82 + + + + + 2048.6 + + + + 19 + 120 + 83 + + + + + 2048.6 + + + + 19 + 122 + 83 + + + + + 2048.6 + + + + 19 + 122 + 83 + + + + + 2048.6 + + + + 19 + 125 + 83 + + + + + 2048.6 + + + + 19 + 127 + 84 + + + + + 2048.6 + + + + 18 + 131 + 84 + + + + + 2049.2 + + + + 18 + 130 + 85 + + + + + 2049.2 + + + + 18 + 131 + 85 + + + + + 2049.2 + + + + 18 + 134 + 84 + + + + + 2049.4 + + + + 18 + 134 + 84 + + + + + 2049.6 + + + + 18 + 134 + 85 + + + + + 2049.8 + + + + 18 + 131 + 84 + + + + + 2049.4 + + + + 18 + 129 + 82 + + + + + 2048.4 + + + + 18 + 133 + 78 + + + + + 2047.8 + + + + 18 + 133 + 78 + + + + + 2047.2 + + + + 18 + 135 + 79 + + + + + 2046.0 + + + + 18 + 134 + 80 + + + + + 2045.6 + + + + 18 + 137 + 81 + + + + + 2045.2 + + + + 18 + 136 + 81 + + + + + 2045.0 + + + + 18 + 137 + 80 + + + + + 2044.6 + + + + 18 + 136 + 80 + + + + + 2044.0 + + + + 18 + 135 + 78 + + + + + 2043.6 + + + + 18 + 132 + 79 + + + + + 2042.6 + + + + 18 + 135 + 80 + + + + + 2041.8 + + + + 18 + 137 + 81 + + + + + 2041.4 + + + + 18 + 136 + 81 + + + + + 2040.8 + + + + 18 + 133 + 81 + + + + + 2040.0 + + + + 18 + 133 + 81 + + + + + 2039.0 + + + + 18 + 134 + 81 + + + + + 2038.2 + + + + 18 + 135 + 81 + + + + + 2037.8 + + + + 18 + 134 + 81 + + + + + 2036.6 + + + + 18 + 133 + 81 + + + + + 2035.4 + + + + 18 + 131 + 80 + + + + + 2035.0 + + + + 18 + 131 + 80 + + + + + 2034.2 + + + + 18 + 133 + 82 + + + + + 2033.4 + + + + 18 + 134 + 82 + + + + + 2033.0 + + + + 18 + 131 + 80 + + + + + 2032.2 + + + + 18 + 129 + 81 + + + + + 2031.8 + + + + 18 + 131 + 82 + + + + + 2030.8 + + + + 18 + 130 + 81 + + + + + 2030.4 + + + + 18 + 129 + 81 + + + + + 2029.6 + + + + 18 + 129 + 80 + + + + + 2028.8 + + + + 18 + 129 + 81 + + + + + 2028.6 + + + + 18 + 128 + 81 + + + + + 2027.6 + + + + 18 + 129 + 83 + + + + + 2026.2 + + + + 18 + 133 + 82 + + + + + 2025.6 + + + + 18 + 130 + 81 + + + + + 2025.0 + + + + 18 + 131 + 81 + + + + + 2024.6 + + + + 18 + 130 + 81 + + + + + 2024.0 + + + + 18 + 131 + 81 + + + + + 2023.2 + + + + 18 + 131 + 81 + + + + + 2023.2 + + + + 18 + 131 + 81 + + + + + 2022.6 + + + + 18 + 131 + 81 + + + + + 2022.6 + + + + 18 + 131 + 81 + + + + + 2022.2 + + + + 18 + 130 + 81 + + + + + 2021.6 + + + + 18 + 132 + 81 + + + + + 2021.0 + + + + 18 + 135 + 82 + + + + + 2020.6 + + + + 18 + 134 + 82 + + + + + 2019.4 + + + + 18 + 135 + 82 + + + + + 2019.2 + + + + 18 + 132 + 87 + + + + + 2018.4 + + + + 18 + 132 + 87 + + + + + 2017.2 + + + + 18 + 131 + 83 + + + + + 2016.0 + + + + 18 + 131 + 82 + + + + + 2015.4 + + + + 18 + 131 + 83 + + + + + 2015.0 + + + + 18 + 131 + 83 + + + + + 2014.0 + + + + 18 + 129 + 81 + + + + + 2012.8 + + + + 18 + 132 + 82 + + + + + 2012.6 + + + + 18 + 131 + 81 + + + + + 2012.4 + + + + 18 + 131 + 81 + + + + + 2012.2 + + + + 18 + 131 + 81 + + + + + 2011.8 + + + + 18 + 128 + 82 + + + + + 2010.8 + + + + 18 + 129 + 81 + + + + + 2010.4 + + + + 18 + 129 + 81 + + + + + 2009.4 + + + + 18 + 133 + 81 + + + + + 2009.2 + + + + 18 + 130 + 82 + + + + + 2008.6 + + + + 18 + 129 + 82 + + + + + 2008.6 + + + + 18 + 132 + 82 + + + + + 2008.2 + + + + 18 + 130 + 82 + + + + + 2007.0 + + + + 18 + 132 + 83 + + + + + 2006.6 + + + + 18 + 131 + 83 + + + + + 2006.0 + + + + 18 + 131 + 82 + + + + + 2005.0 + + + + 18 + 127 + 81 + + + + + 2004.6 + + + + 18 + 130 + 81 + + + + + 2004.2 + + + + 18 + 131 + 82 + + + + + 2003.6 + + + + 18 + 132 + 84 + + + + + 2002.6 + + + + 18 + 130 + 81 + + + + + 2002.2 + + + + 18 + 129 + 81 + + + + + 2001.4 + + + + 18 + 127 + 80 + + + + + 2000.2 + + + + 18 + 127 + 81 + + + + + 1999.8 + + + + 18 + 128 + 81 + + + + + 1999.0 + + + + 18 + 126 + 81 + + + + + 1997.8 + + + + 18 + 123 + 77 + + + + + 1997.2 + + + + 18 + 126 + 79 + + + + + 1997.0 + + + + 18 + 131 + 82 + + + + + 1996.8 + + + + 18 + 133 + 82 + + + + + 1995.8 + + + + 18 + 133 + 81 + + + + + 1994.6 + + + + 18 + 133 + 81 + + + + + 1993.6 + + + + 18 + 133 + 82 + + + + + 1993.4 + + + + 18 + 133 + 82 + + + + + 1992.2 + + + + 18 + 133 + 82 + + + + + 1991.4 + + + + 18 + 133 + 81 + + + + + 1991.4 + + + + 18 + 134 + 81 + + + + + 1991.2 + + + + 18 + 134 + 81 + + + + + 1990.2 + + + + 18 + 134 + 81 + + + + + 1989.0 + + + + 18 + 134 + 81 + + + + + 1988.6 + + + + 18 + 133 + 81 + + + + + 1987.8 + + + + 18 + 133 + 82 + + + + + 1987.6 + + + + 18 + 134 + 82 + + + + + 1986.6 + + + + 18 + 135 + 80 + + + + + 1985.6 + + + + 17 + 132 + 80 + + + + + 1985.4 + + + + 17 + 133 + 80 + + + + + 1984.4 + + + + 17 + 133 + 80 + + + + + 1983.2 + + + + 17 + 133 + 80 + + + + + 1982.2 + + + + 17 + 130 + 83 + + + + + 1982.0 + + + + 17 + 132 + 80 + + + + + 1981.6 + + + + 17 + 130 + 80 + + + + + 1980.6 + + + + 17 + 131 + 82 + + + + + 1979.4 + + + + 17 + 132 + 82 + + + + + 1978.4 + + + + 17 + 131 + 83 + + + + + 1977.4 + + + + 17 + 130 + 81 + + + + + 1977.0 + + + + 17 + 130 + 82 + + + + + 1976.2 + + + + 17 + 130 + 81 + + + + + 1975.2 + + + + 17 + 132 + 82 + + + + + 1974.0 + + + + 17 + 133 + 83 + + + + + 1972.8 + + + + 17 + 133 + 62 + + + + + 1972.2 + + + + 17 + 130 + 60 + + + + + 1971.8 + + + + 17 + 130 + 60 + + + + + 1970.6 + + + + 17 + 127 + 83 + + + + + 1969.4 + + + + 17 + 126 + 84 + + + + + 1968.4 + + + + 17 + 127 + 83 + + + + + 1967.2 + + + + 17 + 126 + 83 + + + + + 1966.4 + + + + 17 + 124 + 83 + + + + + 1966.0 + + + + 17 + 123 + 83 + + + + + 1965.2 + + + + 17 + 123 + 80 + + + + + 1965.0 + + + + 17 + 123 + 80 + + + + + 1964.0 + + + + 17 + 122 + 0 + + + + + 1962.6 + + + + 17 + 121 + 0 + + + + + 1962.0 + + + + 17 + 121 + 84 + + + + + 1961.6 + + + + 17 + 119 + 84 + + + + + 1961.4 + + + + 17 + 118 + 84 + + + + + 1961.2 + + + + 17 + 118 + 84 + + + + + 1960.6 + + + + 17 + 117 + 74 + + + + + 1959.6 + + + + 17 + 119 + 83 + + + + + 1959.4 + + + + 17 + 119 + 82 + + + + + 1958.4 + + + + 17 + 119 + 81 + + + + + 1958.0 + + + + 17 + 119 + 81 + + + + + 1957.0 + + + + 17 + 120 + 81 + + + + + 1955.6 + + + + 17 + 121 + 83 + + + + + 1954.8 + + + + 17 + 122 + 83 + + + + + 1954.6 + + + + 17 + 121 + 82 + + + + + 1953.2 + + + + 17 + 123 + 82 + + + + + 1952.2 + + + + 17 + 123 + 80 + + + + + 1951.0 + + + + 17 + 120 + 80 + + + + + 1950.6 + + + + 17 + 124 + 80 + + + + + 1950.0 + + + + 17 + 124 + 78 + + + + + 1949.4 + + + + 17 + 124 + 65 + + + + + 1948.8 + + + + 17 + 123 + 65 + + + + + 1947.6 + + + + 17 + 123 + 0 + + + + + 1946.8 + + + + 17 + 121 + 83 + + + + + 1946.6 + + + + 17 + 121 + 83 + + + + + 1945.4 + + + + 17 + 120 + 0 + + + + + 1944.8 + + + + 17 + 119 + 80 + + + + + 1944.4 + + + + 17 + 119 + 80 + + + + + 1943.4 + + + + 17 + 120 + 80 + + + + + 1942.0 + + + + 17 + 122 + 80 + + + + + 1941.2 + + + + 17 + 120 + 80 + + + + + 1940.6 + + + + 17 + 118 + 80 + + + + + 1939.2 + + + + 17 + 117 + 79 + + + + + 1938.8 + + + + 17 + 118 + 79 + + + + + 1937.8 + + + + 17 + 117 + 80 + + + + + 1936.8 + + + + 17 + 118 + 80 + + + + + 1935.4 + + + + 17 + 118 + 80 + + + + + 1934.4 + + + + 17 + 119 + 80 + + + + + 1934.2 + + + + 17 + 119 + 80 + + + + + 1932.8 + + + + 17 + 118 + 79 + + + + + 1932.6 + + + + 17 + 118 + 79 + + + + + 1932.0 + + + + 17 + 117 + 79 + + + + + 1931.8 + + + + 17 + 118 + 79 + + + + + 1931.0 + + + + 17 + 118 + 79 + + + + + 1930.2 + + + + 17 + 118 + 81 + + + + + 1930.0 + + + + 17 + 118 + 81 + + + + + 1929.0 + + + + 17 + 119 + 78 + + + + + 1927.6 + + + + 17 + 117 + 79 + + + + + 1926.6 + + + + 17 + 117 + 80 + + + + + 1926.2 + + + + 17 + 117 + 80 + + + + + 1926.0 + + + + 17 + 117 + 80 + + + + + 1925.4 + + + + 17 + 117 + 80 + + + + + 1924.8 + + + + 17 + 117 + 82 + + + + + 1924.0 + + + + 17 + 117 + 82 + + + + + 1923.8 + + + + 17 + 117 + 82 + + + + + 1923.0 + + + + 17 + 116 + 82 + + + + + 1921.8 + + + + 17 + 114 + 81 + + + + + 1921.0 + + + + 17 + 117 + 81 + + + + + 1920.6 + + + + 17 + 117 + 81 + + + + + 1920.4 + + + + 17 + 117 + 81 + + + + + 1920.0 + + + + 17 + 121 + 82 + + + + + 1919.8 + + + + 17 + 123 + 83 + + + + + 1919.8 + + + + 17 + 118 + 83 + + + + + 1920.0 + + + + 17 + 121 + 83 + + + + + 1920.2 + + + + 17 + 121 + 84 + + + + + 1919.6 + + + + 17 + 122 + 82 + + + + + 1919.4 + + + + 17 + 123 + 82 + + + + + 1918.2 + + + + 17 + 124 + 81 + + + + + 1918.0 + + + + 17 + 125 + 80 + + + + + 1917.8 + + + + 17 + 122 + 80 + + + + + 1917.6 + + + + 17 + 120 + 80 + + + + + 1917.6 + + + + 17 + 125 + 80 + + + + + 1917.0 + + + + 17 + 124 + 65 + + + + + 1916.4 + + + + 17 + 121 + 62 + + + + + 1916.0 + + + + 17 + 118 + 0 + + + + + 1914.8 + + + + 17 + 120 + 78 + + + + + 1914.0 + + + + 17 + 119 + 74 + + + + + 1913.8 + + + + 17 + 121 + 74 + + + + + 1913.2 + + + + 17 + 118 + 81 + + + + + 1912.6 + + + + 17 + 117 + 0 + + + + + 1912.6 + + + + 17 + 116 + 0 + + + + + 1912.4 + + + + 17 + 113 + 0 + + + + + 1911.4 + + + + 17 + 113 + 80 + + + + + 1910.8 + + + + 17 + 111 + 79 + + + + + 1910.4 + + + + 17 + 112 + 81 + + + + + 1909.0 + + + + 17 + 112 + 82 + + + + + 1908.0 + + + + 17 + 113 + 82 + + + + + 1907.8 + + + + 17 + 111 + 81 + + + + + 1906.6 + + + + 17 + 111 + 80 + + + + + 1906.2 + + + + 17 + 109 + 63 + + + + + 1905.4 + + + + 17 + 110 + 59 + + + + + 1904.0 + + + + 17 + 110 + 60 + + + + + 1903.0 + + + + 17 + 107 + 63 + + + + + 1902.8 + + + + 17 + 108 + 59 + + + + + 1902.4 + + + + 17 + 104 + 58 + + + + + 1902.4 + + + + 17 + 104 + 58 + + + + + 1902.2 + + + + 17 + 101 + 58 + + + + + 1901.6 + + + + 17 + 102 + 58 + + + + + 1901.0 + + + + 17 + 106 + 56 + + + + + 1900.6 + + + + 17 + 107 + 55 + + + + + 1900.4 + + + + 17 + 107 + 56 + + + + + 1900.0 + + + + 17 + 104 + 56 + + + + + 1899.2 + + + + 17 + 103 + 0 + + + + + 1898.4 + + + + 17 + 103 + 59 + + + + + 1898.2 + + + + 17 + 103 + 60 + + + + + 1897.2 + + + + 17 + 101 + 63 + + + + + 1896.6 + + + + 17 + 100 + 63 + + + + + 1896.0 + + + + 17 + 102 + 63 + + + + + 1895.0 + + + + 17 + 99 + 62 + + + + + 1894.8 + + + + 17 + 99 + 63 + + + + + 1894.8 + + + + 17 + 100 + 63 + + + + + 1894.6 + + + + 17 + 97 + 63 + + + + + 1894.0 + + + + 17 + 100 + 62 + + + + + 1893.8 + + + + 17 + 100 + 62 + + + + + 1893.4 + + + + 17 + 101 + 62 + + + + + 1893.0 + + + + 17 + 98 + 62 + + + + + 1892.4 + + + + 17 + 100 + 63 + + + + + 1892.2 + + + + 17 + 96 + 63 + + + + + 1891.4 + + + + 17 + 98 + 57 + + + + + 1890.6 + + + + 17 + 98 + 56 + + + + + 1890.2 + + + + 17 + 96 + 57 + + + + + 1889.2 + + + + 17 + 94 + 57 + + + + + 1888.0 + + + + 17 + 96 + 58 + + + + + 1887.4 + + + + 17 + 96 + 56 + + + + + 1887.0 + + + + 17 + 97 + 56 + + + + + 1887.0 + + + + 17 + 93 + 56 + + + + + 1886.6 + + + + 17 + 91 + 54 + + + + + 1886.6 + + + + 17 + 94 + 54 + + + + + 1886.0 + + + + 17 + 92 + 64 + + + + + 1885.4 + + + + 17 + 90 + 64 + + + + + 1884.8 + + + + 17 + 90 + 64 + + + + + 1883.6 + + + + 17 + 94 + 63 + + + + + 1883.4 + + + + 17 + 92 + 63 + + + + + 1882.4 + + + + 17 + 92 + 63 + + + + + 1881.4 + + + + 17 + 91 + 63 + + + + + 1881.2 + + + + 17 + 90 + 60 + + + + + 1880.6 + + + + 17 + 93 + 59 + + + + + 1880.0 + + + + 17 + 90 + 60 + + + + + 1878.8 + + + + 17 + 89 + 61 + + + + + 1878.4 + + + + 17 + 89 + 61 + + + + + 1877.8 + + + + 17 + 90 + 60 + + + + + 1876.8 + + + + 17 + 90 + 80 + + + + + 1876.6 + + + + 17 + 90 + 80 + + + + + 1875.4 + + + + 17 + 90 + 80 + + + + + 1875.0 + + + + 17 + 93 + 80 + + + + + 1874.4 + + + + 17 + 93 + 81 + + + + + 1874.4 + + + + 17 + 95 + 81 + + + + + 1874.2 + + + + 17 + 98 + 82 + + + + + 1874.0 + + + + 17 + 101 + 82 + + + + + 1873.6 + + + + 17 + 103 + 82 + + + + + 1873.6 + + + + 17 + 105 + 71 + + + + + 1873.4 + + + + 17 + 106 + 63 + + + + + 1873.4 + + + + 17 + 107 + 62 + + + + + 1872.2 + + + + 17 + 108 + 63 + + + + + 1871.8 + + + + 17 + 105 + 0 + + + + + 1871.6 + + + + 17 + 108 + 59 + + + + + 1871.4 + + + + 17 + 105 + 59 + + + + + 1871.2 + + + + 17 + 106 + 59 + + + + + 1871.0 + + + + 17 + 106 + 62 + + + + + 1870.4 + + + + 17 + 106 + 62 + + + + + 1870.0 + + + + 17 + 102 + 59 + + + + + 1869.6 + + + + 17 + 105 + 60 + + + + + 1869.6 + + + + 17 + 102 + 60 + + + + + 1869.2 + + + + 17 + 103 + 55 + + + + + 1868.8 + + + + 17 + 104 + 55 + + + + + 1867.6 + + + + 17 + 101 + 60 + + + + + 1866.8 + + + + 17 + 99 + 60 + + + + + 1866.6 + + + + 17 + 100 + 59 + + + + + 1866.2 + + + + 17 + 99 + 58 + + + + + 1865.8 + + + + 17 + 103 + 59 + + + + + 1865.2 + + + + 17 + 104 + 61 + + + + + 1864.2 + + + + 17 + 102 + 62 + + + + + 1863.6 + + + + 17 + 101 + 62 + + + + + 1863.2 + + + + 17 + 101 + 60 + + + + + 1862.2 + + + + 17 + 98 + 60 + + + + + 1861.8 + + + + 17 + 99 + 62 + + + + + 1861.6 + + + + 17 + 99 + 62 + + + + + 1860.8 + + + + 17 + 99 + 62 + + + + + 1860.6 + + + + 17 + 99 + 62 + + + + + 1860.4 + + + + 17 + 101 + 82 + + + + + 1860.2 + + + + 17 + 98 + 82 + + + + + 1859.8 + + + + 17 + 100 + 85 + + + + + 1859.8 + + + + 17 + 105 + 86 + + + + + 1859.8 + + + + 17 + 108 + 87 + + + + + 1860.2 + + + + 17 + 112 + 88 + + + + + 1860.2 + + + + 17 + 115 + 88 + + + + + 1860.4 + + + + 17 + 116 + 88 + + + + + 1860.4 + + + + 17 + 120 + 86 + + + + + 1860.8 + + + + 17 + 121 + 87 + + + + + 1860.8 + + + + 17 + 120 + 85 + + + + + 1860.8 + + + + 17 + 119 + 85 + + + + + 1860.8 + + + + 17 + 122 + 85 + + + + + 1861.0 + + + + 17 + 122 + 85 + + + + + 1861.2 + + + + 17 + 120 + 83 + + + + + 1861.4 + + + + 17 + 123 + 84 + + + + + 1861.6 + + + + 17 + 123 + 86 + + + + + 1861.8 + + + + 17 + 127 + 86 + + + + + 1862.2 + + + + 17 + 126 + 85 + + + + + 1862.8 + + + + 17 + 128 + 86 + + + + + 1863.2 + + + + 17 + 129 + 86 + + + + + 1864.0 + + + + 17 + 129 + 87 + + + + + 1864.0 + + + + 17 + 130 + 84 + + + + + 1864.0 + + + + 17 + 127 + 83 + + + + + 1863.8 + + + + 17 + 128 + 83 + + + + + 1863.8 + + + + 17 + 131 + 83 + + + + + 1864.6 + + + + 17 + 132 + 85 + + + + + 1864.6 + + + + 17 + 132 + 85 + + + + + 1864.6 + + + + 17 + 132 + 84 + + + + + 1864.8 + + + + 17 + 132 + 82 + + + + + 1864.8 + + + + 17 + 128 + 83 + + + + + 1864.8 + + + + 17 + 131 + 83 + + + + + 1864.8 + + + + 17 + 130 + 83 + + + + + 1865.0 + + + + 17 + 131 + 84 + + + + + 1865.0 + + + + 17 + 132 + 85 + + + + + 1864.8 + + + + 17 + 131 + 83 + + + + + 1865.0 + + + + 17 + 131 + 85 + + + + + 1865.2 + + + + 17 + 132 + 86 + + + + + 1865.2 + + + + 17 + 132 + 86 + + + + + 1865.4 + + + + 17 + 133 + 85 + + + + + 1865.4 + + + + 17 + 134 + 85 + + + + + 1865.6 + + + + 17 + 134 + 85 + + + + + 1866.0 + + + + 17 + 134 + 86 + + + + + 1866.0 + + + + 17 + 134 + 86 + + + + + 1866.2 + + + + 17 + 135 + 85 + + + + + 1866.2 + + + + 17 + 134 + 84 + + + + + 1866.0 + + + + 17 + 137 + 84 + + + + + 1866.2 + + + + 17 + 136 + 85 + + + + + 1866.2 + + + + 17 + 135 + 86 + + + + + 1866.6 + + + + 17 + 138 + 89 + + + + + 1866.6 + + + + 17 + 141 + 89 + + + + + 1866.8 + + + + 17 + 137 + 88 + + + + + 1867.0 + + + + 16 + 140 + 89 + + + + + 1867.0 + + + + 16 + 139 + 89 + + + + + 1867.4 + + + + 16 + 139 + 88 + + + + + 1867.4 + + + + 16 + 140 + 89 + + + + + 1867.8 + + + + 16 + 140 + 88 + + + + + 1868.0 + + + + 16 + 137 + 87 + + + + + 1868.0 + + + + 16 + 138 + 86 + + + + + 1868.2 + + + + 16 + 139 + 86 + + + + + 1869.2 + + + + 16 + 138 + 85 + + + + + 1869.6 + + + + 16 + 138 + 86 + + + + + 1870.2 + + + + 16 + 142 + 85 + + + + + 1870.2 + + + + 16 + 143 + 85 + + + + + 1870.6 + + + + 16 + 141 + 85 + + + + + 1870.6 + + + + 16 + 142 + 85 + + + + + 1871.2 + + + + 16 + 144 + 84 + + + + + 1871.4 + + + + 16 + 144 + 84 + + + + + 1871.6 + + + + 16 + 145 + 82 + + + + + 1870.2 + + + + 16 + 144 + 84 + + + + + 1870.0 + + + + 16 + 145 + 84 + + + + + 1869.4 + + + + 16 + 146 + 86 + + + + + 1869.2 + + + + 16 + 148 + 82 + + + + + 1868.2 + + + + 16 + 150 + 0 + + + + + 1867.8 + + + + 16 + 150 + 0 + + + + + 1867.0 + + + + 16 + 150 + 82 + + + + + 1866.8 + + + + 16 + 149 + 82 + + + + + 1867.0 + + + + 16 + 149 + 84 + + + + + 1867.8 + + + + 16 + 149 + 54 + + + + + 1868.2 + + + + 16 + 152 + 87 + + + + + 1868.2 + + + + 16 + 149 + 86 + + + + + 1868.2 + + + + 16 + 148 + 86 + + + + + 1868.0 + + + + 16 + 146 + 83 + + + + + 1867.8 + + + + 17 + 147 + 83 + + + + + 1867.2 + + + + 17 + 150 + 82 + + + + + 1867.2 + + + + 17 + 149 + 82 + + + + + 1866.6 + + + + 17 + 146 + 83 + + + + + 1866.4 + + + + 17 + 147 + 82 + + + + + 1866.2 + + + + 17 + 147 + 84 + + + + + 1866.2 + + + + 17 + 145 + 83 + + + + + 1866.4 + + + + 17 + 146 + 85 + + + + + 1865.8 + + + + 17 + 145 + 87 + + + + + 1865.8 + + + + 17 + 144 + 0 + + + + + 1865.6 + + + + 17 + 146 + 0 + + + + + 1865.6 + + + + 17 + 149 + 0 + + + + + 1866.0 + + + + 17 + 146 + 87 + + + + + 1866.6 + + + + 17 + 145 + 84 + + + + + 1867.0 + + + + 17 + 146 + 84 + + + + + 1867.2 + + + + 17 + 146 + 84 + + + + + 1867.6 + + + + 17 + 147 + 86 + + + + + 1867.6 + + + + 17 + 147 + 85 + + + + + 1867.6 + + + + 17 + 146 + 83 + + + + + 1867.6 + + + + 17 + 145 + 83 + + + + + 1867.2 + + + + 17 + 143 + 84 + + + + + 1866.6 + + + + 17 + 145 + 82 + + + + + 1866.2 + + + + 17 + 147 + 82 + + + + + 1866.0 + + + + 17 + 144 + 82 + + + + + 1865.8 + + + + 17 + 146 + 82 + + + + + 1865.4 + + + + 17 + 143 + 83 + + + + + 1865.4 + + + + 17 + 144 + 84 + + + + + 1865.0 + + + + 17 + 145 + 84 + + + + + 1864.4 + + + + 17 + 142 + 83 + + + + + 1864.2 + + + + 17 + 145 + 83 + + + + + 1864.0 + + + + 17 + 145 + 82 + + + + + 1862.8 + + + + 17 + 146 + 84 + + + + + 1861.6 + + + + 17 + 146 + 79 + + + + + 1861.2 + + + + 17 + 147 + 82 + + + + + 1860.8 + + + + 17 + 145 + 82 + + + + + 1860.6 + + + + 17 + 143 + 79 + + + + + 1860.6 + + + + 17 + 142 + 79 + + + + + 1859.6 + + + + 17 + 142 + 88 + + + + + 1859.4 + + + + 17 + 142 + 87 + + + + + 1859.2 + + + + 17 + 141 + 85 + + + + + 1859.0 + + + + 17 + 142 + 89 + + + + + 1859.4 + + + + 17 + 141 + 87 + + + + + 1860.2 + + + + 16 + 142 + 87 + + + + + 1860.6 + + + + 16 + 143 + 87 + + + + + 1861.6 + + + + 16 + 143 + 87 + + + + + 1862.0 + + + + 16 + 145 + 87 + + + + + 1862.8 + + + + 16 + 143 + 87 + + + + + 1863.6 + + + + 16 + 144 + 86 + + + + + 1863.4 + + + + 16 + 147 + 84 + + + + + 1863.0 + + + + 16 + 144 + 82 + + + + + 1863.0 + + + + 16 + 145 + 82 + + + + + 1862.4 + + + + 16 + 148 + 84 + + + + + 1862.4 + + + + 16 + 147 + 85 + + + + + 1861.6 + + + + 16 + 145 + 85 + + + + + 1861.4 + + + + 16 + 145 + 85 + + + + + 1861.2 + + + + 16 + 146 + 59 + + + + + 1860.8 + + + + 16 + 143 + 64 + + + + + 1860.6 + + + + 16 + 144 + 64 + + + + + 1859.4 + + + + 16 + 142 + 84 + + + + + 1858.6 + + + + 16 + 140 + 88 + + + + + 1858.4 + + + + 16 + 139 + 88 + + + + + 1858.4 + + + + 16 + 138 + 87 + + + + + 1859.6 + + + + 16 + 140 + 88 + + + + + 1859.6 + + + + 16 + 139 + 87 + + + + + 1859.8 + + + + 16 + 141 + 86 + + + + + 1860.0 + + + + 16 + 139 + 86 + + + + + 1859.8 + + + + 16 + 139 + 82 + + + + + 1859.6 + + + + 16 + 143 + 82 + + + + + 1859.0 + + + + 16 + 144 + 82 + + + + + 1859.0 + + + + 16 + 146 + 87 + + + + + 1859.2 + + + + 16 + 146 + 87 + + + + + 1859.4 + + + + 16 + 146 + 0 + + + + + 1859.6 + + + + 16 + 147 + 0 + + + + + 1859.6 + + + + 16 + 144 + 52 + + + + + 1859.8 + + + + 16 + 143 + 54 + + + + + 1860.0 + + + + 16 + 140 + 57 + + + + + 1860.2 + + + + 16 + 138 + 59 + + + + + 1860.4 + + + + 16 + 136 + 60 + + + + + 1860.4 + + + + 16 + 133 + 60 + + + + + 1860.6 + + + + 16 + 131 + 60 + + + + + 1860.6 + + + + 16 + 128 + 55 + + + + + 1860.8 + + + + 16 + 127 + 54 + + + + + 1860.4 + + + + 16 + 124 + 54 + + + + + 1860.4 + + + + 16 + 123 + 78 + + + + + 1859.6 + + + + 16 + 122 + 85 + + + + + 1859.6 + + + + 16 + 124 + 84 + + + + + 1859.4 + + + + 16 + 121 + 83 + + + + + 1859.2 + + + + 16 + 124 + 83 + + + + + 1859.2 + + + + 16 + 123 + 83 + + + + + 1858.8 + + + + 16 + 124 + 83 + + + + + 1858.6 + + + + 16 + 124 + 84 + + + + + 1858.4 + + + + 16 + 124 + 84 + + + + + 1858.2 + + + + 16 + 122 + 82 + + + + + 1858.2 + + + + 16 + 125 + 82 + + + + + 1857.6 + + + + 16 + 126 + 83 + + + + + 1857.6 + + + + 16 + 128 + 83 + + + + + 1857.4 + + + + 16 + 127 + 83 + + + + + 1857.0 + + + + 16 + 130 + 83 + + + + + 1856.8 + + + + 16 + 130 + 84 + + + + + 1856.6 + + + + 16 + 131 + 83 + + + + + 1856.4 + + + + 16 + 130 + 83 + + + + + 1856.4 + + + + 16 + 133 + 82 + + + + + 1856.2 + + + + 16 + 134 + 83 + + + + + 1856.0 + + + + 16 + 137 + 83 + + + + + 1855.8 + + + + 16 + 137 + 84 + + + + + 1855.4 + + + + 16 + 139 + 83 + + + + + 1854.8 + + + + 16 + 141 + 83 + + + + + 1854.8 + + + + 16 + 138 + 83 + + + + + 1854.8 + + + + 16 + 141 + 83 + + + + + 1854.2 + + + + 16 + 139 + 62 + + + + + 1854.2 + + + + 16 + 139 + 87 + + + + + 1854.2 + + + + 16 + 137 + 87 + + + + + 1854.0 + + + + 16 + 140 + 85 + + + + + 1854.0 + + + + 16 + 137 + 84 + + + + + 1854.0 + + + + 16 + 140 + 84 + + + + + 1853.8 + + + + 16 + 139 + 60 + + + + + 1853.4 + + + + 16 + 138 + 59 + + + + + 1853.4 + + + + 16 + 135 + 59 + + + + + 1853.2 + + + + 16 + 134 + 59 + + + + + 1852.6 + + + + 16 + 134 + 86 + + + + + 1852.2 + + + + 16 + 135 + 85 + + + + + 1852.0 + + + + 16 + 134 + 86 + + + + + 1851.8 + + + + 16 + 134 + 85 + + + + + 1851.2 + + + + 16 + 136 + 86 + + + + + 1851.2 + + + + 16 + 139 + 85 + + + + + 1851.2 + + + + 16 + 139 + 84 + + + + + 1851.2 + + + + 16 + 141 + 84 + + + + + 1851.2 + + + + 16 + 142 + 85 + + + + + 1851.2 + + + + 16 + 142 + 85 + + + + + 1851.0 + + + + 16 + 142 + 84 + + + + + 1851.0 + + + + 16 + 142 + 84 + + + + + 1851.0 + + + + 16 + 144 + 84 + + + + + 1851.0 + + + + 16 + 142 + 84 + + + + + 1850.4 + + + + 17 + 146 + 84 + + + + + 1850.0 + + + + 17 + 144 + 83 + + + + + 1850.0 + + + + 17 + 144 + 83 + + + + + 1849.4 + + + + 17 + 144 + 85 + + + + + 1849.4 + + + + 17 + 144 + 85 + + + + + 1849.4 + + + + 17 + 145 + 85 + + + + + 1849.4 + + + + 17 + 147 + 0 + + + + + 1849.4 + + + + 17 + 144 + 0 + + + + + 1849.0 + + + + 17 + 146 + 87 + + + + + 1849.2 + + + + 17 + 144 + 89 + + + + + 1849.4 + + + + 17 + 142 + 87 + + + + + 1849.4 + + + + 17 + 145 + 89 + + + + + 1849.6 + + + + 17 + 146 + 91 + + + + + 1849.6 + + + + 17 + 147 + 90 + + + + + 1849.8 + + + + 17 + 147 + 88 + + + + + 1850.0 + + + + 17 + 147 + 89 + + + + + 1850.2 + + + + 17 + 146 + 85 + + + + + 1850.8 + + + + 17 + 147 + 84 + + + + + 1851.0 + + + + 17 + 146 + 84 + + + + + 1851.6 + + + + 17 + 147 + 84 + + + + + 1852.0 + + + + 17 + 147 + 85 + + + + + 1852.2 + + + + 17 + 148 + 86 + + + + + 1852.4 + + + + 17 + 152 + 86 + + + + + 1852.4 + + + + 17 + 149 + 85 + + + + + 1852.4 + + + + 17 + 149 + 85 + + + + + 1852.4 + + + + 17 + 146 + 83 + + + + + 1852.6 + + + + 17 + 149 + 84 + + + + + 1852.4 + + + + 17 + 150 + 64 + + + + + 1851.8 + + + + 17 + 147 + 63 + + + + + 1851.4 + + + + 17 + 145 + 81 + + + + + 1851.0 + + + + 17 + 144 + 81 + + + + + 1850.8 + + + + 17 + 143 + 81 + + + + + 1850.2 + + + + 17 + 140 + 81 + + + + + 1849.8 + + + + 17 + 139 + 62 + + + + + 1849.6 + + + + 17 + 137 + 64 + + + + + 1849.2 + + + + 17 + 133 + 62 + + + + + 1848.6 + + + + 17 + 130 + 59 + + + + + 1848.0 + + + + 17 + 127 + 59 + + + + + 1847.4 + + + + 18 + 125 + 59 + + + + + 1846.4 + + + + 18 + 125 + 80 + + + + + 1846.4 + + + + 18 + 124 + 80 + + + + + 1845.6 + + + + 18 + 121 + 81 + + + + + 1845.4 + + + + 18 + 122 + 80 + + + + + 1844.8 + + + + 18 + 119 + 80 + + + + + 1844.6 + + + + 18 + 119 + 80 + + + + + 1844.4 + + + + 18 + 120 + 79 + + + + + 1843.4 + + + + 18 + 122 + 80 + + + + + 1843.2 + + + + 18 + 121 + 65 + + + + + 1842.4 + + + + 18 + 124 + 63 + + + + + 1842.0 + + + + 18 + 125 + 63 + + + + + 1841.4 + + + + 18 + 125 + 63 + + + + + 1841.0 + + + + 18 + 124 + 82 + + + + + 1840.8 + + + + 18 + 124 + 82 + + + + + 1840.6 + + + + 18 + 123 + 83 + + + + + 1840.4 + + + + 18 + 126 + 87 + + + + + 1840.4 + + + + 18 + 126 + 86 + + + + + 1840.6 + + + + 18 + 129 + 62 + + + + + 1840.6 + + + + 18 + 129 + 61 + + + + + 1840.4 + + + + 18 + 126 + 61 + + + + + 1840.0 + + + + 18 + 125 + 60 + + + + + 1839.8 + + + + 18 + 125 + 60 + + + + + 1839.4 + + + + 18 + 122 + 60 + + + + + 1839.0 + + + + 18 + 119 + 60 + + + + + 1839.0 + + + + 18 + 119 + 60 + + + + + 1838.8 + + + + 18 + 119 + 60 + + + + + 1838.2 + + + + 18 + 117 + 84 + + + + + 1837.8 + + + + 18 + 116 + 81 + + + + + 1837.4 + + + + 18 + 116 + 78 + + + + + 1836.4 + + + + 18 + 116 + 63 + + + + + 1836.0 + + + + 18 + 115 + 83 + + + + + 1835.8 + + + + 18 + 117 + 86 + + + + + 1835.4 + + + + 18 + 118 + 87 + + + + + 1834.2 + + + + 18 + 116 + 87 + + + + + 1833.0 + + + + 18 + 116 + 85 + + + + + 1832.8 + + + + 18 + 119 + 86 + + + + + 1832.4 + + + + 18 + 122 + 85 + + + + + 1832.0 + + + + 18 + 122 + 86 + + + + + 1832.0 + + + + 18 + 124 + 85 + + + + + 1831.8 + + + + 18 + 127 + 0 + + + + + 1831.6 + + + + 18 + 125 + 0 + + + + + 1831.0 + + + + 18 + 126 + 86 + + + + + 1830.4 + + + + 18 + 126 + 84 + + + + + 1830.0 + + + + 18 + 126 + 83 + + + + + 1828.8 + + + + 18 + 123 + 83 + + + + + 1828.6 + + + + 18 + 123 + 83 + + + + + 1827.8 + + + + 18 + 125 + 86 + + + + + 1827.6 + + + + 18 + 126 + 86 + + + + + 1827.4 + + + + 18 + 126 + 86 + + + + + 1826.6 + + + + 18 + 125 + 84 + + + + + 1826.4 + + + + 18 + 126 + 83 + + + + + 1826.2 + + + + 18 + 126 + 83 + + + + + 1826.0 + + + + 18 + 129 + 83 + + + + + 1825.4 + + + + 18 + 128 + 80 + + + + + 1824.2 + + + + 18 + 130 + 83 + + + + + 1823.6 + + + + 18 + 131 + 82 + + + + + 1823.0 + + + + 18 + 129 + 80 + + + + + 1821.8 + + + + 18 + 129 + 64 + + + + + 1821.2 + + + + 18 + 132 + 63 + + + + + 1820.8 + + + + 18 + 132 + 63 + + + + + 1819.8 + + + + 18 + 129 + 64 + + + + + 1819.0 + + + + 18 + 126 + 64 + + + + + 1818.6 + + + + 18 + 127 + 63 + + + + + 1818.4 + + + + 18 + 124 + 63 + + + + + 1818.0 + + + + 18 + 126 + 63 + + + + + 1817.2 + + + + 18 + 124 + 80 + + + + + 1816.0 + + + + 18 + 125 + 83 + + + + + 1815.6 + + + + 18 + 126 + 83 + + + + + 1815.0 + + + + 18 + 126 + 82 + + + + + 1814.2 + + + + 18 + 130 + 83 + + + + + 1814.0 + + + + 18 + 129 + 83 + + + + + 1813.8 + + + + 18 + 129 + 84 + + + + + 1813.6 + + + + 18 + 125 + 84 + + + + + 1812.8 + + + + 18 + 125 + 83 + + + + + 1811.6 + + + + 18 + 124 + 65 + + + + + 1811.4 + + + + 18 + 121 + 83 + + + + + 1811.0 + + + + 18 + 126 + 83 + + + + + 1810.6 + + + + 18 + 126 + 79 + + + + + 1810.2 + + + + 18 + 128 + 78 + + + + + 1809.4 + + + + 18 + 127 + 80 + + + + + 1808.8 + + + + 18 + 129 + 78 + + + + + 1808.4 + + + + 18 + 130 + 78 + + + + + 1807.6 + + + + 18 + 130 + 80 + + + + + 1807.2 + + + + 18 + 129 + 80 + + + + + 1806.0 + + + + 18 + 130 + 81 + + + + + 1805.6 + + + + 18 + 130 + 81 + + + + + 1804.8 + + + + 18 + 131 + 64 + + + + + 1804.4 + + + + 18 + 129 + 64 + + + + + 1803.8 + + + + 18 + 127 + 0 + + + + + 1802.8 + + + + 18 + 125 + 79 + + + + + 1801.6 + + + + 18 + 123 + 79 + + + + + 1800.8 + + + + 18 + 122 + 78 + + + + + 1800.6 + + + + 18 + 124 + 77 + + + + + 1799.4 + + + + 18 + 124 + 82 + + + + + 1799.0 + + + + 18 + 123 + 82 + + + + + 1798.2 + + + + 18 + 123 + 83 + + + + + 1797.6 + + + + 18 + 126 + 85 + + + + + 1797.2 + + + + 18 + 127 + 87 + + + + + 1797.0 + + + + 18 + 130 + 87 + + + + + 1796.8 + + + + 18 + 133 + 87 + + + + + 1796.6 + + + + 18 + 136 + 88 + + + + + 1796.4 + + + + 18 + 135 + 87 + + + + + 1796.2 + + + + 18 + 134 + 87 + + + + + 1796.2 + + + + 18 + 136 + 0 + + + + + 1795.8 + + + + 18 + 137 + 0 + + + + + 1795.2 + + + + 18 + 135 + 84 + + + + + 1794.6 + + + + 18 + 133 + 83 + + + + + 1794.6 + + + + 18 + 136 + 83 + + + + + 1794.2 + + + + 18 + 141 + 83 + + + + + 1794.2 + + + + 18 + 141 + 83 + + + + + 1793.8 + + + + 18 + 144 + 83 + + + + + 1793.4 + + + + 18 + 147 + 83 + + + + + 1793.4 + + + + 18 + 145 + 83 + + + + + 1793.2 + + + + 18 + 143 + 84 + + + + + 1792.6 + + + + 18 + 140 + 60 + + + + + 1792.0 + + + + 18 + 138 + 58 + + + + + 1791.4 + + + + 18 + 135 + 59 + + + + + 1790.8 + + + + 18 + 132 + 62 + + + + + 1790.6 + + + + 18 + 129 + 62 + + + + + 1790.2 + + + + 18 + 130 + 60 + + + + + 1789.8 + + + + 18 + 128 + 59 + + + + + 1788.8 + + + + 18 + 125 + 63 + + + + + 1788.6 + + + + 18 + 125 + 63 + + + + + 1788.4 + + + + 18 + 124 + 62 + + + + + + diff --git a/ApiDemos/project/common-ui/src/main/res/values/strings.xml b/ApiDemos/project/common-ui/src/main/res/values/strings.xml index 049f5162b..60e5c1c27 100755 --- a/ApiDemos/project/common-ui/src/main/res/values/strings.xml +++ b/ApiDemos/project/common-ui/src/main/res/values/strings.xml @@ -39,6 +39,8 @@ Bounds: Adelaide Bounds: Pacific Position: (%1$.6f, %2$.6f)\nzoom=%3$.1f, tilt=%4$.1f\u00b0, bearing=%5$.1f\u00b0 + Lat: %1$.4f\u00b0, Lng: %2$.4f\u00b0 + Zoom: %1$.1fx \u2022 Tilt: %2$.1f\u00b0 \u2022 Bearing: %3$.1f\u00b0 MinZoom++ MaxZoom-- Reset Zoom diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/AdvancedMarkersDemoActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/AdvancedMarkersDemoActivity.java index c66320770..b73e256b7 100644 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/AdvancedMarkersDemoActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/AdvancedMarkersDemoActivity.java @@ -13,6 +13,10 @@ // limitations under the License. package com.example.mapdemo; +import com.example.common_ui.catalog.Sample; +import com.example.common_ui.catalog.Complexity; +import com.example.common_ui.catalog.Framework; + import android.graphics.Color; import android.os.Bundle; import android.util.Log; @@ -45,6 +49,18 @@ * The following sample showcases how to create Advanced Markers, and use all their customization * possibilities. */ +@Sample( + id = "advanced_markers", + title = "Advanced Markers & Pins", + description = "Modern PinConfig pins, custom glyphs, badge icon views, and collision behavior.", + category = "Markers & Overlays", + complexity = Complexity.ADVANCED, + tags = {"#markers", "#advancedmarkers", "#pinconfig", "#collision", "#badges", "#mapid"}, + purpose = "Demonstrates Cloud-backed Advanced Markers with custom colors, pin glyphs, collision behaviors, and custom View icons.", + successCriteria = "Custom colored pins and badge icon views render sharply at correct anchor points with collision handling.", + failureIndicators = "Pins render as default red markers (missing Map ID), collision behavior ignored, or badge text blurry.", + framework = Framework.JAVA_VIEWS +) // [START maps_android_sample_marker_advanced] public class AdvancedMarkersDemoActivity extends SamplesBaseActivity implements OnMapReadyCallback { @@ -152,13 +168,17 @@ public void onMapReady(GoogleMap map) { pinConfigBuilder.setBackgroundColor(Color.MAGENTA); PinConfig pinConfig = pinConfigBuilder.build(); - // Use the PinConfig instance to set the icon for AdvancedMarkerOptions. + // Use the PinConfig instance to set the icon for AdvancedMarkerOptions. AdvancedMarkerOptions advancedMarkerOptions = new AdvancedMarkerOptions() .icon(BitmapDescriptorFactory.fromPinConfig(pinConfig)) - .position(KUALA_LUMPUR); + .position(KUALA_LUMPUR) + .title("Kuala Lumpur (Magenta Pin)"); // Pass the AdvancedMarkerOptions instance to addMarker(). Marker marker = map.addMarker(advancedMarkerOptions); + if (marker != null) { + marker.showInfoWindow(); + } // This sample changes the border color of the advanced marker PinConfig.Builder pinConfigBuilder2 = PinConfig.builder(); @@ -167,7 +187,8 @@ public void onMapReady(GoogleMap map) { AdvancedMarkerOptions advancedMarkerOptions2 = new AdvancedMarkerOptions() .icon(BitmapDescriptorFactory.fromPinConfig(pinConfig2)) - .position(JAKARTA); + .position(JAKARTA) + .title("Jakarta (Blue Border)"); Marker marker2 = map.addMarker(advancedMarkerOptions2); @@ -182,7 +203,8 @@ public void onMapReady(GoogleMap map) { AdvancedMarkerOptions advancedMarkerOptions3 = new AdvancedMarkerOptions() .icon(BitmapDescriptorFactory.fromPinConfig(pinConfig3)) - .position(BANGKOK); + .position(BANGKOK) + .title("Bangkok (Text Glyph 'A')"); Marker marker3 = map.addMarker(advancedMarkerOptions3); @@ -194,7 +216,8 @@ public void onMapReady(GoogleMap map) { AdvancedMarkerOptions advancedMarkerOptions4 = new AdvancedMarkerOptions() .icon(BitmapDescriptorFactory.fromPinConfig(pinConfig4)) - .position(MANILA); + .position(MANILA) + .title("Manila (Transparent Cutout Glyph)"); Marker marker4 = map.addMarker(advancedMarkerOptions4); @@ -203,7 +226,8 @@ public void onMapReady(GoogleMap map) { int collisionBehavior = AdvancedMarkerOptions.CollisionBehavior.REQUIRED_AND_HIDES_OPTIONAL; AdvancedMarkerOptions advancedMarkerOptions5 = new AdvancedMarkerOptions() .position(HO_CHI_MINH_CITY) - .collisionBehavior(collisionBehavior); + .collisionBehavior(collisionBehavior) + .title("Ho Chi Minh City (Collision Behavior)"); Marker marker5 = map.addMarker(advancedMarkerOptions5); } diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/BasicMapDemoActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/BasicMapDemoActivity.java index fec64ca23..a737b01d9 100755 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/BasicMapDemoActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/BasicMapDemoActivity.java @@ -14,6 +14,11 @@ package com.example.mapdemo; +import com.example.common_ui.catalog.Sample; +import com.example.common_ui.catalog.Complexity; +import com.example.common_ui.catalog.Framework; + +import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; @@ -27,9 +32,29 @@ /** * This shows how to create a simple activity with a map and a marker on the map. */ +@Sample( + id = "basic_map", + title = "Basic Map", + description = "Fundamental map instantiation, lifecycle binding, and default camera centering.", + category = "Map Initialization", + complexity = Complexity.SNIPPET, + tags = {"#map", "#init", "#lifecycle", "#quickstart"}, + apiCalls = { + "SupportMapFragment.getMapAsync(OnMapReadyCallback)", + "GoogleMap.addMarker(MarkerOptions)", + "GoogleMap.moveCamera(CameraUpdate)" + }, + purpose = "Demonstrates clean, minimal map instantiation using SupportMapFragment.", + successCriteria = "The map loads default vector tiles cleanly centered at the initial coordinates with working gestures.", + failureIndicators = "Grey tiles (missing API key or auth mismatch), crash on back navigation, or map failing to unpause.", + framework = Framework.JAVA_VIEWS +) // [START maps_android_sample_basic_map] public class BasicMapDemoActivity extends SamplesBaseActivity implements OnMapReadyCallback { + private static final LatLng SYDNEY = new LatLng(-33.862, 151.21); + private static final float ZOOM_LEVEL = 13.0f; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -43,12 +68,12 @@ protected void onCreate(Bundle savedInstanceState) { /** * This is where we can add markers or lines, add listeners or move the camera. In this case, - * we - * just add a marker near Africa. + * we move the camera to Sydney and add a marker at Sydney. */ @Override public void onMapReady(GoogleMap map) { - map.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker")); + map.moveCamera(CameraUpdateFactory.newLatLngZoom(SYDNEY, ZOOM_LEVEL)); + map.addMarker(new MarkerOptions().position(SYDNEY).title("Sydney")); } } // [END maps_android_sample_basic_map] \ No newline at end of file diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/CameraClampingDemoActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/CameraClampingDemoActivity.java index 44f13aff5..51dbfe7e5 100644 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/CameraClampingDemoActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/CameraClampingDemoActivity.java @@ -15,6 +15,10 @@ package com.example.mapdemo; +import com.example.common_ui.catalog.Sample; +import com.example.common_ui.catalog.Complexity; +import com.example.common_ui.catalog.Framework; + import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.GoogleMap.OnCameraIdleListener; @@ -30,6 +34,18 @@ /** * This shows how to constrain the camera to specific boundaries and zoom levels. */ +@Sample( + id = "camera_clamping", + title = "Camera Clamping & Bounds", + description = "Constraining camera viewport to LatLngBounds and dynamic min/max zoom limits.", + category = "Camera Controls", + complexity = Complexity.SIMPLE, + tags = {"#camera", "#clamping", "#bounds", "#zoomlimits", "#latlngbounds"}, + purpose = "Demonstrates restricting camera panning to a specific bounding box (Adelaide/Pacific) and zoom slider limits.", + successCriteria = "User cannot pan the camera outside the clamped region; zoom sliders enforce min/max bounds immediately.", + failureIndicators = "Camera pans outside bounding box or resetting bounds fails when selecting 'Reset Bounds'.", + framework = Framework.JAVA_VIEWS +) public class CameraClampingDemoActivity extends SamplesBaseActivity implements OnMapReadyCallback, OnCameraIdleListener, GoogleMap.OnCameraMoveListener { diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/CameraDemoActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/CameraDemoActivity.java index 3695ad94a..e4d685522 100644 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/CameraDemoActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/CameraDemoActivity.java @@ -15,6 +15,10 @@ package com.example.mapdemo; +import com.example.common_ui.catalog.Sample; +import com.example.common_ui.catalog.Complexity; +import com.example.common_ui.catalog.Framework; + import android.graphics.Color; import android.os.Bundle; import android.util.Log; @@ -37,12 +41,31 @@ import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.MarkerOptions; import com.example.common_ui.databinding.CameraDemoBinding; import com.google.android.gms.maps.model.PolylineOptions; /** * This shows how to change the camera position for the map. */ +@Sample( + id = "camera_demo", + title = "Camera Controls & Animation", + description = "Programmatic camera panning, zooming, tilt, bearing, and smooth animations.", + category = "Camera Controls", + complexity = Complexity.SIMPLE, + tags = {"#camera", "#animation", "#bearing", "#tilt", "#zoom", "#pan"}, + apiCalls = { + "GoogleMap.animateCamera(CameraUpdate)", + "GoogleMap.moveCamera(CameraUpdate)", + "GoogleMap.addMarker(MarkerOptions)", + "CameraUpdateFactory.newCameraPosition(CameraPosition)" + }, + purpose = "Demonstrates programmatic camera movements, animated transitions, tilt angles, and bearing rotations.", + successCriteria = "Buttons animate camera smoothly with custom durations, stops, and rotation angles.", + failureIndicators = "Jerky animations, unexpected camera jumps, or tilt angle exceeding platform constraints.", + framework = Framework.JAVA_VIEWS +) // [START maps_camera_events] public class CameraDemoActivity extends SamplesBaseActivity implements OnCameraMoveStartedListener, @@ -140,7 +163,11 @@ public void onMapReady(GoogleMap googleMap) { // [END_EXCLUDE] // Show Sydney - map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(-33.87365, 151.20689), 10)); + LatLng sydneyLatLng = new LatLng(-33.87365, 151.20689); + LatLng bondiLatLng = new LatLng(-33.891614, 151.276417); + map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydneyLatLng, 10)); + map.addMarker(new MarkerOptions().position(sydneyLatLng).title("Sydney")); + map.addMarker(new MarkerOptions().position(bondiLatLng).title("Bondi Beach")); } public GoogleMap getMap() { diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/CircleDemoActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/CircleDemoActivity.java index 95494f3ce..eba9623b8 100755 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/CircleDemoActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/CircleDemoActivity.java @@ -14,6 +14,10 @@ package com.example.mapdemo; +import com.example.common_ui.catalog.Sample; +import com.example.common_ui.catalog.Complexity; +import com.example.common_ui.catalog.Framework; + import android.graphics.Color; import android.graphics.Point; import android.location.Location; @@ -56,6 +60,18 @@ /** * This shows how to draw circles on a map. */ +@Sample( + id = "circles", + title = "Circles & Geodesic Radii", + description = "Drawing geographic circles with dynamic center drag, radius sliders, and stroke styling.", + category = "Shapes & Geometry", + complexity = Complexity.SIMPLE, + tags = {"#shapes", "#circles", "#radius", "#geodesic"}, + purpose = "Demonstrates drawing circles with radius defined in meters and dynamic updates via seekbars.", + successCriteria = "Adjusting radius slider dynamically updates circle boundary in real-time.", + failureIndicators = "Circle distorted or radius math inaccurate across high latitudes.", + framework = Framework.JAVA_VIEWS +) public class CircleDemoActivity extends SamplesBaseActivity implements OnSeekBarChangeListener, OnMarkerDragListener, OnMapLongClickListener, OnItemSelectedListener, OnMapReadyCallback, MapProvider { diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/CloudBasedMapStylingDemoActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/CloudBasedMapStylingDemoActivity.java index 93f21802f..4540b417e 100644 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/CloudBasedMapStylingDemoActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/CloudBasedMapStylingDemoActivity.java @@ -16,9 +16,12 @@ import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; +import com.example.common_ui.R; +import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; +import com.google.android.gms.maps.model.LatLng; /** * This shows how to use Cloud-based Map Styling in a simple Activity. For more information on how @@ -40,29 +43,31 @@ protected void onCreate(Bundle savedInstanceState) { // The underlying style the map will use has been set in the layout // `cloud_styling_basic_demo` under the SupportMapFragment's `map:mapId` attribute. - setContentView(com.example.common_ui.R.layout.cloud_styling_basic_demo); + setContentView(R.layout.cloud_styling_basic_demo); SupportMapFragment mapFragment = - (SupportMapFragment) getSupportFragmentManager().findFragmentById(com.example.common_ui.R.id.map); + (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); mapFragment.getMapAsync(this); setUpButtonListeners(); - applyInsets(findViewById(com.example.common_ui.R.id.map_container)); + applyInsets(findViewById(R.id.map_container)); } @Override public void onMapReady(GoogleMap map) { this.map = map; map.setMapType(currentMapType); + LatLng montBlanc = new LatLng(45.8326, 6.8652); + map.moveCamera(CameraUpdateFactory.newLatLngZoom(montBlanc, 11.5f)); } private void setUpButtonListeners() { - findViewById(com.example.common_ui.R.id.styling_normal_mode).setOnClickListener( + findViewById(R.id.styling_normal_mode).setOnClickListener( v -> setMapType(GoogleMap.MAP_TYPE_NORMAL)); - findViewById(com.example.common_ui.R.id.styling_satellite_mode).setOnClickListener( + findViewById(R.id.styling_satellite_mode).setOnClickListener( v -> setMapType(GoogleMap.MAP_TYPE_SATELLITE)); - findViewById(com.example.common_ui.R.id.styling_hybrid_mode).setOnClickListener( + findViewById(R.id.styling_hybrid_mode).setOnClickListener( v -> setMapType(GoogleMap.MAP_TYPE_HYBRID)); - findViewById(com.example.common_ui.R.id.styling_terrain_mode).setOnClickListener( + findViewById(R.id.styling_terrain_mode).setOnClickListener( v -> setMapType(GoogleMap.MAP_TYPE_TERRAIN)); } diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/DataDrivenBoundariesActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/DataDrivenBoundariesActivity.java index 84cad55ff..bc15fd557 100644 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/DataDrivenBoundariesActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/DataDrivenBoundariesActivity.java @@ -13,6 +13,10 @@ // limitations under the License. package com.example.mapdemo; +import com.example.common_ui.catalog.Sample; +import com.example.common_ui.catalog.Complexity; +import com.example.common_ui.catalog.Framework; + import static java.lang.Math.round; import android.graphics.Color; @@ -57,6 +61,18 @@ * on how the Data-driven styling for boundaries work, check out the following link: * https://developers.google.com/maps/documentation/android-sdk/dds-boundaries/overview */ +@Sample( + id = "data_driven_boundaries", + title = "Data-Driven Boundaries", + description = "Dynamic styling and click handlers for administrative boundaries (Localities, States, Countries).", + category = "Data-Driven Styling", + complexity = Complexity.ADVANCED, + tags = {"#boundaries", "#datadriven", "#featurelayer", "#locality", "#choropleth"}, + purpose = "Demonstrates styling administrative boundaries dynamically via FeatureLayer and capturing boundary clicks.", + successCriteria = "Boundaries render with custom stroke and fill colors; tapping a region highlights its polygon.", + failureIndicators = "Boundary layer is null (requires vector map / Map ID) or click listener not firing.", + framework = Framework.JAVA_VIEWS +) // [START maps_android_data_driven_styling_boundaries] public class DataDrivenBoundariesActivity extends SamplesBaseActivity implements OnMapReadyCallback, FeatureLayer.OnFeatureClickListener, PopupMenu.OnMenuItemClickListener { @@ -119,8 +135,16 @@ protected void onCreate(Bundle savedInstanceState) { mapFragment.getMapAsync(this); - findViewById(R.id.button_hawaii).setOnClickListener(view -> centerMapOnLocation(HANA_HAWAII, 11f)); - findViewById(R.id.button_us).setOnClickListener(view -> centerMapOnLocation(CENTER_US, 1f)); + findViewById(R.id.button_hawaii).setOnClickListener(view -> { + localityEnabled = true; + updateStyles(); + centerMapOnLocation(HANA_HAWAII, 11f); + }); + findViewById(R.id.button_us).setOnClickListener(view -> { + adminAreaEnabled = true; + updateStyles(); + centerMapOnLocation(CENTER_US, 3.8f); + }); applyInsets(findViewById(R.id.map_container)); diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/DataDrivenDatasetStylingActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/DataDrivenDatasetStylingActivity.java index e829d35be..991f8022a 100644 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/DataDrivenDatasetStylingActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/DataDrivenDatasetStylingActivity.java @@ -13,6 +13,10 @@ // limitations under the License. package com.example.mapdemo; +import com.example.common_ui.catalog.Sample; +import com.example.common_ui.catalog.Complexity; +import com.example.common_ui.catalog.Framework; + import android.graphics.Color; import android.os.Bundle; import android.util.Log; @@ -54,6 +58,18 @@ *

* This is meant to work with the datasets in the res/raw directory. */ +@Sample( + id = "data_driven_datasets", + title = "Data-Driven Dataset Styling", + description = "Styling custom geospatial datasets uploaded to Google Cloud Platform based on attributes.", + category = "Data-Driven Styling", + complexity = Complexity.ADVANCED, + tags = {"#datasets", "#datadriven", "#clouddata", "#attributes", "#filtering"}, + purpose = "Demonstrates loading a Cloud Dataset FeatureLayer and applying dynamic style rules based on feature properties.", + successCriteria = "Dataset points and polygons display distinct styling according to attribute values.", + failureIndicators = "Dataset ID invalid or attributes fail to filter correctly.", + framework = Framework.JAVA_VIEWS +) // [START maps_android_data_driven_styling_datasets] public class DataDrivenDatasetStylingActivity extends SamplesBaseActivity implements OnMapReadyCallback, FeatureLayer.OnFeatureClickListener { private record DataSet( diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/EventsDemoActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/EventsDemoActivity.java index 5114f7d36..2b25790ec 100644 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/EventsDemoActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/EventsDemoActivity.java @@ -15,6 +15,10 @@ package com.example.mapdemo; +import com.example.common_ui.catalog.Sample; +import com.example.common_ui.catalog.Complexity; +import com.example.common_ui.catalog.Framework; + import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.GoogleMap.OnCameraIdleListener; import com.google.android.gms.maps.GoogleMap.OnMapClickListener; @@ -32,6 +36,18 @@ /** * This shows how to listen to some {@link GoogleMap} events. */ +@Sample( + id = "events_demo", + title = "Events & Gestures", + description = "Handling map taps, long clicks, camera change events, and POI selections.", + category = "Events & Gestures", + complexity = Complexity.SNIPPET, + tags = {"#events", "#gestures", "#clicks", "#poi", "#listeners"}, + purpose = "Demonstrates registering listeners for map clicks, long presses, camera moves, and POI selections.", + successCriteria = "Event log text updates with coordinates and POI names upon user interaction.", + failureIndicators = "Click events swallowed or POI name unresolved.", + framework = Framework.JAVA_VIEWS +) // [START maps_android_sample_events] public class EventsDemoActivity extends SamplesBaseActivity implements OnMapClickListener, OnMapLongClickListener, OnCameraIdleListener, diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/GroundOverlayDemoActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/GroundOverlayDemoActivity.java index a1cb5af9f..4958a6840 100644 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/GroundOverlayDemoActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/GroundOverlayDemoActivity.java @@ -14,6 +14,10 @@ package com.example.mapdemo; +import com.example.common_ui.catalog.Sample; +import com.example.common_ui.catalog.Complexity; +import com.example.common_ui.catalog.Framework; + import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.OnMapReadyCallback; @@ -42,6 +46,18 @@ * oriented against the Earth's surface rather than the screen. Rotating, tilting, or zooming the * map changes the orientation of the camera, but not the overlay. */ +@Sample( + id = "ground_overlay", + title = "Ground Overlays", + description = "Anchoring raster bitmap images to geographic LatLngBounds on the map surface.", + category = "Overlays & Tiles", + complexity = Complexity.SIMPLE, + tags = {"#overlays", "#groundoverlay", "#images", "#bounds", "#transparency"}, + purpose = "Demonstrates overlaying historical or custom aerial images onto the map with transparency sliders.", + successCriteria = "Historical Newark map image appears pinned to geographic coordinates with adjustable transparency.", + failureIndicators = "Overlay image stretched/misaligned or opacity slider unresponsive.", + framework = Framework.JAVA_VIEWS +) public class GroundOverlayDemoActivity extends SamplesBaseActivity implements OnSeekBarChangeListener, OnMapReadyCallback, GoogleMap.OnGroundOverlayClickListener, MapProvider { diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/LiteDemoActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/LiteDemoActivity.java index 139b11d33..245309274 100755 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/LiteDemoActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/LiteDemoActivity.java @@ -15,6 +15,10 @@ package com.example.mapdemo; +import com.example.common_ui.catalog.Complexity; +import com.example.common_ui.catalog.Framework; +import com.example.common_ui.catalog.Sample; +import com.example.common_ui.R; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.SupportMapFragment; @@ -38,6 +42,25 @@ * launch the Google Maps Mobile application, {@link com.google.android.gms.maps.CameraUpdate}s * and {@link com.google.android.gms.maps.model.Polygon}s. */ +@Sample( + id = "com.example.mapdemo.LiteDemoActivity", + title = "Lite Mode Basics", + description = "Non-interactive raster map with programmatic camera jumps, markers, and polygons.", + category = "Lists & Performance", + complexity = Complexity.SIMPLE, + tags = {"#litemode", "#static", "#raster", "#markers", "#polygons"}, + apiCalls = { + "GoogleMapOptions.liteMode(true)", + "GoogleMap.moveCamera(CameraUpdate)", + "GoogleMap.addMarker(MarkerOptions)", + "GoogleMap.addPolygon(PolygonOptions)" + }, + purpose = "Demonstrates Lite Mode features: static raster rendering, markers launching Google Maps intent, and programmatic camera jumps.", + successCriteria = "Map renders lightweight static raster view; Darwin/Adelaide buttons immediately reposition camera.", + failureIndicators = "Full vector GL map loaded instead of lite mode, or buttons fail to move camera.", + framework = Framework.JAVA_VIEWS +) +// [START maps_android_sample_lite] public class LiteDemoActivity extends SamplesBaseActivity implements OnMapAndViewReadyListener.OnGlobalLayoutAndMapReadyListener { @@ -73,7 +96,7 @@ protected void onCreate(Bundle savedInstanceState) { // Get the map and register for the ready callback SupportMapFragment mapFragment = - (SupportMapFragment) getSupportFragmentManager().findFragmentById(com.example.common_ui.R.id.map); + (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); new OnMapAndViewReadyListener(mapFragment, this); applyInsets(binding.mapContainer); @@ -190,3 +213,4 @@ private void addMarkers() { .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA))); } } +// [END maps_android_sample_lite] diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/LiteListDemoActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/LiteListDemoActivity.java index 3dc14db1a..bdd9d3625 100755 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/LiteListDemoActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/LiteListDemoActivity.java @@ -15,6 +15,10 @@ package com.example.mapdemo; +import com.example.common_ui.catalog.Sample; +import com.example.common_ui.catalog.Complexity; +import com.example.common_ui.catalog.Framework; + import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapView; @@ -41,6 +45,18 @@ * Note the use of the view holder pattern with the * {@link com.google.android.gms.maps.OnMapReadyCallback}. */ +@Sample( + id = "lite_list", + title = "Lite Mode in RecyclerView", + description = "High-performance Lite Mode map instances inside smooth scrolling RecyclerView list rows.", + category = "Lists & Performance", + complexity = Complexity.ADVANCED, + tags = {"#litemode", "#recyclerview", "#lists", "#viewholder", "#lifecycle"}, + purpose = "Demonstrates embedding MapView lite mode instances inside RecyclerView rows with proper lifecycle management.", + successCriteria = "List scrolls at 60/120fps without stutter; map snapshots display accurate markers per row.", + failureIndicators = "RecyclerView scrolling stutters or recycled MapViews display stale map markers.", + framework = Framework.JAVA_VIEWS +) public class LiteListDemoActivity extends SamplesBaseActivity { private RecyclerView mRecyclerView; diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/LocationSourceDemoActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/LocationSourceDemoActivity.java index e3c6e4825..812805a2b 100644 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/LocationSourceDemoActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/LocationSourceDemoActivity.java @@ -12,121 +12,352 @@ // See the License for the specific language governing permissions and // limitations under the License. - package com.example.mapdemo; -import android.Manifest.permission; -import android.annotation.SuppressLint; +import android.Manifest; import android.content.pm.PackageManager; +import android.location.Location; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.SystemClock; +import android.util.Xml; +import android.view.View; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.appcompat.widget.Toolbar; import androidx.core.app.ActivityCompat; +import com.example.common_ui.R; +import com.example.common_ui.catalog.Complexity; +import com.example.common_ui.catalog.Framework; +import com.example.common_ui.catalog.Sample; +import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; -import com.google.android.gms.maps.GoogleMap.OnMapLongClickListener; import com.google.android.gms.maps.LocationSource; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; +import com.google.android.gms.maps.model.JointType; import com.google.android.gms.maps.model.LatLng; - -import android.location.Location; -import android.os.Bundle; - -import androidx.appcompat.app.AppCompatActivity; +import com.google.android.gms.maps.model.LatLngBounds; +import com.google.android.gms.maps.model.PolylineOptions; +import com.google.android.gms.maps.model.RoundCap; +import com.google.android.material.button.MaterialButton; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Executors; +import org.xmlpull.v1.XmlPullParser; /** - * This shows how to use a custom location source. + * Demonstrates feeding programmatic coordinates from a GPX track into the GoogleMap location layer + * using a custom {@link LocationSource}. */ +@Sample( + id = "com.example.mapdemo.LocationSourceDemoActivity", + title = "Custom LocationSource", + description = "Providing a custom mock LocationSource for simulated GPS navigation playback along a trail.", + category = "Location & Sensors", + complexity = Complexity.ADVANCED, + tags = {"#location", "#locationsource", "#mock", "#simulation", "#gpx", "#navigation"}, + apiCalls = { + "GoogleMap.setLocationSource(LocationSource)", + "LocationSource.activate(OnLocationChangedListener)", + "LocationSource.deactivate()", + "GoogleMap.setMyLocationEnabled(Boolean)", + "GoogleMap.addPolyline(PolylineOptions)", + "CameraUpdateFactory.newLatLngBounds(LatLngBounds, Int)" + }, + purpose = "Shows how to feed programmatic coordinates from a GPX track into the GoogleMap location layer using a custom LocationSource.", + successCriteria = "The map bounds to the trail, draws a polyline, and the blue dot animates smoothly along the route.", + failureIndicators = "Blue dot fails to move or location updates cause memory leaks.", + framework = Framework.JAVA_VIEWS +) +// [START maps_android_sample_location_source] public class LocationSourceDemoActivity extends SamplesBaseActivity implements OnMapReadyCallback { - /** - * A {@link LocationSource} which reports a new location whenever a user long presses the map - * at - * the point at which a user long pressed the map. - */ - private static class LongPressLocationSource implements LocationSource, OnMapLongClickListener { - - private OnLocationChangedListener mListener; - - /** - * Flag to keep track of the activity's lifecycle. This is not strictly necessary in this - * case because onMapLongPress events don't occur while the activity containing the map is - * paused but is included to demonstrate best practices (e.g., if a background service were - * to be used). - */ - private boolean mPaused; + private GoogleMap mMap; + private GpxLocationSource mLocationSource; + private LatLngBounds mTrackBounds; - @Override - public void activate(OnLocationChangedListener listener) { - mListener = listener; - } - - @Override - public void deactivate() { - mListener = null; - } - - @Override - public void onMapLongClick(LatLng point) { - if (mListener != null && !mPaused) { - Location location = new Location("LongPressLocationProvider"); - location.setLatitude(point.latitude); - location.setLongitude(point.longitude); - location.setAccuracy(100); - mListener.onLocationChanged(location); + private final ActivityResultLauncher mPermissionLauncher = + registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), isGranted -> { + if (Boolean.TRUE.equals(isGranted.get(Manifest.permission.ACCESS_FINE_LOCATION)) + || Boolean.TRUE.equals(isGranted.get(Manifest.permission.ACCESS_COARSE_LOCATION))) { + enableMyLocation(); } - } - - public void onPause() { - mPaused = true; - } - - public void onResume() { - mPaused = false; - } - } - - private LongPressLocationSource mLocationSource; + }); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(com.example.common_ui.R.layout.basic_demo); + setContentView(R.layout.location_source_demo); - androidx.appcompat.widget.Toolbar toolbar = findViewById(com.example.common_ui.R.id.top_bar); + Toolbar toolbar = findViewById(R.id.top_bar); if (toolbar != null) { - toolbar.setTitle(com.example.common_ui.R.string.location_source_demo_label); + toolbar.setTitle(R.string.location_source_demo_label); } - mLocationSource = new LongPressLocationSource(); + mLocationSource = new GpxLocationSource(new ArrayList<>(), 60L); + Executors.newSingleThreadExecutor().execute(() -> { + List trackPoints = parseGpxTrack(getResources().openRawResource(R.raw.fowler_rattlesnake)); + runOnUiThread(() -> { + mLocationSource.setTrackPoints(trackPoints); + if (mMap != null) { + setupTrackOnMap(mMap); + } + }); + }); + + MaterialButton toggleButton = findViewById(R.id.btn_toggle_playback); + if (toggleButton != null) { + toggleButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + boolean isPlaying = mLocationSource.togglePlayback(); + toggleButton.setText(isPlaying ? R.string.location_source_pause : R.string.location_source_play); + } + }); + } SupportMapFragment mapFragment = - (SupportMapFragment) getSupportFragmentManager().findFragmentById(com.example.common_ui.R.id.map); - mapFragment.getMapAsync(this); - applyInsets(findViewById(com.example.common_ui.R.id.map_container)); + (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); + if (mapFragment != null) { + mapFragment.getMapAsync(this); + } + + applyInsets(findViewById(R.id.map_container)); } @Override protected void onResume() { super.onResume(); - mLocationSource.onResume(); + if (mLocationSource != null) { + mLocationSource.onResume(); + } } @Override protected void onPause() { super.onPause(); - mLocationSource.onPause(); + if (mLocationSource != null) { + mLocationSource.onPause(); + } } - @SuppressLint("MissingPermission") @Override public void onMapReady(GoogleMap map) { + mMap = map; map.setLocationSource(mLocationSource); - map.setOnMapLongClickListener(mLocationSource); + enableMyLocation(); + if (!mLocationSource.getTrackPoints().isEmpty()) { + setupTrackOnMap(map); + } + } - if (ActivityCompat.checkSelfPermission(this, permission.ACCESS_FINE_LOCATION) - != PackageManager.PERMISSION_GRANTED - && ActivityCompat.checkSelfPermission(this, permission.ACCESS_COARSE_LOCATION) - != PackageManager.PERMISSION_GRANTED) { + private void setupTrackOnMap(GoogleMap map) { + if (mTrackBounds != null) { return; } - map.setMyLocationEnabled(true); + List trackPoints = mLocationSource.getTrackPoints(); + if (trackPoints.isEmpty()) { + return; + } + + LatLngBounds.Builder boundsBuilder = LatLngBounds.builder(); + for (LatLng point : trackPoints) { + boundsBuilder.include(point); + } + mTrackBounds = boundsBuilder.build(); + + // 1. Draw route polyline with outer casing and core color + map.addPolyline( + new PolylineOptions() + .addAll(trackPoints) + .color(0xFF0D47A1) + .width(16f) + .jointType(JointType.ROUND) + .startCap(new RoundCap()) + .endCap(new RoundCap()) + ); + map.addPolyline( + new PolylineOptions() + .addAll(trackPoints) + .color(0xFF2196F3) + .width(10f) + .jointType(JointType.ROUND) + .startCap(new RoundCap()) + .endCap(new RoundCap()) + ); + + // 2. Center and bound camera + int padding = (int) (getResources().getDisplayMetrics().density * 56); + map.moveCamera(CameraUpdateFactory.newLatLngZoom(mTrackBounds.getCenter(), 14.5f)); + map.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() { + @Override + public void onMapLoaded() { + map.animateCamera(CameraUpdateFactory.newLatLngBounds(mTrackBounds, padding)); + } + }); + + MaterialButton recenterButton = findViewById(R.id.btn_recenter_bounds); + if (recenterButton != null) { + recenterButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mTrackBounds != null) { + map.animateCamera(CameraUpdateFactory.newLatLngBounds(mTrackBounds, padding)); + } + } + }); + } + } + + private void enableMyLocation() { + if (mMap == null) { + return; + } + if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) + == PackageManager.PERMISSION_GRANTED + || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) + == PackageManager.PERMISSION_GRANTED) { + mMap.setMyLocationEnabled(true); + } else { + mPermissionLauncher.launch(new String[]{ + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.ACCESS_COARSE_LOCATION + }); + } + } + + private List parseGpxTrack(InputStream inputStream) { + List points = new ArrayList<>(); + try (InputStream stream = inputStream) { + XmlPullParser parser = Xml.newPullParser(); + parser.setInput(stream, "UTF-8"); + int eventType = parser.getEventType(); + while (eventType != XmlPullParser.END_DOCUMENT) { + if (eventType == XmlPullParser.START_TAG && "trkpt".equals(parser.getName())) { + String latStr = parser.getAttributeValue(null, "lat"); + String lonStr = parser.getAttributeValue(null, "lon"); + if (latStr != null && lonStr != null) { + try { + double lat = Double.parseDouble(latStr); + double lon = Double.parseDouble(lonStr); + points.add(new LatLng(lat, lon)); + } catch (NumberFormatException ignored) { + } + } + } + eventType = parser.next(); + } + } catch (Exception ignored) { + } + return points; + } + + private static class GpxLocationSource implements LocationSource { + private List trackPoints; + private final long intervalMs; + private OnLocationChangedListener listener; + private boolean isRunning = true; + private int currentIndex; + private final Handler handler = new Handler(Looper.getMainLooper()); + + private final Runnable stepRunnable = new Runnable() { + @Override + public void run() { + if (!isRunning || listener == null || trackPoints.isEmpty()) { + return; + } + emitCurrentPoint(); + currentIndex = (currentIndex + 1) % trackPoints.size(); + handler.removeCallbacks(this); + handler.postDelayed(this, intervalMs); + } + }; + + public GpxLocationSource(List trackPoints, long intervalMs) { + this.trackPoints = trackPoints; + this.intervalMs = intervalMs; + } + + public void setTrackPoints(List trackPoints) { + this.trackPoints = trackPoints; + this.currentIndex = 0; + if (isRunning && listener != null && !trackPoints.isEmpty()) { + handler.removeCallbacks(stepRunnable); + handler.post(stepRunnable); + } + } + + public List getTrackPoints() { + return trackPoints; + } + + @Override + public void activate(OnLocationChangedListener listener) { + this.listener = listener; + if (isRunning) { + emitCurrentPoint(); + handler.postDelayed(stepRunnable, intervalMs); + } + } + + @Override + public void deactivate() { + handler.removeCallbacks(stepRunnable); + this.listener = null; + } + + public boolean togglePlayback() { + isRunning = !isRunning; + if (isRunning) { + handler.post(stepRunnable); + } else { + handler.removeCallbacks(stepRunnable); + } + return isRunning; + } + + private void emitCurrentPoint() { + if (listener == null || trackPoints.isEmpty()) { + return; + } + LatLng p1 = trackPoints.get(currentIndex); + LatLng p2 = trackPoints.get((currentIndex + 1) % trackPoints.size()); + + Location loc1 = new Location("GpxTrackLocationSource"); + loc1.setLatitude(p1.latitude); + loc1.setLongitude(p1.longitude); + + Location loc2 = new Location("GpxTrackLocationSource"); + loc2.setLatitude(p2.latitude); + loc2.setLongitude(p2.longitude); + + float bearing = loc1.bearingTo(loc2); + + Location location = new Location("GpxTrackLocationSource"); + location.setLatitude(p1.latitude); + location.setLongitude(p1.longitude); + location.setAccuracy(6.0f); + location.setBearing(bearing); + location.setSpeed(4.5f); + location.setTime(System.currentTimeMillis()); + location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); + + listener.onLocationChanged(location); + } + + public void onPause() { + handler.removeCallbacks(stepRunnable); + } + + public void onResume() { + if (isRunning && listener != null) { + handler.post(stepRunnable); + } + } } } +// [END maps_android_sample_location_source] diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/MarkerDemoActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/MarkerDemoActivity.java index 5ce1ba105..522d8eef2 100644 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/MarkerDemoActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/MarkerDemoActivity.java @@ -14,6 +14,10 @@ package com.example.mapdemo; +import com.example.common_ui.catalog.Sample; +import com.example.common_ui.catalog.Complexity; +import com.example.common_ui.catalog.Framework; + import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.GoogleMap.InfoWindowAdapter; @@ -40,6 +44,7 @@ import android.os.SystemClock; import com.example.common_ui.R; +import com.example.common_ui.databinding.MarkerDemoBinding; import androidx.annotation.ColorInt; import androidx.annotation.DrawableRes; @@ -66,6 +71,18 @@ /** * This shows how to place markers on a map. */ +@Sample( + id = "marker_demo", + title = "Standard Markers & Info Windows", + description = "Placing markers, custom icons, draggable pins (long press Melbourne to drag), and custom info window layouts.", + category = "Markers & Overlays", + complexity = Complexity.SIMPLE, + tags = {"#markers", "#infowindow", "#draggable", "#icons", "#anchor"}, + purpose = "Demonstrates adding standard markers with alpha, rotation, draggable pins (long press Melbourne to drag), and custom InfoWindowAdapter views.", + successCriteria = "Tapping markers displays custom info windows with formatted content; dragging pins updates position.", + failureIndicators = "Info window clicks not detected or custom snippet styling not applied.", + framework = Framework.JAVA_VIEWS +) // [START maps_android_sample_marker] public class MarkerDemoActivity extends SamplesBaseActivity implements OnMarkerClickListener, @@ -90,7 +107,7 @@ public class MarkerDemoActivity extends SamplesBaseActivity implements private static final LatLng ALICE_SPRINGS = new LatLng(-24.6980, 133.8807); - private com.example.common_ui.databinding.MarkerDemoBinding binding; + private MarkerDemoBinding binding; /** Demonstrates customizing the info window and/or its contents. */ class CustomInfoWindowAdapter implements InfoWindowAdapter { @@ -208,7 +225,7 @@ private void render(Marker marker, View view) { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - binding = com.example.common_ui.databinding.MarkerDemoBinding.inflate(getLayoutInflater()); + binding = MarkerDemoBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); binding.rotationSeekBar.setMax(360); @@ -291,7 +308,8 @@ private void addMarkersToMap() { mMelbourne = mMap.addMarker(new MarkerOptions() .position(MELBOURNE) .title("Melbourne") - .snippet("Population: 4,137,400") + .snippet(getString(R.string.melbourne_drag_snippet)) + .icon(vectorToBitmap(R.drawable.ic_drag_pan, Color.parseColor("#E65100"))) .draggable(true)); // Place four markers on top of each other with differing z-indexes. @@ -333,6 +351,11 @@ private void addMarkersToMap() { .icon(vectorToBitmap(R.drawable.ic_android, Color.parseColor("#A4C639"))) .title("Alice Springs")); + if (mMelbourne != null) { + mMelbourne.showInfoWindow(); + mLastSelectedMarker = mMelbourne; + } + // Creates a marker rainbow demonstrating how to create default marker icons of different // hues (colors). float rotation = binding.rotationSeekBar.getProgress(); @@ -486,16 +509,19 @@ public void onInfoWindowLongClick(Marker marker) { @Override public void onMarkerDragStart(Marker marker) { + binding.topText.setVisibility(View.VISIBLE); binding.topText.setText(R.string.on_marker_drag_start); } @Override public void onMarkerDragEnd(Marker marker) { + binding.topText.setVisibility(View.VISIBLE); binding.topText.setText(R.string.on_marker_drag_end); } @Override public void onMarkerDrag(Marker marker) { + binding.topText.setVisibility(View.VISIBLE); binding.topText.setText(getString(R.string.on_marker_drag, marker.getPosition().latitude, marker.getPosition().longitude)); } diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/MultiMapDemoActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/MultiMapDemoActivity.java index f0403251f..7662dad53 100644 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/MultiMapDemoActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/MultiMapDemoActivity.java @@ -17,17 +17,71 @@ import android.os.Bundle; -import androidx.appcompat.app.AppCompatActivity; +import com.example.common_ui.R; +import com.example.common_ui.catalog.Complexity; +import com.example.common_ui.catalog.Framework; +import com.example.common_ui.catalog.Sample; +import com.google.android.gms.maps.CameraUpdateFactory; +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.SupportMapFragment; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.MarkerOptions; /** - * This shows how to create a simple activity with multiple maps on screen. + * Demonstrates rendering and animating multiple independent GoogleMap instances concurrently. + * Each quadrant showcases a UNESCO World Heritage Site with simultaneous smooth zoom animations. */ +@Sample( + id = "com.example.mapdemo.MultiMapDemoActivity", + title = "Multi-Map View", + description = "Rendering multiple independent GoogleMap instances in a single activity layout.", + category = "Map Initialization", + complexity = Complexity.ADVANCED, + tags = {"#multimap", "#multiple", "#layout", "#rendering"}, + apiCalls = { + "SupportMapFragment.getMapAsync(OnMapReadyCallback)", + "GoogleMap.animateCamera(CameraUpdate, int, CancelableCallback)", + "GoogleMap.addMarker(MarkerOptions)" + }, + purpose = "Shows how to render and control multiple independent GoogleMap instances concurrently in one screen.", + successCriteria = "All 4 map fragments render distinct geographic locations simultaneously with smooth scrolling.", + failureIndicators = "GL context collision, thread locking, or tile stuttering when dragging multiple maps.", + framework = Framework.JAVA_VIEWS +) +// [START maps_android_sample_multimap] public class MultiMapDemoActivity extends SamplesBaseActivity { + private static final LatLng COMMON_START = new LatLng(20.0, 0.0); + private static final LatLng GIZA = new LatLng(29.9792, 31.1342); + private static final LatLng MACHU_PICCHU = new LatLng(-13.1631, -72.5450); + private static final LatLng TAJ_MAHAL = new LatLng(27.1751, 78.0421); + private static final LatLng COLOSSEUM = new LatLng(41.8902, 12.4922); + private static final float INITIAL_ZOOM = 1.5f; + private static final float TARGET_ZOOM = 15.5f; + private static final int ANIM_DURATION_MS = 3000; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(com.example.common_ui.R.layout.multimap_demo); - applyInsets(findViewById(com.example.common_ui.R.id.map_container)); + setContentView(R.layout.multimap_demo); + applyInsets(findViewById(R.id.map_container)); + + setupMap(R.id.map1, GIZA, "Pyramids of Giza"); + setupMap(R.id.map2, MACHU_PICCHU, "Machu Picchu"); + setupMap(R.id.map3, TAJ_MAHAL, "Taj Mahal"); + setupMap(R.id.map4, COLOSSEUM, "Colosseum"); + } + + private void setupMap(int fragmentId, LatLng location, String title) { + SupportMapFragment fragment = + (SupportMapFragment) getSupportFragmentManager().findFragmentById(fragmentId); + if (fragment != null) { + fragment.getMapAsync(map -> { + map.moveCamera(CameraUpdateFactory.newLatLngZoom(COMMON_START, INITIAL_ZOOM)); + map.addMarker(new MarkerOptions().position(location).title(title)); + map.animateCamera(CameraUpdateFactory.newLatLngZoom(location, TARGET_ZOOM), ANIM_DURATION_MS, null); + }); + } } } +// [END maps_android_sample_multimap] diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/MyLocationDemoActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/MyLocationDemoActivity.java index 7f9008f8a..855899988 100755 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/MyLocationDemoActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/MyLocationDemoActivity.java @@ -15,6 +15,10 @@ package com.example.mapdemo; +import com.example.common_ui.catalog.Sample; +import com.example.common_ui.catalog.Complexity; +import com.example.common_ui.catalog.Framework; + import android.Manifest.permission; import android.annotation.SuppressLint; import com.google.android.gms.maps.GoogleMap; @@ -41,6 +45,18 @@ * android.Manifest.permission#ACCESS_COARSE_LOCATION} are requested at run time. If either * permission is not granted, the Activity is finished with an error message. */ +@Sample( + id = "my_location", + title = "My Location Layer", + description = "Enabling blue dot location indicator and My Location button with runtime permissions.", + category = "Location & Sensors", + complexity = Complexity.SIMPLE, + tags = {"#location", "#mylocation", "#permissions", "#bluedot"}, + purpose = "Demonstrates requesting ACCESS_FINE_LOCATION permissions and enabling the blue dot location layer.", + successCriteria = "Tapping My Location button centers camera on user's current GPS position.", + failureIndicators = "Permission denial causes unhandled crash or location button missing.", + framework = Framework.JAVA_VIEWS +) // [START maps_android_sample_my_location] public class MyLocationDemoActivity extends SamplesBaseActivity implements diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/PolygonDemoActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/PolygonDemoActivity.java index 95bda098a..c2fdb9111 100644 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/PolygonDemoActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/PolygonDemoActivity.java @@ -15,6 +15,10 @@ package com.example.mapdemo; +import com.example.common_ui.catalog.Sample; +import com.example.common_ui.catalog.Complexity; +import com.example.common_ui.catalog.Framework; + import android.graphics.Color; import android.os.Bundle; import android.view.View; @@ -47,6 +51,18 @@ /** * This shows how to draw polygons on a map. */ +@Sample( + id = "polygons", + title = "Polygons & Holes", + description = "Drawing geodesic polygons with fill colors, stroke patterns, click events, and interior holes.", + category = "Shapes & Geometry", + complexity = Complexity.SIMPLE, + tags = {"#shapes", "#polygons", "#holes", "#geometry", "#stroke", "#fill"}, + purpose = "Demonstrates drawing styled polygons with interior holes (donut polygons), click listeners, and stroke caps.", + successCriteria = "Polygons render with specified fill opacity and interior cutout holes properly subtracted.", + failureIndicators = "Holes not rendering as transparent cutouts or stroke color incorrect.", + framework = Framework.JAVA_VIEWS +) // [START maps_android_sample_polygons] public class PolygonDemoActivity extends SamplesBaseActivity implements OnSeekBarChangeListener, OnItemSelectedListener, OnMapReadyCallback { diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/PolylineDemoActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/PolylineDemoActivity.java index cda119abf..f192579f6 100644 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/PolylineDemoActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/PolylineDemoActivity.java @@ -15,6 +15,10 @@ package com.example.mapdemo; +import com.example.common_ui.catalog.Sample; +import com.example.common_ui.catalog.Complexity; +import com.example.common_ui.catalog.Framework; + import android.graphics.Color; import android.os.Bundle; import android.view.View; @@ -54,6 +58,18 @@ /** * This shows how to draw polylines on a map. */ +@Sample( + id = "polylines", + title = "Polylines & Patterns", + description = "Drawing polylines with joint types, dash/dot stroke patterns, joint styles, and spans.", + category = "Shapes & Geometry", + complexity = Complexity.SIMPLE, + tags = {"#shapes", "#polylines", "#patterns", "#dashes", "#stroke", "#routes"}, + purpose = "Demonstrates drawing customizable polylines with dash/gap patterns, round end caps, and bevel joints.", + successCriteria = "Polylines render crisp dashed and dotted stroke lines along coordinate vertices.", + failureIndicators = "Line caps distorted or custom pattern ignored on high-DPI screens.", + framework = Framework.JAVA_VIEWS +) // [START maps_android_sample_polylines] public class PolylineDemoActivity extends SamplesBaseActivity implements OnSeekBarChangeListener, OnItemSelectedListener, OnMapReadyCallback { diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/ProgrammaticDemoActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/ProgrammaticDemoActivity.java index 235215894..11cdbf619 100644 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/ProgrammaticDemoActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/ProgrammaticDemoActivity.java @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. - package com.example.mapdemo; import com.google.android.gms.maps.GoogleMap; @@ -36,6 +35,7 @@ public class ProgrammaticDemoActivity extends SamplesBaseActivity implements OnM @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setContentView(com.example.common_ui.R.layout.activity_sample_base); // It isn't possible to set a fragment's id programmatically so we set a tag instead and // search for it using that. @@ -47,15 +47,13 @@ protected void onCreate(Bundle savedInstanceState) { // To programmatically add the map, we first create a SupportMapFragment. mapFragment = SupportMapFragment.newInstance(); - // Then we add it using a FragmentTransaction. + // Then we add it using a FragmentTransaction into the standard sample content container. FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); - fragmentTransaction.add(android.R.id.content, mapFragment, MAP_FRAGMENT_TAG); + fragmentTransaction.add(com.example.common_ui.R.id.sample_content_container, mapFragment, MAP_FRAGMENT_TAG); fragmentTransaction.commit(); } mapFragment.getMapAsync(this); - - applyInsets(findViewById(com.example.common_ui.R.id.map_container)); } @Override diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/SnapshotDemoActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/SnapshotDemoActivity.java index d46e9611c..1a6858770 100755 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/SnapshotDemoActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/SnapshotDemoActivity.java @@ -15,6 +15,10 @@ package com.example.mapdemo; +import com.example.common_ui.catalog.Sample; +import com.example.common_ui.catalog.Complexity; +import com.example.common_ui.catalog.Framework; + import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.GoogleMap.OnMapLoadedCallback; @@ -43,6 +47,18 @@ * 3. Material 3 Split View: Displays the interactive map in a top card and the captured * preview in a bottom card with empty-state placeholder handling. */ +@Sample( + id = "snapshot_demo", + title = "Map Snapshot & Image Capture", + description = "Asynchronous bitmap frame capture using GoogleMap.snapshot() rendered in Material 3 preview cards.", + category = "Snapshots & Sharing", + complexity = Complexity.SIMPLE, + tags = {"#snapshot", "#bitmap", "#export", "#material3", "#capture"}, + purpose = "Demonstrates taking asynchronous high-resolution bitmap snapshots of the map with snapshot ready callbacks.", + successCriteria = "Tapping 'Take Snapshot' captures the current map frame and displays it in the Material 3 preview card.", + failureIndicators = "Snapshot returns blank bitmap or blocks UI thread during GL readback.", + framework = Framework.JAVA_VIEWS +) public class SnapshotDemoActivity extends SamplesBaseActivity implements OnMapReadyCallback { // Venice, Italy (Grand Canal & Rialto) diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/SplitStreetViewPanoramaAndMapDemoActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/SplitStreetViewPanoramaAndMapDemoActivity.java index f4ae30791..992993046 100755 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/SplitStreetViewPanoramaAndMapDemoActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/SplitStreetViewPanoramaAndMapDemoActivity.java @@ -15,6 +15,10 @@ package com.example.mapdemo; +import com.example.common_ui.catalog.Sample; +import com.example.common_ui.catalog.Complexity; +import com.example.common_ui.catalog.Framework; + import android.Manifest; import android.annotation.SuppressLint; import android.content.pm.PackageManager; @@ -61,6 +65,18 @@ * 3. **High-Accuracy Location**: Uses {@link FusedLocationProviderClient} with {@link Priority#PRIORITY_HIGH_ACCURACY} * to teleport Pegman and Street View to the user's real-time physical location on demand. */ +@Sample( + id = "split_street_view", + title = "Split Street View & Map Sync", + description = "Dual synchronized view: draggable 2D Pegman marker synchronized with 3D Street View panorama.", + category = "Street View", + complexity = Complexity.ADVANCED, + tags = {"#streetview", "#panorama", "#pegman", "#sync", "#bidirectional"}, + purpose = "Demonstrates bidirectional synchronization: dragging map Pegman updates panorama; walking Street View moves map marker.", + successCriteria = "Moving Pegman on map instantly loads new 360 panorama; street navigation rotates Pegman bearing.", + failureIndicators = "Infinite update feedback loops, Pegman desyncing from panorama, or FAB jump failing.", + framework = Framework.JAVA_VIEWS +) public class SplitStreetViewPanoramaAndMapDemoActivity extends SamplesBaseActivity implements OnMarkerDragListener, OnStreetViewPanoramaChangeListener, ActivityCompat.OnRequestPermissionsResultCallback { diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/StyledMapDemoActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/StyledMapDemoActivity.java index 8810774d8..3ff050402 100644 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/StyledMapDemoActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/StyledMapDemoActivity.java @@ -15,6 +15,11 @@ package com.example.mapdemo; +import com.example.common_ui.catalog.Sample; +import com.example.common_ui.catalog.Complexity; +import com.example.common_ui.catalog.Framework; +import com.example.common_ui.R; + import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.OnMapReadyCallback; @@ -37,6 +42,24 @@ /** * This shows how to style a map with JSON. */ +@Sample( + id = "com.example.mapdemo.StyledMapDemoActivity", + title = "JSON Map Styling (Retro / Dark)", + description = "Applying raw JSON styling rules locally for Retro, Grayscale, and Night mode aesthetics.", + category = "Styling & Cloud", + complexity = Complexity.SIMPLE, + tags = {"#styling", "#json", "#darkmode", "#night", "#retro"}, + apiCalls = { + "GoogleMap.setMapStyle(MapStyleOptions)", + "MapStyleOptions.loadRawResourceStyle(Context, int)", + "MapStyleOptions(String)" + }, + purpose = "Demonstrates applying local JSON MapStyleOptions to change base map theme dynamically.", + successCriteria = "Selecting style options in the toolbar instantly restyles the map (Night / Retro / Standard).", + failureIndicators = "Invalid JSON causes silent fallback or parsing exception.", + framework = Framework.JAVA_VIEWS +) +// [START maps_android_sample_styled_map] public class StyledMapDemoActivity extends SamplesBaseActivity implements OnMapReadyCallback { private GoogleMap mMap = null; @@ -47,16 +70,16 @@ public class StyledMapDemoActivity extends SamplesBaseActivity implements OnMapR // Stores the ID of the currently selected style, so that we can re-apply it when // the activity restores state, for example when the device changes orientation. - private int mSelectedStyleId = com.example.common_ui.R.string.style_label_default; + private int mSelectedStyleId = R.string.style_label_night; // These are simply the string resource IDs for each of the style names. We use them // as identifiers when choosing which style to apply. private final int[] mStyleIds = { - com.example.common_ui.R.string.style_label_retro, - com.example.common_ui.R.string.style_label_night, - com.example.common_ui.R.string.style_label_grayscale, - com.example.common_ui.R.string.style_label_no_pois_no_transit, - com.example.common_ui.R.string.style_label_default, + R.string.style_label_retro, + R.string.style_label_night, + R.string.style_label_grayscale, + R.string.style_label_no_pois_no_transit, + R.string.style_label_default, }; private static final LatLng SYDNEY = new LatLng(-33.8688, 151.2093); @@ -67,13 +90,13 @@ protected void onCreate(Bundle savedInstanceState) { if (savedInstanceState != null) { mSelectedStyleId = savedInstanceState.getInt(SELECTED_STYLE); } - setContentView(com.example.common_ui.R.layout.styled_map_demo); + setContentView(R.layout.styled_map_demo); SupportMapFragment mapFragment = - (SupportMapFragment) getSupportFragmentManager().findFragmentById(com.example.common_ui.R.id.map); + (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); mapFragment.getMapAsync(this); - applyInsets(findViewById(com.example.common_ui.R.id.map_container)); + applyInsets(findViewById(R.id.map_container)); } @Override @@ -92,13 +115,13 @@ public void onMapReady(@NonNull GoogleMap map) { @Override public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(com.example.common_ui.R.menu.styled_map, menu); + getMenuInflater().inflate(R.menu.styled_map, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == com.example.common_ui.R.id.menu_style_choose) { + if (item.getItemId() == R.id.menu_style_choose) { showStylesDialog(); } return true; @@ -119,11 +142,11 @@ private void showStylesDialog() { } AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(getString(com.example.common_ui.R.string.style_choose)); + builder.setTitle(getString(R.string.style_choose)); builder.setItems(styleNames.toArray(new CharSequence[styleNames.size()]), (dialog, which) -> { mSelectedStyleId = mStyleIds[which]; - String msg = getString(com.example.common_ui.R.string.style_set_to, getString(mSelectedStyleId)); + String msg = getString(R.string.style_set_to, getString(mSelectedStyleId)); Toast.makeText(getBaseContext(), msg, Toast.LENGTH_SHORT).show(); Log.d(TAG, msg); setSelectedStyle(); @@ -139,16 +162,16 @@ private void showStylesDialog() { private void setSelectedStyle() { MapStyleOptions style; int id = mSelectedStyleId; - if (id == com.example.common_ui.R.string.style_label_retro) { + if (id == R.string.style_label_retro) { // Sets the retro style via raw resource JSON. - style = MapStyleOptions.loadRawResourceStyle(this, com.example.common_ui.R.raw.mapstyle_retro); - } else if (id == com.example.common_ui.R.string.style_label_night) { + style = MapStyleOptions.loadRawResourceStyle(this, R.raw.mapstyle_retro); + } else if (id == R.string.style_label_night) { // Sets the night style via raw resource JSON. - style = MapStyleOptions.loadRawResourceStyle(this, com.example.common_ui.R.raw.mapstyle_night); - } else if (id == com.example.common_ui.R.string.style_label_grayscale) { + style = MapStyleOptions.loadRawResourceStyle(this, R.raw.mapstyle_night); + } else if (id == R.string.style_label_grayscale) { // Sets the grayscale style via raw resource JSON. - style = MapStyleOptions.loadRawResourceStyle(this, com.example.common_ui.R.raw.mapstyle_grayscale); - } else if (id == com.example.common_ui.R.string.style_label_no_pois_no_transit) { + style = MapStyleOptions.loadRawResourceStyle(this, R.raw.mapstyle_grayscale); + } else if (id == R.string.style_label_no_pois_no_transit) { // Sets the no POIs or transit style via JSON string. style = new MapStyleOptions("[" + " {" + @@ -170,7 +193,7 @@ private void setSelectedStyle() { " ]" + " }" + "]"); - } else if (id == com.example.common_ui.R.string.style_label_default) { + } else if (id == R.string.style_label_default) { // Removes previously set style, by setting it to null. style = null; } else { @@ -179,4 +202,5 @@ private void setSelectedStyle() { mMap.setMapStyle(style); } -} \ No newline at end of file +} +// [END maps_android_sample_styled_map] \ No newline at end of file diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/TileOverlayDemoActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/TileOverlayDemoActivity.java index b507ff684..1eb7f1e4a 100644 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/TileOverlayDemoActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/TileOverlayDemoActivity.java @@ -15,6 +15,10 @@ package com.example.mapdemo; +import com.example.common_ui.catalog.Sample; +import com.example.common_ui.catalog.Complexity; +import com.example.common_ui.catalog.Framework; + import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; @@ -38,6 +42,18 @@ /** * This demonstrates how to add a tile overlay to a map. */ +@Sample( + id = "tile_overlay", + title = "Tile Overlays & TileProvider", + description = "Custom TileProvider rendering coordinate grid tiles and custom imagery.", + category = "Overlays & Tiles", + complexity = Complexity.SIMPLE, + tags = {"#overlays", "#tiles", "#tileprovider", "#customtiles"}, + purpose = "Demonstrates generating custom raster tiles on the fly using a custom TileProvider (coordinate overlays).", + successCriteria = "Tile grid numbers (x, y, zoom) render cleanly over the base map.", + failureIndicators = "Tile rendering blocks UI thread or tiles fail to fetch on pan.", + framework = Framework.JAVA_VIEWS +) public class TileOverlayDemoActivity extends SamplesBaseActivity implements OnSeekBarChangeListener, OnMapReadyCallback { diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/UiSettingsDemoActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/UiSettingsDemoActivity.java index b289968fd..bb8282708 100755 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/UiSettingsDemoActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/UiSettingsDemoActivity.java @@ -77,6 +77,7 @@ protected void onCreate(Bundle savedInstanceState) { binding.rotateToggle.setOnClickListener(v -> setRotateGesturesEnabled()); } + // [START maps_android_sample_ui_settings] @SuppressLint("MissingPermission") @Override public void onMapReady(GoogleMap map) { @@ -101,6 +102,7 @@ public void onMapReady(GoogleMap map) { } mMap.setMyLocationEnabled(binding.mylocationlayerToggle.isChecked()); } + // [END maps_android_sample_ui_settings] /** * Checks if the map is ready (which depends on whether the Google Play services APK is diff --git a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/VisibleRegionDemoActivity.java b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/VisibleRegionDemoActivity.java index bbabb704f..c06d43d10 100755 --- a/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/VisibleRegionDemoActivity.java +++ b/ApiDemos/project/java-app/src/main/java/com/example/mapdemo/VisibleRegionDemoActivity.java @@ -14,6 +14,11 @@ package com.example.mapdemo; +import com.example.common_ui.catalog.Sample; +import com.example.common_ui.catalog.Complexity; +import com.example.common_ui.catalog.Framework; +import com.example.common_ui.R; + import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -23,10 +28,14 @@ import android.view.animation.OvershootInterpolator; import android.widget.Toast; +import androidx.appcompat.widget.PopupMenu; +import java.util.Locale; + import com.example.common_ui.databinding.VisibleRegionDemoBinding; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.SupportMapFragment; +import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLngBounds; import com.google.android.gms.maps.model.MarkerOptions; @@ -35,6 +44,25 @@ * This shows how to use setPadding to allow overlays that obscure part of the map without * obscuring the map UI or copyright notices. */ +@Sample( + id = "com.example.mapdemo.VisibleRegionDemoActivity", + title = "Visible Region & Projection", + description = "Querying current viewport bounding coordinates via GoogleMap.projection.", + category = "Camera Controls", + complexity = Complexity.SIMPLE, + tags = {"#camera", "#projection", "#visibleregion", "#latlngbounds"}, + apiCalls = { + "GoogleMap.setPadding(int, int, int, int)", + "GoogleMap.moveCamera(CameraUpdate)", + "GoogleMap.cameraPosition", + "GoogleMap.setOnCameraIdleListener(OnCameraIdleListener)" + }, + purpose = "Demonstrates reading GoogleMap.projection.visibleRegion and calculating viewport bounds dynamically.", + successCriteria = "Bounding coordinates update live in the UI as the camera pans and zooms.", + failureIndicators = "Projection returns null or stale LatLng bounds after camera idle.", + framework = Framework.JAVA_VIEWS +) +// [START maps_android_sample_visible_region] public class VisibleRegionDemoActivity extends SamplesBaseActivity implements OnMapAndViewReadyListener.OnGlobalLayoutAndMapReadyListener { @@ -53,7 +81,7 @@ public class VisibleRegionDemoActivity extends SamplesBaseActivity implements private VisibleRegionDemoBinding binding; /** Keep track of current values for padding, so we can animate from them. */ - int currentLeft = 150; + int currentLeft = 0; int currentTop = 0; @@ -67,6 +95,32 @@ protected void onCreate(Bundle savedInstanceState) { binding = VisibleRegionDemoBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); + binding.cameraActionsButton.setOnClickListener(v -> { + PopupMenu popup = new PopupMenu(this, v); + popup.getMenuInflater().inflate(R.menu.visible_region_menu, popup.getMenu()); + popup.setOnMenuItemClickListener(item -> { + int itemId = item.getItemId(); + if (itemId == R.id.menu_action_no_padding) { + setNoPadding(); + return true; + } else if (itemId == R.id.menu_action_more_padding) { + setMorePadding(v); + return true; + } else if (itemId == R.id.menu_action_opera_house) { + moveToOperaHouse(v); + return true; + } else if (itemId == R.id.menu_action_sfo) { + moveToSFO(v); + return true; + } else if (itemId == R.id.menu_action_australia) { + moveToAUS(v); + return true; + } + return false; + }); + popup.show(); + }); + binding.vrNormalButton.setOnClickListener(v -> setNoPadding()); binding.vrMorePaddedButton.setOnClickListener(this::setMorePadding); binding.vrSohButton.setOnClickListener(this::moveToOperaHouse); @@ -74,7 +128,7 @@ protected void onCreate(Bundle savedInstanceState) { binding.vrAusButton.setOnClickListener(this::moveToAUS); SupportMapFragment mapFragment = - (SupportMapFragment) getSupportFragmentManager().findFragmentById(com.example.common_ui.R.id.map); + (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); new OnMapAndViewReadyListener(mapFragment, this); applyInsets(binding.mapContainer); @@ -90,8 +144,24 @@ public void onMapReady(GoogleMap map) { // Add a marker to the Opera House. mMap.addMarker(new MarkerOptions().position(SOH).title("Sydney Opera House")); // Add a camera idle listener. - mMap.setOnCameraIdleListener(() -> binding.messageText.setText( - getString(com.example.common_ui.R.string.camera_change_message, mMap.getCameraPosition()))); + mMap.setOnCameraIdleListener(this::updateCameraDisplay); + updateCameraDisplay(); + } + + private void updateCameraDisplay() { + if (mMap == null) return; + CameraPosition pos = mMap.getCameraPosition(); + binding.cameraTargetText.setText(getString( + R.string.camera_target_format, + pos.target.latitude, + pos.target.longitude + )); + binding.cameraDetailsText.setText(getString( + R.string.camera_details_format, + pos.zoom, + pos.tilt, + pos.bearing + )); } /** @@ -100,7 +170,7 @@ public void onMapReady(GoogleMap map) { */ private boolean checkReady() { if (mMap == null) { - Toast.makeText(this, com.example.common_ui.R.string.map_not_ready, Toast.LENGTH_SHORT).show(); + Toast.makeText(this, R.string.map_not_ready, Toast.LENGTH_SHORT).show(); return false; } return true; @@ -131,15 +201,15 @@ private void setNoPadding() { if (!checkReady()) { return; } - animatePadding(150, 0, 0, 0); + animatePadding(0, 0, 0, 0); } public void setMorePadding(View view) { if (!checkReady()) { return; } - View mapView = (getSupportFragmentManager().findFragmentById(com.example.common_ui.R.id.map)).getView(); - int left = 150; + View mapView = (getSupportFragmentManager().findFragmentById(R.id.map)).getView(); + int left = 0; int top = 0; int right = mapView.getWidth() / 3; int bottom = mapView.getHeight() / 4; @@ -186,3 +256,4 @@ public void run() { }); } } +// [END maps_android_sample_visible_region]