随笔 - 81  文章 - 1033  trackbacks - 0
<2024年3月>
252627282912
3456789
10111213141516
17181920212223
24252627282930
31123456

在浮躁的年代里,我们进取心太切,患得患失;虚荣心太强,战战兢兢。一心争强好胜,惟恐榜上无名。
I think I can fly , and flying like a bird !
程序员一名,已售出,缺货中!

我的邮件联系方式

用且仅用于MSN

博客点击率
free web counter
free web counter

常用链接

留言簿(36)

随笔档案

搜索

  •  

积分与排名

  • 积分 - 185548
  • 排名 - 308

最新评论

阅读排行榜

评论排行榜

     作者:施伟,原文出处: http://www.blogjava.net/crespo9907/archive/2007/03/02/mapeasy_answer3_level_row_column.html,转载请保留。
      
       cyg_gis在我的博里留言,问到如下三个问题:

      1.请问level不同时如何分割图片,是否根据坐标来? 
      2.level变动时,function NewMapType() {}函数如何实现? 
      3.可否说说MapEasy的执行流程。
 

      这也是很多的朋友在群里和论坛里经常问到的问题,也因为最近比较忙都只是做了简单的交流,今天抽空在这里把这个问题分析一下,我想上面三个问题也就自己解开了。

      首先需要搞清楚row,column,level分别是什么意思,我想大家英文对付它们应该绰绰有余,呵呵。row表示行、column表示列而level表示级别,在MapEasy中row表示瓦片(tile)所在的行数、column表示瓦片所在的列数而level表示地图缩放的级别。

      下面我们来理解几个更为重要的概念,主要是MapModel这个地图核心对象的几个属性:

      1. MapModel.bound 表示地图的坐标范围
      它为地图指定了一个参考坐标范围,其他一些带有坐标信息的概念都是以它作为参考,如点(Point)、地物标注(Marker)等。如设置当前坐标范围为(-180e16, 180e16, -90e16, 90e16),即MapModel.bound = new Bound(-180e16, 180e16, -90e16, 90e16)(在这里默认你已经了解Bound对象的含义),有一个标注的坐标为(-180e16, 90e16),即new Marker(new Point(-180, 90)) ,很容易看出在这个地图坐标系范围中此标注在地图的最左上角。自然这个标注在显示时位置也就在地图的最左上角。

      2. MapModel.firstZoomTileNum 表示地图在客户端显示时在第一个级别所分成的瓦片数。
      这个值一般是一个平方数,因为默认地图为正方形。如MapModel.firstZoomTileNum = 121表示在第一个级别会分成121和瓦片来显示,即11行11列的瓦片组成的二元矩阵。

      3. MapModel.scalePara 表示地图每一层缩放之间的缩放比例
      这个比较容易理解,如果MapModel.scalePara=2,那么每个级别之间就以2倍的比例放大或者缩小。

      4. MapModel.tileSize 表示每个瓦片的尺寸大小,单位为象素
      如MapModel.tileSize=256,那么瓦片即为256*256的DIV,地图图片相应也为256*256。注意此处单位为象素。

      5. MapModel.maxZoomLevel 表示地图能放大的最大级别
      如MapModel.maxZoomLevel=5,那么地图能放大的最大级别为5,相应在滑块工具上你也只能看到放大到5。

      
      我想理解了上面几个概念要回答那三个甚至是相关的问题都不会太难,首先我们来分析问题一:请问level不同时如何分割图片,是否根据坐标来? MapEasy这种地图显示方式就是把地图分成一个个大小相等小的瓦片,我们可以把的地图看作是又我们生成的这些瓦片所拼接起来,其实一个瓦片在浏览器中就是一个DIV,里面包含一个图片。我们举一个比较典型的例子来说明。
     
      如果地图坐标范围为(-100,100,-100,100),我们把它看左一个长宽均为200的大图片,我们设置MapModel.firstZoomTileNum=4,即在第一级用4个瓦片来显示,显示如下:

      A1 A2
      B1 B2

      A1,A2,B1,B2即为4个瓦片,显然A1显示(-100,0,0,100)范围的地图,A2显示(0,100,0,100)范围,B1显示(-100,0,-100,0)范围,B2显示(0,100,-100,0)范围。这个时候我们可以结合理解row,column的概念,其实这四个代号中A,B即代表row,下标1,2即代表column。

      为方便阅读把图片与地图范围列表如下:

      A1-(-100,0,0,100)
      A2-(0,100,0,100)

      B1-(-100,0,-100,0)
      B2-(0,100,-100,0)

      同样举最典型的例子当地图由level=1变为level=2时,并MapModel.scalePara=2即放大比例为2时,显然图片的长和宽都变为原来的一倍,而整个地图的面积就变成了原来的四倍。这个时候MapEasy会用四倍的瓦片数量来显示地图,如上面举的例子就变成如下显示:

   C1 C2 C3 C4
   D1 D2 D3 D4
   E1  E2 E3 E4
   F1  F2 F3 F4

      注:这里的ABCDEF并没有任何含义,只是代号而已。

      这个时候C1显示(-100,-50,50,100)范围地图,而C2显示(-50,0,50,100),依次类推,见下表:

      C1-(-100,-50,50,100)
      C2-(-50,0,50,100)
      C3-(0,50,50,100)
      C4-(50,100,50,100)

      D1-(-100,-50,0,50)
      D2-(-50,0,0,50)
      D3-(0,50,0,50)
      D4-(50,100,0,50)

      E1-(-100,-50,-50,0)
      E2-(-50,0,-50,0)
      E3-(0,50,-50,0)
      E4-(50,100,-50,0)

      F1-(-100,-50,-100,-50)
      F2-(-50,0,-100,-50)
      F3-(0,50,-100,-50)
      F4-(50,100,-100,-50)

      可以看出原来由一个瓦片A1显示的部分,现在由C1,C2,D1,D2四个瓦片共同显示,其他类推。

      当level不同时MapEasy就是这样分割图片来形成瓦片显示的,我想第一个问题应该解决了吧。下面我们来看第二个问题:level变动时,function NewMapType() {}函数如何实现?在自定义一个新的地图类型时,主要就是需要重载getSrc()方法来跟特定的地图服务器配合取得对应瓦片的图片数据。这个在以前也讨论过,getSrc方法通过level, row, column三个参数来确定现在需要请求哪个瓦片的图片数据。即表示在level级别下第row行第column列的瓦片地图数据的地址(在MapEasy中row,column的索引是从0开始的)。再结合第一个问题的解释第二个问题也就自然不成问题了。如上面的例子当level为1第二行第二列的瓦片图片数据为B2即(0,100,-100,0)范围的图片数据,二当level为2时同样第二行第二列的瓦片图片数据为D2即(-50,0,0,50)的图片数据。

      不管你的地图服务器(或者称为数据源)是使用按图片名称编好号码的静态图片还是动态的WMS服务等,都没有任何关系,按照上面的规律实现getSrc方法按对应的level,row,column取得对应的地图数据就可以享受MapEasy带来的乐趣了。如果你知道了这些还问我怎么去取图片呢,那我只能说仁者见仁,智者见智。呵呵

      对于第三个问题,我能说的就是在开源项目文档不全的客观条件下,静下心来研读一遍代码是最好的方法。MapEasy的代码即使在JavaScript基础不是太好的情况下我想抽一个星期的空余时间应该可以完整的读一遍了。不知道我这样回答cyg_gis兄是否能满意,不过这确实是肺腑直言,读源代码才是王道,强烈推荐!

      确实有好多好多的朋友提到这几个相关的问题,希望这篇文章能帮大家一解困惑,共同享受MapEasy!
