<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>IT妖怪 &#187; GIS</title>
	<atom:link href="http://blog.ityao.com/archives/tag/gis/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.ityao.com</link>
	<description>热爱生活，热爱程序</description>
	<lastBuildDate>Wed, 03 Aug 2011 02:56:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>用Flex构建地图应用 — 利用Google Map API制作自己的地图（2）</title>
		<link>http://blog.ityao.com/archives/287</link>
		<comments>http://blog.ityao.com/archives/287#comments</comments>
		<pubDate>Mon, 14 Sep 2009 15:11:08 +0000</pubDate>
		<dc:creator>Silver</dc:creator>
				<category><![CDATA[Adobe Flex]]></category>
		<category><![CDATA[妖怪作品发布]]></category>
		<category><![CDATA[bing]]></category>
		<category><![CDATA[ditu]]></category>
		<category><![CDATA[GIS]]></category>
		<category><![CDATA[map]]></category>
		<category><![CDATA[mapABC]]></category>

		<guid isPermaLink="false">http://blog.ityao.com/?p=287</guid>
		<description><![CDATA[接着上期的，这里用两个实例，给大家介绍一下Flex自定义地图制作的流程，看看是怎么从TileLayBase扩展成自定义的地图 首先是live的地图 然后是mapABC的地图 在上面的例子可以看见，其实只要重载loadTile方法就可以了，是不是非常简单？ loadTile的第一个参数是图块坐标，第二个参数是zoom的图层深度 这里有篇很好的文章和实例演示告诉你这些参数是怎么来的， http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection/ 使用这两个参数，我们要针对不用的图瓦（live或mapABC）去构造图瓦的链接，从而用一块块图瓦拼接出完整的地图。 图瓦的链接是怎么获得的呢？ 呵呵，可以是根据不同地图的文档说明（不过通常都很少），通常我在看一个地图的时候，用firefox进行浏览，然后打开&#8221;工具&#8221;->&#8221;页面信息&#8221;，如下图所示： 然后就发挥你的小宇宙，去猜猜那串图瓦链接怎么来的，呵呵！ 我把live的猜出来了，欢迎大家补充别的链接。]]></description>
			<content:encoded><![CDATA[<p>接着上期的，这里用两个实例，给大家介绍一下Flex自定义地图制作的流程，看看是怎么从TileLayBase扩展成自定义的地图<br />
<span id="more-287"></span></p>
<p>首先是live的地图</p>
<pre class="brush: as3; title: ; notranslate">
package com.ityao.map
{
	import com.google.maps.CopyrightCollection;
	import com.google.maps.TileLayerBase;

	import flash.display.DisplayObject;
	import flash.display.Loader;
	import flash.events.IEventDispatcher;
	import flash.events.IOErrorEvent;
	import flash.geom.Point;
	import flash.net.URLRequest;

	public class LiveDituTileLayerBase extends TileLayerBase
	{
		private var serviceUrls:Array=[&quot;http://r0.tiles.ditu.live.com/tiles/r&quot;,
									   &quot;http://r1.tiles.ditu.live.com/tiles/r&quot;,
									   &quot;http://r2.tiles.ditu.live.com/tiles/r&quot;,
									   &quot;http://r3.tiles.ditu.live.com/tiles/r&quot;];
		private var serviceUrlSuffix:String = &quot;.png?g=29&quot;;

		public function LiveDituTileLayerBase()
		{
			super(new CopyrightCollection(&quot;http://cn.bing.com/ditu/&quot;),0,19)
		}

		private function getTileUrl(p:Point,zoom:int):String{			

			var c:Number=Math.pow(2,zoom);
			var d:Number=p.x;
			var e:Number=p.y;
			var f:String=&quot;&quot;;
			for(var g:int=0;g&lt;zoom;g++){
				c=c/2;
				if(e&lt;c){
					if(d&lt;c){
						f+=&quot;0&quot;
					}else{
						f+=&quot;1&quot;;
						d-=c
					}
				}else{
					if(d&lt;c){
						f+=&quot;2&quot;;
						e-=c
					}else{
						f+=&quot;3&quot;;
						d-=c;
						e-=c
					}
				}
			}
			var h:int=(p.x+p.y)%serviceUrls.length;
			return serviceUrls[h]+f+serviceUrlSuffix;

		}	

		public override function loadTile(tilePos:Point, zoom:Number):DisplayObject{

			var loader:Loader = new Loader();
			configureListeners(loader.contentLoaderInfo);
			var url:String = getTileUrl(tilePos,zoom);
			var tileUrl:URLRequest = new URLRequest(url);
			trace(tilePos.toString()+&quot; z:&quot;+zoom + &quot; url:&quot;+url);
			loader.load(tileUrl);
			return loader;

		}

		private function configureListeners(dispatcher:IEventDispatcher):void{
			dispatcher.addEventListener(IOErrorEvent.IO_ERROR,_secondaryLoad);
		} 

		private function _secondaryLoad(event:IOErrorEvent):void{
			//image fail to load handler
		}
	}
}
</pre>
<p>然后是mapABC的地图</p>
<pre class="brush: as3; title: ; notranslate">
package com.ityao.map
{
	import com.google.maps.CopyrightCollection;
	import com.google.maps.TileLayerBase;

	import flash.display.DisplayObject;
	import flash.display.Loader;
	import flash.events.IEventDispatcher;
	import flash.events.IOErrorEvent;
	import flash.geom.Point;
	import flash.net.URLRequest;

	public class MapABCDituTileLayerBase extends TileLayerBase{

		public function MapABCDituTileLayerBase(){
			super(new CopyrightCollection(&quot;http://www.mapabc.com&quot;),0,17)
		}

		private function getTileUrl(p:Point,zoom:int):String{
			var url:String = &quot;http://emap&quot; + ((p.x + p.y) % 4) + &quot;.mapabc.com/mapabc/maptile?v=&quot;;
			url += &quot;w2.99&quot; ;
			url += &quot;&amp;x=&quot; + p.x + &quot;&amp;y=&quot; + p.y + &quot;&amp;zoom=&quot; + (17-zoom);
			return url;
		}	

		public override function loadTile(tilePos:Point, zoom:Number):DisplayObject{

			var loader:Loader = new Loader();
			configureListeners(loader.contentLoaderInfo);
			var url:String = getTileUrl(tilePos,zoom);
			var tileUrl:URLRequest = new URLRequest(url);
			trace(tilePos.toString()+&quot; z:&quot;+zoom + &quot; url:&quot;+url);
			loader.load(tileUrl);
			return loader;

		}

		private function configureListeners(dispatcher:IEventDispatcher):void{
			dispatcher.addEventListener(IOErrorEvent.IO_ERROR,_secondaryLoad);
		} 

		private function _secondaryLoad(event:IOErrorEvent):void{
			//image fail to load handler
		}
	}
}
</pre>
<p>在上面的例子可以看见，其实只要重载loadTile方法就可以了，是不是非常简单？</p>
<p>loadTile的第一个参数是图块坐标，第二个参数是zoom的图层深度<br />
这里有篇很好的文章和实例演示告诉你这些参数是怎么来的，<br />
<a href="http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection/">http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection/</a></p>
<p>使用这两个参数，我们要针对不用的图瓦（live或mapABC）去构造图瓦的链接，从而用一块块图瓦拼接出完整的地图。</p>
<p><strong>图瓦的链接是怎么获得的呢？</strong><br />
呵呵，可以是根据不同地图的文档说明（不过通常都很少），通常我在看一个地图的时候，用firefox进行浏览，然后打开&#8221;工具&#8221;->&#8221;页面信息&#8221;，如下图所示：<br />
<a href="http://blog.ityao.com/wp-content/uploads/2009/09/bingditu.jpg"><img src="http://blog.ityao.com/wp-content/uploads/2009/09/bingditu.jpg" alt="bingditu" title="bingditu" width="910" height="752" class="alignnone size-full wp-image-293" /></a></p>
<p>然后就发挥你的小宇宙，去猜猜那串图瓦链接怎么来的，呵呵！<br />
我把live的猜出来了，欢迎大家补充别的链接。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ityao.com/archives/287/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>用Flex构建地图应用 &#8212; 利用Google Map API制作自己的地图（1）</title>
		<link>http://blog.ityao.com/archives/258</link>
		<comments>http://blog.ityao.com/archives/258#comments</comments>
		<pubDate>Sat, 12 Sep 2009 16:51:28 +0000</pubDate>
		<dc:creator>Silver</dc:creator>
				<category><![CDATA[Adobe Flex]]></category>
		<category><![CDATA[妖怪作品发布]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[GIS]]></category>
		<category><![CDATA[google map]]></category>
		<category><![CDATA[地图]]></category>

		<guid isPermaLink="false">http://blog.ityao.com/?p=258</guid>
		<description><![CDATA[现在地图应用已经成为网络应用的一个大类了，各个大的网站几乎都有自己的地图产品。最出名的莫过于国外的Google Map和国内的都市圈地图，前面Daniel Yang介绍了都市圈的Flex源代码，小弟也来一个介绍Flex构建地图的系列，希望能够让大家分享到地图开发的乐趣。 不过自己毕竟不是GIS科班出身，也没从事过GIS或者地图的真正商业开发，研究地图应用开发，纯属兴趣，所以不足之处，敬请斧正:) 构建Flex地图应用，首选Google的地图API来实现，有以下原因： 支持自定义扩展地图类型 有丰富的图形标注工具 有多种数据接口 详细的文档支持 Google map API的这些特点，可以使我们快速地开发出各式各样的地图web应用，由于本帖不是替google map打广告，就不一一介绍这些特点的详细情况了，本帖更关注于第一个特点，利用Google map api来构建属于自己的地图。 或者大家会问：构建自己的地图？可以是什么样子的呢？ 小弟天马行空地替大家想象了一下，我初步想大家可以构建这样的一些应用： 在专业的地图服务器里写script导出图瓦（动态或静态），然后制作自己的地图应用，最好的例子就是google地图本身 利用网络的地图图瓦资源，构造地图应用，如利用API来显示e都市的三维地图，或者如后面演示的显示别的厂商如google的对手bingo的地图，mapABC的地图等 通过修改现成的地图图瓦，来创造自己的地图。呵呵，站在巨人的肩膀上啊，例如你可以抓取google的图瓦，把上面的藏南地区全改回中文，然后发布出去 发布大型的图画作品，例如你是卖画或者什么别的艺术品，或者你要做游戏地图，可以把照片割成图瓦，挂到网上去，让大家可以在不同分辨层次下欣赏作品 协同进行艺术创作，把地图想象成大图画，大家可以在一个图画上创作，通过Map API可以进行宏观创作或者细节创作 &#8230; 更多更多好点子，欢迎在评论里面留言 首先贴一个swf，给大家看看用Google Map API来显示Live地图和MapABC地图的效果。 实现这个效果的步骤如下： 使用Flex的google map api，首先要去这里 下载 注册一个api使用的key，在这个页面进行注册 创建flex项目，项目目录结构如下图所示： 前面下载的SDK里面的map_flex_1_16.swc（下载时间不同，可能版本号不一致）需要放在项目的lib目录里面去。 创建mapsample.mxml主程序，代码如下： 注意需要在程序中修改mapKey变量成为你前面注册的google map api key。 在主程序里面，我们创建了两种自定义的地图类型，并且添加了这两种类型进google地图中进行显示 定制自定义地图，如果地图的投影方法和google map一致的话，那只要继承TileLayerBase并重载里面的loadTile（加载图瓦）方法就可以了，下一篇将用live地图和mapABC地图为大家做介绍。]]></description>
			<content:encoded><![CDATA[<p>现在地图应用已经成为网络应用的一个大类了，各个大的网站几乎都有自己的地图产品。最出名的莫过于国外的Google Map和国内的都市圈地图，前面Daniel Yang介绍了都市圈的Flex源代码，小弟也来一个介绍Flex构建地图的系列，希望能够让大家分享到地图开发的乐趣。</p>
<p>不过自己毕竟不是GIS科班出身，也没从事过GIS或者地图的真正商业开发，研究地图应用开发，纯属兴趣，所以不足之处，敬请斧正:)<br />
<span id="more-258"></span></p>
<p>构建Flex地图应用，首选Google的地图API来实现，有以下原因：</p>
<ol>
<li>支持自定义扩展地图类型</li>
<li>有丰富的图形标注工具</li>
<li>有多种数据接口</li>
<li>详细的文档支持</li>
</ol>
<p>Google map API的这些特点，可以使我们快速地开发出各式各样的地图web应用，由于本帖不是替google map打广告，就不一一介绍这些特点的详细情况了，本帖更关注于第一个特点，利用Google map api来构建属于自己的地图。</p>
<p>或者大家会问：构建自己的地图？可以是什么样子的呢？<br />
小弟天马行空地替大家想象了一下，我初步想大家可以构建这样的一些应用：</p>
<ul>
<li>在专业的地图服务器里写script导出图瓦（动态或静态），然后制作自己的地图应用，最好的例子就是google地图本身</li>
<li>利用网络的地图图瓦资源，构造地图应用，如利用API来显示e都市的三维地图，或者如后面演示的显示别的厂商如google的对手bingo的地图，mapABC的地图等</li>
<li>通过修改现成的地图图瓦，来创造自己的地图。呵呵，站在巨人的肩膀上啊，例如你可以抓取google的图瓦，把上面的藏南地区全改回中文，然后发布出去</li>
<li>发布大型的图画作品，例如你是卖画或者什么别的艺术品，或者你要做游戏地图，可以把照片割成图瓦，挂到网上去，让大家可以在不同分辨层次下欣赏作品</li>
<li>协同进行艺术创作，把地图想象成大图画，大家可以在一个图画上创作，通过Map API可以进行宏观创作或者细节创作</li>
<li>&#8230; 更多更多好点子，欢迎在评论里面留言</li>
</ul>
<p>首先贴一个swf，给大家看看用Google Map API来显示Live地图和MapABC地图的效果。<br />

<object width="500" height="300">
<param name="movie" value="http://blog.ityao.com/wp-content/uploads/2009/09/mapsample.swf"></param>
<param name="quality" value="high"></param>
<param name="wmode" value="window"></param>
<param name="menu" value="false"></param>
<param name="bgcolor" value="#FFFFFF"></param>
<embed type="application/x-shockwave-flash" width="500" height="300" src="http://blog.ityao.com/wp-content/uploads/2009/09/mapsample.swf" quality="high" bgcolor="#FFFFFF" wmode="window" menu="false" ></embed>
</object>
</p>
<p>实现这个效果的步骤如下：</p>
<ol>
<li>使用Flex的google map api，首先要去这里 <a href="http://maps.googleapis.com/maps/flash/release/sdk.zip">下载</a></li>
<li>注册一个api使用的key，在这个<a href="http://code.google.com/intl/zh-CN/apis/maps/signup.html">页面</a>进行注册</li>
<li>创建flex项目，项目目录结构如下图所示：<br />
<a href="http://blog.ityao.com/wp-content/uploads/2009/09/mapsampleproject.jpg"><img src="http://blog.ityao.com/wp-content/uploads/2009/09/mapsampleproject.jpg" alt="mapsampleproject" title="mapsampleproject" width="335" height="378" class="alignnone size-full wp-image-273" /></a><br />
前面下载的SDK里面的map_flex_1_16.swc（下载时间不同，可能版本号不一致）需要放在项目的lib目录里面去。
</li>
<li>创建mapsample.mxml主程序，代码如下：
<pre class="brush: as3; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;mx:Application xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot; layout=&quot;absolute&quot;&gt;
	&lt;maps:Map xmlns:maps=&quot;com.google.maps.*&quot; language=&quot;zh-CN&quot; id=&quot;map&quot;
		mapevent_mapready=&quot;onMapReady(event)&quot;
		width=&quot;100%&quot; height=&quot;100%&quot; key=&quot;{mapKey}&quot;/&gt;
	&lt;mx:Script&gt;
		&lt;![CDATA[
			import com.ityao.map.MapABCDituTileLayerBase;
			import com.ityao.map.GoogleDituTileLayerBase;
			import com.ityao.map.LiveDituTileLayerBase;			

			import com.google.maps.overlays.TileLayerOverlay;
			import com.google.maps.controls.MapTypeControl;
			import com.google.maps.controls.PositionControl;
			import com.google.maps.controls.ZoomControl;
			import com.google.maps.LatLng;
			import com.google.maps.Map;
			import com.google.maps.MapEvent;
			import com.google.maps.MapType;    

			//key for http://blog.ityao.com/
			private static const mapKey:String = &quot;ABQIAAAAjg2LNPeLd2SY_LMC4kTfyhREhvxbmPPYdzuafsMTRfCiNgtm-xT_QN9uPU6M7JTAKA4l_ycXr_8HOg&quot;;
			private function onMapReady(event:Event):void {				      

				map.addControl(new ZoomControl());
				map.addControl(new PositionControl());
				map.addControl(new MapTypeControl());
				map.removeMapType(MapType.PHYSICAL_MAP_TYPE);
				map.removeMapType(MapType.SATELLITE_MAP_TYPE);
				map.removeMapType(MapType.HYBRID_MAP_TYPE);

				//Live地图
				var liveTileBase:LiveDituTileLayerBase = new LiveDituTileLayerBase();
				var liveTileLayers:Array = new Array();
				liveTileLayers.push(liveTileBase);
				var liveMapType:MapType = new MapType(liveTileLayers,map.MERCATOR_PROJECTION,&quot;Live地图&quot;);
				liveTileBase.setMapType(liveMapType);
				map.addMapType(liveMapType);

				//mapABC地图
				var mapABCDituTileLayerBase:MapABCDituTileLayerBase = new MapABCDituTileLayerBase();
				var mapABCDituTileLayers:Array = new Array();
				mapABCDituTileLayers.push(mapABCDituTileLayerBase);
				var mapABCDituMapType:MapType = new MapType(mapABCDituTileLayers,map.MERCATOR_PROJECTION,&quot;mapABC地图&quot;);
				mapABCDituTileLayerBase.setMapType(mapABCDituMapType);
				map.addMapType(mapABCDituMapType);
				//设置缺省的地图中心和地图类型
				map.setCenter(new LatLng(23.09656,113.19219), 10);
			}
		]]&gt;
	&lt;/mx:Script&gt;
&lt;/mx:Application&gt;
</pre>
<p>注意需要在程序中修改mapKey变量成为你前面注册的google map api key。
</li>
<li>在主程序里面，我们创建了两种自定义的地图类型，并且添加了这两种类型进google地图中进行显示</li>
</ol>
<p>定制自定义地图，如果地图的投影方法和google map一致的话，那只要继承TileLayerBase并重载里面的loadTile（加载图瓦）方法就可以了，下一篇将用live地图和mapABC地图为大家做介绍。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ityao.com/archives/258/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

