mirrorworld 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. mirrorworld-0.1.0/.gitignore +138 -0
  2. mirrorworld-0.1.0/CREDITS.md +8 -0
  3. mirrorworld-0.1.0/LICENSE +22 -0
  4. mirrorworld-0.1.0/PKG-INFO +387 -0
  5. mirrorworld-0.1.0/README.md +343 -0
  6. mirrorworld-0.1.0/docs/Makefile +20 -0
  7. mirrorworld-0.1.0/docs/_static/css/additional.css +141 -0
  8. mirrorworld-0.1.0/docs/conf.py +33 -0
  9. mirrorworld-0.1.0/docs/dataclasses.rst +5 -0
  10. mirrorworld-0.1.0/docs/geo.rst +5 -0
  11. mirrorworld-0.1.0/docs/index.rst +44 -0
  12. mirrorworld-0.1.0/docs/make.bat +35 -0
  13. mirrorworld-0.1.0/docs/mirrorworld.aerial.rst +121 -0
  14. mirrorworld-0.1.0/docs/mirrorworld.baidu.rst +132 -0
  15. mirrorworld-0.1.0/docs/mirrorworld.elevation.rst +86 -0
  16. mirrorworld-0.1.0/docs/mirrorworld.ja.rst +90 -0
  17. mirrorworld-0.1.0/docs/mirrorworld.kakao.rst +93 -0
  18. mirrorworld-0.1.0/docs/mirrorworld.kartaview.rst +49 -0
  19. mirrorworld-0.1.0/docs/mirrorworld.lidar.rst +33 -0
  20. mirrorworld-0.1.0/docs/mirrorworld.lookaround.rst +138 -0
  21. mirrorworld-0.1.0/docs/mirrorworld.mapillary.rst +87 -0
  22. mirrorworld-0.1.0/docs/mirrorworld.mapy.rst +88 -0
  23. mirrorworld-0.1.0/docs/mirrorworld.naver.rst +105 -0
  24. mirrorworld-0.1.0/docs/mirrorworld.panoramax.rst +45 -0
  25. mirrorworld-0.1.0/docs/mirrorworld.satellite.rst +100 -0
  26. mirrorworld-0.1.0/docs/mirrorworld.services.rst +74 -0
  27. mirrorworld-0.1.0/docs/mirrorworld.streetside.rst +90 -0
  28. mirrorworld-0.1.0/docs/mirrorworld.streetview.rst +114 -0
  29. mirrorworld-0.1.0/docs/mirrorworld.vector.rst +24 -0
  30. mirrorworld-0.1.0/docs/mirrorworld.yandex.rst +91 -0
  31. mirrorworld-0.1.0/docs/raster.rst +12 -0
  32. mirrorworld-0.1.0/docs/requirements.txt +17 -0
  33. mirrorworld-0.1.0/docs/util.rst +5 -0
  34. mirrorworld-0.1.0/mirrorworld/__init__.py +1 -0
  35. mirrorworld-0.1.0/mirrorworld/aerial/__init__.py +16 -0
  36. mirrorworld-0.1.0/mirrorworld/aerial/__main__.py +62 -0
  37. mirrorworld-0.1.0/mirrorworld/aerial/arcgis.py +74 -0
  38. mirrorworld-0.1.0/mirrorworld/aerial/bing/__init__.py +3 -0
  39. mirrorworld-0.1.0/mirrorworld/aerial/bing/api.py +22 -0
  40. mirrorworld-0.1.0/mirrorworld/aerial/bing/bing.py +135 -0
  41. mirrorworld-0.1.0/mirrorworld/aerial/bing/util.py +45 -0
  42. mirrorworld-0.1.0/mirrorworld/aerial/dataclasses.py +47 -0
  43. mirrorworld-0.1.0/mirrorworld/aerial/esri/__init__.py +3 -0
  44. mirrorworld-0.1.0/mirrorworld/aerial/esri/api.py +35 -0
  45. mirrorworld-0.1.0/mirrorworld/aerial/esri/esri.py +139 -0
  46. mirrorworld-0.1.0/mirrorworld/aerial/esri/util.py +12 -0
  47. mirrorworld-0.1.0/mirrorworld/aerial/google/__init__.py +3 -0
  48. mirrorworld-0.1.0/mirrorworld/aerial/google/api.py +18 -0
  49. mirrorworld-0.1.0/mirrorworld/aerial/google/google.py +136 -0
  50. mirrorworld-0.1.0/mirrorworld/aerial/google/util.py +11 -0
  51. mirrorworld-0.1.0/mirrorworld/aerial/pdok/__init__.py +2 -0
  52. mirrorworld-0.1.0/mirrorworld/aerial/pdok/pdok.py +105 -0
  53. mirrorworld-0.1.0/mirrorworld/aerial/usgs/__init__.py +2 -0
  54. mirrorworld-0.1.0/mirrorworld/aerial/usgs/api.py +35 -0
  55. mirrorworld-0.1.0/mirrorworld/aerial/usgs/usgs.py +142 -0
  56. mirrorworld-0.1.0/mirrorworld/aerial/util.py +327 -0
  57. mirrorworld-0.1.0/mirrorworld/aerial/wayback/__init__.py +2 -0
  58. mirrorworld-0.1.0/mirrorworld/aerial/wayback/api.py +50 -0
  59. mirrorworld-0.1.0/mirrorworld/aerial/wayback/release.py +40 -0
  60. mirrorworld-0.1.0/mirrorworld/aerial/wayback/wayback.py +245 -0
  61. mirrorworld-0.1.0/mirrorworld/baidu/__init__.py +2 -0
  62. mirrorworld-0.1.0/mirrorworld/baidu/api.py +39 -0
  63. mirrorworld-0.1.0/mirrorworld/baidu/baidu.py +199 -0
  64. mirrorworld-0.1.0/mirrorworld/baidu/panorama.py +243 -0
  65. mirrorworld-0.1.0/mirrorworld/baidu/parse.py +235 -0
  66. mirrorworld-0.1.0/mirrorworld/baidu/util.py +19 -0
  67. mirrorworld-0.1.0/mirrorworld/dataclasses.py +32 -0
  68. mirrorworld-0.1.0/mirrorworld/elevation/__init__.py +7 -0
  69. mirrorworld-0.1.0/mirrorworld/elevation/ahn.py +109 -0
  70. mirrorworld-0.1.0/mirrorworld/elevation/copernicus.py +85 -0
  71. mirrorworld-0.1.0/mirrorworld/elevation/ea.py +140 -0
  72. mirrorworld-0.1.0/mirrorworld/elevation/usgs3dep.py +61 -0
  73. mirrorworld-0.1.0/mirrorworld/elevation/wales.py +88 -0
  74. mirrorworld-0.1.0/mirrorworld/exif.py +157 -0
  75. mirrorworld-0.1.0/mirrorworld/geo.py +169 -0
  76. mirrorworld-0.1.0/mirrorworld/ja/__init__.py +2 -0
  77. mirrorworld-0.1.0/mirrorworld/ja/api.py +27 -0
  78. mirrorworld-0.1.0/mirrorworld/ja/ja.py +158 -0
  79. mirrorworld-0.1.0/mirrorworld/ja/panorama.py +103 -0
  80. mirrorworld-0.1.0/mirrorworld/ja/parse.py +71 -0
  81. mirrorworld-0.1.0/mirrorworld/ja/util.py +24 -0
  82. mirrorworld-0.1.0/mirrorworld/kakao/__init__.py +2 -0
  83. mirrorworld-0.1.0/mirrorworld/kakao/api.py +28 -0
  84. mirrorworld-0.1.0/mirrorworld/kakao/kakao.py +261 -0
  85. mirrorworld-0.1.0/mirrorworld/kakao/panorama.py +106 -0
  86. mirrorworld-0.1.0/mirrorworld/kakao/parse.py +51 -0
  87. mirrorworld-0.1.0/mirrorworld/kakao/util.py +35 -0
  88. mirrorworld-0.1.0/mirrorworld/kartaview/__init__.py +3 -0
  89. mirrorworld-0.1.0/mirrorworld/kartaview/api.py +46 -0
  90. mirrorworld-0.1.0/mirrorworld/kartaview/kartaview.py +210 -0
  91. mirrorworld-0.1.0/mirrorworld/kartaview/panorama.py +73 -0
  92. mirrorworld-0.1.0/mirrorworld/kartaview/parse.py +76 -0
  93. mirrorworld-0.1.0/mirrorworld/kartaview/util.py +10 -0
  94. mirrorworld-0.1.0/mirrorworld/lidar/__init__.py +8 -0
  95. mirrorworld-0.1.0/mirrorworld/lidar/ept.py +228 -0
  96. mirrorworld-0.1.0/mirrorworld/lidar/usgs3dep.py +136 -0
  97. mirrorworld-0.1.0/mirrorworld/lookaround/__init__.py +8 -0
  98. mirrorworld-0.1.0/mirrorworld/lookaround/api.py +50 -0
  99. mirrorworld-0.1.0/mirrorworld/lookaround/auth.py +69 -0
  100. mirrorworld-0.1.0/mirrorworld/lookaround/geo.py +128 -0
  101. mirrorworld-0.1.0/mirrorworld/lookaround/lookaround.py +161 -0
  102. mirrorworld-0.1.0/mirrorworld/lookaround/panorama.py +175 -0
  103. mirrorworld-0.1.0/mirrorworld/lookaround/parse.py +60 -0
  104. mirrorworld-0.1.0/mirrorworld/lookaround/proto/GroundMetadataTile.proto +111 -0
  105. mirrorworld-0.1.0/mirrorworld/lookaround/proto/GroundMetadataTile_pb2.py +44 -0
  106. mirrorworld-0.1.0/mirrorworld/lookaround/proto/MuninViewState.proto +21 -0
  107. mirrorworld-0.1.0/mirrorworld/lookaround/proto/MuninViewState_pb2.py +30 -0
  108. mirrorworld-0.1.0/mirrorworld/lookaround/proto/__init__.py +0 -0
  109. mirrorworld-0.1.0/mirrorworld/lookaround/proto/generate.bat +2 -0
  110. mirrorworld-0.1.0/mirrorworld/lookaround/reproject.py +118 -0
  111. mirrorworld-0.1.0/mirrorworld/lookaround/util.py +31 -0
  112. mirrorworld-0.1.0/mirrorworld/mapillary/__init__.py +3 -0
  113. mirrorworld-0.1.0/mirrorworld/mapillary/api.py +127 -0
  114. mirrorworld-0.1.0/mirrorworld/mapillary/features.py +87 -0
  115. mirrorworld-0.1.0/mirrorworld/mapillary/mapillary.py +410 -0
  116. mirrorworld-0.1.0/mirrorworld/mapillary/panorama.py +87 -0
  117. mirrorworld-0.1.0/mirrorworld/mapillary/parse.py +156 -0
  118. mirrorworld-0.1.0/mirrorworld/mapillary/util.py +39 -0
  119. mirrorworld-0.1.0/mirrorworld/mapy/__init__.py +2 -0
  120. mirrorworld-0.1.0/mirrorworld/mapy/api.py +82 -0
  121. mirrorworld-0.1.0/mirrorworld/mapy/mapy.py +266 -0
  122. mirrorworld-0.1.0/mirrorworld/mapy/panorama.py +83 -0
  123. mirrorworld-0.1.0/mirrorworld/mapy/parse.py +75 -0
  124. mirrorworld-0.1.0/mirrorworld/mapy/util.py +38 -0
  125. mirrorworld-0.1.0/mirrorworld/naver/__init__.py +2 -0
  126. mirrorworld-0.1.0/mirrorworld/naver/api.py +106 -0
  127. mirrorworld-0.1.0/mirrorworld/naver/model.py +120 -0
  128. mirrorworld-0.1.0/mirrorworld/naver/naver.py +423 -0
  129. mirrorworld-0.1.0/mirrorworld/naver/panorama.py +170 -0
  130. mirrorworld-0.1.0/mirrorworld/naver/parse.py +138 -0
  131. mirrorworld-0.1.0/mirrorworld/naver/proto/Model.proto +8 -0
  132. mirrorworld-0.1.0/mirrorworld/naver/proto/Model_pb2.py +26 -0
  133. mirrorworld-0.1.0/mirrorworld/naver/proto/__init__.py +0 -0
  134. mirrorworld-0.1.0/mirrorworld/naver/proto/generate.bat +2 -0
  135. mirrorworld-0.1.0/mirrorworld/naver/util.py +21 -0
  136. mirrorworld-0.1.0/mirrorworld/panoramax/__init__.py +3 -0
  137. mirrorworld-0.1.0/mirrorworld/panoramax/api.py +27 -0
  138. mirrorworld-0.1.0/mirrorworld/panoramax/panorama.py +81 -0
  139. mirrorworld-0.1.0/mirrorworld/panoramax/panoramax.py +222 -0
  140. mirrorworld-0.1.0/mirrorworld/panoramax/parse.py +67 -0
  141. mirrorworld-0.1.0/mirrorworld/panoramax/util.py +19 -0
  142. mirrorworld-0.1.0/mirrorworld/raster.py +247 -0
  143. mirrorworld-0.1.0/mirrorworld/satellite/__init__.py +8 -0
  144. mirrorworld-0.1.0/mirrorworld/satellite/landsat.py +100 -0
  145. mirrorworld-0.1.0/mirrorworld/satellite/naip.py +86 -0
  146. mirrorworld-0.1.0/mirrorworld/satellite/scene.py +33 -0
  147. mirrorworld-0.1.0/mirrorworld/satellite/sentinel1.py +87 -0
  148. mirrorworld-0.1.0/mirrorworld/satellite/sentinel2.py +101 -0
  149. mirrorworld-0.1.0/mirrorworld/satellite/stac.py +305 -0
  150. mirrorworld-0.1.0/mirrorworld/satellite/worldcover.py +90 -0
  151. mirrorworld-0.1.0/mirrorworld/services/__init__.py +14 -0
  152. mirrorworld-0.1.0/mirrorworld/services/arcgis.py +103 -0
  153. mirrorworld-0.1.0/mirrorworld/services/util.py +121 -0
  154. mirrorworld-0.1.0/mirrorworld/services/wcs.py +158 -0
  155. mirrorworld-0.1.0/mirrorworld/services/wms.py +158 -0
  156. mirrorworld-0.1.0/mirrorworld/services/wmts.py +304 -0
  157. mirrorworld-0.1.0/mirrorworld/streetside/__init__.py +2 -0
  158. mirrorworld-0.1.0/mirrorworld/streetside/api.py +34 -0
  159. mirrorworld-0.1.0/mirrorworld/streetside/panorama.py +62 -0
  160. mirrorworld-0.1.0/mirrorworld/streetside/parse.py +46 -0
  161. mirrorworld-0.1.0/mirrorworld/streetside/streetside.py +259 -0
  162. mirrorworld-0.1.0/mirrorworld/streetside/util.py +44 -0
  163. mirrorworld-0.1.0/mirrorworld/streetview/__init__.py +2 -0
  164. mirrorworld-0.1.0/mirrorworld/streetview/api.py +234 -0
  165. mirrorworld-0.1.0/mirrorworld/streetview/depth.py +124 -0
  166. mirrorworld-0.1.0/mirrorworld/streetview/panorama.py +355 -0
  167. mirrorworld-0.1.0/mirrorworld/streetview/parse.py +296 -0
  168. mirrorworld-0.1.0/mirrorworld/streetview/protobuf.py +97 -0
  169. mirrorworld-0.1.0/mirrorworld/streetview/streetview.py +284 -0
  170. mirrorworld-0.1.0/mirrorworld/streetview/util.py +47 -0
  171. mirrorworld-0.1.0/mirrorworld/util.py +387 -0
  172. mirrorworld-0.1.0/mirrorworld/vector/__init__.py +2 -0
  173. mirrorworld-0.1.0/mirrorworld/vector/osm.py +209 -0
  174. mirrorworld-0.1.0/mirrorworld/yandex/__init__.py +2 -0
  175. mirrorworld-0.1.0/mirrorworld/yandex/api.py +36 -0
  176. mirrorworld-0.1.0/mirrorworld/yandex/panorama.py +133 -0
  177. mirrorworld-0.1.0/mirrorworld/yandex/parse.py +161 -0
  178. mirrorworld-0.1.0/mirrorworld/yandex/util.py +38 -0
  179. mirrorworld-0.1.0/mirrorworld/yandex/yandex.py +176 -0
  180. mirrorworld-0.1.0/pyproject.toml +70 -0
  181. mirrorworld-0.1.0/tests/__init__.py +0 -0
  182. mirrorworld-0.1.0/tests/aerial/__init__.py +1 -0
  183. mirrorworld-0.1.0/tests/aerial/aerial_test.py +68 -0
  184. mirrorworld-0.1.0/tests/aerial/wayback_test.py +44 -0
  185. mirrorworld-0.1.0/tests/baidu/__init__.py +0 -0
  186. mirrorworld-0.1.0/tests/baidu/baidu_test.py +29 -0
  187. mirrorworld-0.1.0/tests/baidu/data/find.json +1 -0
  188. mirrorworld-0.1.0/tests/geo_test.py +40 -0
  189. mirrorworld-0.1.0/tests/ja/__init__.py +0 -0
  190. mirrorworld-0.1.0/tests/ja/data/find.json +1 -0
  191. mirrorworld-0.1.0/tests/ja/data/find_by_id.json +1 -0
  192. mirrorworld-0.1.0/tests/ja/ja_test.py +31 -0
  193. mirrorworld-0.1.0/tests/kakao/__init__.py +0 -0
  194. mirrorworld-0.1.0/tests/kakao/data/find.json +1 -0
  195. mirrorworld-0.1.0/tests/kakao/data/find_by_id.json +1 -0
  196. mirrorworld-0.1.0/tests/kakao/kakao_test.py +41 -0
  197. mirrorworld-0.1.0/tests/kartaview/__init__.py +1 -0
  198. mirrorworld-0.1.0/tests/kartaview/data/find.json +136 -0
  199. mirrorworld-0.1.0/tests/kartaview/data/find_by_id.json +73 -0
  200. mirrorworld-0.1.0/tests/kartaview/kartaview_test.py +54 -0
  201. mirrorworld-0.1.0/tests/lidar/__init__.py +1 -0
  202. mirrorworld-0.1.0/tests/lidar/lidar_test.py +53 -0
  203. mirrorworld-0.1.0/tests/lookaround/__init__.py +0 -0
  204. mirrorworld-0.1.0/tests/lookaround/data/metadata_tile.pb +0 -0
  205. mirrorworld-0.1.0/tests/lookaround/geo_test.py +31 -0
  206. mirrorworld-0.1.0/tests/lookaround/lookaround_test.py +26 -0
  207. mirrorworld-0.1.0/tests/mapillary/__init__.py +1 -0
  208. mirrorworld-0.1.0/tests/mapillary/data/find_by_id.json +37 -0
  209. mirrorworld-0.1.0/tests/mapillary/mapillary_features_test.py +77 -0
  210. mirrorworld-0.1.0/tests/mapillary/mapillary_test.py +69 -0
  211. mirrorworld-0.1.0/tests/mapy/__init__.py +0 -0
  212. mirrorworld-0.1.0/tests/mapy/data/getbest.pkl +0 -0
  213. mirrorworld-0.1.0/tests/mapy/mapy_test.py +21 -0
  214. mirrorworld-0.1.0/tests/naver/__init__.py +0 -0
  215. mirrorworld-0.1.0/tests/naver/data/find.json +1 -0
  216. mirrorworld-0.1.0/tests/naver/data/find_by_id.json +1 -0
  217. mirrorworld-0.1.0/tests/naver/naver_test.py +39 -0
  218. mirrorworld-0.1.0/tests/panoramax/__init__.py +1 -0
  219. mirrorworld-0.1.0/tests/panoramax/data/find_by_id.json +202 -0
  220. mirrorworld-0.1.0/tests/panoramax/panoramax_test.py +44 -0
  221. mirrorworld-0.1.0/tests/pytest.ini +3 -0
  222. mirrorworld-0.1.0/tests/raster_test.py +52 -0
  223. mirrorworld-0.1.0/tests/satellite/__init__.py +1 -0
  224. mirrorworld-0.1.0/tests/satellite/stac_test.py +44 -0
  225. mirrorworld-0.1.0/tests/services/__init__.py +1 -0
  226. mirrorworld-0.1.0/tests/services/data/ahn_describe.xml +51 -0
  227. mirrorworld-0.1.0/tests/services/services_test.py +102 -0
  228. mirrorworld-0.1.0/tests/streetside/__init__.py +0 -0
  229. mirrorworld-0.1.0/tests/streetside/data/find.json +1 -0
  230. mirrorworld-0.1.0/tests/streetside/streetside_test.py +24 -0
  231. mirrorworld-0.1.0/tests/streetview/__init__.py +0 -0
  232. mirrorworld-0.1.0/tests/streetview/data/ari_with_timestamp_in_12.json +1 -0
  233. mirrorworld-0.1.0/tests/streetview/data/ari_with_uuid_in_12.json +1 -0
  234. mirrorworld-0.1.0/tests/streetview/data/coverage_tile.json +1 -0
  235. mirrorworld-0.1.0/tests/streetview/data/find.json +1 -0
  236. mirrorworld-0.1.0/tests/streetview/data/find_by_id.json +1 -0
  237. mirrorworld-0.1.0/tests/streetview/data/missing_date.json +211 -0
  238. mirrorworld-0.1.0/tests/streetview/data/missing_historical_date.json +1120 -0
  239. mirrorworld-0.1.0/tests/streetview/data/missing_level_name.json +256 -0
  240. mirrorworld-0.1.0/tests/streetview/data/missing_link_direction.json +468 -0
  241. mirrorworld-0.1.0/tests/streetview/data/mixed_historical_dates.json +1 -0
  242. mirrorworld-0.1.0/tests/streetview/data/nepal_links.json +241 -0
  243. mirrorworld-0.1.0/tests/streetview/data/places.json +716 -0
  244. mirrorworld-0.1.0/tests/streetview/data/street_names.json +1616 -0
  245. mirrorworld-0.1.0/tests/streetview/depth_test.py +69 -0
  246. mirrorworld-0.1.0/tests/streetview/streetview_test.py +176 -0
  247. mirrorworld-0.1.0/tests/util_test.py +23 -0
  248. mirrorworld-0.1.0/tests/vector/__init__.py +1 -0
  249. mirrorworld-0.1.0/tests/vector/osm_test.py +30 -0
  250. mirrorworld-0.1.0/tests/yandex/__init__.py +0 -0
  251. mirrorworld-0.1.0/tests/yandex/data/find.json +517 -0
  252. mirrorworld-0.1.0/tests/yandex/yandex_test.py +21 -0
