<?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>收容站</title>
	<atom:link href="http://hmfly.info/feed/" rel="self" type="application/rss+xml" />
	<link>http://hmfly.info</link>
	<description>关注GIS、Web技术、AC Milan</description>
	<lastBuildDate>Wed, 09 May 2012 10:50:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>SharpMap简单试用</title>
		<link>http://hmfly.info/2012/05/09/sharpmap%e7%ae%80%e5%8d%95%e8%af%95%e7%94%a8/</link>
		<comments>http://hmfly.info/2012/05/09/sharpmap%e7%ae%80%e5%8d%95%e8%af%95%e7%94%a8/#comments</comments>
		<pubDate>Wed, 09 May 2012 07:13:52 +0000</pubDate>
		<dc:creator>hmfly</dc:creator>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[open gis]]></category>
		<category><![CDATA[sharpmap]]></category>

		<guid isPermaLink="false">http://hmfly.info/?p=403</guid>
		<description><![CDATA[SharpMap是.Net上比较出名的开源GIS包了，功能中规中矩，支持各种数据源，但也有一些基础的Buffer之类的空间分析至今没有实现（？）。 打算在接下来的一段时间仔细看看.Net上的开源GIS，除了SharpMap还有DotSpatial、GMap等等，最好自己也能实现一个简单的GIS（比如几何对象模型比SFS还简单的那种，呵呵）。 这次先试了下SharpMap，主要功能都在SharpMap.dll中，模仿项目主页上HowTo部分，实现了加载数据（ShapeFile），拉框选中要素并显示属性表等功能。 代码： using System; using System.Drawing; using System.Windows.Forms; using SharpMap; using SharpMap.Data; using SharpMap.Data.Providers; using SharpMap.Geometries; using SharpMap.Layers; using Point = System.Drawing.Point; namespace SharpMapTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); // map and layers var map = new Map(new Size(584, 537)) { BackColor = Color.White, }; var [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://sharpmap.codeplex.com/">SharpMap</a>是.Net上比较出名的开源GIS包了，功能中规中矩，支持各种数据源，但也有一些基础的Buffer之类的空间分析至今没有实现（？）。</p>
<p>打算在接下来的一段时间仔细看看.Net上的开源GIS，除了SharpMap还有DotSpatial、GMap等等，最好自己也能实现一个简单的GIS（比如几何对象模型比SFS还简单的那种，呵呵）。</p>
<p>这次先试了下SharpMap，主要功能都在SharpMap.dll中，模仿项目主页上<a href="http://sharpmap.codeplex.com/wikipage?title=How%20to...&amp;referringTitle=Documentation">HowTo</a>部分，实现了加载数据（ShapeFile），拉框选中要素并显示属性表等功能。</p>
<p>代码：</p>
<pre class="prettyprint" font="10"><font size="2" face="Consolas">
using System;
using System.Drawing;
using System.Windows.Forms;
using SharpMap;
using SharpMap.Data;
using SharpMap.Data.Providers;
using SharpMap.Geometries;
using SharpMap.Layers;
using Point = System.Drawing.Point;

namespace SharpMapTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // map and layers
            var map
                = new Map(new Size(584, 537))
                      {
                          BackColor = Color.White,
                      };
            var layerChina
                = new VectorLayer("china")
                      {
                          DataSource = new ShapeFile(@".\data\bou1_4l.shp"),
                          SRID = 4326,
                      };
            layerChina.Style.Line.DashPattern = new[] { 4.0f, 2.0f };
            var layerCity
                = new VectorLayer("city")
                      {
                          DataSource = new ShapeFile(@".\data\res1_4m.shp"),
                          SRID = 4326,
                          Style = { PointSize = 5 },
                      };

            map.Layers.Add(layerChina);
            map.Layers.Add(layerCity);
            map.ZoomToExtents();

            this.pictureBox1.BackgroundImage = map.GetMap();
            this.pictureBox1.BackgroundImageLayout = ImageLayout.Center;

            // display coordinate
            this.pictureBox1.MouseMove
                += (s, e) =>
                       {
                           var mapPoint = map.ImageToWorld(new PointF(e.X, e.Y));
                           var strCoor = String.Format("({0},{1})--({2},{3})", e.X, e.Y, mapPoint.X, mapPoint.Y);
                           this.lblCoor.Text = strCoor;
                       };

            // select and display attributes
            bool inSelect = false;
            var p1 = new Point();
            this.pictureBox1.MouseDown
                += (s, e) =>
                       {
                           p1 = e.Location;
                           inSelect = true;
                       };

            this.pictureBox1.MouseMove
                 += (s, e) =>
                        {
                            if (!inSelect) return;
                            var p2 = e.Location;
                            var rect = new System.Drawing.Rectangle(p1.X, p1.Y, Math.Abs(p2.X - p1.X), Math.Abs(p1.Y - p2.Y));
                            var brush = new System.Drawing.SolidBrush(Color.Blue);
                            var g = this.pictureBox1.CreateGraphics();
                            var p = new Pen(brush);
                            g.DrawRectangle(p, rect);
                            pictureBox1.Refresh();
                            g.Dispose();
                            p.Dispose();
                        };

            this.pictureBox1.MouseUp
                += (s, e) =>
                       {
                           var bbox = new BoundingBox(map.ImageToWorld(p1), map.ImageToWorld(e.Location));
                           var ds = new FeatureDataSet();
                           layerCity.DataSource.Open();
                           layerCity.DataSource.ExecuteIntersectionQuery(bbox, ds);
                           dataGridView1.DataSource = ds.Tables[0];
                           layerCity.DataSource.Close();
                           inSelect = false;
                       };
        }
    }
}
</font></pre>
<p>截图：</p>
<p><img src="https://public.blu.livefilestore.com/y1pL3RP4NL-JTb2HMSuePULtdlikSWy0h4Z9iOIh3Qn4gnRTzVhR5ASHTbKjWYnSuTERGysGxmUM0omwZi7thF8JQ/sm1.jpg?psid=1" alt="" /></p>
<p><img src="https://public.blu.livefilestore.com/y1p_O4QLi5L4_Yjnugny_23TZkXH-yH0bVQvk2iSzlK2VfMwVqAWq2KV0xTYu7k4Gou-4Z402F1XqfjiQr484a6iA/sm2.jpg?psid=1" alt="" /></p>
<p><iframe src="https://skydrive.live.com/embed?cid=2ED0177AA900D3E1&amp;resid=2ED0177AA900D3E1%21249&amp;authkey=AIHYT0T9l8A4gEg" frameborder="0" scrolling="no" width="98" height="120"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://hmfly.info/2012/05/09/sharpmap%e7%ae%80%e5%8d%95%e8%af%95%e7%94%a8/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>风场的简单绘制</title>
		<link>http://hmfly.info/2012/04/24/%e9%a3%8e%e5%9c%ba%e7%9a%84%e7%ae%80%e5%8d%95%e7%bb%98%e5%88%b6/</link>
		<comments>http://hmfly.info/2012/04/24/%e9%a3%8e%e5%9c%ba%e7%9a%84%e7%ae%80%e5%8d%95%e7%bb%98%e5%88%b6/#comments</comments>
		<pubDate>Tue, 24 Apr 2012 15:03:30 +0000</pubDate>
		<dc:creator>hmfly</dc:creator>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[arcgis]]></category>
		<category><![CDATA[silverlight]]></category>

		<guid isPermaLink="false">http://hmfly.info/?p=387</guid>
		<description><![CDATA[台风风场数据一般包括X、Y、U和V，分别表示经度、纬度、东西方向速度和南北方向速度。简单的绘制，可以在一个GraphicsLayer中根据这几个属性值绘制箭头。开始我想的是自己动态生成各种Symbol，但现在还没法实现。现在用的方法的主要思路是根据X和Y确定箭头的末端位置p1，通过U和V确定箭头的大小（为了在地图上可见，可以乘以一个常数来放大）length，并且根据&#124;V/U&#124;的反正切值算出箭头与东西方向的夹角theta，这样就能根据length和theta计算箭头的顶点位置p2。取length/8（取多少自己感觉吧）为箭头两翼的长度h，并设箭头两翼的夹角为pi/3（还是感觉），那箭头一翼与箭身的夹角就是pi/6。这样就能根据p2、h、theta和pi/6，计算出箭头的左右两翼末端的坐标pL和pR。根据箭头的不同朝向，计算具体的参数值。 具体代码如下（Vector类中就包含了四个属性XYUV）： private void displayCurrent(List&#60;vector&#62; vectors) { var wm = new SpatialReference(3857); foreach (var vector in vectors) { var length = Math.Sqrt(vector.U * vector.U + vector.V * vector.V) * 5000; var theta = Math.Atan(Math.Abs(vector.V / vector.U)); var p1 = (MapPoint)_webMercator.FromGeographic(new MapPoint(vector.X, vector.Y, new SpatialReference(4326))); var h = length / 8; double alphaL, alphaR; MapPoint p2 [...]]]></description>
			<content:encoded><![CDATA[<p><script src="http://hmfly.info/Silverlight.js" type="text/javascript"></script><script type="text/javascript">
        function onSilverlightError(sender, args) {
            var appSource = "";
            if (sender != null &#038;&#038; sender != 0) {
              appSource = sender.getHost().Source;
            }</p>
<p>            var errorType = args.ErrorType;
            var iErrorCode = args.ErrorCode;</p>
<p>            if (errorType == "ImageError" || errorType == "MediaError") {
              return;
            }</p>
<p>            var errMsg = "Silverlight 应用程序中未处理的错误 " +  appSource + "\n" ;</p>
<p>            errMsg += "代码: "+ iErrorCode + "    \n";
            errMsg += "类别: " + errorType + "       \n";
            errMsg += "消息: " + args.ErrorMessage + "     \n";</p>
<p>            if (errorType == "ParserError") {
                errMsg += "文件: " + args.xamlFile + "     \n";
                errMsg += "行: " + args.lineNumber + "     \n";
                errMsg += "位置: " + args.charPosition + "     \n";
            }
            else if (errorType == "RuntimeError") {           
                if (args.lineNumber != 0) {
                    errMsg += "行: " + args.lineNumber + "     \n";
                    errMsg += "位置: " +  args.charPosition + "     \n";
                }
                errMsg += "方法名称: " + args.methodName + "     \n";
            }</p>
<p>            throw new Error(errMsg);
        }
    </script>
<p>台风风场数据一般包括X、Y、U和V，分别表示经度、纬度、东西方向速度和南北方向速度。简单的绘制，可以在一个GraphicsLayer中根据这几个属性值绘制箭头。开始我想的是自己动态生成各种Symbol，但现在还没法实现。现在用的方法的主要思路是根据X和Y确定箭头的末端位置p1，通过U和V确定箭头的大小（为了在地图上可见，可以乘以一个常数来放大）length，并且根据|V/U|的反正切值算出箭头与东西方向的夹角theta，这样就能根据length和theta计算箭头的顶点位置p2。取length/8（取多少自己感觉吧）为箭头两翼的长度h，并设箭头两翼的夹角为pi/3（还是感觉），那箭头一翼与箭身的夹角就是pi/6。这样就能根据p2、h、theta和pi/6，计算出箭头的左右两翼末端的坐标pL和pR。根据箭头的不同朝向，计算具体的参数值。</p>
<p>具体代码如下（Vector类中就包含了四个属性XYUV）：</p>
<pre class="prettyprint" font="10"><font size="2" face="Consolas">
        private void displayCurrent(List&lt;vector&gt; vectors)
        {
            var wm = new SpatialReference(3857);
            foreach (var vector in vectors)
            {
                var length = Math.Sqrt(vector.U * vector.U + vector.V * vector.V) * 5000;
                var theta = Math.Atan(Math.Abs(vector.V / vector.U));
                var p1 =
                    (MapPoint)_webMercator.FromGeographic(new MapPoint(vector.X, vector.Y, new SpatialReference(4326)));
                var h = length / 8;

                double alphaL, alphaR;
                MapPoint p2 = null;
                MapPoint pR = null;
                MapPoint pL = null;
                if (vector.U &gt; 0 &amp;&amp; vector.V &gt; 0)
                {
                    p2 = new MapPoint(p1.X + length * Math.Cos(theta), p1.Y + length * Math.Sin(theta), wm);
                    alphaR = Math.PI / 2 - theta - Math.PI / 6;
                    alphaL = theta - Math.PI / 6;
                    pR = new MapPoint(p2.X - h * Math.Sin(alphaR), p2.Y - h * Math.Cos(alphaR), wm);
                    pL = new MapPoint(p2.X - h * Math.Cos(alphaL), p2.Y - h * Math.Sin(alphaL), wm);
                }
                else if (vector.U &gt; 0 &amp;&amp; vector.V &lt; 0)
                {
                    p2 = new MapPoint(p1.X + length * Math.Cos(theta), p1.Y - length * Math.Sin(theta), wm);
                    alphaR = theta - Math.PI / 6;
                    alphaL = Math.PI / 2 - theta - Math.PI / 6;
                    pR = new MapPoint(p2.X - h * Math.Cos(alphaR), p2.Y + h * Math.Sin(alphaR), wm);
                    pL = new MapPoint(p2.X - h * Math.Sin(alphaL), p2.Y + h * Math.Cos(alphaL), wm);
                }
                else if (vector.U &lt; 0 &amp;&amp; vector.V &gt; 0)
                {
                    p2 = new MapPoint(p1.X - length * Math.Cos(theta), p1.Y + length * Math.Sin(theta), wm);
                    alphaR = theta - Math.PI / 6;
                    alphaL = Math.PI / 2 - theta - Math.PI / 6;
                    pR = new MapPoint(p2.X + h * Math.Cos(alphaR), p2.Y - h * Math.Sin(alphaR), wm);
                    pL = new MapPoint(p2.X + h * Math.Sin(alphaL), p2.Y - h * Math.Cos(alphaL), wm);
                }
                else if (vector.U &lt; 0 &amp;&amp; vector.V &lt; 0)
                {
                    p2 = new MapPoint(p1.X - length * Math.Cos(theta), p1.Y - length * Math.Sin(theta), wm);
                    alphaR = Math.PI / 2 - theta - Math.PI / 6;
                    alphaL = theta - Math.PI / 6;
                    pR = new MapPoint(p2.X + h * Math.Sin(alphaR), p2.Y + h * Math.Cos(alphaR), wm);
                    pL = new MapPoint(p2.X + h * Math.Cos(alphaL), p2.Y + h * Math.Sin(alphaL), wm);
                }

                var arrow = new ESRI.ArcGIS.Client.Geometry.Polyline();
                var path1 = new ESRI.ArcGIS.Client.Geometry.PointCollection { p1, p2 };
                arrow.Paths.Add(path1);
                var path2 = new ESRI.ArcGIS.Client.Geometry.PointCollection { pL, p2, pR };
                arrow.Paths.Add(path2);

                _currentLayer.Graphics.Add(new Graphic
                {
                    Geometry = arrow,
                    Symbol = new SimpleLineSymbol(Colors.Black, 1),
                });
            }
        }
</font></pre>
<p>效果如下：</p>
<div id="silverlightControlHost"><object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="600" height="600"><param name="source" value="http://hmfly.info/pubs/windfield/ClientBin/WindField.xap" /><param name="onError" value="onSilverlightError" /><param name="background" value="white" /><param name="minRuntimeVersion" value="4.0.50401.0" /><param name="autoUpgrade" value="true" /><a href="http://go.microsoft.com/fwlink/?LinkID=149156&amp;v=4.0.50401.0" style="text-decoration:none">  			  <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="获取 Microsoft Silverlight" style="border-style:none" /> 		  </a> 	    </object><iframe style="border-right-width: 0px; width: 0px; border-top-width: 0px; border-bottom-width: 0px; height: 0px; visibility: hidden; border-left-width: 0px" id="_sl_historyFrame"></iframe></div>
<p>做这个是因为师姐毕业论文中要用，而且自己以后肯定也会用到，毕竟都是一个方向的。参考以前毕业师姐写过的代码，完善了一下，就用ArcGIS API for Silverlight做了个例子。</p>
]]></content:encoded>
			<wfw:commentRss>http://hmfly.info/2012/04/24/%e9%a3%8e%e5%9c%ba%e7%9a%84%e7%ae%80%e5%8d%95%e7%bb%98%e5%88%b6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>杭州实时公交&#8211;以B1线为例</title>
		<link>http://hmfly.info/2012/04/13/%e6%9d%ad%e5%b7%9e%e5%ae%9e%e6%97%b6%e5%85%ac%e4%ba%a4-%e4%bb%a5b1%e7%ba%bf%e4%b8%ba%e4%be%8b/</link>
		<comments>http://hmfly.info/2012/04/13/%e6%9d%ad%e5%b7%9e%e5%ae%9e%e6%97%b6%e5%85%ac%e4%ba%a4-%e4%bb%a5b1%e7%ba%bf%e4%b8%ba%e4%be%8b/#comments</comments>
		<pubDate>Fri, 13 Apr 2012 03:20:57 +0000</pubDate>
		<dc:creator>hmfly</dc:creator>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[arcgis]]></category>
		<category><![CDATA[bus]]></category>
		<category><![CDATA[silverlight]]></category>

		<guid isPermaLink="false">http://hmfly.info/?p=384</guid>
		<description><![CDATA[============= 更新： 自从我写了这个以后，B1线的实时数据貌似就没有正常过。当初选择B1线无非是因为他是快速公交，比较出名，而且以前坐的也比较多点。既然B1线不行，那就换个别的了。现在用的是194路坐例子，站点是蒋村公交中心站，也就是地图上最上方的那个。反正能说明问题就行了吧。 ============= 以前在杭州等车的时候见过路牌上有公交车的到站信息，虽然感觉有时候不太准但还是比较新颖的；后来在网上看到有人做手机端的实时公交应用，但我那时对Web开发还啥都不懂，搞不清楚怎么回事，当然现在也只是知道一点点；再后来又看到些Live、Realtime的应用，感觉到公交也是一个很好的实时例子；去年末写了个公交换乘算法，处理了一些南京市的公交数据，对公交应用也略有了解；上个月初，突然对（www.hzbus.cn）开始感兴趣，找到了它的服务调用地址，顿时以前的一些想法开始脑中翻滚，就开始动手操作了。 最近这个月事情好多，转眼间就过去了，我只是断断续续再做这个事情。碰到的问题也相当相当多，比如服务给的坐标都是经过偏移的，这种致命打击完全让我失去了做一个完整应用的动力，我；再比如典型的跨域问题，Silverlight对第三方的服务有什么好的解决办法吗？我用的是YQL来做的；还有就是自己的能力不足，对Web开发、Silverlight以及ArcGIS API都只是停留在入门的水平，没有一个完整的项目来驱动，很难更深入的学习了。 简单说说这个例子的思路：地图调的是arcgisonline.cn上的服务，很喜欢gray风格，特别是做Mashup的时候，能很鲜明地突出专题信息；公交线路、站点和车辆实时位置当然是调用前面提到网站中的服务了，但为了实现跨域访问，经过了YQL的一层包装；解析抓取到的数据，都作为简单的Graphic添加到相应图层中；对于实时位置，显然要通过计时器，每隔几秒去抓一次数据，更新位置的。 总的来说，做的比较简单，与我开始的雄心壮志相比不知差了几条街额。下面是这个例子： 这个是杭州B1线，下沙-&#62;黄龙方向，终点站黄龙公交中心站（最西边那个站）的实时公交情况。也就是说，假设你在黄龙公交中心站，能看到向你开过来最近的3辆B1车的实时位置（按理应该是这样吧，但实际上服务给的数据还是有出入的）。表格中是三辆车的数据，包括车辆编号，位置和速度。B1的工作时间是到晚上10点，10点以后你肯定看不到公交车啦。 最后，希望有更多的单位出来共享数据，提供友好的API，特别是带GeoLocation的。我想只有这样，我们提的那些智慧城市之类的口号才有实现的可能吧。]]></description>
			<content:encoded><![CDATA[<p><script src="http://hmfly.info/Silverlight.js" type="text/javascript">
</script><script type="text/javascript">
        function onSilverlightError(sender, args) {
            var appSource = "";
            if (sender != null &#038;&#038; sender != 0) {
              appSource = sender.getHost().Source;
            }</p>
<p>            var errorType = args.ErrorType;
            var iErrorCode = args.ErrorCode;</p>
<p>            if (errorType == "ImageError" || errorType == "MediaError") {
              return;
            }</p>
<p>            var errMsg = "Silverlight 应用程序中未处理的错误 " +  appSource + "\n" ;</p>
<p>            errMsg += "代码: "+ iErrorCode + "    \n";
            errMsg += "类别: " + errorType + "       \n";
            errMsg += "消息: " + args.ErrorMessage + "     \n";</p>
<p>            if (errorType == "ParserError") {
                errMsg += "文件: " + args.xamlFile + "     \n";
                errMsg += "行: " + args.lineNumber + "     \n";
                errMsg += "位置: " + args.charPosition + "     \n";
            }
            else if (errorType == "RuntimeError") {           
                if (args.lineNumber != 0) {
                    errMsg += "行: " + args.lineNumber + "     \n";
                    errMsg += "位置: " +  args.charPosition + "     \n";
                }
                errMsg += "方法名称: " + args.methodName + "     \n";
            }</p>
<p>            throw new Error(errMsg);
        }
    </script> </p>
<p><span style="color: #ff0000;">=============</span></p>
<p><span style="color: #ff0000;">更新：</span></p>
<p><span style="color: #ff0000;">自从我写了这个以后，B1线的实时数据貌似就没有正常过。当初选择B1线无非是因为他是快速公交，比较出名，而且以前坐的也比较多点。既然B1线不行，那就换个别的了。现在用的是194路坐例子，站点是蒋村公交中心站，也就是地图上最上方的那个。反正能说明问题就行了吧。</span></p>
<p><span style="color: #ff0000;">=============</span></p>
<p>以前在杭州等车的时候见过路牌上有公交车的到站信息，虽然感觉有时候不太准但还是比较新颖的；后来在网上看到有人做手机端的实时公交应用，但我那时对Web开发还啥都不懂，搞不清楚怎么回事，当然现在也只是知道一点点；再后来又看到些Live、Realtime的应用，感觉到公交也是一个很好的实时例子；去年末写了个公交换乘算法，<a href="http://hmfly.info/2011/12/27/%E5%88%9B%E5%BB%BA%E5%85%AC%E4%BA%A4%E6%9F%A5%E8%AF%A2%E6%95%B0%E6%8D%AE/" target="_blank">处理了一些南京市的公交数据</a>，对公交应用也略有了解；上个月初，突然对（<a href="http://www.hzbus.cn">www.hzbus.cn</a>）开始感兴趣，找到了它的服务调用地址，顿时以前的一些想法开始脑中翻滚，就开始动手操作了。</p>
<p>最近这个月事情好多，转眼间就过去了，我只是断断续续再做这个事情。碰到的问题也相当相当多，比如服务给的坐标都是经过偏移的，这种致命打击完全让我失去了做一个完整应用的动力，我；再比如典型的跨域问题，Silverlight对第三方的服务有什么好的解决办法吗？我用的是<a href="http://developer.yahoo.com/yql/console/?q=select%20*%20from%20xml%20where%20url%20%3Dhttp%3A%2F%2Fwww.hzbus.cn%2FPage%2Flinestop.axd%3Fid%3D228%26type%3D1%26rnd%3D2#h=select%20*%20from%20xml%20where%20url%20%3D%27http%3A//www.hzbus.cn/Page/linestop.axd%3Fid%3D228%26type%3D1%26rnd%3D2%27" target="_blank">YQL</a>来做的；还有就是自己的能力不足，对Web开发、Silverlight以及ArcGIS API都只是停留在入门的水平，没有一个完整的项目来驱动，很难更深入的学习了。</p>
<p>简单说说这个例子的思路：地图调的是arcgisonline.cn上的服务，很喜欢<a href="http://cache1.arcgisonline.cn/ArcGIS/rest/services/ChinaOnlineStreetGray/MapServer" target="_blank">gray风格</a>，特别是做Mashup的时候，能很鲜明地突出专题信息；公交线路、站点和车辆实时位置当然是调用前面提到网站中的服务了，但为了实现跨域访问，经过了YQL的一层包装；解析抓取到的数据，都作为简单的Graphic添加到相应图层中；对于实时位置，显然要通过计时器，每隔几秒去抓一次数据，更新位置的。</p>
<p>总的来说，做的比较简单，与我开始的雄心壮志相比不知差了几条街额。下面是这个例子：</p>
<div id="silverlightControlHost"><object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="600" height="600"><param name="source" value="http://hmfly.info/pubs/hzbus_gps/ClientBin/hzbus_gps.xap" /><param name="onError" value="onSilverlightError" /><param name="background" value="white" /><param name="minRuntimeVersion" value="4.0.50401.0" /><param name="autoUpgrade" value="true" /><a href="http://go.microsoft.com/fwlink/?LinkID=149156&amp;v=4.0.50401.0" style="text-decoration:none">  			  <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="获取 Microsoft Silverlight" style="border-style:none" /> 		  </a> 	    </object><iframe style="border-right-width: 0px; width: 0px; border-top-width: 0px; border-bottom-width: 0px; height: 0px; visibility: hidden; border-left-width: 0px" id="_sl_historyFrame"></iframe></div>
<p>这个是杭州B1线，下沙-&gt;黄龙方向，终点站黄龙公交中心站（最西边那个站）的实时公交情况。也就是说，假设你在黄龙公交中心站，能看到向你开过来最近的3辆B1车的实时位置（按理应该是这样吧，但实际上服务给的数据还是有出入的）。表格中是三辆车的数据，包括车辆编号，位置和速度。B1的工作时间是到晚上10点，10点以后你肯定看不到公交车啦。</p>
<p>最后，希望有更多的单位出来共享数据，提供友好的API，特别是带GeoLocation的。我想只有这样，我们提的那些智慧城市之类的口号才有实现的可能吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://hmfly.info/2012/04/13/%e6%9d%ad%e5%b7%9e%e5%ae%9e%e6%97%b6%e5%85%ac%e4%ba%a4-%e4%bb%a5b1%e7%ba%bf%e4%b8%ba%e4%be%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>代码高亮以及仙林PM2.5</title>
		<link>http://hmfly.info/2012/04/01/%e4%bb%a3%e7%a0%81%e9%ab%98%e4%ba%ae%e4%bb%a5%e5%8f%8a%e4%bb%99%e6%9e%97pm2-5/</link>
		<comments>http://hmfly.info/2012/04/01/%e4%bb%a3%e7%a0%81%e9%ab%98%e4%ba%ae%e4%bb%a5%e5%8f%8a%e4%bb%99%e6%9e%97pm2-5/#comments</comments>
		<pubDate>Sun, 01 Apr 2012 05:00:34 +0000</pubDate>
		<dc:creator>hmfly</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[pm2.5]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://hmfly.info/?p=356</guid>
		<description><![CDATA[日志中的代码一直都是截图的，一是因为上面贴的代码本来就少；二是因为有时会把文章贴到别的地方，这就只有图片才能保持同样的效果了；三是因为懒得折腾吧。 在StackExchange帮助中看到他们用的代码高亮脚本Google Code Prettify，感觉效果不错，就直接找个Wordpress插件安上了。 下面是一段获取仙林大学城PM2.5值的代码： using System.IO; using System.Net; using System.Xml; using System.Xml.Linq; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { var request = (HttpWebRequest)WebRequest.Create(&#34;http://218.94.78.75/pm25services/Service.asmx&#34;); request.Headers.Add(&#34;Action&#34;, &#34;http://218.94.78.75/pm25services/Service.asmx?op=getSurvyValue&#34;); request.Method = &#34;POST&#34;; request.ContentType = &#34;text/xml;charset=\&#34;utf-8\&#34;&#34;; request.Accept = &#34;text/xml&#34;; XmlDocument soapEnvelop = new XmlDocument(); XNamespace soapenv = &#34;http://schemas.xmlsoap.org/soap/envelope/&#34;; XNamespace tns = &#34;http://tempuri.org/&#34;; var xml = [...]]]></description>
			<content:encoded><![CDATA[<p>日志中的代码一直都是截图的，一是因为上面贴的代码本来就少；二是因为有时会把文章贴到别的地方，这就只有图片才能保持同样的效果了；三是因为懒得折腾吧。</p>
<p>在StackExchange帮助中看到他们用的代码高亮脚本<a href="http://code.google.com/p/google-code-prettify/" target="_blank">Google Code Prettify</a>，感觉效果不错，就直接找个Wordpress插件安上了。</p>
<p>下面是一段获取仙林大学城PM2.5值的代码：</p>
<pre class="prettyprint" font="10"><font size="2" face="Consolas">using System.IO;
using System.Net;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var request = (HttpWebRequest)WebRequest.Create(&quot;http://218.94.78.75/pm25services/Service.asmx&quot;);
            request.Headers.Add(&quot;Action&quot;, &quot;http://218.94.78.75/pm25services/Service.asmx?op=getSurvyValue&quot;);
            request.Method = &quot;POST&quot;;
            request.ContentType = &quot;text/xml;charset=\&quot;utf-8\&quot;&quot;;
            request.Accept = &quot;text/xml&quot;;

            XmlDocument soapEnvelop = new XmlDocument();
            XNamespace soapenv = &quot;http://schemas.xmlsoap.org/soap/envelope/&quot;;
            XNamespace tns = &quot;http://tempuri.org/&quot;;
            var xml =
                new XElement(soapenv+&quot;Envelope&quot;, new XAttribute(XNamespace.Xmlns +&quot;SOAP-ENV&quot;, &quot;http://schemas.xmlsoap.org/soap/envelope/&quot;), new XAttribute(XNamespace.Xmlns +&quot;s&quot;, &quot;http://www.w3.org/2001/XMLSchema&quot;), new XAttribute(XNamespace.Xmlns +&quot;xsi&quot;, &quot;http://www.w3.org/2001/XMLSchema-instance&quot;),
                    new XElement(soapenv + &quot;Body&quot;,
                        new XElement(tns + &quot;getSurvyValue&quot;, new XAttribute(XNamespace.Xmlns + &quot;tns&quot;, &quot;http://tempuri.org/&quot;),
                            new XElement(tns + &quot;elemname&quot;, &quot;PM25&quot;),
                            new XElement(tns + &quot;scode&quot;, &quot;AQMS02500104&quot;)))).ToString();
            soapEnvelop.LoadXml(xml);

            Stream requestStream = request.GetRequestStream();
            soapEnvelop.Save(requestStream);
            requestStream.Close();

            WebResponse response = request.GetResponse();
            Stream responseStream = response.GetResponseStream();
            var sr = new StreamReader(responseStream);
            string result = sr.ReadToEnd();
        }
    }
}</font></pre>
<p>代码当然是能运行的，有图有真相：</p>
<p><img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://public.blu.livefilestore.com/y1pMtvKRFrF0-C6EMU9X9WeUtKujnoCGXRk6gHHQ875ZzNjKG7LLVDz_4Iv4GzNM7jeIpS83fQerDUWs58JfJrhSg/pm2.5.jpg?psid=1" width="400" height="224" /></p>
<p>政府公开信息是好事，既能树立公信力也能让普通人获益，虽然按理说这些早就是我们纳税人应得的服务。</p>
<p>这个网站（<a href="http://218.94.78.75/airwebsite/">http://218.94.78.75/airwebsite/</a>），大致看了下是ArcGIS Server+REST Service+Flex API+天地图底图。目前尚在测试中，且建议IE浏览。其实这是个很普通的应用吧，后台的服务写好了，前面用商业地图API，不管是Google Maps还是国产地图，都能很好的满足需求。再看看GIS服务（<a href="http://218.94.78.75/ArcGIS/rest/services">http://218.94.78.75/ArcGIS/rest/services</a>），四个MapServer和一个GeometryServer。MapServer只是提供底图、测站和注记而已，GeometryServer也没从Fiddler中看出用在哪了。其实这是挺简单的活，不需要这样的排场，而且整个整出来的效果像是实习生作品。</p>
<p>不过话说回来，这些东西都用商业地图、开源软件做了，那还让GIS厂商活吗，还让我们过日子不？</p>
<p>所以，各取所需，和谐社会。</p>
]]></content:encoded>
			<wfw:commentRss>http://hmfly.info/2012/04/01/%e4%bb%a3%e7%a0%81%e9%ab%98%e4%ba%ae%e4%bb%a5%e5%8f%8a%e4%bb%99%e6%9e%97pm2-5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>你可能不知道的搜索方法</title>
		<link>http://hmfly.info/2012/03/29/%e4%bd%a0%e5%8f%af%e8%83%bd%e4%b8%8d%e7%9f%a5%e9%81%93%e7%9a%84%e6%90%9c%e7%b4%a2%e6%96%b9%e6%b3%95/</link>
		<comments>http://hmfly.info/2012/03/29/%e4%bd%a0%e5%8f%af%e8%83%bd%e4%b8%8d%e7%9f%a5%e9%81%93%e7%9a%84%e6%90%9c%e7%b4%a2%e6%96%b9%e6%b3%95/#comments</comments>
		<pubDate>Thu, 29 Mar 2012 02:34:39 +0000</pubDate>
		<dc:creator>hmfly</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[search]]></category>

		<guid isPermaLink="false">http://hmfly.info/?p=303</guid>
		<description><![CDATA[每天面对如此多的信息，怎样快速地从里面提取出你所需要的资料就显得尤为重要。否则既费时又费精力，还没有好的结果。大好青春，白白浪费在检索上，还可能被误导（度娘），这是每个人都是不愿看到的。下面介绍几个搜索方法，我觉得比较有用，可能还有人没用到过： 一、Google搜索操作符 1.站内搜索（site） 常常我们只要查某个网站里面的东西，比如查询南师的食堂，只需用“site”操作符，再加上检索的关键词“食堂”即可： 2.网址搜索（inurl） 有时候网址中恰恰包含了你所需要的信息，而在网页中却是没有的。比如有哪些查询已经发布的ArcGIS REST服务，只需用“inurl”操作符，再加上关键词“arcgis/rest”即可： 3.文件格式搜索（filetype） 限定文件格式，比如常见的doc、pdf和xls等等。先通过文件格式筛选一部分（其实是大部分）结果，然后再使用具体关键词就事半功倍了。比如查询自然科学基金项目清单，往往这都是Excel表格中（这里再加上限定站内搜索，这也说明操作符可以组合的）： Google搜索操作符有很多，这里只是列举一些我用过的而已。 二、自定义搜索 自定义搜索就是限定在几个网站内搜索，比较适合信息集中的领域。比如GIS圈子比较小，找资料就是那么几个网站（esri、arcgis、stackexchange等等），这样就可以用Google Custom Search自定义一个搜索引擎，专门在这几个网站中找资料： 你可以通过这个网址访问：http://goo.gl/3mSe2 三、整合Evernote搜索 Evernote是一款强大的笔记软件，可以用来收集平时的一些文字、图片等等，几乎所有格式的文件都能存储。如果你积累了一定数量的笔记，那你的Evernote是你的专属知识库。这样，在查找资料时，先在自己的知识库中看看会比较有针对性。 Chrome中有Evernote的插件，可以设置为在搜索引擎中检索时，同时在你的Evernote账户中检索： 四、Everthing本地搜索 Everything是本地的文件检索工具，根据文件名，直接在硬盘中列出相关的文件。其最大特点也是唯一的特点就是快： 这样，很多时候找文件的时候都不用去资源管理器一层一层去翻了，直接Everthing一下，多方便。 五、微软学术搜索 虽然不搞学术，但偶尔还是会需要看点文章。Google Scholar和CNKI都已经很熟悉了，很多人可能不太用微软的学术搜索。这个搜索有几个比较优秀的地方，比如会猜测你的关键词全称，按学科分类，以及像学术地图等一些可视化工具。 六、Chrome管理搜索引擎 Chrome中可以在地址栏中直接输入搜索关键词，默认使用的是Google搜索。你也可以为不同的搜索引擎，添加自定义的缩写。例如自定义淘宝搜索： 在淘宝的搜索栏中右击，选中添加搜索引擎 为淘宝搜索设置关键字“tb” 在地址栏中输入“tb”，空格，ipad 你可以将常用的引擎都通过这种方式来管理，就不需要再登录到各个主页去检索了。 总结 不管是哪种方法，都是为了更省时间，更高效。上面列出的只是沧海一粟，各个领域应该还有许多常用的方法，欢迎补充。]]></description>
			<content:encoded><![CDATA[<p>每天面对如此多的信息，怎样快速地从里面提取出你所需要的资料就显得尤为重要。否则既费时又费精力，还没有好的结果。大好青春，白白浪费在检索上，还可能被误导（度娘），这是每个人都是不愿看到的。下面介绍几个搜索方法，我觉得比较有用，可能还有人没用到过：</p>
<h6>一、Google搜索操作符</h6>
<p>1.站内搜索（site）</p>
<p>常常我们只要查某个网站里面的东西，比如查询南师的食堂，只需用“site”操作符，再加上检索的关键词“食堂”即可：</p>
<p><img src="https://public.blu.livefilestore.com/y1pvJl3dz59CGT5dxWH6t7j_me5oVJyM13PAX_oyB5_aInLHxEjdAxjOOJ-KDADphnSznBlqsCa6eRGCYt8CqU9RA/s_site.jpg?psid=1" /></p>
<p>2.网址搜索（inurl）</p>
<p>有时候网址中恰恰包含了你所需要的信息，而在网页中却是没有的。比如有哪些查询已经发布的ArcGIS REST服务，只需用“inurl”操作符，再加上关键词“arcgis/rest”即可：</p>
<p><img src="https://public.blu.livefilestore.com/y1pWq6CzCt2pzjZQpeCjkiNgHjMmm0hz5CH4ZAtQ40FJ2kG0QN2cETSIhIJjLnCy80j-qGWNNkyX9fZps36dPcq9g/s_inurl.jpg?psid=1" /></p>
<p>3.文件格式搜索（filetype）</p>
<p>限定文件格式，比如常见的doc、pdf和xls等等。先通过文件格式筛选一部分（其实是大部分）结果，然后再使用具体关键词就事半功倍了。比如查询自然科学基金项目清单，往往这都是Excel表格中（这里再加上限定站内搜索，这也说明操作符可以组合的）：</p>
<p><img src="https://public.blu.livefilestore.com/y1pWq6CzCt2pzjnCGixZ10f5KrYycP8PqeHPjHXxPOsDNCPqm82-OfUdYvrwPddknn5EXXQ98r7k-wp5Um6iwN5kg/s_file.jpg?psid=1" /></p>
<p>Google搜索操作符有很多，这里只是列举一些我用过的而已。</p>
<h6>二、自定义搜索</h6>
<p>自定义搜索就是限定在几个网站内搜索，比较适合信息集中的领域。比如GIS圈子比较小，找资料就是那么几个网站（esri、arcgis、stackexchange等等），这样就可以用<a href="http://www.google.com/cse/" target="_blank">Google Custom Search</a>自定义一个搜索引擎，专门在这几个网站中找资料：</p>
<p><img src="https://public.blu.livefilestore.com/y1px78N5yADodxWleH20pY2vQC8JwYij1YbdOW0s50PG1Ws_XI2-K-MwB-VqneMslqb47B04iWDZARZhbx8pl8VbQ/s_cs.jpg?psid=1" /></p>
<p>你可以通过这个网址访问：<a title="http://goo.gl/3mSe2" href="http://goo.gl/3mSe2">http://goo.gl/3mSe2</a></p>
<h6>三、整合Evernote搜索</h6>
<p><a href="http://www.evernote.com" target="_blank">Evernote</a>是一款强大的笔记软件，可以用来收集平时的一些文字、图片等等，几乎所有格式的文件都能存储。如果你积累了一定数量的笔记，那你的Evernote是你的专属知识库。这样，在查找资料时，先在自己的知识库中看看会比较有针对性。</p>
<p>Chrome中有Evernote的<a href="https://chrome.google.com/webstore/detail/pioclpoplcdbaefihamjohnefbikjilc?hl=en-US" target="_blank">插件</a>，可以设置为在搜索引擎中检索时，同时在你的Evernote账户中检索：</p>
<p><img src="https://public.blu.livefilestore.com/y1p4CpNJ88wDXSSUW50sNjx7D9a3s9-C9e3MrdNSw8IDImNT_JOoabw5qpLxyJDDTn7kSf7JEnOWNKxvV6Oqgjqfg/s_evernote.jpg?psid=1" /></p>
<h6>四、Everthing本地搜索</h6>
<p><a href="http://www.voidtools.com/" target="_blank">Everything</a>是本地的文件检索工具，根据文件名，直接在硬盘中列出相关的文件。其最大特点也是唯一的特点就是快：</p>
<p><img src="https://public.blu.livefilestore.com/y1pusdV1rJKZph8wD182IrgTKAzDsAcck7h5swQJ5wdSUadvRBmGtfvFDLCazSDbhetmQHEOieJEhyTXjw-I8Szgg/s_everything.jpg?psid=1" /></p>
<p>这样，很多时候找文件的时候都不用去资源管理器一层一层去翻了，直接Everthing一下，多方便。</p>
<h6>五、微软学术搜索</h6>
<p>虽然不搞学术，但偶尔还是会需要看点文章。Google Scholar和CNKI都已经很熟悉了，很多人可能不太用微软的学术搜索。这个搜索有几个比较优秀的地方，比如会猜测你的关键词全称，按学科分类，以及像<a href="http://academic.research.microsoft.com/AcademicMap" target="_blank">学术地图</a>等一些可视化工具。</p>
<p><img src="https://public.blu.livefilestore.com/y1ptuoldwRyNf0fZ5BzQeE6lHqZ3z9jqlD0zy_uzsjMXEgji3EsjhybLHRdUV0CNnndFpzZHynmVmDNhrU5Efuy4g/s_ms.jpg?psid=1" width="600" height="414" /></p>
<h6>六、Chrome管理搜索引擎</h6>
<p>Chrome中可以在地址栏中直接输入搜索关键词，默认使用的是Google搜索。你也可以为不同的搜索引擎，添加自定义的缩写。例如自定义淘宝搜索：</p>
<p>在淘宝的搜索栏中右击，选中添加搜索引擎</p>
<p><img src="https://public.blu.livefilestore.com/y1pKY3uzFAh-2wOdmK3Lql7vbrmcC2FjXAb7c9ftiJup5sqNeF4IRbPEAzAZKHsDE0k69LGofiKEwf4c8r664NEJw/s_tb1.jpg?psid=1" width="600" height="256" /></p>
<p>为淘宝搜索设置关键字“tb”</p>
<p><img src="https://public.blu.livefilestore.com/y1p0_fI1KaH6DercbdcDMidesZy2zSOAHldNtP0flDFgnDr0SmyGcXHxE7Z271Fph-3JHAw8n_Ses0jUVzjYbD0Kg/s_tb2.jpg?psid=1" /></p>
<p>在地址栏中输入“tb”，空格，ipad</p>
<p><img src="https://public.blu.livefilestore.com/y1p0_fI1KaH6Dd5t5g8_P8bqKZa_kKMQwr3basRHzdEIsD_oJNyjcZ8PLjHvuKyA1aIx_w4FVQCGyWdmPW4rw87fw/s_tb3.jpg?psid=1" /></p>
<p>你可以将常用的引擎都通过这种方式来管理，就不需要再登录到各个主页去检索了。</p>
<h6>总结</h6>
<p>不管是哪种方法，都是为了更省时间，更高效。上面列出的只是沧海一粟，各个领域应该还有许多常用的方法，欢迎补充。</p>
]]></content:encoded>
			<wfw:commentRss>http://hmfly.info/2012/03/29/%e4%bd%a0%e5%8f%af%e8%83%bd%e4%b8%8d%e7%9f%a5%e9%81%93%e7%9a%84%e6%90%9c%e7%b4%a2%e6%96%b9%e6%b3%95/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>用ArcGIS计算测地线</title>
		<link>http://hmfly.info/2012/02/13/%e7%94%a8arcgis%e8%ae%a1%e7%ae%97%e6%b5%8b%e5%9c%b0%e7%ba%bf/</link>
		<comments>http://hmfly.info/2012/02/13/%e7%94%a8arcgis%e8%ae%a1%e7%ae%97%e6%b5%8b%e5%9c%b0%e7%ba%bf/#comments</comments>
		<pubDate>Mon, 13 Feb 2012 06:26:05 +0000</pubDate>
		<dc:creator>hmfly</dc:creator>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[arcgis]]></category>
		<category><![CDATA[carto]]></category>

		<guid isPermaLink="false">http://hmfly.info/?p=301</guid>
		<description><![CDATA[你一定见过Facebook那张著名的友邻图： 图中两个地点之间的连线不是直线，而是测地线（Geodesic），或者说大圆路径、航线等等。其实就是球体上两点之间最短路径投影后的表示。用测地线做图需要有比较多的数据，这样可以表现的比较“繁忙”。而且地理上必须是大范围的，不然看上去还是直线，就缺少了曲线的美感。 在ArcGIS中，也有计算测地线的工具，XY To Line： 它需要一张包含起始点地理坐标的表，就能输出两点之间的测地线了。使用起来很简单，当然真要自己算应该比较麻烦的。 下面举个不恰当的例子：美驻华使领馆与省会城市之间的距离关系。 美国在华有7个使领馆：北京、沈阳、上海、武汉、成都、广州和香港，不考虑香港。 大陆有31个省会城市，能享受“休假式治疗”的起码得是地方大员，处级干部就不考虑了，当然也不包括港澳台。 数据来自国家基础地理信息中心。 使邻馆是点数据，省会城市也是点数据，那么只需计算点和点之间的距离关系就可以了。 具体步骤见代码： 简要说明下，首先为点数据添加坐标属性，之后计算两两之间的距离，然后为距离表连接起始点的坐标属性，最后根据距离表计算测地线。 结果如下（点击可看大图）： 仅供参考。]]></description>
			<content:encoded><![CDATA[<p>你一定见过Facebook那张著名的友邻图：</p>
<p><img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://public.blu.livefilestore.com/y1pDRcb7mst1dNKO61y95xZoCgH5n_8ZNZlkdQYtPSppgqQJsoYhOykppEStbmY1Y7DS-9fLJkP4sHwbT_WRAmFyw/fb2.jpg?psid=1" width="640" height="319" /></p>
<p>图中两个地点之间的连线不是直线，而是<a href="http://zh.wikipedia.org/wiki/%E6%B5%8B%E5%9C%B0%E7%BA%BF" target="_blank">测地线（Geodesic）</a>，或者说大圆路径、航线等等。其实就是球体上两点之间最短路径投影后的表示。用测地线做图需要有比较多的数据，这样可以表现的比较“繁忙”。而且地理上必须是大范围的，不然看上去还是直线，就缺少了曲线的美感。</p>
<p>在ArcGIS中，也有计算测地线的工具，<a href="http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//0017000000tv000000" target="_blank">XY To Line</a>：</p>
<p><img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://public.blu.livefilestore.com/y1pRXzkPc5iOJuGEs-oj30oJyY7ICU9Pt0kNOtOulelMZfDHVbji6nqljQ7WMwBDQMaqmXETweBZY7AwokJCWWNDA/xy2line.jpg?psid=1" width="407" height="420" /></p>
<p>它需要一张包含起始点地理坐标的表，就能输出两点之间的测地线了。使用起来很简单，当然真要自己算应该比较麻烦的。</p>
<p>下面举个不恰当的例子：<strong>美驻华使领馆与省会城市之间的距离关系</strong>。</p>
<p>美国在华有<a href="http://zh.wikipedia.org/wiki/%E7%BE%8E%E5%9B%BD%E9%A9%BB%E5%8D%8E%E5%A4%A7%E4%BD%BF%E9%A6%86" target="_blank">7个使领馆</a>：北京、沈阳、上海、武汉、成都、广州和香港，不考虑香港。</p>
<p>大陆有31个省会城市，能享受“休假式治疗”的起码得是地方大员，处级干部就不考虑了，当然也不包括港澳台。</p>
<p>数据来自国家基础地理信息中心。</p>
<p>使邻馆是点数据，省会城市也是点数据，那么只需计算点和点之间的距离关系就可以了。</p>
<p>具体步骤见代码：</p>
<p><img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://public.blu.livefilestore.com/y1pMPrJvb5A5mwsARhxl1yWguHZY2Aqq_nmUWd7W_pqYdpajjkdzPI3hFCSZhhXQUUOLnODwHTdq2TcrFQYkLLO8g/emcode.jpg?psid=1" width="700" height="79" /></p>
<p>简要说明下，首先为点数据添加坐标属性，之后计算两两之间的距离，然后为距离表连接起始点的坐标属性，最后根据距离表计算测地线。</p>
<p>结果如下（点击可看大图）：</p>
<p><a href="https://public.blu.livefilestore.com/y1pKmlCxYyuj7xykN0_-sdNJBcltP3eFG1TPtv-BNaWrinKVSYweY9Ygur6iPdPts2RKI2tmLZK56cTb9Uyutg0cA/em.png?psid=1" target="_blank"><img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://public.blu.livefilestore.com/y1pKmlCxYyuj7xykN0_-sdNJBcltP3eFG1TPtv-BNaWrinKVSYweY9Ygur6iPdPts2RKI2tmLZK56cTb9Uyutg0cA/em.png?psid=1" width="700" height="421" /></a></p>
<p>仅供参考。</p>
]]></content:encoded>
			<wfw:commentRss>http://hmfly.info/2012/02/13/%e7%94%a8arcgis%e8%ae%a1%e7%ae%97%e6%b5%8b%e5%9c%b0%e7%ba%bf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>又一年要开始了</title>
		<link>http://hmfly.info/2012/02/09/%e5%8f%88%e4%b8%80%e5%b9%b4%e8%a6%81%e5%bc%80%e5%a7%8b%e4%ba%86/</link>
		<comments>http://hmfly.info/2012/02/09/%e5%8f%88%e4%b8%80%e5%b9%b4%e8%a6%81%e5%bc%80%e5%a7%8b%e4%ba%86/#comments</comments>
		<pubDate>Thu, 09 Feb 2012 07:24:34 +0000</pubDate>
		<dc:creator>hmfly</dc:creator>
				<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://hmfly.info/?p=299</guid>
		<description><![CDATA[年初的时候懒惰，没有写去年的总结，总是想拖着，拖到现在就更不想写了，其实这就跟早上赖床一样，不过最终你还是要起来的。 写总结还是有点好处的，至少知道自己做了些什么，也能大致估计你以后能干些什么。因为，你还是你，你的心又不会变的。你一直追随你的心，你的优点和缺点，永远都围绕在你身边，和你一起向前或者向后。这样对自己就有一个自己的评价，能做多少，能做多好都有个数。不要太妄自菲薄，也不要太骄傲自满，走在两个极端都不正常，除非你是乔布斯。乔布斯能改变世界，而且不止一次，而我只求世界不要太改变了我，然后我又能让世界变的一点点美好，那就够了。你总结的材料就是样本点，将这些样本点拟合起来之后，或许会找到规律，然后就能估计你自己的未来了吧。举个不恰当的例子，当年林彪潜逃和近日立军闯馆，里面没有内在的关联性吗？ 去年做过的事，大多都写在了日志里面，我还按写过的东西来归类吧： 制过几张图。 上半年还在上课，做过三维阶梯图，其实是把上课的步骤按自己的想法再简化了下，用ModelBuilder来做而已，后来我发现里面的步骤还是最简的。 去年的作业，做了性别比地图。因为我觉得用饼图来做是相当难看，结果自己想把各省的人口数据随机分配到省内的各个区域，再按这个数据来制图。不过我做的不是很好。后来我才知道，这个叫人口估计，就是我们只能拿到一个城市的人口数据，但又想知道城市里面各个区域的人口是多少，这就得结合土地利用等其他数据去估计了，这是人口地理学里面的吧？不过我觉得这是很2的问题，我们国家常常人口普查，挨家挨户的查，数据已经精确到不能再精确了，但是用纳税人的钱查的纳税人数目，还不对纳税人公开，这他妈的是什么道理啊？美国人口普查一结束，纽约时报马上就有精确到每个Block的人口地图出来了，难怪立军先生要跑去他们的大使馆呀，至少他没了，地球人不会不知道。 ArcGIS10中有图层有时态功能，所以就去USGS拿了份数据做了个地震数据的可视化。东西比较简单，主要是处理数据相对麻烦些，用了ArcPy，当时还是初学，现在算是入门了吧。越来越多的数据可视化中都用到了地图，这是必然的趋势，但要做的精致，别人才有欲望看，才能领会制图者想表达的意思。但要做的精致，在国内实在是看不到，学校也根本不在乎这方面的教育，你能怪学生吗？ 下半年大连PX项目闹的很大，后来我发现南京也有，还就在栖霞山下面，顿时怒从中来，花了一晚上在ArcGIS.com上做了个PX项目与仙林各学校的距离图。不得不说，有这样的工具，地理数据在日常生活中的作用会表现的更直接、迅捷。但是，愿意做这方面事情的人不多，大家都当业余活动玩的。而且，能提起兴趣的事情往往又是党国所不忍的，就像我在微博上发的PX图后来就被删了一样。 给生科院的博士做了张全球哺乳动物分布图。他在别的文献中看到，也需要一张类似的图。所以我们载到数据之后猜测作者的做法，最后做出来，当然也走了点弯路的。GIS总归是个工具，大家都来用，那大家都能得到好处。 写过点代码。 还是去年的作业，三角网剖分的，很简单的一个程序，写了个WinForm的交次作业，改成Silverlight的又交了次作业。还想把它弄到WP7上，看看有没有时间吧。 C#和Fortran的混编，后来我发现其实就是.Net Interop中的PInvoke呀。主要是为了调POM才去看这个的，但最后的需求可能不需要这样做，而是简单的建一个Process就可以了。 实现过一个公交换乘模型，包括数据创建、数据结构和算法。数据结构和算法得益于老师的想法。后来把公交查询数据创建那块写了下，还没写数据结构和算法。前前后后花了不少时间，对这块也有一点了解了，后来我发现经常有硕士论文是写这块的，主要的创新点都在算法改进上。国外很多巴士机构都已公开公交车的实时位置数据，结合在线地图，实现实时的公交换乘，这是一个趋势呀。 模型封装，还封闭了一阵子，没啥好写的，纯粹体力活，顶多写个批处理。其实总的花起来的时间差不多，但更有趣点，还能复用。谁知道你先前写的就一定对呢？ 分享过几个视频。 Esri的用户大会，反正每年听他们吹吹，获得点力量也好的。 元首咆哮Esri，我觉得挺搞笑的，但貌似没什么人感兴趣啊。 Geospatial Revolution，这个视频放了好久了，因为想翻译下字幕，后来发现这个活比较专业啊。直接贴上英文字幕挂到网上，还不算是无人问津。视频里的东西很实在，不像国内动不动数字地球，智慧城市，结果连一个靠谱的应用都看不到，劳民伤财。 稍微有点影响力的。 把Esri中国在微博上的帐号聚合了下，做成Google Reader Bundle，直接订阅就行。就是有时候不稳定，会没有输出，不知道什么问题，不过肯定不是我的问题。现在有50多个人订阅了，GIS这个小圈子里面不错了吧。 怎么做GIS项目，翻译顺带写了点东西，被Esri中国通讯拿去了，还算不错吧。我也是实话实说，即使错了也是实话，而且一直也是这么做的。 没写过论文。。。。。。。。 又要一年开始了，争取今年再多做点东西，去年没做好的事情今年有机会再做好。例如建模建了一个月，什么奖都没拿到；英语还是那么拿不出手；多看几本书；晚上早点睡（这好像和前面那句矛盾）；早上早点起来。。。 明年这个时候估计工作也找的差不多了吧，我又不去念博士，这个专业没啥好念的，我也不是做研究的料；我也不会出国，一直走的路线就不是那么规划的，再说只要自己保持年轻而自由的心，生活还是不差的，而且大环境总是会变好的嘛。]]></description>
			<content:encoded><![CDATA[<p>年初的时候懒惰，没有写去年的总结，总是想拖着，拖到现在就更不想写了，其实这就跟早上赖床一样，不过最终你还是要起来的。</p>
<p>写总结还是有点好处的，至少知道自己做了些什么，也能大致估计你以后能干些什么。因为，你还是你，你的心又不会变的。你一直追随你的心，你的优点和缺点，永远都围绕在你身边，和你一起向前或者向后。这样对自己就有一个自己的评价，能做多少，能做多好都有个数。不要太妄自菲薄，也不要太骄傲自满，走在两个极端都不正常，除非你是乔布斯。乔布斯能改变世界，而且不止一次，而我只求世界不要太改变了我，然后我又能让世界变的一点点美好，那就够了。你总结的材料就是样本点，将这些样本点拟合起来之后，或许会找到规律，然后就能估计你自己的未来了吧。举个不恰当的例子，当年林彪潜逃和近日立军闯馆，里面没有内在的关联性吗？</p>
<p>去年做过的事，大多都写在了日志里面，我还按写过的东西来归类吧：</p>
<ul>
<li>制过几张图。
<ol>
<li>上半年还在上课，做过<a href="http://hmfly.info/2011/04/25/%E5%88%B6%E4%BD%9C%E4%B8%89%E7%BB%B4%E9%98%B6%E6%A2%AF%E5%9B%BE%E7%9A%84%E6%96%B9%E6%B3%95%E5%8F%8A%E6%A8%A1%E5%9E%8B/" target="_blank">三维阶梯图</a>，其实是把上课的步骤按自己的想法再简化了下，用ModelBuilder来做而已，后来我发现里面的步骤还是最简的。 </li>
<li>去年的作业，做了<a href="http://hmfly.info/2011/03/10/%E4%B8%80%E7%A7%8D%E4%BA%BA%E5%8F%A3%E6%80%A7%E5%88%AB%E6%AF%94%E4%B8%93%E9%A2%98%E5%9B%BE%E5%88%B6%E4%BD%9C%E7%9A%84%E6%96%B9%E6%B3%95/" target="_blank">性别比地图</a>。因为我觉得用饼图来做是相当难看，结果自己想把各省的人口数据随机分配到省内的各个区域，再按这个数据来制图。不过我做的不是很好。后来我才知道，这个叫人口估计，就是我们只能拿到一个城市的人口数据，但又想知道城市里面各个区域的人口是多少，这就得结合土地利用等其他数据去估计了，这是人口地理学里面的吧？不过我觉得这是很2的问题，我们国家常常人口普查，挨家挨户的查，数据已经精确到不能再精确了，但是用纳税人的钱查的纳税人数目，还不对纳税人公开，这他妈的是什么道理啊？美国人口普查一结束，纽约时报马上就有精确到每个Block的人口地图出来了，难怪立军先生要跑去他们的大使馆呀，至少他没了，地球人不会不知道。 </li>
<li>ArcGIS10中有图层有时态功能，所以就去USGS拿了份数据做了个<a href="http://hmfly.info/2011/03/15/earthquakes-with-1000-or-more-deaths-since-1900/" target="_blank">地震数据的可视化</a>。东西比较简单，主要是处理数据相对麻烦些，用了ArcPy，当时还是初学，现在算是入门了吧。越来越多的数据可视化中都用到了地图，这是必然的趋势，但要做的精致，别人才有欲望看，才能领会制图者想表达的意思。但要做的精致，在国内实在是看不到，学校也根本不在乎这方面的教育，你能怪学生吗？ </li>
<li>下半年大连PX项目闹的很大，后来我发现南京也有，还就在栖霞山下面，顿时怒从中来，花了一晚上在ArcGIS.com上做了个<a href="http://hmfly.info/2011/08/15/%E5%8D%97%E4%BA%AC%EF%BC%8Cpx%E7%A6%BB%E6%88%91%E4%BB%AC%E6%9C%89%E5%A4%9A%E8%BF%9C%EF%BC%9F/" target="_blank">PX项目与仙林各学校的距离图</a>。不得不说，有这样的工具，地理数据在日常生活中的作用会表现的更直接、迅捷。但是，愿意做这方面事情的人不多，大家都当业余活动玩的。而且，能提起兴趣的事情往往又是党国所不忍的，就像我在微博上发的PX图后来就被删了一样。 </li>
<li>给生科院的博士做了张<a href="http://hmfly.info/2011/11/28/%E5%85%A8%E7%90%83%E5%93%BA%E4%B9%B3%E5%8A%A8%E7%89%A9%E5%88%86%E5%B8%83%E5%9B%BE/" target="_blank">全球哺乳动物分布图</a>。他在别的文献中看到，也需要一张类似的图。所以我们载到数据之后猜测作者的做法，最后做出来，当然也走了点弯路的。GIS总归是个工具，大家都来用，那大家都能得到好处。 </li>
</ol>
</li>
<li>写过点代码。
<ol>
<li>还是去年的作业，<a href="http://hmfly.info/2011/07/27/%E7%94%A8silverlight%E5%86%99%E7%9A%84delaunay%E5%89%96%E5%88%86%E5%B0%8F%E7%A8%8B%E5%BA%8F/" target="_blank">三角网剖</a>分的，很简单的一个程序，写了个WinForm的交次作业，改成Silverlight的又交了次作业。还想把它弄到WP7上，看看有没有时间吧。 </li>
<li><a href="http://hmfly.info/2011/07/10/c%E4%B8%8Efortran%E6%B7%B7%E7%BC%96%E7%9A%84%E4%B8%80%E4%B8%AA%E4%BE%8B%E5%AD%90/" target="_blank">C#和Fortran的混编</a>，后来我发现其实就是.Net Interop中的PInvoke呀。主要是为了调POM才去看这个的，但最后的需求可能不需要这样做，而是简单的建一个Process就可以了。 </li>
<li>实现过一个公交换乘模型，包括数据创建、数据结构和算法。数据结构和算法得益于老师的想法。后来把<a href="http://hmfly.info/2011/12/27/%E5%88%9B%E5%BB%BA%E5%85%AC%E4%BA%A4%E6%9F%A5%E8%AF%A2%E6%95%B0%E6%8D%AE/" target="_blank">公交查询数据创建</a>那块写了下，还没写数据结构和算法。前前后后花了不少时间，对这块也有一点了解了，后来我发现经常有硕士论文是写这块的，主要的创新点都在算法改进上。国外很多巴士机构都已公开公交车的实时位置数据，结合在线地图，实现实时的公交换乘，这是一个趋势呀。 </li>
<li>模型封装，还封闭了一阵子，没啥好写的，纯粹体力活，顶多写个批处理。其实总的花起来的时间差不多，但更有趣点，还能复用。谁知道你先前写的就一定对呢？ </li>
</ol>
</li>
<li>分享过几个视频。
<ol>
<li><a href="http://hmfly.info/2011/07/25/esri%E5%85%A8%E7%90%83%E7%94%A8%E6%88%B7%E5%A4%A7%E4%BC%9A%EF%BC%8C%E5%9C%B0%E7%90%83%E4%BA%BA%E7%9C%8B%E4%BA%86%E9%83%BD%E6%9C%89%E6%94%B6%E8%8E%B7/" target="_blank">Esri的用户大会</a>，反正每年听他们吹吹，获得点力量也好的。 </li>
<li><a href="http://hmfly.info/2011/07/09/%E5%B8%8C%E7%89%B9%E5%8B%92%E5%90%8C%E5%BF%97%E5%90%91esri%E5%92%86%E5%93%AE%EF%BC%81%EF%BC%81%EF%BC%81/" target="_blank">元首咆哮Esri</a>，我觉得挺搞笑的，但貌似没什么人感兴趣啊。 </li>
<li><a href="http://hmfly.info/2011/11/16/geospatial-revolution/" target="_blank">Geospatial Revolution</a>，这个视频放了好久了，因为想翻译下字幕，后来发现这个活比较专业啊。直接贴上英文字幕挂到网上，还不算是无人问津。视频里的东西很实在，不像国内动不动数字地球，智慧城市，结果连一个靠谱的应用都看不到，劳民伤财。 </li>
</ol>
</li>
<li>稍微有点影响力的。 </li>
</ul>
<ol>
<ol>
<li>把<a href="http://hmfly.info/2011/04/21/%E7%94%A8google-reader%E8%AE%A2%E9%98%85%E6%96%B0%E6%B5%AA%E5%BE%AE%E5%8D%9A%E4%B8%ADesri%E4%B8%AD%E5%9B%BD%E7%9A%84%E4%BC%97%E5%A4%9A%E5%BE%AE%E5%8D%9A/" target="_blank">Esri中国在微博上的帐号聚合</a>了下，做成Google Reader Bundle，直接订阅就行。就是有时候不稳定，会没有输出，不知道什么问题，不过肯定不是我的问题。现在有50多个人订阅了，GIS这个小圈子里面不错了吧。 </li>
<li><a href="http://hmfly.info/2011/04/17/%E6%88%91%E5%BA%94%E8%AF%A5%E6%80%8E%E4%B9%88%E5%81%9A%E6%88%91%E7%9A%84gis%E9%A1%B9%E7%9B%AE%EF%BC%9F/" target="_blank">怎么做GIS项目</a>，翻译顺带写了点东西，被Esri中国通讯拿去了，还算不错吧。我也是实话实说，即使错了也是实话，而且一直也是这么做的。 </li>
</ol>
</ol>
<ul>
<li>没写过论文。。。。。。。。 </li>
</ul>
<p>又要一年开始了，争取今年再多做点东西，去年没做好的事情今年有机会再做好。例如建模建了一个月，什么奖都没拿到；英语还是那么拿不出手；多看几本书；晚上早点睡（这好像和前面那句矛盾）；早上早点起来。。。</p>
<p>明年这个时候估计工作也找的差不多了吧，我又不去念博士，这个专业没啥好念的，我也不是做研究的料；我也不会出国，一直走的路线就不是那么规划的，再说只要自己保持年轻而自由的心，生活还是不差的，而且大环境总是会变好的嘛。</p>
]]></content:encoded>
			<wfw:commentRss>http://hmfly.info/2012/02/09/%e5%8f%88%e4%b8%80%e5%b9%b4%e8%a6%81%e5%bc%80%e5%a7%8b%e4%ba%86/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>创建公交查询数据</title>
		<link>http://hmfly.info/2011/12/27/%e5%88%9b%e5%bb%ba%e5%85%ac%e4%ba%a4%e6%9f%a5%e8%af%a2%e6%95%b0%e6%8d%ae/</link>
		<comments>http://hmfly.info/2011/12/27/%e5%88%9b%e5%bb%ba%e5%85%ac%e4%ba%a4%e6%9f%a5%e8%af%a2%e6%95%b0%e6%8d%ae/#comments</comments>
		<pubDate>Tue, 27 Dec 2011 11:19:49 +0000</pubDate>
		<dc:creator>hmfly</dc:creator>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[bus transit]]></category>

		<guid isPermaLink="false">http://hmfly.info/2011/12/27/%e5%88%9b%e5%bb%ba%e5%85%ac%e4%ba%a4%e6%9f%a5%e8%af%a2%e6%95%b0%e6%8d%ae/</guid>
		<description><![CDATA[公交查询，准确说是公交换乘查询算法有很多人做过，主要有3种方法： 按照集合求交的方法，把每条线路看作是站点的集合，如果两条线路之间有交集，就说明可以换乘。 将公交网络抽象成图，用最短路径算法。 使用换乘矩阵。 这些都有文章能找到，还挺多的，每种算法都各有各的利弊。 用这些算法的前提是要有线路的站点顺序，例如南京138，文澜路下一站是文澜路北站吧。这个数据得有，不然你怎么知道公交车的行驶方向呢？这都不知道就更不用说换乘关系了。 但是，在实际当中是会碰到这种情况的，比如只有站点（point）和线路（line），而没有站点和线路之间的关系： 不过这并不意味着就不能做这个事情了，因为我们知道，在GIS中，要素之间不光有属性关联，而且有空间关联。现在只是没有属性关联而已，可以通过空间上的相对位置找到他们之间的关系： 我的思路是这样的：站点就是point，线路是line。line其实也是由point构成的，只不过必须得有两个以上的point，point之间先相互连接组成线段，再由线段组成line。所以要找到point和line之间的关系，只需找到point和构成line的point（vertex）之间的关系就可以了。如果point和vertex重合，那说明point在line当中，也就是说这条线路包含这个站点。而vertex在line中是按顺序存储的，这个顺序就是公交车的起点到终点。因为制作数据的人员是先绘制站点，然后按公交车的线路将站点连接起来的，不然不符合常理吧。 那么，如何实践呢？首先必须进行point和line之间的拓扑验证，就是必须保证所有的point必须在line上。拓扑验证结果如下： 有21个错误，即21个点不在线上。通过编辑将点移到线上即可。 但是，point在line上，并不一定保证point在vertex上。还要再一次用点和点是否一致的拓扑规则进行验证，这需要将line先打断成vertex，打断后有172491个点（407条线路），这样去和1267个点去做验证会很慢很慢，可以先将重复的vertex去掉再做（这得自己code了，推荐FileGDBAPI），去掉之后只有24013个vertex，这样进行验证就很快。通过验证发现，point和vertex是完全一致的（coincide with），也就是说所有的point都和vertex重合。（其实，只需要一次点和点是否一致的拓扑验证就够了，不过做的时候就是这么做的，将错就错吧。） 最后，去遍历线路，按顺序进行vertex和point的位置进行比较，位置一样就记录下这个站点。当然还需要一些额外的处理，例如有些上下行线路完全一致的，做数据的人就直接复制了一份，这样上下行两条line中存的vertex顺序是一致的，这还得自己判断给他逆转过来，诸如此类等等。 看一下138的结果： 【程序获得】太阳城-1040.黄庄一号路-1041.朱庄-535.朱庄北站-532.仙鹤门-531.仙鹤门东-1042.应天学院-1043.学衡路-530.亚东新城区-792.亚东新城区-870.文澜路南站-869.文澜路-868.文澜路北站-867.学海路-1044.学子路-1049.东部山庄-1048.四桥指挥部-1047.戴家库-1045.南山公墓-1046.栖霞寺 【8684】太阳城 &#8211; 黄庄一号路 &#8211; 朱庄 &#8211; 朱庄北站 &#8211; 仙鹤门[地铁站] &#8211; 仙鹤门东 &#8211; 应天学院(仙林大道) &#8211; 学衡路 &#8211; 亚东新城区(仙林大学城管委会) &#8211; 文澜路南站 &#8211; 文澜路 &#8211; 文澜路北站 &#8211; 学海路 &#8211; 学子路 &#8211; 衡阳寺 &#8211; 红枫新村 &#8211; 栖霞老街 &#8211; 芦干圩 &#8211; 栖霞寺 &#8211; 栖霞 [...]]]></description>
			<content:encoded><![CDATA[<p>公交查询，准确说是公交换乘查询算法有很多人做过，主要有3种方法：</p>
<ol>
<li>按照集合求交的方法，把每条线路看作是站点的集合，如果两条线路之间有交集，就说明可以换乘。 </li>
<li>将公交网络抽象成图，用最短路径算法。 </li>
<li>使用换乘矩阵。 </li>
</ol>
<p>这些都有文章能找到，还挺多的，每种算法都各有各的利弊。</p>
<p>用这些算法的前提是要有线路的站点顺序，例如南京138，文澜路下一站是文澜路北站吧。这个数据得有，不然你怎么知道公交车的行驶方向呢？这都不知道就更不用说换乘关系了。</p>
<p>但是，在实际当中是会碰到这种情况的，比如只有站点（point）和线路（line），而没有站点和线路之间的关系：</p>
<p><img src="https://public.blu.livefilestore.com/y1pIUobdTCkFMdPNms4PVFR84abQxj-WYnx1n4IPd6DgLe0956Yvxm1L0oSkyc8QaVHLNnVq4-u7NNDSp6Aie0Rcw/stop_bus_table.png?psid=1" width="700" height="575" /></p>
<p>不过这并不意味着就不能做这个事情了，因为我们知道，在GIS中，要素之间不光有属性关联，而且有空间关联。现在只是没有属性关联而已，可以通过空间上的相对位置找到他们之间的关系：</p>
<p><img src="https://public.blu.livefilestore.com/y1pIUobdTCkFMf4bgalWYN4L94Qy-zI10jPjs6M5NMMOOOXHJMAOcVb9xDulPXpEtqKVQnvH_9WQRtLzYnrmk6t8w/bus_map.jpg?psid=1" width="700" height="621" /></p>
<p>我的思路是这样的：站点就是point，线路是line。line其实也是由point构成的，只不过必须得有两个以上的point，point之间先相互连接组成线段，再由线段组成line。所以要找到point和line之间的关系，只需找到point和构成line的point（vertex）之间的关系就可以了。如果point和vertex重合，那说明point在line当中，也就是说这条线路包含这个站点。而vertex在line中是按顺序存储的，这个顺序就是公交车的起点到终点。因为制作数据的人员是先绘制站点，然后按公交车的线路将站点连接起来的，不然不符合常理吧。</p>
<p>那么，如何实践呢？首先必须进行point和line之间的拓扑验证，就是必须保证所有的point必须在line上。拓扑验证结果如下：</p>
<p><img src="https://public.blu.livefilestore.com/y1pJWTZW6hgr7FDp5a6ko1GKPh-7DgwfiWk8lkjUdOqpnEVi44VfsqmT5vfxq8E_u_oDiSNV8Bf1OYsECkAAGK9ig/stop_in_route.png?psid=1" width="700" height="694" /></p>
<p>有21个错误，即21个点不在线上。通过编辑将点移到线上即可。</p>
<p>但是，point在line上，并不一定保证point在vertex上。还要再一次用点和点是否一致的拓扑规则进行验证，这需要将line先打断成vertex，打断后有172491个点（407条线路），这样去和1267个点去做验证会很慢很慢，可以先将重复的vertex去掉再做（这得自己code了，推荐FileGDBAPI），去掉之后只有24013个vertex，这样进行验证就很快。通过验证发现，point和vertex是完全一致的（coincide with），也就是说所有的point都和vertex重合。（其实，只需要一次点和点是否一致的拓扑验证就够了，不过做的时候就是这么做的，将错就错吧。）</p>
<p>最后，去遍历线路，按顺序进行vertex和point的位置进行比较，位置一样就记录下这个站点。当然还需要一些额外的处理，例如有些上下行线路完全一致的，做数据的人就直接复制了一份，这样上下行两条line中存的vertex顺序是一致的，这还得自己判断给他逆转过来，诸如此类等等。</p>
<p>看一下138的结果：</p>
<blockquote><p>【程序获得】太阳城-1040.黄庄一号路-1041.朱庄-535.朱庄北站-532.仙鹤门-531.仙鹤门东-1042.应天学院-1043.学衡路-530.亚东新城区-792.亚东新城区-870.文澜路南站-869.文澜路-868.文澜路北站-867.学海路-1044.学子路-1049.东部山庄-1048.四桥指挥部-1047.戴家库-1045.南山公墓-1046.栖霞寺</p>
<p>【8684】太阳城 &#8211; 黄庄一号路 &#8211; 朱庄 &#8211; 朱庄北站 &#8211; 仙鹤门[地铁站] &#8211; 仙鹤门东 &#8211; 应天学院(仙林大道) &#8211; 学衡路 &#8211; 亚东新城区(仙林大学城管委会) &#8211; 文澜路南站 &#8211; 文澜路 &#8211; 文澜路北站 &#8211; 学海路 &#8211; 学子路 &#8211; 衡阳寺 &#8211; 红枫新村 &#8211; 栖霞老街 &#8211; 芦干圩 &#8211; 栖霞寺 &#8211; 栖霞</p>
</blockquote>
<p>从太阳城到学子路的顺序都是正确的，后面不一样是因为我这份数据是2号线开通前的，数据本身的不一致不在我的考虑范围内了。</p>
<p>创建好数据之后，可以选前面提到的算法中的任一个进行计算，当然还要做很多的工作。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>这个事情做了我将近半个月的时间，当然包括后面算法的调试，我现在是深深体会到程序=数据结构+算法，其实我这里都没提到这次用的数据结构和算法，只是介绍了下数据的预处理，有机会以后再说吧。</p>
<p>还有一些比较好玩的事情，比如：</p>
<ul>
<li><font color="#000000">Google的<a href="http://www.google.com/transitpartners" target="_blank">公交合作伙伴计划</a></font><font color="#000000"></font>，你只需要按Goolge的数据格式，将某个城市的公交数据上传到Google那里，你就能使用公交换乘啦。这比较适合小城市，因为大城市都已经有数据了，小城市的线路不多，需求不大，而且数据也不好弄，所以用这种方式补充Google的数据，也让当地的人能获得便利，是双赢的事情。这还带来一个好处，就是大家都能使用这些<a href="http://www.gtfs-data-exchange.com/" target="_blank">公交数据</a>做研究等等。可以看看Google所需要的数据格式：</li>
</ul>
<p><img src="https://public.blu.livefilestore.com/y1pIUobdTCkFMdQc6ps6VQ5vU6VjV01qqzMkNqtrsWDHSZmBpC4EeLcX1ZHbLsOB5C_HytF7c6qmk89MQJ1AeyY7w/gtfs.jpg?psid=1" width="700" height="324" /></p>
<ul>
<li>现在的公交很多都带GPS了，在公交换乘查询中，如果能考虑到公交车的实时位置，推荐最合适的公交供换乘参考，这是一个方向吧。我查了一下，Google已经在<a href="http://www.guao.hk/posts/google-maps-live-transit-updates.html" target="_blank">部分城市</a>实现了，其实这个问题应该也不会很难，主要是各个agency肯不肯将数据放出的问题，特别是我朝各部门一直将数据视为生命，不然也不会有我前面这么苦逼地数据预处理了。国内<a href="http://www.hzbus.cn/" target="_blank">杭州</a>在这些方面一直走在前面，杭州的公交实时位置数据已经做成服务发布了，但是相当不好用额，不过已经走在全国前面了：</li>
</ul>
<p><img src="https://public.blu.livefilestore.com/y1p62CLkLiWwkOXbdu0xnBXVfNPuLPVRETrS9CEtkeT-y1dYKZUP794WBM6evVxfTOPlB61kY7ZzcGUve1FTdzn6w/hz_bus.jpg?psid=1" width="700" height="356" /></p>
<ul>
<li>还看到一个<a href="http://www.baytripper.org/" target="_blank">团队</a>做过类似的事情，Stanford的同学做了当地的公交实时换乘iOS上的软件。他们做这个是因为相关课程涉及到，因此就干脆开发了一个软件发布到App Store中，还产出了两篇论文。这种一举多得的事情真好！上面有关Google公交数据格式的截图就来自他们的<a href="http://www.google.com.hk/url?sa=t&amp;rct=j&amp;q=Algorithm+for+finding+optimal+paths+in+a+public+transit+network+with+real-time+data&amp;source=web&amp;cd=1&amp;ved=0CCgQFjAA&amp;url=http%3A%2F%2Fwww.baytripper.org%2FTRB%5BRESUBMIT%5D.pdf&amp;ei=P4X5Tp7dDKWViAfx4NGoAQ&amp;usg=AFQjCNGode1nrcBKq5uwjym7fZQfgJcCAw" target="_blank">论文</a>中。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://hmfly.info/2011/12/27/%e5%88%9b%e5%bb%ba%e5%85%ac%e4%ba%a4%e6%9f%a5%e8%af%a2%e6%95%b0%e6%8d%ae/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>全球哺乳动物分布图</title>
		<link>http://hmfly.info/2011/11/28/%e5%85%a8%e7%90%83%e5%93%ba%e4%b9%b3%e5%8a%a8%e7%89%a9%e5%88%86%e5%b8%83%e5%9b%be/</link>
		<comments>http://hmfly.info/2011/11/28/%e5%85%a8%e7%90%83%e5%93%ba%e4%b9%b3%e5%8a%a8%e7%89%a9%e5%88%86%e5%b8%83%e5%9b%be/#comments</comments>
		<pubDate>Mon, 28 Nov 2011 07:43:13 +0000</pubDate>
		<dc:creator>hmfly</dc:creator>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[Map]]></category>
		<category><![CDATA[carto]]></category>
		<category><![CDATA[mammal]]></category>

		<guid isPermaLink="false">http://hmfly.info/2011/11/28/%e5%85%a8%e7%90%83%e5%93%ba%e4%b9%b3%e5%8a%a8%e7%89%a9%e5%88%86%e5%b8%83%e5%9b%be/</guid>
		<description><![CDATA[上个礼拜，和帮隔壁学院某研究蝙蝠的博士做了个图——根据全球哺乳动物的活动范围（多边形），在1×1经纬网上，获取每个网格上活动（栖息？）的哺乳动物种类数目。 原始数据是这样的： 我处理（Dissolve）了下，有5398种哺乳动物，和维基上说的差不多。我关注的是活动范围，其中，活动范围最小的是Melomys rubicola（一种老鼠？）范围小到几乎可以忽略不计啊，在（143，-9）附近；最大的是Orcinus orca（虎鲸），基本上有水的地方都是它的地盘，这就叫四海为家吧。 先生成经纬网（ArcPy）： 然后按Intersect进行SpatialJoin（本来想还是用ArcPy直接遍历每个几何进行overlaps、contains和within比较，无奈数据太大，要先进行几何的envelope比较，这个不涉及空间操作，但是写起来多稍微麻烦了点呢，而且为什么SearchCursor获取的几何不能保存在list中？不解）。 之后统计网格数目，再将统计表Join到网格数据中，完事。 SpatialJoin那步效率太差，反正我晚上回去开始跑，第二天早上来看是跑完的。后来看了下，最后有190多万个多边形。。。想想也是，光光经纬网格就有360×180了，平均下来每个网格上才3种哺乳动物吧。 最后的图： 没受过专业的制图训练，见谅了，虽然我们专业前面是有Cartography这种说法的，但现在还有人（老师）知道有制图这回事吗？ Scene里面拉伸下： 最后，上上个礼拜在3sNews上分享了下Geospatial Revolution的视频，还不算是无人问津。我觉得这种制图，就是EP4中介绍的地理空间技术在科研方面的应用之一。学GIS的可能觉得很简单，但对别的邻域是一种很强有力的工具，甚至是新颖的。 最最后，胡适先生曾说，多研究些问题，少谈些“主义”。在现在这种“云”里“雾”里的浮躁年代，多解决些问题，多拓展些行业，少吹点牛皮，少扯点概念，或许更好。]]></description>
			<content:encoded><![CDATA[<p>上个礼拜，和帮隔壁学院某研究蝙蝠的博士做了个图——根据全球哺乳动物的活动范围（多边形），在1×1经纬网上，获取每个网格上活动（栖息？）的哺乳动物种类数目。</p>
<p>原始数据是这样的：</p>
<p><img src="https://blufiles.storage.live.com/y1pS6mtndWTrez6tnjsnqyoc3dyJfqLX38X4mr91k2sypWXV9YTpFj9gb1t-So_QHfe6pauJdoz-Mc/mammals_source.jpg?psid=1" width="700" height="346" /></p>
<p>我处理（Dissolve）了下，有5398种哺乳动物，和维基上说的差不多。我关注的是活动范围，其中，活动范围最小的是Melomys rubicola（一种老鼠？）范围小到几乎可以忽略不计啊，在（143，-9）附近；最大的是Orcinus orca（虎鲸），基本上有水的地方都是它的地盘，这就叫四海为家吧。</p>
<p>先生成经纬网（ArcPy）：</p>
<p><img src="https://blufiles.storage.live.com/y1pv9p3cEopErVb9_CkfqFfUqlucdSWpSH4HNdkg6AMpS67Iusa9MAbWUn22zIsO0yJ23sVq6VH5Nc/grid.jpg?psid=1" width="700" height="364" /></p>
<p>然后按Intersect进行SpatialJoin（本来想还是用ArcPy直接遍历每个几何进行overlaps、contains和within比较，无奈数据太大，要先进行几何的envelope比较，这个不涉及空间操作，但是写起来多稍微麻烦了点呢，而且为什么SearchCursor获取的几何不能保存在list中？不解）。</p>
<p>之后统计网格数目，再将统计表Join到网格数据中，完事。</p>
<p>SpatialJoin那步效率太差，反正我晚上回去开始跑，第二天早上来看是跑完的。后来看了下，最后有190多万个多边形。。。想想也是，光光经纬网格就有360×180了，平均下来每个网格上才3种哺乳动物吧。</p>
<p>最后的图：</p>
<p><img src="https://blu2.storage.live.com/items/2ED0177AA900D3E1!210:Scaled1024/mammals.png?psid=1&amp;ck=0&amp;ex=720" width="700" height="495" /></p>
<p>没受过专业的制图训练，见谅了，虽然我们专业前面是有Cartography这种说法的，但现在还有人（老师）知道有制图这回事吗？</p>
<p>Scene里面拉伸下：</p>
<p><img src="https://blufiles.storage.live.com/y1pVshCGOnQnqOkt74f5Jg7FtjDtP1hp36Fu0M4403438UXZymaFGThnFUsaumP0jrMqpOl7hUy98w/mammals_scene.jpg?psid=1" width="700" height="424" /></p>
<p>最后，上上个礼拜在3sNews上分享了下<a href="http://blog.3snews.net/space.php?uid=34108&amp;do=blog&amp;id=60253" target="_blank">Geospatial Revolution</a>的视频，还不算是无人问津。我觉得这种制图，就是EP4中介绍的地理空间技术在科研方面的应用之一。学GIS的可能觉得很简单，但对别的邻域是一种很强有力的工具，甚至是新颖的。</p>
<p>最最后，胡适先生曾说，<a href="http://news.ifeng.com/opinion/200807/0703_23_632114.shtml" target="_blank">多研究些问题，少谈些“主义”</a>。在现在这种“云”里“雾”里的浮躁年代，多解决些问题，多拓展些行业，少吹点牛皮，少扯点概念，或许更好。</p>
]]></content:encoded>
			<wfw:commentRss>http://hmfly.info/2011/11/28/%e5%85%a8%e7%90%83%e5%93%ba%e4%b9%b3%e5%8a%a8%e7%89%a9%e5%88%86%e5%b8%83%e5%9b%be/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Geospatial Revolution</title>
		<link>http://hmfly.info/2011/11/16/geospatial-revolution/</link>
		<comments>http://hmfly.info/2011/11/16/geospatial-revolution/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 11:44:31 +0000</pubDate>
		<dc:creator>hmfly</dc:creator>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[geospatial]]></category>

		<guid isPermaLink="false">http://hmfly.info/2011/11/16/geospatial-revolution/</guid>
		<description><![CDATA[Pennsylvania State University制作的『Geospatial Revolution』系列视频制作精美、内容丰富，通过一个个真实案例，介绍了地理空间技术在各个领域的广泛应用，包括灾难、军事、政府、商业和科研等等，还有多位业内大佬倾情出演～ 下面是具体内容，总共分四个Episode： The first episode covers what is involved in the geospatial revolution, the origins of mapping and geospatial technology, and a look at the use of crisis mapping in Haitian earthquake relief efforts. &#160; The second episode looks at how local governments and business use geospatial technology to deliver services and [...]]]></description>
			<content:encoded><![CDATA[<p>Pennsylvania State University制作的『Geospatial Revolution』系列视频制作精美、内容丰富，通过一个个真实案例，介绍了地理空间技术在各个领域的广泛应用，包括灾难、军事、政府、商业和科研等等，还有多位业内大佬倾情出演～</p>
<p>下面是具体内容，总共分四个Episode：</p>
<p>The first episode covers what is involved in the geospatial revolution, the origins of mapping and geospatial technology, and a look at the use of crisis mapping in Haitian earthquake relief efforts.</p>
<p align="center"><embed src="http://www.tudou.com/v/57GAqBqq4iY/&amp;rpid=94136585/v.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="480" height="400"></embed> </p>
<p>&#160;</p>
<p>The second episode looks at how local governments and business use geospatial technology to deliver services and run efficiently, keeping a continuing eye on future developments and applications.</p>
<p align="center"><embed src="http://www.tudou.com/v/EJqHsCy59QE/&amp;rpid=94136585/v.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="480" height="400"></embed> </p>
<p>&#160;</p>
<p>The third episode explores geospatial technology in the world of security: how new technologies help to broker peace, wage war, and fight crime but can also compromise personal privacy.</p>
<p align="center"><embed src="http://www.tudou.com/v/McSTXRxyhYQ/&amp;rpid=94136585/v.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="480" height="400"></embed> </p>
<p>&#160;</p>
<p>The fourth and final episode explores geospatial technology around the world: monitoring global climate change, preventing famine, tracking disease and mapping communities never before seen on a map.</p>
<p align="center"><embed src="http://www.tudou.com/v/8zM0HW41iJ0/&amp;rpid=94136585/v.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="480" height="400"></embed></p>
]]></content:encoded>
			<wfw:commentRss>http://hmfly.info/2011/11/16/geospatial-revolution/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

