ModestMap 技术简介
2011-04-13 23:36 c#在路上 阅读(1527) 评论(0) 编辑 收藏 举报一,ModestMaps简介:
ModestMaps是一套基于As3.0(ActionScript2.0与ActionScript3.0)脚本与Python脚本开发出来的一套类库,是遵循BSD许可协议(参见Unix知识)在Falsh里进行地图显示与用户交互的。
目的是为初学者设计者与开发人员提供一个最轻量级的,可扩展的,可定制的和免费的地图显示类库,这个类库能帮助开发人员在他们自己的项目里能够与地图进行交互。ModestMaps提供一个核心健壮的带有很多hooks与附加functionality函数的要素开发包。
例子请参见:http://www.modestmaps.com/example.html(NASA Blue Marble satellite mages,) http://www.modestmaps.com/tutorial-actransit/actransit.html(AC Transit Oakland bus lines.)
这里有一个讨论组(discussion group:http://getsatisfaction.com/modestmaps)一个跑车爱好者(采集数据) 一个通讯专门为版本的更新与补丁提供帮助 这些使得地图瓦片提供者继续为modestmaps效力。当然了 如果你想发布你自己的地图瓦片服务的话 你也可以按照如下说明 第一 地图坐标转换计算 第二 制作瓦片数据 如果你感兴趣利用modestmaps作为一个地图服务端工具来使用的话 那么你可以参照ws—compose(利用Python脚本写的一个HTTP接口)进行开发(http://www.modestmaps.com/examples-python-ws/)。
自从2008年12月以来 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组件-UMap(http://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);