@@ -0,0 +1,138 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ pip-wheel-metadata/
24
+ share/python-wheels/
25
+ *.egg-info/
26
+ .installed.cfg
27
+ *.egg
28
+ MANIFEST
29
+
30
+ # PyInstaller
31
+ # Usually these files are written by a python script from a template
32
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
33
+ *.manifest
34
+ *.spec
35
+
36
+ # Installer logs
37
+ pip-log.txt
38
+ pip-delete-this-directory.txt
39
+
40
+ # Unit test / coverage reports
41
+ htmlcov/
42
+ .tox/
43
+ .nox/
44
+ .coverage
45
+ .coverage.*
46
+ .cache
47
+ nosetests.xml
48
+ coverage.xml
49
+ *.cover
50
+ *.py,cover
51
+ .hypothesis/
52
+ .pytest_cache/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ target/
76
+
77
+ # Jupyter Notebook
78
+ .ipynb_checkpoints
79
+
80
+ # IPython
81
+ profile_default/
82
+ ipython_config.py
83
+
84
+ # pyenv
85
+ .python-version
86
+
87
+ # pipenv
88
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
89
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
90
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
91
+ # install all needed dependencies.
92
+ #Pipfile.lock
93
+
94
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow
95
+ __pypackages__/
96
+
97
+ # Celery stuff
98
+ celerybeat-schedule
99
+ celerybeat.pid
100
+
101
+ # SageMath parsed files
102
+ *.sage.py
103
+
104
+ # Environments
105
+ .env
106
+ .venv
107
+ env/
108
+ venv/
109
+ ENV/
110
+ env.bak/
111
+ venv.bak/
112
+
113
+ # Spyder project settings
114
+ .spyderproject
115
+ .spyproject
116
+
117
+ # Rope project settings
118
+ .ropeproject
119
+
120
+ # mkdocs documentation
121
+ /site
122
+
123
+ # mypy
124
+ .mypy_cache/
125
+ .dmypy.json
126
+ dmypy.json
127
+
128
+ # Pyre type checker
129
+ .pyre/
130
+
131
+ .idea/
132
+
133
+ *.ipynb
134
+ *.csv
135
+
136
+ *.jpg
137
+ *.heic
138
+ *.png
@@ -0,0 +1,8 @@
1
+ # Credits
2
+
3
+ ## Apple Look Around
4
+ The authentication code has been translated from
5
+ [retroplasma/flyover-reverse-engineering](https://github.com/retroplasma/flyover-reverse-engineering/blob/master/pkg/mps/auth/auth.go).
6
+
7
+ ## Google Street View
8
+ The depth map parser is based on [this SO post by ted](https://stackoverflow.com/a/56245973), which is derived from [proog128/GSVPanoDepth.js](proog128/GSVPanoDepth.js).
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 skzk (streetlevel)
4
+ Copyright (c) 2026 alienpenguin10 (mirrorworld additions)
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
@@ -0,0 +1,387 @@
1
+ Metadata-Version: 2.5
2
+ Name: mirrorworld
3
+ Version: 0.1.0
4
+ Summary: Fetch street-level, aerial, satellite, elevation, LiDAR and map data for any place
5
+ Project-URL: Homepage, https://github.com/alienpenguin10/Mirrorworld
6
+ Project-URL: Bug Tracker, https://github.com/alienpenguin10/Mirrorworld/issues
7
+ Project-URL: Based on, https://github.com/sk-zk/streetlevel
8
+ Author: alienpenguin10
9
+ Author-email: sk-zk <sk-zk@users.noreply.github.com>
10
+ Maintainer: alienpenguin10
11
+ License-Expression: MIT
12
+ License-File: LICENSE
13
+ Keywords: aerial imagery,elevation,gis,lidar,mapillary,remote sensing,satellite,street view
14
+ Classifier: Development Status :: 3 - Alpha
15
+ Classifier: Intended Audience :: Science/Research
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Topic :: Scientific/Engineering :: GIS
19
+ Classifier: Topic :: Scientific/Engineering :: Image Processing
20
+ Requires-Python: >=3.10
21
+ Requires-Dist: aiohttp
22
+ Requires-Dist: bd09convertor
23
+ Requires-Dist: coordinatesconverter
24
+ Requires-Dist: cython
25
+ Requires-Dist: mapbox-vector-tile
26
+ Requires-Dist: numpy
27
+ Requires-Dist: pillow
28
+ Requires-Dist: protobuf>4
29
+ Requires-Dist: pycryptodome
30
+ Requires-Dist: pyequilib
31
+ Requires-Dist: pyexiv2
32
+ Requires-Dist: pyfrpc==0.2.13
33
+ Requires-Dist: pyproj
34
+ Requires-Dist: requests
35
+ Requires-Dist: scipy
36
+ Provides-Extra: all
37
+ Requires-Dist: laspy[lazrs]; extra == 'all'
38
+ Requires-Dist: rasterio; extra == 'all'
39
+ Provides-Extra: lidar
40
+ Requires-Dist: laspy[lazrs]; extra == 'lidar'
41
+ Provides-Extra: raster
42
+ Requires-Dist: rasterio; extra == 'raster'
43
+ Description-Content-Type: text/markdown
44
+
45
+ # mirrorworld
46
+ **mirrorworld** fetches data about a place from many sources with one consistent API: street-level imagery
47
+ (Google Street View, Apple Look Around, Mapillary, KartaView, Panoramax and more), detected street assets,
48
+ aerial and satellite imagery, elevation models, LiDAR point clouds, any OGC/ArcGIS map service and
49
+ OpenStreetMap features. Everything is downloaded on demand for a point or bounding box; nothing is hosted by
50
+ this project.
51
+
52
+ It is a fork of [streetlevel](https://github.com/sk-zk/streetlevel) by sk-zk, whose street-level providers use the
53
+ services' internal APIs: no API keys are required for them, but they may break unexpectedly.
54
+
55
+ (Nearly) all functions are available as either a sync function using `requests` or an async function
56
+ using `aiohttp`, requiring a `ClientSession`.
57
+
58
+ ## Installation
59
+
60
+ ```sh
61
+ pip install mirrorworld
62
+ pip install "mirrorworld[all]" # plus GeoTIFF (rasterio) and LiDAR (laspy) support
63
+ ```
64
+
65
+ The extras can also be installed separately: `mirrorworld[raster]` for satellite, elevation and GeoTIFF output,
66
+ `mirrorworld[lidar]` for point clouds.
67
+
68
+ macOS users may need to install [additional dependencies](https://github.com/LeoHsiao1/pyexiv2/blob/master/docs/Tutorial.md#faq):
69
+
70
+ ```sh
71
+ brew install gettext
72
+ brew install inih
73
+ ```
74
+
75
+ ## Example
76
+ Downloading the closest Google Street View panorama to a specific location, sync:
77
+
78
+ ```python
79
+ from mirrorworld import streetview
80
+
81
+ pano = streetview.find_panorama(46.883958, 12.169002)
82
+ streetview.download_panorama(pano, f"{pano.id}.jpg")
83
+ ```
84
+
85
+ Or async:
86
+
87
+ ```python
88
+ from mirrorworld import streetview
89
+ from aiohttp import ClientSession
90
+
91
+ async with ClientSession() as session:
92
+ pano = await streetview.find_panorama_async(46.883958, 12.169002, session)
93
+ await streetview.download_panorama_async(pano, f"{pano.id}.jpg", session)
94
+ ```
95
+
96
+ ## More modalities for a place
97
+ On top of streetlevel's providers, mirrorworld adds sources that researchers commonly need next to street-level panoramas. Everything is fetched on
98
+ demand for a point or a bounding box (WGS84, lat/lon order) and nothing is hosted by us; results carry their
99
+ georeferencing and source metadata. Sync and async variants are provided wherever the work is network-bound.
100
+
101
+ | Modality | Module | Sources | Coverage | Key |
102
+ |---|---|---|---|---|
103
+ | Open street-level imagery | `mapillary`, `kartaview`, `panoramax` | Mapillary, KartaView, Panoramax (all CC BY-SA) | worldwide, crowd-sourced: Mapillary dense in cities (incl. UK); KartaView and Panoramax patchy (Panoramax strongest in France) | Mapillary: free token |
104
+ | Detected street assets | `mapillary` (`find_map_features`, `get_detections`, `get_point_cloud`) | Mapillary map features (poles, manholes, junction boxes, signs, ...), segmentations, SfM point clouds | wherever Mapillary has imagery | free token |
105
+ | Aerial imagery (web tiles) | `aerial.bing`, `aerial.google`, `aerial.esri`, `aerial.usgs` | Bing, Google, Esri World Imagery, USGS | worldwide (USGS: US only) | none |
106
+ | Dated aerial imagery | `aerial.wayback` | Esri World Imagery Wayback, 2014 onwards | worldwide | none |
107
+ | National orthophotos | `aerial.pdok` | Netherlands RGB + colour-infrared, 8 cm | Netherlands | none |
108
+ | Satellite | `satellite.sentinel2`, `sentinel1`, `landsat`, `naip`, `worldcover`, generic `satellite.stac` | Earth Search, Microsoft Planetary Computer | worldwide (NAIP: US only) | none |
109
+ | Elevation | `elevation.ea`, `elevation.wales`, `elevation.ahn`, `elevation.usgs3dep`, `elevation.copernicus` | Environment Agency LiDAR (1 m), Welsh Government LiDAR (1 m), AHN (0.5 m), USGS 3DEP, Copernicus GLO-30 | England, Wales, Netherlands, US, worldwide (30 m) | none |
110
+ | LiDAR point clouds | `lidar.usgs3dep`, generic `lidar.ept` | USGS 3DEP on AWS | US (any EPT dataset elsewhere) | none |
111
+ | Any map service | `services.wms`, `wmts`, `wcs`, `arcgis`, `raster.read_cog` | any OGC / ArcGIS server or cloud-optimized GeoTIFF | depends on the service | depends |
112
+ | Vector map data | `vector.osm` | OpenStreetMap via Overpass (ODbL) | worldwide; tag completeness varies (UK street cabinets and poles are sparsely mapped) | none |
113
+
114
+ ```python
115
+ from mirrorworld import mapillary, panoramax
116
+ from mirrorworld.aerial import wayback, pdok
117
+ from mirrorworld.satellite import sentinel2
118
+ from mirrorworld.elevation import ahn
119
+ from mirrorworld.lidar import usgs3dep
120
+ from mirrorworld.vector import osm
121
+
122
+ poles = mapillary.find_map_features(47.68, -122.30, radius=150, values=["object--support--utility-pole"])
123
+ pics = panoramax.find_panoramas(51.5088, -0.127, radius=30)
124
+ versions = wayback.find_versions(47.6062, -122.3321) # dated imagery versions at a place
125
+ pdok.download_raster(52.3736, 4.8915, 52.3728, 4.8932, "dam_cir.png", infrared=True)
126
+ s2 = sentinel2.get_raster(47.615, -122.345, 47.600, -122.325, bands=("red", "nir"))
127
+ heights = ahn.get_ndsm(52.3736, 4.8915, 52.3728, 4.8932) # object heights above ground
128
+ las = usgs3dep.get_points(47.6068, -122.3340, 47.6058, -122.3325, resolution=1.0)
129
+ cabinets = osm.find_features(47.61, -122.34, 47.60, -122.33, {"man_made": "street_cabinet"})
130
+ ```
131
+
132
+ Optional dependencies: `pip install "mirrorworld[raster]"` (rasterio: GeoTIFF/COG for satellite, elevation, WCS,
133
+ ArcGIS) and `pip install "mirrorworld[lidar]"` (laspy with LAZ support). Mapillary reads its token from
134
+ `access_token=` or `MAPILLARY_ACCESS_TOKEN`.
135
+
136
+ Each source keeps its own terms (listed in each module's docstring and the docs). Bing and Google tiles use
137
+ unofficial endpoints; check their terms before relying on them.
138
+
139
+ ## Documentation
140
+ The API reference lives in [`docs/`](docs/) (Sphinx: `pip install -r docs/requirements.txt && make -C docs html`).
141
+ The original streetlevel documentation is at [streetlevel.readthedocs.io](https://streetlevel.readthedocs.io/).
142
+
143
+ ## Functionality overview
144
+ Services covering multiple countries are on the left; services covering one specific country are on the right.
145
+
146
+ ✔ implemented / available; 🟡 partially implemented; ❌ not implemented; ⚫ not available / not applicable
147
+
148
+ <table>
149
+ <thead>
150
+ <th></th>
151
+ <th align="center">Google<br>Street&nbsp;View</th>
152
+ <th align="center">Apple<br>Look&nbsp;Around</th>
153
+ <th align="center">Yandex<br>Panorama</th>
154
+ <th align="center">Bing<br>Streetside</th>
155
+ <th></th>
156
+ <th align="center">🇨🇳 Baidu<br>Panorama</th>
157
+ <th align="center">🇰🇷 Kakao<br>Road&nbsp;View</th>
158
+ <th align="center">🇰🇷 Naver<br>Street&nbsp;View</th>
159
+ <th align="center">🇨🇿 Mapy.cz<br>Panorama</th>
160
+ <th align="center">🇮🇸 Já<br>360</th>
161
+ </thead>
162
+ <thead>
163
+ <td colspan="11" style="padding-top:20px"><br><b>Finding panoramas</b><br>
164
+ How panoramas can be retrieved through the API.
165
+ </td>
166
+ </thead>
167
+ <tr>
168
+ <td align="right">Find panoramas around a point</td>
169
+ <td align="center">✔<sup>1</sup></td>
170
+ <td align="center">⚫</td>
171
+ <td align="center">✔<sup>1</sup></td>
172
+ <td align="center">✔</td>
173
+ <td></td>
174
+ <td align="center">✔<sup>1</sup></td>
175
+ <td align="center">✔</td>
176
+ <td align="center">✔<sup>1</sup></td>
177
+ <td align="center">✔<sup>1</sup></td>
178
+ <td align="center">✔<sup>1</sup></td>
179
+ </tr>
180
+ <tr>
181
+ <td align="right">Find panoramas by map tile or bbox</td>
182
+ <td align="center">✔<sup>2</sup></td>
183
+ <td align="center">✔<sup>2</sup></td>
184
+ <td align="center">⚫</td>
185
+ <td align="center">✔<sup>3</sup></td>
186
+ <td></td>
187
+ <td align="center">⚫</td>
188
+ <td align="center">⚫</td>
189
+ <td align="center">⚫</td>
190
+ <td align="center">⚫</td>
191
+ <td align="center">⚫</td>
192
+ </tr>
193
+ <tr>
194
+ <td align="right">Get specific panorama by ID</td>
195
+ <td align="center">✔</td>
196
+ <td align="center">⚫</td>
197
+ <td align="center">✔</td>
198
+ <td align="center">✔</td>
199
+ <td></td>
200
+ <td align="center">✔</td>
201
+ <td align="center">✔</td>
202
+ <td align="center">✔</td>
203
+ <td align="center">✔</td>
204
+ <td align="center">✔</td>
205
+ </tr>
206
+ <thead>
207
+ <td colspan="11" style="padding-top:20px"><br><b>Imagery</b><br>
208
+ The type of imagery returned by the service.
209
+ </td>
210
+ </thead>
211
+ <tr>
212
+ <td align="right">Panoramas</td>
213
+ <td align="center">✔</td>
214
+ <td align="center">✔<sup>4</sup></td>
215
+ <td align="center">✔</td>
216
+ <td align="center">✔</td>
217
+ <td></td>
218
+ <td align="center">✔</td>
219
+ <td align="center">✔</td>
220
+ <td align="center">✔</td>
221
+ <td align="center">✔</td>
222
+ <td align="center">✔</td>
223
+ </tr>
224
+ <tr>
225
+ <td align="right">Depth</td>
226
+ <td align="center">✔<sup>5</sup></td>
227
+ <td align="center">❌</td>
228
+ <td align="center">⚫</td>
229
+ <td align="center">⚫</td>
230
+ <td></td>
231
+ <td align="center">❌?<sup>10</sup></td>
232
+ <td align="center">✔</td>
233
+ <td align="center">✔<sup>14</sup></td>
234
+ <td align="center">⚫<br></td>
235
+ <td align="center">⚫<br></td>
236
+ </tr>
237
+ <tr>
238
+ <td align="right">Image projection</td>
239
+ <td align="center">Equirectangular</td>
240
+ <td align="center">???</td>
241
+ <td align="center">Equirectangular</td>
242
+ <td align="center">Cubemap</td>
243
+ <td></td>
244
+ <td align="center">Equirectangular</td>
245
+ <td align="center">Equirectangular</td>
246
+ <td align="center">Equirectangular/Cubemap<sup>13</sup></td>
247
+ <td align="center">Equirectangular</td>
248
+ <td align="center">Cubemap</td>
249
+ </tr>
250
+ <tr>
251
+ <td align="right">Image format</td>
252
+ <td align="center">JPEG</td>
253
+ <td align="center">HEIC</td>
254
+ <td align="center">JPEG</td>
255
+ <td align="center">JPEG</td>
256
+ <td></td>
257
+ <td align="center">JPEG</td>
258
+ <td align="center">JPEG</td>
259
+ <td align="center">JPEG</td>
260
+ <td align="center">JPEG</td>
261
+ <td align="center">JPEG</td>
262
+ </tr>
263
+ <thead>
264
+ <td colspan="11" style="padding-top:20px"><br><b>Available metadata</b><br>
265
+ Metadata returned by the API of the service alongside ID and location.
266
+ </td>
267
+ </thead>
268
+ <tr>
269
+ <td align="right">Capture date</td>
270
+ <td align="center">✔<sup>6</sup></td>
271
+ <td align="center">✔</td>
272
+ <td align="center">✔</td>
273
+ <td align="center">✔</td>
274
+ <td></td>
275
+ <td align="center">✔</td>
276
+ <td align="center">✔</td>
277
+ <td align="center">✔</td>
278
+ <td align="center">✔</td>
279
+ <td align="center">✔<sup>9</sup></td>
280
+ </tr>
281
+ <tr>
282
+ <td align="right">Heading, pitch, roll</td>
283
+ <td align="center">✔</td>
284
+ <td align="center">✔</td>
285
+ <td align="center">✔<sup>7</sup></td>
286
+ <td align="center">✔</td>
287
+ <td></td>
288
+ <td align="center">✔</td>
289
+ <td align="center">✔<sup>7</sup></td>
290
+ <td align="center">✔<sup>11</sup></td>
291
+ <td align="center">✔</td>
292
+ <td align="center">✔<sup>7</sup></td>
293
+ </tr>
294
+ <tr>
295
+ <td align="right">Elevation</td>
296
+ <td align="center">✔</td>
297
+ <td align="center">✔</td>
298
+ <td align="center">⚫</td>
299
+ <td align="center">✔</td>
300
+ <td></td>
301
+ <td align="center">✔</td>
302
+ <td align="center">⚫</td>
303
+ <td align="center">⚫<sup>12</sup></td>
304
+ <td align="center">✔</td>
305
+ <td align="center">⚫</td>
306
+ </tr>
307
+ <tr>
308
+ <td align="right">Nearby / linked panoramas</td>
309
+ <td align="center">✔</td>
310
+ <td align="center">⚫</td>
311
+ <td align="center">✔</td>
312
+ <td align="center">✔<sup>8</sup></td>
313
+ <td></td>
314
+ <td align="center">✔</td>
315
+ <td align="center">✔</td>
316
+ <td align="center">✔</td>
317
+ <td align="center">✔</td>
318
+ <td align="center">✔</td>
319
+ </tr>
320
+ <tr>
321
+ <td align="right">Historical panoramas</td>
322
+ <td align="center">✔</td>
323
+ <td align="center">⚫</td>
324
+ <td align="center">✔</td>
325
+ <td align="center">⚫</td>
326
+ <td></td>
327
+ <td align="center">✔</td>
328
+ <td align="center">✔</td>
329
+ <td align="center">✔</td>
330
+ <td align="center">✔</td>
331
+ <td align="center">⚫</td>
332
+ </tr>
333
+ <tr>
334
+ <td align="right">Address</td>
335
+ <td align="center">✔</td>
336
+ <td align="center">⚫</td>
337
+ <td align="center">✔</td>
338
+ <td align="center">⚫</td>
339
+ <td></td>
340
+ <td align="center">⚫</td>
341
+ <td align="center">✔</td>
342
+ <td align="center">✔</td>
343
+ <td align="center">⚫</td>
344
+ <td align="center">✔</td>
345
+ </tr>
346
+ <tr>
347
+ <td align="right">PoIs</td>
348
+ <td align="center">✔</td>
349
+ <td align="center">❌</td>
350
+ <td align="center">✔</td>
351
+ <td align="center">⚫</td>
352
+ <td></td>
353
+ <td align="center">⚫</td>
354
+ <td align="center">❌</td>
355
+ <td align="center">❌</td>
356
+ <td align="center">⚫</td>
357
+ <td align="center">⚫</td>
358
+ </tr>
359
+ <tr>
360
+ <td align="right">Creator</td>
361
+ <td align="center">✔</td>
362
+ <td align="center">⚫</td>
363
+ <td align="center">✔</td>
364
+ <td align="center">⚫</td>
365
+ <td></td>
366
+ <td align="center">✔</td>
367
+ <td align="center">⚫</td>
368
+ <td align="center">⚫</td>
369
+ <td align="center">✔</td>
370
+ <td align="center">⚫</td>
371
+ </tr>
372
+ </table>
373
+
374
+ 1: Returns closest only
375
+ 2: Tile, z=17
376
+ 3: Bounding box
377
+ 4: Unstitched
378
+ 5: Appears to be a synthetic depth map created from elevation data and building footprints
379
+ 6: Month and year only for official coverage, full date for inofficial coverage
380
+ 7: Only heading; pitch/roll do not appear to be available
381
+ 8: Previous and next image in sequence
382
+ 9: Month and year only
383
+ 10: There is a `has_depth` field in the raw metadata, but I've yet to find a panorama that actually has depth
384
+ 11: Pitch/roll are only available for the new 3D imagery
385
+ 12: Camera altitude is available, however
386
+ 13: 3D imagery panos have both an equirectangular and a cubemap version; everything else is only available as cubemap
387
+ 14: Non-3D imagery appears to use a synthetic depthmap created from elevation data and building footprints