PageRenderTime 28ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 0ms

/client/view.map.js

https://gitlab.com/crazybutterfly815/netentionjs
JavaScript | 409 lines | 271 code | 89 blank | 49 comment | 20 complexity | bf7602c1ac48e9410a4d196cd729e3b0 MD5 | raw file
  1. function getProxyURL(u) {
  2. return '/http/' + encodeURIComponent(u);
  3. }
  4. function getKMLLayer(kmlurl) {
  5. //use an layer cache with explicit expiration,
  6. //so that when this function gets here again, it doesn't need to re-fetch unless its past the explicit expiration
  7. //if (!window.kmlLayer) window.kmlLayer = { };
  8. //var kml = window.kmlLayer[kmlurl];
  9. //if (!kml) {
  10. var kml =new OpenLayers.Protocol.HTTP({
  11. //url: getProxyURL(kmlurl),
  12. url: kmlurl,
  13. format: new OpenLayers.Format.KML({
  14. extractStyles: true,
  15. extractAttributes: true,
  16. maxDepth: 0,
  17. })
  18. });
  19. // window.kmlLayer[kmlurl] = kml;
  20. // }
  21. return new OpenLayers.Layer.Vector("KML", {
  22. strategies: [new OpenLayers.Strategy.Fixed()],
  23. protocol: kml
  24. });
  25. }
  26. var map2d = true;
  27. function renderMap(s, o, v) {
  28. var mm = { };
  29. var typeSelect;
  30. function updateMap() {
  31. v.html('');
  32. if (typeSelect)
  33. map2d = (typeSelect.val() === '2D');
  34. else
  35. map2d = true;
  36. var mapControl = newDiv();
  37. typeSelect = $('<select/>');
  38. typeSelect.append('<option ' + (map2d ? 'selected' : '') + '>2D</option>');
  39. typeSelect.append('<option ' + (!map2d ? 'selected' : '') + '>3D</option>');
  40. typeSelect.change(function(x) {
  41. later(function() {
  42. updateMap();
  43. });
  44. });
  45. var planetSelect = $('<select/>');
  46. planetSelect.append('<option>Earth</option>');
  47. planetSelect.append('<option>Moon</option>');
  48. planetSelect.append('<option>Mars</option>');
  49. mapControl.append(typeSelect);
  50. mapControl.append(planetSelect);
  51. mapControl.addClass('MapControl');
  52. if (map2d) {
  53. var m = renderOLMap(s, o, v);
  54. mm.onChange = m.onChange;
  55. mm.location = m.location;
  56. }
  57. else {
  58. v.append('TODO: add Cesium');
  59. }
  60. v.append(mapControl);
  61. }
  62. updateMap();
  63. return mm;
  64. }
  65. function renderOLMap(s, o, v) {
  66. var MAX_ITEMS = 500;
  67. var e = uuid();
  68. $('<div style="width: 100%; height: 100%"/>').attr('id', e).appendTo(v);
  69. /*{
  70. var menu = $('<div></div>');
  71. menu.css('position', 'absolute');
  72. menu.css('right', '1em');
  73. menu.css('top', '1em');
  74. menu.append('<button>prev</button>');
  75. menu.append('<button>next</button>');
  76. menu.append('<button>NOW</button>');
  77. o.append(menu);
  78. }*/
  79. var target = e;
  80. var location = objSpacePointLatLng(s.myself());
  81. if (!location)
  82. location = [0,0];
  83. var fromProjection = new OpenLayers.Projection("EPSG:4326"); // Transform from WGS 1984
  84. var toProjection = new OpenLayers.Projection("EPSG:900913"); // to Spherical Mercator Projection
  85. var m = new OpenLayers.Map({
  86. div: target,
  87. projection: fromProjection,
  88. displayProjection: toProjection
  89. //numZoomLevels: 12
  90. });
  91. var mapnik = new OpenLayers.Layer.OSM();
  92. var aerial = new OpenLayers.Layer.OSM("Open Aerial", ["http://otile1.mqcdn.com/tiles/1.0.0/sat/${z}/${x}/${y}.jpg",
  93. "http://otile2.mqcdn.com/tiles/1.0.0/sat/${z}/${x}/${y}.jpg",
  94. "http://otile3.mqcdn.com/tiles/1.0.0/sat/${z}/${x}/${y}.jpg",
  95. "http://otile4.mqcdn.com/tiles/1.0.0/sat/${z}/${x}/${y}.jpg"]);
  96. var vector = new OpenLayers.Layer.Vector("Vectors", {});
  97. var markers = new OpenLayers.Layer.Markers( "Markers" );
  98. m.vector = vector;
  99. m.marker = markers;
  100. m.addLayers([
  101. mapnik, aerial, vector, markers //, gphy, gmap, gsat, ghyb, /*veroad, veaer, vehyb,*/
  102. ]);
  103. function saveBounds() {
  104. /*later(function() {
  105. s.set('mapExtent', m.getExtent());
  106. });*/
  107. }
  108. m.events.register("moveend", m, saveBounds);
  109. m.events.register("zoomend", m, saveBounds);
  110. var exm = s.get('mapExtent');
  111. if (exm) {
  112. //m.zoomToExtent(exm, true);
  113. m.zoomToMaxExtent();
  114. }
  115. else {
  116. var hh = project(new OpenLayers.LonLat(location[1], location[0]));
  117. center(hh);
  118. }
  119. m.targetLocation = m.getCenter();
  120. m.addControl( new OpenLayers.Control.LayerSwitcher() );
  121. var select;
  122. vector.events.on({
  123. featureselected: function(event) {
  124. var feature = event.feature;
  125. var area = feature.geometry.getArea();
  126. var id = feature.attributes.key;
  127. //var output = "Item: " + id;// + " Area: " + area.toFixed(2);
  128. //console.log(feature, area, id, output);
  129. newPopupObjectView(feature.uri);
  130. //document.getElementById("output-id").innerHTML = output;
  131. }
  132. });
  133. /*
  134. var df = new OpenLayers.Control.DragFeature(vector);
  135. m.addControl(df);
  136. df.activate();*/
  137. function center(oll) {
  138. m.setCenter(oll, 12, false, true);
  139. }
  140. function unproject(x) {
  141. x.transform(toProjection, fromProjection);
  142. return x;
  143. }
  144. function project(x) {
  145. x.transform(fromProjection, toProjection);
  146. return x;
  147. }
  148. function createMarker(uri, lat, lon, rad, opacity, fill, iconURL) {
  149. var p = project(new OpenLayers.LonLat(lon, lat));
  150. var t = new OpenLayers.Geometry.Point(p.lon, p.lat /*location[1],location[0]*/);
  151. var targetLocation = new OpenLayers.Feature.Vector(
  152. OpenLayers.Geometry.Polygon.createRegularPolygon(
  153. t,
  154. rad,
  155. 6,
  156. 0), {}, {
  157. fillColor: fill,
  158. //strokeColor: '#fff',
  159. fillOpacity: opacity,
  160. //strokeOpacity: opacity,
  161. strokeWidth: 0
  162. //view-source:http://openlayers.org/dev/examples/vector-features-with-text.html
  163. });
  164. targetLocation.uri = uri;
  165. m.vector.addFeatures([targetLocation]);
  166. //m.zoomToExtent(m.vector.getDataExtent());
  167. if (iconURL) {
  168. var iw = 35;
  169. var ih = 35;
  170. var iop = 0.95;
  171. var size = new OpenLayers.Size(iw,ih);
  172. var offset = new OpenLayers.Pixel(-iw/2.0,-ih/2.0);
  173. var icon = new OpenLayers.Icon(iconURL,size,offset);
  174. icon.setOpacity(iop);
  175. markers.addMarker(new OpenLayers.Marker(p,icon));
  176. }
  177. return targetLocation;
  178. }
  179. m.location = function() {
  180. return unproject(m.getCenter());
  181. };
  182. // Register the function for the animatio
  183. /*var interval = window.setInterval(function(){
  184. animate(tg);
  185. },150);*/
  186. var isVisible = function() {
  187. return $('#' + e).is(':visible');
  188. };
  189. var animate = function(feature) {
  190. feature.data.size += 1;
  191. var x = feature.data.size;
  192. /*feature.style = {
  193. pointRadius: Math.random()*10.0, //feature.data.size, // I will change only the size of the feature
  194. fillColor: "#ffcc66",
  195. fillOpacity: Math.sin(x/10.0),
  196. strokeColor: "#ff9933",
  197. strokeWidth: Math.random()*10.0,
  198. graphicZIndex: 1
  199. };*/
  200. feature.style.strokeWidth = Math.random()*10.0;
  201. feature.layer.redraw();
  202. if (!isVisible()) {
  203. window.clearInterval(interval);
  204. }
  205. };
  206. var kmllayers = [];
  207. function addKMLLayer(url) {
  208. var kml = getKMLLayer(url);
  209. m.addLayer(kml);
  210. kmllayers.push(kml);
  211. kml.events.on({
  212. featureselected: function(event) {
  213. var feature = event.feature;
  214. var area = feature.geometry.getArea();
  215. var id = feature.attributes.key;
  216. newPopupObjectView({
  217. uri: uuid(),
  218. name: feature.attributes.name,
  219. text: feature.attributes.description
  220. });
  221. //feature.geometry.getBounds().getCenterLonLat(),
  222. //'<div class="markerContent">'+feature.attributes.description+'</div>',
  223. }
  224. });
  225. return kml;
  226. }
  227. var now = Date.now();
  228. function renderMapFeature(x, r) {
  229. var k = x.id;
  230. if (objHasTag(x, 'web.KML')) {
  231. addKMLLayer(x.kmlURL);
  232. return;
  233. }
  234. var s = objSpacePoint(x);
  235. if (s) {
  236. var fill = '#888';
  237. var op = 0.5;
  238. var rad = 50;
  239. var iconURL = undefined;
  240. var ww = x.modifiedAt || x.createdAt || null;
  241. if (ww) {
  242. op = 0.25 + 0.5 * Math.exp( -((now - ww) / 1000.0 / 48.0 / 60.0 / 60.0) );
  243. }
  244. iconURL = getTagIcon(x);
  245. var tagStyling = {
  246. 'environment.EarthQuake' : function() {
  247. fill = '#b33';
  248. var mag = objFirstValue(x,'eqMagnitude',1);
  249. rad = 100000 + (mag - 5.0)*700000;
  250. op *= 0.5;
  251. },
  252. 'NuclearFacility' : function() {
  253. rad = 7000;
  254. op = 0.3;
  255. fill = '#ff0';
  256. },
  257. 'Human' : function() {
  258. rad = 200;
  259. op = 0.25;
  260. },
  261. 'Message' : function() {
  262. fill = '#55f';
  263. rad = 50;
  264. },
  265. 'PlanCentroid' : function() {
  266. rad = 7000;
  267. op = 0.3;
  268. fill = '#fa3';
  269. }
  270. };
  271. var tags = objTags(x);
  272. for (var i = 0; i < tags.length; i++) {
  273. var tt = tags[i];
  274. if (tagStyling[tt])
  275. tagStyling[tt]();
  276. }
  277. createMarker(k, s.lat, s.lon, rad, op, fill, iconURL);
  278. }
  279. }
  280. function updateMap() {
  281. if (select) {
  282. select.deactivate();
  283. m.removeControl(select);
  284. select.destroy();
  285. }
  286. m.marker.clearMarkers();
  287. m.vector.removeAllFeatures();
  288. for (var i = 0; i < kmllayers.length; i++) {
  289. kmllayers[i].destroy();
  290. }
  291. kmllayers = [];
  292. var ollayers = [vector];
  293. var layer = s.layer();
  294. if (layer.kml) {
  295. for (var i = 0; i < layer.kml.length; i++) {
  296. var l = addKMLLayer(layer.kml[i]);
  297. ollayers.push(l);
  298. }
  299. }
  300. renderItems(s, o, v, MAX_ITEMS, function(s, v, xxrr) {
  301. for (var i = 0; i < xxrr.length; i++) {
  302. var x = xxrr[i][0];
  303. var r = xxrr[i][1];
  304. renderMapFeature(x, r);
  305. }
  306. });
  307. select = new OpenLayers.Control.SelectFeature(ollayers, {
  308. toggle: true,
  309. clickout: true
  310. });
  311. m.addControl(select);
  312. select.activate();
  313. }
  314. updateMap();
  315. m.onChange = function() {
  316. updateMap();
  317. };
  318. return m;
  319. }