You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

281 lines
6.7 KiB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
  1. /* globals map:true, overpassFrontend:true, currentPath:true, options:true, baseCategory:true, overpassUrl:true */
  2. var LeafletGeoSearch = require('leaflet-geosearch')
  3. var OverpassFrontend = require('overpass-frontend')
  4. var OpenStreetBrowserLoader = require('./OpenStreetBrowserLoader')
  5. var state = require('./state')
  6. var hash = require('sheet-router/hash')
  7. global.OpenStreetBrowserLoader = OpenStreetBrowserLoader
  8. require('./CategoryIndex')
  9. require('./CategoryOverpass')
  10. global.map = null
  11. global.baseCategory = null
  12. global.overpassUrl = null
  13. global.overpassFrontend = null
  14. global.currentPath = null
  15. var lastPopupClose = 0
  16. // Optional modules
  17. require('./options')
  18. require('./language')
  19. require('./overpassChooser')
  20. require('./fullscreen')
  21. require('./mapLayers')
  22. require('./twigFunctions')
  23. require('./categories')
  24. window.onload = function () {
  25. initState = config.defaultView
  26. map = L.map('map')
  27. call_hooks('init')
  28. call_hooks_callback('init_callback', initState, onload2.bind(this, initState))
  29. }
  30. function onload2 (initState) {
  31. // Add Geo Search
  32. var provider = new LeafletGeoSearch.OpenStreetMapProvider()
  33. var searchControl = new LeafletGeoSearch.GeoSearchControl({
  34. provider: provider,
  35. showMarker: false,
  36. retainZoomLevel: true
  37. })
  38. map.addControl(searchControl)
  39. // Geo location
  40. L.control.locate({
  41. keepCurrentZoomLevel: true,
  42. drawCircle: false,
  43. drawMarker: false,
  44. showPopup: false
  45. }).addTo(map)
  46. if (!overpassUrl) {
  47. overpassUrl = config.overpassUrl
  48. if (Array.isArray(overpassUrl) && overpassUrl.length) {
  49. overpassUrl = overpassUrl[0]
  50. }
  51. }
  52. overpassFrontend = new OverpassFrontend(overpassUrl, {
  53. timeGap: 10,
  54. effortPerRequest: 100
  55. })
  56. OpenStreetBrowserLoader.setMap(map)
  57. var newState
  58. if (location.hash && location.hash.length > 1) {
  59. newState = state.parse(location.hash.substr(1))
  60. } else {
  61. newState = initState
  62. }
  63. // make sure the map has an initial location
  64. if (!('zoom' in newState) && !('lat' in newState) && !('lon' in newState)) {
  65. newState.zoom = initState.zoom
  66. newState.lat = initState.lat
  67. newState.lon = initState.lon
  68. }
  69. state.apply(newState)
  70. OpenStreetBrowserLoader.getCategory('index', function (err, category) {
  71. if (err) {
  72. alert(err)
  73. return
  74. }
  75. baseCategory = category
  76. category.setParentDom(document.getElementById('contentList'))
  77. category.open()
  78. })
  79. map.on('popupopen', function (e) {
  80. if (e.popup.object) {
  81. var url = e.popup.object.layer_id + '/' + e.popup.object.id
  82. if (location.hash.substr(1) !== url && location.hash.substr(1, url.length + 1) !== url + '/') {
  83. currentPath = url
  84. // only push state, when last popup close happened >1sec earlier
  85. state.update(null, Date.now() - lastPopupClose > 1000)
  86. }
  87. OpenStreetBrowserLoader.getCategory(e.popup.object.layer_id, function (err, category) {
  88. if (err) {
  89. alert(err)
  90. return
  91. }
  92. category.notifyPopupOpen(e.popup.object, e.popup)
  93. })
  94. }
  95. })
  96. map.on('popupclose', function (e) {
  97. lastPopupClose = Date.now()
  98. currentPath = null
  99. state.update(null, true)
  100. hide()
  101. })
  102. map.on('moveend', function (e) {
  103. state.update()
  104. })
  105. hash(function (loc) {
  106. state.apply(state.parse(loc.substr(1)))
  107. })
  108. state.update()
  109. }
  110. window.setPath = function (path) {
  111. currentPath = path
  112. if (!path) {
  113. map.closePopup()
  114. return
  115. }
  116. options = {
  117. showDetails: !!path.match(/\/details$/)
  118. }
  119. show(path, options, function (err) {
  120. if (err) {
  121. alert(err)
  122. return
  123. }
  124. call_hooks('show', path, options)
  125. })
  126. }
  127. function show (id, options, callback) {
  128. if (options.showDetails) {
  129. document.getElementById('content').className = 'details'
  130. document.getElementById('contentDetails').innerHTML = 'Loading ...'
  131. }
  132. id = id.split('/')
  133. if (id.length < 2) {
  134. return callback(new Error('unknown request'))
  135. }
  136. OpenStreetBrowserLoader.getCategory(id[0], function (err, category) {
  137. if (err) {
  138. return callback(new Error('error loading category "' + id[0] + '": ' + err))
  139. }
  140. if (!category.parentDom) {
  141. category.setParentDom(document.getElementById('contentList'))
  142. }
  143. category.show(
  144. id[1],
  145. {
  146. },
  147. function (err, data) {
  148. if (err) {
  149. return callback(new Error('error loading object "' + id[0] + '/' + id[1] + '": ' + err))
  150. }
  151. if (!map._popup || map._popup !== data.popup) {
  152. data.feature.openPopup()
  153. }
  154. if (options.showDetails) {
  155. showDetails(data, category)
  156. }
  157. callback(err)
  158. }
  159. )
  160. category.open()
  161. })
  162. }
  163. function showDetails (data, category) {
  164. var div, h, dt, dd
  165. var k
  166. var dom = document.getElementById('contentDetails')
  167. dom.innerHTML = ''
  168. div = document.createElement('h1')
  169. div.className = 'title'
  170. div.innerHTML = data.data.title
  171. dom.appendChild(div)
  172. div = document.createElement('div')
  173. div.className = 'description'
  174. div.innerHTML = data.data.description
  175. dom.appendChild(div)
  176. div = document.createElement('div')
  177. div.className = 'body'
  178. div.innerHTML = data.data.body
  179. dom.appendChild(div)
  180. div = document.createElement('div')
  181. div.className = 'body'
  182. dom.appendChild(div)
  183. category.renderTemplate(data, 'detailsBody', function (div, err, result) {
  184. div.innerHTML = result
  185. }.bind(this, div))
  186. h = document.createElement('h3')
  187. h.innerHTML = 'Attributes'
  188. dom.appendChild(h)
  189. div = document.createElement('dl')
  190. div.className = 'tags'
  191. for (k in data.object.tags) {
  192. dt = document.createElement('dt')
  193. dt.appendChild(document.createTextNode(k))
  194. div.appendChild(dt)
  195. dd = document.createElement('dd')
  196. dd.appendChild(document.createTextNode(data.object.tags[k]))
  197. div.appendChild(dd)
  198. }
  199. dom.appendChild(div)
  200. h = document.createElement('h3')
  201. h.innerHTML = 'OSM Meta'
  202. dom.appendChild(h)
  203. div = document.createElement('dl')
  204. div.className = 'meta'
  205. dt = document.createElement('dt')
  206. dt.appendChild(document.createTextNode('id'))
  207. div.appendChild(dt)
  208. dd = document.createElement('dd')
  209. var a = document.createElement('a')
  210. a.appendChild(document.createTextNode(data.object.type + '/' + data.object.osm_id))
  211. a.href = 'https://openstreetmap.org/' + data.object.type + '/' + data.object.osm_id
  212. a.target = '_blank'
  213. dd.appendChild(a)
  214. div.appendChild(dd)
  215. for (k in data.object.meta) {
  216. dt = document.createElement('dt')
  217. dt.appendChild(document.createTextNode(k))
  218. div.appendChild(dt)
  219. dd = document.createElement('dd')
  220. dd.appendChild(document.createTextNode(data.object.meta[k]))
  221. div.appendChild(dd)
  222. }
  223. dom.appendChild(div)
  224. }
  225. function hide () {
  226. document.getElementById('content').className = 'list'
  227. }
  228. window.showRootContent = hide