<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Google-API on Chang Luo</title>
		<link>https://www.luochang.ink/tags/google-api/</link>
		<description>Recent content in Google-API on Chang Luo</description>
		<generator>Hugo</generator>
		<language>zh-CN</language>
		
		
		
		
			<lastBuildDate>Wed, 10 Apr 2019 00:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://www.luochang.ink/tags/google-api/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>【项目】TSP旅行路线规划</title>
				<link>https://www.luochang.ink/posts/tsp_route/</link>
				<pubDate>Wed, 10 Apr 2019 00:00:00 +0000</pubDate>
				<guid>https://www.luochang.ink/posts/tsp_route/</guid>
				<description>&lt;!--原题：用Jupyter notebook规划旅行路线--&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/tsp-route&#34; target=&#34;_blank&#34;&gt;tsp-route&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;对于在欧洲的小伙伴们，复活节假在这一周就正式开始啦。大家都是怎么计划旅行的呢？&lt;/p&gt;&#xA;&lt;p&gt;我的习惯是在出发前最后一晚，花上半小时，搜索目的地景点 (Point of interest, POI), 然后在Google Maps上为它们点上小星星，以免和它们擦肩而过。我的地图经过一番操作，就成了下面这副模样。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.luochang.ink/img/bristol.png&#34; alt=&#34;攒满了小星星&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;此时此刻，望着这些密集的星星，我不禁自问：如何才能走最少的路，遍历所有景点呢?&lt;/p&gt;&#xA;&lt;p&gt;搜索了谷歌和百度，都没找到我要路径规划功能。最接近需求的是谷歌地图的&amp;quot;Add destination&amp;quot;功能。然而这个功能只是依次连接你点选的地点。并不能由一组地点，确定连接它们的一条全局最短路径。&lt;/p&gt;&#xA;&lt;p&gt;没有现成应用怎么办，我打算自己动手写一个。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;下图是Google Add destination功能。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.luochang.ink/img/googlemap.JPG&#34; alt=&#34;Add destination 功能&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;适用模型tsp-模型&#34;&gt;适用模型：TSP 模型&lt;/h3&gt;&#xA;&lt;p&gt;用一句话概括需求就是：我们需要一条从某地方出发，遍历所有地点，最终回到起点的最短路径。&lt;/p&gt;&#xA;&lt;p&gt;这个需求其实就是运筹学的一个经典问题，旅行商问题(TSP)。旅行商问题的确切描述是这样的：一个商人在各个城市之间旅行，要求遍历所有城市并返回到出发点，要如何规划路线，才能使总路径最短。（打开&lt;a href=&#34;https://zh.wikipedia.org/wiki/%E6%97%85%E8%A1%8C%E6%8E%A8%E9%94%80%E5%91%98%E9%97%AE%E9%A2%98&#34; target=&#34;_blank&#34;&gt;维基百科&lt;/a&gt;了解更多)&lt;/p&gt;&#xA;&lt;h3 id=&#34;解决思路&#34;&gt;解决思路&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;用googlemaps包获取纬度和经度信息&lt;/li&gt;&#xA;&lt;li&gt;用OR-Tools包求解TSP问题&lt;/li&gt;&#xA;&lt;li&gt;最后用gmaps可视化结果&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;在敲代码的过程中，最难的地方莫过于看文档查API, 搞清楚输入输出和调用结构。不过敲完这一顿之后我还是不禁感慨，Google 太为开发者着想了。一旦学会调用API，实现一个简单应用的代码量还是很小的 orz&lt;/p&gt;&#xA;&lt;h3 id=&#34;食用指南&#34;&gt;食用指南&lt;/h3&gt;&#xA;&lt;p&gt;项目地址 &amp;ndash;&amp;gt; &lt;a href=&#34;https://github.com/luochang212/tsp-route&#34; target=&#34;_blank&#34;&gt;传送门&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;在运行代码之前，你需要以下配置：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;一个Jupyter Notebook. &lt;!--推荐安装Anaconda3，Anaconda3自带Jupyter Notebook和全套Python依赖.--&gt;&lt;/li&gt;&#xA;&lt;li&gt;你需要安装这些包：googleplaces, googlemaps, gmaps, ortools.&lt;/li&gt;&#xA;&lt;li&gt;你需要一个Google Maps API key, &lt;a href=&#34;https://developers.google.com/maps/documentation/distance-matrix/start#get-a-key&#34; target=&#34;_blank&#34;&gt;从这里获取API&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;完成配置等于成功的一半。在Jupyter notebook打开&lt;code&gt;TSPSolver.ipynb&lt;/code&gt;，将第二个代码块的所有变量，改成自己的，比如自己的目的地自己的区域和自己的API密码……最后从头到尾运行所有代码块，你就可以得到自己的定制路线辣~&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.luochang.ink/img/my_route.JPG&#34; alt=&#34;my route&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;配置代码如下。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# input the places of interest (POI)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;places &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;YHA London Central Hostel&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;Coca-Cola London Eye&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;St. Paul&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;\&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;s Cathedral&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;Leadenhall Market&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;The National Gallery&amp;#39;&lt;/span&gt; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;Big Ben&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;Buckingham Palace&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;Waterloo Station&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# the region&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Location&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;London&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# choose a mode&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Mode &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;walking&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#57606a&#34;&gt;# &amp;#34;driving&amp;#34;, &amp;#34;walking&amp;#34;, &amp;#34;bicycling&amp;#34;, &amp;#34;transit&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# get Google API key from following website: &lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# https://developers.google.com/maps/documentation/distance-matrix/start#get-a-key&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;password &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;YOUR_GOOGLE_API_KEY_HERE&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&#xA;&lt;center&gt; 欢迎Star, Pull, Pr.&lt;/center&gt;</description>
			</item>
	</channel>
</rss>
