AjaxMap.js
上传用户:sex100000
上传日期:2013-11-09
资源大小:1377k
文件大小:11k
源码类别:

GIS编程

开发平台:

C#

  1. // Copyright 2005, 2006 - Morten Nielsen (www.iter.dk)
  2. //
  3. // This file is part of SharpMap.
  4. // SharpMap is free software; you can redistribute it and/or modify
  5. // it under the terms of the GNU Lesser General Public License as published by
  6. // the Free Software Foundation; either version 2 of the License, or
  7. // (at your option) any later version.
  8. // 
  9. // SharpMap is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. // GNU Lesser General Public License for more details.
  13. // You should have received a copy of the GNU Lesser General Public License
  14. // along with SharpMap; if not, write to the Free Software
  15. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
  16. //Notes: Event compatibility tables: http://www.quirksmode.org/js/events_compinfo.html
  17. /* Sets up the map objects events, properties and methods */
  18. function SharpMap_Init(container,map1,map2,statusbar,statustext,uniqueId)
  19. {
  20. var obj = new Object();
  21. //Properties
  22. obj.currMap = 1;
  23. obj.mapReady = 1;
  24. obj.zoomEnded = 1;
  25. obj.clickEvent = null;
  26. obj.clickEventActive = false;
  27. obj.toogleClickEvent = function() { obj.clickEventActive = (!obj.clickEventActive); }
  28. obj.disableClickEvent = function() { obj.clickEventActive = false; }
  29. obj.enableClickEvent = function() { obj.clickEventActive = true; }
  30. obj.setClickEvent = function(fnc) { obj.clickEvent = fnc; }
  31. obj.container = WebForm_GetElementById(container);
  32. obj.uniqueId = uniqueId;
  33. obj.map1 = WebForm_GetElementById(map1);
  34. obj.map2 = WebForm_GetElementById(map2);
  35. if(statusbar!='') { obj.statusbar = WebForm_GetElementById(statusbar); obj.statusText = statustext; }
  36. //Methods
  37. obj.VisibleMap = function() { if(obj.currMap==1) return obj.map1; else return obj.map2; }
  38. obj.HiddenMap =  function() { if(obj.currMap==2) return obj.map1; else return obj.map2; }
  39. obj.GetCenter =  function() { return SharpMap_GetCenter(obj); }
  40. //Events
  41. obj.container.onmousemove = function(event) { SharpMap_MapMouseOver(event,obj); }
  42. if(statusbar!='') obj.container.onmouseout = function(event) { obj.statusbar.innerHTML = ''; }
  43. obj.container.onmousewheel = function(event) { SharpMap_MouseWheel(event,obj); return false;}
  44. if(obj.container.addEventListener)
  45. obj.container.addEventListener('DOMMouseScroll', function(event) { SharpMap_MozillaMouseWheel(event,obj); }, false);
  46. obj.container.onresize = function(event) { SharpMap_ResizeTimeout(event,obj); }
  47. obj.container.onselectstart = function() { return false; }
  48. obj.container.ondrag = function(event) { return false; }
  49. obj.container.onmousedown = function(event) { SharpMap_MouseDown(event,obj); return false; }
  50. obj.container.onmouseup = function(event) { SharpMap_MouseUp(event,obj); return false; }
  51. return obj;
  52. }
  53. /* Called when the mousewheel-scroll event occurs on the map  */
  54. function SharpMap_MouseWheel(event,obj) {
  55. var e = event || window.event;
  56. if (e.type == 'mousewheel' && obj.mapReady && obj.zoomEnded==1) {
  57. var zoomval = obj.zoomAmount;
  58. if(e.wheelDelta<0) { zoomval = 1/obj.zoomAmount; }
  59. SharpMap_BeginZoom(obj,e.clientX,e.clientY,zoomval);
  60. }
  61. }
  62. /* this intermediate wheel function is used for mousewheel compatibility in Mozilla browsers */
  63. function SharpMap_MozillaMouseWheel(event,obj)
  64. {
  65. var e = new Object;
  66. e.type = 'mousewheel';
  67. e.wheelDelta = -event.detail;
  68. e.clientX = event.screenX;
  69. e.clientY = event.screenY;
  70. SharpMap_MouseWheel(e,obj);
  71. }
  72. var startDrag = null;
  73. /* MouseDown - Occurs when potentially starting a drag event */ 
  74. function SharpMap_MouseDown(event,obj) {
  75. if(obj.zoomEnded==1 && obj.mapReady==1) { 
  76. var e = event || window.event;
  77. startDrag=SharpMap_GetRelativePosition(e.clientX,e.clientY,obj.container);
  78. }
  79. }
  80. /* MouseUp - Occurs during a drag event or when doing a click */ 
  81. function SharpMap_MouseUp(event,obj) {
  82. if(obj.zoomEnded==1 && obj.mapReady==1 && SharpMap_IsDefined(startDrag)) {
  83. var e = event || window.event;
  84. var endDrag=SharpMap_GetRelativePosition(e.clientX,e.clientY,obj.container);
  85. var dx=endDrag.x-startDrag.x;
  86. var dy=endDrag.y-startDrag.y;
  87. if(dx!=0 || dy!=0) { //we are dragging
  88. var center = SharpMap_PixelToMap(obj.container.offsetWidth*0.5-dx,obj.container.offsetHeight*0.5-dy,obj);
  89. obj.minX=center.x-obj.zoom*0.5;
  90. obj.maxY=center.y+obj.zoom/obj.container.offsetWidth*obj.container.offsetHeight*0.5;
  91. obj.mapReady = 0;
  92. SharpMap_BeginRefreshMap(obj,1);
  93. }
  94. else if(obj.clickEventActive && obj.clickEvent!=null)
  95. obj.clickEvent(e,obj);
  96. else
  97. SharpMap_BeginZoom(obj,e.clientX,e.clientY,obj.zoomAmount);
  98. }
  99. startDrag=null;
  100. return false;
  101. }
  102. function SharpMap_MapMouseOver(event,obj)
  103. {
  104. if(SharpMap_IsDefined(startDrag)) {
  105. var e = event || window.event;
  106. var endDrag=SharpMap_GetRelativePosition(e.clientX,e.clientY,obj.container);
  107. var dx=endDrag.x-startDrag.x;
  108. var dy=endDrag.y-startDrag.y;
  109. var img=obj.map1;
  110. if(obj.currMap==2) img=obj.map2;
  111. img.style.left=dx+'px';
  112. img.style.top=dy+'px';
  113. obj.container.style.cursor='move';
  114. }
  115. else
  116. {
  117. //var position = WebForm_GetElementPosition(obj.container);
  118. var e = event || window.event;
  119. var mousePos = SharpMap_GetRelativePosition(e.clientX,e.clientY,obj.container);
  120. //var pos = SharpMap_PixelToMap(e.clientX-position.x,e.clientY-position.y,obj);
  121. var pos = SharpMap_PixelToMap(mousePos.x,mousePos.y,obj);
  122. var round = Math.floor(-Math.log(obj.zoom/obj.container.offsetWidth));
  123. var zoom = obj.zoom;
  124. if(round>0) {
  125. round = Math.pow(10,round);
  126. pos.x = Math.round(pos.x*round)/round;
  127. pos.y = Math.round(pos.y*round)/round;
  128. zoom = Math.round(zoom*round)/round;
  129. }
  130. else {
  131. pos.x = Math.round(pos.x);
  132. pos.y = Math.round(pos.y);
  133. zoom = Math.round(zoom);
  134. }
  135. if(SharpMap_IsDefined(obj.statusbar)) obj.statusbar.innerHTML = obj.statusText.replace('[X]',pos.x).replace('[Y]',pos.y).replace('[ZOOM]',zoom);
  136. }
  137. }
  138. /* Begins zooming around the point x,y */
  139. function SharpMap_BeginZoom(obj,x,y,zoomval)
  140. {
  141. if(obj.zoomEnded==0) return;
  142. obj.zoomEnded=0;
  143. obj.container.style.cursor = 'wait';
  144. var position = WebForm_GetElementPosition(obj.container);
  145. var imgX = x-position.x;
  146. var imgY = y-position.y;
  147. if(obj.zoom/zoomval<obj.minZoom) zoomval = obj.zoom/obj.minZoom;
  148. if(obj.zoom/zoomval>obj.maxZoom) zoomval = obj.zoom/obj.maxZoom;
  149. var center = SharpMap_PixelToMap(imgX+(obj.container.offsetWidth*0.5-imgX)/zoomval,imgY+(obj.container.offsetHeight*0.5-imgY)/zoomval,obj);
  150. obj.zoom = obj.zoom/zoomval;
  151. obj.minX = center.x - obj.zoom*0.5;
  152. obj.maxY = center.y + obj.zoom*obj.container.offsetHeight/obj.container.offsetWidth*0.5;
  153. SharpMap_BeginRefreshMap(obj,1); //Start refreshing the map while we're zooming
  154. obj.zoomEnded = 0;
  155. SharpMap_DynamicZoom((position.x-x)*(zoomval-1),(position.y-y)*(zoomval-1),zoomval,0.0,obj);
  156. }
  157. /* loop method started by SharpMap_BeginZoom */
  158. function SharpMap_DynamicZoom(tox,toy,toscale,step,obj)
  159. {    
  160. step = step + 0.2;
  161. var imgd = obj.VisibleMap();
  162. var width = Math.round(obj.container.offsetWidth * ((toscale-1.0)*step+1.0)) +'px';
  163. var height = Math.round(obj.container.offsetHeight * ((toscale-1.0)*step+1.0))+'px';
  164. var left = Math.round(tox*step)+'px';
  165. var top = Math.round(toy*step)+'px';
  166. imgd.style.width = width;
  167. imgd.style.height = height;
  168. imgd.style.left = left;
  169. imgd.style.top = top;
  170. if(step < 0.99) {
  171. var delegate = function() { SharpMap_DynamicZoom(tox,toy,toscale,step,obj); };
  172. setTimeout(delegate,obj.zoomSpeed);
  173. }
  174. else {
  175. obj.zoomEnded=1;
  176. if(obj.mapReady==1) { SharpMap_BeginFade(obj);  }
  177. }
  178. }
  179. /* Starts the fading from one image to the other */
  180. function SharpMap_BeginFade(obj)
  181. {
  182. obj.container.style.cursor = 'wait';
  183. var to=obj.HiddenMap();
  184. var from=obj.VisibleMap();
  185. to.style.zIndex = 10;
  186. from.style.zIndex = 9;
  187. to.style.width = '';
  188. to.style.height = '';
  189. to.style.left = '';
  190. to.style.top = '';
  191. from.onload = ''; //Clear the onload event
  192. SharpMap_SetOpacity(to,0);
  193. to.style.visibility='visible';
  194. if(obj.onViewChange)
  195. obj.onViewChange();
  196. if(obj.currMap==2) { obj.currMap=1; } else { obj.currMap=2; }
  197. SharpMap_Fade(20,20,from,to,obj);
  198. }
  199. /* Recursive method started from SharpMap_BeginFade */
  200. function SharpMap_Fade(value,step,from,to,obj)
  201. {
  202. SharpMap_SetOpacity(to,value);
  203. if(value < 100) { 
  204. var delegate = function() { SharpMap_Fade((value+step),step,from,to,obj); };
  205. setTimeout(delegate,obj.fadeSpeed);
  206. }
  207. else {
  208. from.style.visibility='hidden';
  209. obj.container.style.cursor = 'auto';
  210. }
  211. }
  212. /* Resize handle and method of responding to window/map resizing */
  213. var resizeHandle;
  214. function SharpMap_ResizeTimeout(event,obj)
  215. {
  216. /*
  217. if (resizeHandle!=0) { clearTimeout(resizeHandle); }
  218. var delegate = function() { SharpMap_BeginRefreshMap(obj,1); };
  219. resizeHandle = setTimeout(delegate,500);
  220. */
  221. }
  222. /* Processes the response from the callback -
  223.    The function sets up an onload-event for when the image should start fading if dofade==1 */
  224. function SharpMap_GetCallbackResponse(url,obj,dofade)
  225. {
  226. if(url=='') return;
  227. if(dofade==1)
  228. {
  229. var imgdnew = obj.HiddenMap();
  230. imgdnew.src = url;
  231. imgdnew.onload = function(){ obj.mapReady=1; imgdnew.onload=''; if(obj.zoomEnded==1) { SharpMap_BeginFade(obj); } }
  232. //imgdnew.onerror = function(event) { alert('Could not load image'); imgdnew.onerror=''; }
  233. }
  234. else
  235. {
  236. obj.VisibleMap().src = url;
  237. obj.container.style.cursor = 'auto';
  238. obj.VisibleMap().onload = function(){ obj.mapReady=1;  VisibleMap().onload='';}
  239. //obj.VisibleMap().onerror = function(event) { alert('Could not load image: '); VisibleMap().onerror=''; }
  240. }
  241. }
  242. /* Requests a new map from the server using async callback and starts fading when the image have been retrieved*/
  243. function SharpMap_BeginRefreshMap(obj,dofade)
  244. {
  245. var center = SharpMap_GetCenter(obj);
  246. var delegate = function(url) { SharpMap_GetCallbackResponse(url,obj,dofade); };
  247. WebForm_DoCallback(obj.uniqueId ,center.x+';'+center.y+';'+obj.zoom+';'+obj.container.offsetWidth+';'+obj.container.offsetHeight,delegate,null,SharpMap_AjaxOnError,true)
  248. obj.mapReady=0;
  249. obj.container.style.cursor = 'wait';
  250. if(obj.onViewChanging) obj.onViewChanging();
  251. }
  252. /* Returns the center of the current view */
  253. function SharpMap_GetCenter(obj)
  254. {
  255.    var center = new Object();
  256.    center.x = obj.minX+obj.zoom*0.5;
  257.    center.y = obj.maxY-obj.zoom*obj.container.offsetHeight/obj.container.offsetWidth*0.5;
  258.    return center;
  259. }
  260. /* Sets the opacity of an object (x-browser) */
  261. function SharpMap_SetOpacity(obj,value)
  262. {
  263. obj.style.opacity = value/100.0;
  264. obj.style.mozopacity = value/100.0;
  265. obj.style.filter = 'ALPHA(opacity=' + value + ')';
  266. }
  267. function SharpMap_AjaxOnError(arg) { alert('Map refresh failed: ' + arg); }
  268. /* Transforms from pixels coordinates to world coordinates */
  269. function SharpMap_PixelToMap(x,y,obj)
  270. {
  271.  var p=new Object();
  272.  p.x = obj.minX+x*obj.zoom/obj.container.offsetWidth; p.y = obj.maxY-y*obj.zoom/obj.container.offsetWidth;
  273.  return p;
  274. }
  275. /* Returns the relative position of a point to an object */
  276. function SharpMap_GetRelativePosition(x,y,obj)
  277. {
  278. var position=WebForm_GetElementPosition(obj);
  279. var p=new Object();
  280. p.x=x-position.x;
  281. p.y=y-position.y;
  282. return p;
  283. }
  284. function SharpMap_IsDefined(obj)
  285. {
  286. if (null == obj) { return false; }
  287. if ('undefined' == typeof(obj) ) { return false; }
  288. return true;
  289. }