posted on 2007-03-02 02:04 cresposhi 阅读(5281) 评论(18)  编辑  收藏

FeedBack:
# re: MapEasy答疑(三) row,column,level与瓦片显示的关系【很多朋友反复问到的问题】 2007-03-02 08:50 Tom Xu
目前ME系统针对数据源的缺点是:只能显示定范围的地图数据,定范围的数据虽然容易切图,但往往会错过一些重要的比例尺,因此定范围的数据层与层之间是有线性关系的。但如果要按固定比例尺切图,那现在ME系统就无法满足需求,需要做一些调整,目前正在测试,基本实现。

不过好在目前大部分WMS及像Google, Yahoo, Mapbar, 51ditu等都是采用固定范围的方式显示数据,因而系统开发难度降低不少。  回复  更多评论
  
# re: MapEasy答疑(三) row,column,level与瓦片显示的关系【很多朋友反复问到的问题】 2007-03-02 10:54 cyg_gis
写的很详细,我正在详读。我现在卡在了“level不同如何切割服务器端地图”等问题。  回复  更多评论
  
# re: MapEasy答疑(三) row,column,level与瓦片显示的关系【很多朋友反复问到的问题】 2007-03-02 10:57 cyg_gis
看了上面Tom Xu的回复,我想“用比例尺切图”的方法现阶段应该不可行,但“定范围”切图的方法现在还不是很清楚。  回复  更多评论
  
