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.

232 lines
5.5 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
  1. var ipLocation = require('./ip-location')
  2. var LeafletGeoSearch = require('leaflet-geosearch')
  3. var OverpassLayer = require('overpass-layer')
  4. var OverpassLayerList = require('overpass-layer').List
  5. var OverpassFrontend = require('overpass-frontend')
  6. var OpenStreetBrowserLoader = require('./OpenStreetBrowserLoader')
  7. var hash = require('sheet-router/hash')
  8. window.OpenStreetBrowserLoader = OpenStreetBrowserLoader
  9. require('./CategoryIndex')
  10. require('./CategoryOverpass')
  11. var tagTranslations = require('./tagTranslations')
  12. var map
  13. var baseCategory
  14. window.onload = function() {
  15. call_hooks('init')
  16. map = L.map('map')
  17. ipLocation('', function (err, ipLoc) {
  18. if (typeof ipLoc === 'object' && 'latitude' in ipLoc) {
  19. map.setView([ ipLoc.latitude, ipLoc.longitude ], 14)
  20. } else {
  21. map.setView([ 51.505, -0.09 ], 14)
  22. }
  23. })
  24. // Add Geo Search
  25. var provider = new LeafletGeoSearch.OpenStreetMapProvider()
  26. var searchControl = new LeafletGeoSearch.GeoSearchControl({
  27. provider: provider,
  28. showMarker: false,
  29. retainZoomLevel: true
  30. })
  31. map.addControl(searchControl)
  32. // Geo location
  33. L.control.locate({
  34. keepCurrentZoomLevel: true,
  35. drawCircle: false,
  36. drawMarker: false,
  37. showPopup: false
  38. }).addTo(map);
  39. overpassFrontend = new OverpassFrontend('//overpass-api.de/api/interpreter', {
  40. timeGap: 10,
  41. effortPerRequest: 100
  42. })
  43. var osm_mapnik = L.tileLayer('//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
  44. {
  45. maxZoom: 19,
  46. attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
  47. }
  48. )
  49. osm_mapnik.addTo(map)
  50. OpenStreetBrowserLoader.setMap(map)
  51. OpenStreetBrowserLoader.getCategory('index', function (err, category) {
  52. if (err) {
  53. alert(err)
  54. return
  55. }
  56. baseCategory = category
  57. category.setParentDom(document.getElementById('content'))
  58. category.open()
  59. })
  60. map.on('popupopen', function (e) {
  61. if (e.popup.object) {
  62. var url = e.popup.object.layer_id + '/' + e.popup.object.id
  63. if (location.hash !== url) {
  64. history.pushState(null, null, '#' + url)
  65. }
  66. }
  67. })
  68. map.on('popupclose', function (e) {
  69. history.pushState(null, null, '#')
  70. hide()
  71. })
  72. if (location.hash && location.hash.length > 1) {
  73. var url = location.hash.substr(1)
  74. options = {
  75. showDetails: !!location.hash.match(/\/details$/)
  76. }
  77. show(url, options, function () {})
  78. }
  79. hash(function (loc) {
  80. if (loc.length > 1) {
  81. var url = loc.substr(1)
  82. options = {
  83. showDetails: !!loc.match(/\/details$/)
  84. }
  85. show(url, options, function () {})
  86. }
  87. })
  88. tagTranslations.setTagLanguage(ui_lang)
  89. tagTranslations.load('node_modules/openstreetmap-tag-translations', ui_lang, function (err) {
  90. if (err) {
  91. alert('Error loading translations: ' + err)
  92. return
  93. }
  94. })
  95. }
  96. function show (id, options, callback) {
  97. if (options.showDetails) {
  98. document.getElementById('content').innerHTML = 'Loading ...'
  99. }
  100. id = id.split('/')
  101. if (id.length < 2) {
  102. alert('unknown request')
  103. return
  104. }
  105. OpenStreetBrowserLoader.getCategory(id[0], function (err, category) {
  106. if (err) {
  107. alert('error loading category "' + id[0] + '": ' + err)
  108. return
  109. }
  110. if (!category.parentDom) {
  111. category.setParentDom(document.getElementById('content'))
  112. }
  113. category.show(
  114. id[1],
  115. {
  116. },
  117. function (err, data) {
  118. if (err) {
  119. alert('error loading object "' + id[0] + '/' + id[1] +'": ' + err)
  120. return
  121. }
  122. data.feature.openPopup()
  123. if (options.showDetails) {
  124. showDetails(data, category)
  125. }
  126. callback(err)
  127. }
  128. )
  129. category.open()
  130. })
  131. }
  132. function showDetails (data, category) {
  133. var dom = document.getElementById('content')
  134. dom.innerHTML = ''
  135. var div = document.createElement('h1')
  136. div.className = 'title'
  137. div.innerHTML = data.data.title
  138. dom.appendChild(div)
  139. var div = document.createElement('div')
  140. div.className = 'body'
  141. div.innerHTML = data.data.body
  142. dom.appendChild(div)
  143. var h = document.createElement('h3')
  144. h.innerHTML = 'Attributes'
  145. dom.appendChild(h)
  146. var div = document.createElement('dl')
  147. div.className = 'tags'
  148. for (var k in data.object.tags) {
  149. var dt = document.createElement('dt')
  150. dt.appendChild(document.createTextNode(k))
  151. div.appendChild(dt)
  152. var dd = document.createElement('dd')
  153. dd.appendChild(document.createTextNode(data.object.tags[k]))
  154. div.appendChild(dd)
  155. }
  156. dom.appendChild(div)
  157. var h = document.createElement('h3')
  158. h.innerHTML = 'OSM Meta'
  159. dom.appendChild(h)
  160. var div = document.createElement('dl')
  161. div.className = 'meta'
  162. var dt = document.createElement('dt')
  163. dt.appendChild(document.createTextNode('id'))
  164. div.appendChild(dt)
  165. var dd = document.createElement('dd')
  166. var a = document.createElement('a')
  167. a.appendChild(document.createTextNode(data.object.type + '/' + data.object.osm_id))
  168. a.href = 'https://openstreetmap.org/' + data.object.type + '/' + data.object.osm_id
  169. a.target = '_blank'
  170. dd.appendChild(a)
  171. div.appendChild(dd)
  172. for (var k in data.object.meta) {
  173. var dt = document.createElement('dt')
  174. dt.appendChild(document.createTextNode(k))
  175. div.appendChild(dt)
  176. var dd = document.createElement('dd')
  177. dd.appendChild(document.createTextNode(data.object.meta[k]))
  178. div.appendChild(dd)
  179. }
  180. dom.appendChild(div)
  181. }
  182. function hide () {
  183. var content = document.getElementById('content')
  184. content.innerHTML = ''
  185. if (baseCategory) {
  186. baseCategory.setParentDom(content)
  187. }
  188. }