代码改变世界

Google静态地图-如何显示两点之间路线2(url过长问题)

2012-01-17 10:16  快乐乔巴  阅读(2948)  评论(0编辑  收藏  举报

URL的长度限制

上一篇Google静态地图-如何显示两点之间路线(简单路线)中,简单介绍了如何利用google static map api返回两点之间行车的路线,我们来看一下冈山京都步行路线(行车路线的拐点太少),代码中两个点改成冈山和京都,然后路线类型改成步行mode=walking,执行程序看下结果~

 

天呐,怎么回事~看下url的内容:

http://maps.google.com/maps/api/staticmap?sensor=true&size=400×400&path=color:0x0000ff|weight:5| 34.6601800,133.9178300|34.6601900,133.9184900|34.6601900,133.9184900| 34.6602000,133.9189400|34.6602000,133.9189400|34.6603000,133.9190300| 34.6603000,133.9190300|34.6602100,133.9194700|34.6602100,133.9194700| 34.6601500,133.9200000|34.6601500,133.9200000|34.6591800,133.9200800| 34.6591800,133.9200800|34.6591600,133.9203300|34.6591600,133.9203300| 34.6584100,133.9204300|34.6584100,133.9204300|34.6584000,133.9210200| 34.6584000,133.9210200|34.6581400,133.9215800|34.6581400,133.9215800| 34.6576700,133.9215900|34.6576700,133.9215900|34.6576600,133.9224700| 34.6576600,133.9224700|34.6574200,133.9224800|34.6574200,133.9224800| 34.6573700,133.9227700|34.6573700,133.9227700|34.6569200,133.9227900| 34.6569200,133.9227900|34.6569300,133.9230700|34.6569300,133.9230700| 34.6510800,133.9274600|34.6510800,133.9274600|34.6503100,133.9321500| …

统计了一下长度居然高达1万字符太长了,所以在此省略了…,这怎么办呢。

折线编码

我们来看看Google Static Maps API V2 开发人员指南中的一处说明:

编码折线

除了使用一组位置,您还能够以编码折线的形式声明路径,方法是在 path 的位置声明中使用 enc: 前缀。请注意,如果为地图提供编码折线路径,就无需指定通常必须指定的 center 和 zoom 参数。

http://maps.google.com/maps/api/staticmap?size=400x400&path=weight:3|color:orange|enc:polyline_data

编码折线??我们去看看这是什么东东:编码折线。里面似乎讲了一些算法,有兴趣的朋友可以自己研究下,简单的来说就是把一个个坐标点进行编码,使其编码后的字符更加简短~~ 例如:

点:(38.5, -120.2)、(40.7, -120.95)、(43.252, -126.453)

编码折线:_p~iF~ps|U_ulLnnqC_mqNvxq`@

似乎看不出长度缩短到哪去,别急,坐标点越多效果越明显~

就比如我们冈山到京都步行路线的例子,统计了下大概有500个坐标点(够长了吧),那如何得到这500个坐标点的折线编码呢?还记得上一篇文中提到的Google Geocoding API位置之间路线服务吗~没错,我们的坐标点也是从那个xml中取的,那么折线编码其实也在其中了。

这是冈山到京都的步行路线

http://maps.google.com/maps/api/directions/xml?origin=34.660322,133.917847&destination=35.014252,135.769043&mode=walking &sensor=false

打开网页,查找源代码中xml的overview_polyline节点下的points节点,里面的内容就是500个坐标点的折线编码:

cqprEmyjpXFuLxIqAnEsMzd@qPfEah@fF^fm@oYzVwb@fa@crAtgCq{BuBsGz`@_R}CyE|EuDyI{QdHiKhC`DdBsB_LeQyDyWhLsXlc@smEbl@szA|hOuuPlj@aaAja@csBvZsj@vNcB}QzH}Lv`@eEbhAnLfu@bQ`]jt@~m@z`UpfMfzAjeAm`B{gBunBknDo\qx@maAmhDuMerBdOgnEcDssAs\suFw_@osBgWih@sPkPibGeaCs_Aor@gi@yq@?wfA~Okj@jf@}Nfj@fMzIvJnM{ExGjFqBiU~EeJpH_A~@|KpIdD|vAjBrc@oDv`@uLlh@m_@xs@g~@zPif@nR{jAm@ir@uqPmpq@{sK_ub@mrGojXw_@soCsJqwBkCei[mIuhEgLcrA}Mwm@eVwl@{SoTshGm_@ag@ic@yN_`@~Ute@dZnMnjCwvAfr@|Lrc@`h@fa@e@nJ_EzTa[t[ouAtG}|@ImdAwf@ghKmVakCiHq|JrW{qAli@orErF[s[kuArI_xAe@we@kPz@oOmp@mc@uc@iGE}@cLya@Xqd@}K_h@vAiUg^oy@kDaaAcScdAjC{MdFsVkYcm@l@sJuUwDMgu@kdAmk@wAgd@pKuJmRy_@q]sOu]{UmHkNqs@}q@m~@cPie@w\kPkTm@}HgF{j@ywAgU?uH_IaxDk_FoN{M_iA_NicByfB}BwVuLmKe_BohAmQvD_A}S_a@uXuMsZ_tDclDcSu[se@sWmx@kwAazA{f@H_`@_|AwcB}f@aPyEwg@mp@mPcE}S}n@cz@{l@oe@wCvBiKcIyuBk@c~@q_@kjA~A

统计下共818个字符,哇~是不是跟刚才1万字符比起来少了很多很多呢~好了,我们来试验下吧~~注意折线编码前面要加上enc:这样的前缀。我还是全写出来吧~

http://maps.google.com/maps/api/staticmap?sensor=true&size=400x400&path=color:0x0000ff|weight:5| enc:cqprEmyjpXFuLxIqAnEsMzd@qPfEah@fF^fm@oYzVwb@fa@crAtgCq{BuBsGz`@_R}CyE|EuDyI{QdHiKhC`DdBsB_LeQyDyWhLsXlc@smEbl@szA|hOuuPlj@aaAja@csBvZsj@vNcB}QzH}Lv`@eEbhAnLfu@bQ`]jt@~m@z`UpfMfzAjeAm`B{gBunBknDo\qx@maAmhDuMerBdOgnEcDssAs\suFw_@osBgWih@sPkPibGeaCs_Aor@gi@yq@?wfA~Okj@jf@}Nfj@fMzIvJnM{ExGjFqBiU~EeJpH_A~@|KpIdD|vAjBrc@oDv`@uLlh@m_@xs@g~@zPif@nR{jAm@ir@uqPmpq@{sK_ub@mrGojXw_@soCsJqwBkCei[mIuhEgLcrA}Mwm@eVwl@{SoTshGm_@ag@ic@yN_`@~Ute@dZnMnjCwvAfr@|Lrc@`h@fa@e@nJ_EzTa[t[ouAtG}|@ImdAwf@ghKmVakCiHq|JrW{qAli@orErF[s[kuArI_xAe@we@kPz@oOmp@mc@uc@iGE}@cLya@Xqd@}K_h@vAiUg^oy@kDaaAcScdAjC{MdFsVkYcm@l@sJuUwDMgu@kdAmk@wAgd@pKuJmRy_@q]sOu]{UmHkNqs@}q@m~@cPie@w\kPkTm@}HgF{j@ywAgU?uH_IaxDk_FoN{M_iA_NicByfB}BwVuLmKe_BohAmQvD_A}S_a@uXuMsZ_tDclDcSu[se@sWmx@kwAazA{f@H_`@_|AwcB}f@aPyEwg@mp@mPcE}S}n@cz@{l@oe@wCvBiKcIyuBk@c~@q_@kjA~A

点击上面的链接,冈山到京都的步行路线图片就显示出来了~呵呵,步行路线有些诡异,居然跑海上了~

顺便把C#代码也发一下吧:

 1 protected void Page_Load(object sender, EventArgs e)
2 {
3 //开始地点(冈山)
4 string start = "34.660322,133.917847";
5
6 //到达地点(京都)
7 string end = "35.014252,135.769043";
8
9 string url = "http://maps.google.com/maps/api/directions/xml?" +
10 "origin=" + start +
11 "&destination=" + end +
12 "&mode=walking" +
13 "&sensor=false";
14
15 XmlDocument doc = new XmlDocument();
16 doc.Load(url);
17
18 if (-1 == doc.InnerXml.IndexOf("<status>OK</status>"))
19 {
20 return;
21 }
22 //取出折线编码
23 XmlNode node = doc.SelectSingleNode("//overview_polyline/points");
24 string points = node.InnerText;
25
26 string imgUrl = "http://maps.google.com/maps/api/staticmap?sensor=true&size=400x400&path=color:0x0000ff|weight:5|enc:" + points;
27
28 Response.Redirect(imgUrl);
29 }

解决问题了? 有朋友要问了…如果折线编码的长度也太长了怎么办呢?

是的没错,这还没有本质上解决问题~况且在一些非智能的手机上由于浏览器的不同,长度限制也不同,由于篇幅问题请看下一篇 Google静态地图-如何显示两点之间路线3(url过长–路径简化-完结篇)