# re: MapEasy答疑(三) row,column,level与瓦片显示的关系【很多朋友反复问到的问题】[未登录] 2007-03-02 11:18 SIN
当前MapEasy可不可以跟你的博客地图中那样,在上面加一些能显示动态数据的标注??  回复  更多评论
  
# re: MapEasy答疑(三) row,column,level与瓦片显示的关系【很多朋友反复问到的问题】 2007-03-02 11:51 施伟
@SIN
当然可以,需要自己建立自己的标注数据库,在客户端JS中生成标注对象Marker或者扩展覆盖物Overlay对象来生成自己的标注即可。
  回复  更多评论
  
# re: MapEasy答疑(三) row,column,level与瓦片显示的关系【很多朋友反复问到的问题】 2007-03-02 11:54 施伟
@cyg_gis
有什么具体问题你可以详细的给我mail list,我抽时间帮你解决。
最近确实被事忙晕了,ME也一段时间没碰了,呵呵
找时间看看tom兄说的几个问题。
看来我又落后了啊,tom等等我啊 ^_^  回复  更多评论
  
# re: MapEasy答疑(三) row,column,level与瓦片显示的关系【很多朋友反复问到的问题】 2007-03-12 12:04 颖颖
呵呵,怎么这么快就落后了啊。  回复  更多评论
  
# re: MapEasy答疑(三) row,column,level与瓦片显示的关系【很多朋友反复问到的问题】 2007-03-12 21:38 施伟
呵呵,日新月异啊。。。  回复  更多评论
  
# re: MapEasy答疑(三) row,column,level与瓦片显示的关系【很多朋友反复问到的问题】 2007-03-13 09:07 颖颖
造也,呵呵,这个世界有没有天才啊,就是那种不用学都知道的,还有啊,过目不忘的那种。  回复  更多评论
  
# re: MapEasy答疑(三) row,column,level与瓦片显示的关系【很多朋友反复问到的问题】 2007-03-13 22:20 施伟
有天才,所谓的天才并不是不用学都知道,而是拼命学并且掌握学习方法的人。  回复  更多评论
  
# re: MapEasy答疑(三) row,column,level与瓦片显示的关系【很多朋友反复问到的问题】 2007-03-14 10:14 颖颖
哦,那每个人都可以成为天才列,呵呵看来又跟:这个世界没有丑女人,只有懒女人的道理一样,呵呵  回复  更多评论
  
# re: MapEasy答疑(三) row,column,level与瓦片显示的关系【很多朋友反复问到的问题】 2007-03-14 11:52 cresposhi
这句话说的有见地,美女越来越有深度了,呵呵  回复  更多评论
  
# re: MapEasy答疑(三) row,column,level与瓦片显示的关系【很多朋友反复问到的问题】 2007-03-14 12:41 颖颖
呵呵,那我是美女所以我不懒,这个对不对啊?  回复  更多评论
  
# re: MapEasy答疑(三) row,column,level与瓦片显示的关系【很多朋友反复问到的问题】 2007-03-15 09:16 cresposhi
呵呵,也有道理哦  回复  更多评论
  
# re: MapEasy答疑(三) row,column,level与瓦片显示的关系【很多朋友反复问到的问题】 2007-08-30 15:05 bwrobert
瞎扯!答疑成了谈论天才美女和懒人了!  回复  更多评论
  
# re: MapEasy答疑(三) row,column,level与瓦片显示的关系【很多朋友反复问到的问题】 2007-08-30 15:27 bwrobert
最近刚弄 MapEasyx想问个初学者的问题:
自定义类型来读取地图图片数据如何形成瓦片显示在页面上?  回复  更多评论
  
# re: MapEasy答疑(三) row,column,level与瓦片显示的关系【很多朋友反复问到的问题】 2007-11-13 14:49 hyowner
看了上面的问题我还是感到很迷惑,我现在的唯一的问题就是不知道如何把地图把地图切割,我在浏览器上看时一些简单的功能是可以实现的,但就是里面的瓦片显示部分不知道怎样换成我的图例,还请能详细讲解,怎样把我的N多的图片多显示出来呢,我用了一张图片测试,结果在
A1 B1
A2 B2
都出现了同样的图片,我怎么才能把所头的图片按一个完整的地图显示出来啊
QQ:57191841  回复  更多评论
  
# re: MapEasy答疑(三) row,column,level与瓦片显示的关系【很多朋友反复问到的问题】[未登录] 2009-06-30 14:31 lu
我也有同上的问题。而且之前下的ME,运行demo2_google.html这些例子的时候,googlemap的图片都读不出来啊,全都是x。是不是读取googlemap数据的url有问题啊?急切求教  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: