ModestMap 技术简介

一,ModestMaps简介:

ModestMaps是一套基于As3.0ActionScript2.0ActionScript3.0)脚本与Python脚本开发出来的一套类库,是遵循BSD许可协议(参见Unix知识)在Falsh里进行地图显示与用户交互的。

 

目的是为初学者设计者与开发人员提供一个最轻量级的,可扩展的,可定制的和免费的地图显示类库,这个类库能帮助开发人员在他们自己的项目里能够与地图进行交互。ModestMaps提供一个核心健壮的带有很多hooks与附加functionality函数的要素开发包。

 

例子请参见:http://www.modestmaps.com/example.htmlNASA Blue Marble satellite mages,               http://www.modestmaps.com/tutorial-actransit/actransit.htmlAC Transit Oakland bus lines.

 这里有一个讨论组(discussion grouphttp://getsatisfaction.com/modestmaps)一个跑车爱好者(采集数据) 一个通讯专门为版本的更新与补丁提供帮助 这些使得地图瓦片提供者继续为modestmaps效力。当然了 如果你想发布你自己的地图瓦片服务的话 你也可以按照如下说明 第一 地图坐标转换计算 第二 制作瓦片数据 如果你感兴趣利用modestmaps作为一个地图服务端工具来使用的话 那么你可以参照wscompose(利用Python脚本写的一个HTTP接口)进行开发(http://www.modestmaps.com/examples-python-ws/)。

 

自从200812月以来 modest maps不早包含了对Google maps的支持了 如果你想用googlemaps的话 你可以使用Google's Maps API for Flash or the Google Static Maps API 来进行开发,这些与flash,Python都比较类似。

 

下面我们来看看ModestMaps到底能做什么 不能做什么

 

第一:ModestMaps能做到:

 

 1.显示基于地图瓦片的地图 比方说来自的OpenstreetMap,来自NASA Blue Marble,来自Yahho!,来自Microsoft或者其他地方的地图服务瓦片。

2.支持对地图瓦片进行任意地理空间投影设置

3.支持漫游与缩放

4.支持跟踪地理兴趣点(地理标识)的位置

5.支持ActionScript 2.0 代码与flashlite协同工作(这个不是很清楚)

 

第二 ModestMaps不能做到:

1.不提供默认的地理标识的显示

2.不提供默认的按钮进行缩放与平移地图操作

3.不提供其他的api 使得能够进行商业区搜索与数据库查找功能

4、增强的flash组件-UMaphttp://www.afcomponents.com/components/umap_as3/

5、基于地理数据的BI工具spatialKey新版发布

 二,            ModestMaps技术实现:

 

GoogleMapProvider 的实现继承AbstractMapProvider 抽象类,实现接口IMapProvider即可

代码:

package com.modestmaps.mapproviders.google

{

     import com.modestmaps.core.Coordinate;

     import com.modestmaps.mapproviders.AbstractMapProvider;

     import com.modestmaps.mapproviders.IMapProvider;

    

     /**

     * @

      * @

      * */

     public class GoogleMapProvider extends AbstractMapProvider implements IMapProvider

     {

            //private var tilePathBase:String="http://mt{0}.google.com/vt/lyrs={1}&z={2}&x={3}&y={4}";

            //http://mt2.google.com/vt/lyrs=m@107&hl=lt&x=18&y=10&z=5&s=

            private var tilePathBase:String="http://{0}{1}.google.com/{2}/lyrs={3}&hl={4}&x={5}{6}&y={7}&z={8}&s={9}";

           

            private const charStreet:String="m";

            private const charSatellite:String = "s";

        private const charSatelliteHybrid:String = "y";

        private const charPhysical:String = "t";

        private const charPhysicalHybrid:String = "p";

        private const charStreetOverlay:String = "h";

        private const charStreetWaterOverlay:String = "r";

            private const charServer:String="mt";

            private const secGoogleWord:String="Galileo";

            private var server_rr:int=0;

           

            private var type:String;

            //google map zoom is between 0 and 17

            public function GoogleMapProvider(type:String="STREET",minZoom:int=0,maxZoom:int=17)

            {

                   super(minZoom,maxZoom);

                  

                   this.type=type;

                   __topLeftOutLimit.zoomTo(0);

            }

           

            protected function getZoomString(coord:Coordinate):String

            {

                   return "";

            }

           

            //calc the zoom; must be update

            private function TileToZoom(tileLevel:int):int

            {

                   return tileLevel-8;

            }

           

            //get google secwords

            private function GetSecGoogleWords(coord:Coordinate):Array

            {

                   var arr:Array=new Array();

                   var sec1:String="";

                   var sec2:String="";

                   var seclen:int=(coord.row*3+coord.column)%8;

                   sec2=secGoogleWord.substr(0,seclen);

                   if(coord.column>=1000&&coord.column<100000)

                   {

                          sec1="&s=";

                   }

                   arr.push(sec1);

                   arr.push(sec2);

                   return arr;      

            }

            //http://mt2.google.com/vt/lyrs=m@107&hl=lt&x=18&y=10&z=5&s=

            //"http://{0}{1}.google.com/{2}/lyrs={3}&hl={4}&x={5}{6}&y={7}&z={8}&s={9}";

            private function xyzUrl(url:String,server:int,mapMode:String,zoom:int,tilePositionX:int,tilePositionY:int,sec1:String,sec2:String):String

            {

                   var x:int=tilePositionX;

                   var y:int=tilePositionY;

 

                   url=url.replace("{0}",charServer);

                   url=url.replace("{1}",server.toString());

                   url=url.replace("{2}","vt");

                   url=url.replace("{3}","m@130");

                   url=url.replace("{4}","en");

                   url=url.replace("{5}",x.toString());

                   url=url.replace("{6}",sec1);

                   url=url.replace("{7}",y.toString());

                   url=url.replace("{8}",zoom);

                   url=url.replace("{9}",sec2);

                   //url="http://mt1.google.com/vt/lyrs=m@130&hl=en&src=api&x=6859&y=3347&zoom=4&s=Gali";

                   trace(url);

                   return url;

            }

           

            public function toString():String

            {

                   return "GOOGLE"+this.type;

            }

            public function getTileUrls(coord:Coordinate):Array

            {

                   if (coord.row < 0 || coord.row >= Math.pow(2, coord.zoom))

                   {

                          return null;

                   }

                   trace(coord.toString())

                   //var zoom:int=TileToZoom(coord.zoom);

                   server_rr=(coord.row+coord.column*2)%4;

                   var arr:Array=GetSecGoogleWords(coord);

                   var sec1:String=arr[0];

                   var sec2:String=arr[1];

                   var url:String="";

                   switch(this.type)

                   {

                          case GoogleMapModes.Street:

                              url=xyzUrl(this.tilePathBase,server_rr,charStreet,coord.zoom,coord.column,coord.row,sec1,sec2);

                                 break;

                          case GoogleMapModes.Physic:

                                 break;

                          case GoogleMapModes.PhysicalHybrid:

                                 break;

                          case GoogleMapModes.Satellite:

                                 break;

                          case GoogleMapModes.SatelliteHybrid:

                                 break;

                          case GoogleMapModes.StreetOverlay:

                                 break;

                          case GoogleMapModes.StreetWaterOverly:

                                 break;

                   }

                   var array:Array=new Array();

                   array.push(url);

                   return array;

            }

 

     }

}

界面的使用:

//google map

               var provide:GoogleMapProvider=new GoogleMapProvider();

              var extend:MapExtent=new MapExtent(40.764941, 40.693655, -73.938675, -74.039612);

               map=new Map(1000,1000,true,provide,extend);

            

 

原文地址:https://www.cnblogs.com/csharponworking/p/2015493.html