zoukankan      html  css  js  c++  java
  • 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);

                

     

  • 相关阅读:
    memmove 的实现
    [转]SGI STL 红黑树(Red-Black Tree)源代码分析
    [转]让我看了很有感触
    [转]C++ list 类学习笔记
    [转]码农自白:这样成为谷歌工程师
    [转]Traits 编程技法+模板偏特化+template参数推导+内嵌型别编程技巧
    泛型指针,原生指针和智能指针
    [转]C++基本功和 Design Pattern系列 ctor & dtor
    python+opencv滤波操作
    python+opencv阈值
  • 原文地址:https://www.cnblogs.com/csharponworking/p/2015493.html
Copyright © 2011-2022 走看看