python车辆路径优化_构建⼀个pip安装的车辆路径显⽰的
python包
最近有⼀些车辆的gps数据要分析,想着能否先直观地感受下车辆的运⾏情况,正好有leaflet地图库,做起来很⽅便。简单实现了基本需求后,想着能不能封装下,弄成个python包的形式,这样可以在其他地⽅使⽤pip安装,在程序⾥import调⽤,也显得简洁。
基本效果
基本功能实现
html页⾯借助leaflet实现由地理坐标和时间列表数据产⽣的动态轨迹。
数据获取利⽤jinja2模板渲染,直接往html模板(即path_template)中填充数据(经纬度,对应时间,以及轨迹运⾏快慢即时间间隔)。
最后保存渲染好的html⽂件到本地。
代码如下,很简单,就是⼀个模板变量加⼀个函数,仅供参考。将该⽂件保存为car.py。
# -*- coding: utf-8 -*-
from jinja2 import Template
path_template = '''
车辆路径图
var app = new Vue({
el: '#mapid',
data: {
message: 'Hello Vue!',
latlngs: [
{% for lat,lng in latlngs %}
[ {{ lat }}, {{ lng }} ],
{% endfor %}
],
time: [
{% for i in times %}
'{{i.hour}}:{{i.minute}}:{{i.second}}',
{% endfor %}
],
num: 0,
colors: ['purple', 'pink', 'orange', 'yellow', 'green', 'blue'],
deltatime: {{ deltatime }},
},
mounted: function () {
this.$nextTick(function () {
// 代码保证 this.$el 在 document 中
this.initMap();
this.addButton();
setTimeout(this.pathRun, 1000);
})
},
methods: {
initMap() {
zoom: 7, //初始聚焦程度
center: this.latlngs[0], // [lat, lng] [纬度, 经度]
minZoom: 3, //最宽⼴,越⼩越宽⼴
maxZoom: 18, //最细致,越⼤越细致
});
L.tileLayer(
'webrd0{s}.is.autonavi/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}', { subdomains: ["1", "2", "3", "4"], //可⽤⼦域名,⽤于浏览器并发请求
attribution: "© ⾼德地图", //可以修改为其它内容
}).ap); //添加tile层到地图
this.marker = L.marker(this.latlngs[0]).ap);
this.marker.bindPopup(this.time[0]).openPopup();
},
genPath() {
L.polyline(this.latlngs).ap);
this.runline = L.polyline([], {color: 'red'}).ap);
},
pathRun(){
if ( this.num > (this.latlngs.length-1) ){
this.num = 0
}
this.marker.setLatLng(this.latlngs[this.num])
Popup().setContent(this.time[this.num])
this.runline.addLatLng(this.latlngs[this.num])
this.num += 1
if (this.changeView != null){
this.changeView()
}
setTimeout(this.pathRun, {{deltatime}})
},
addButton() {
L.easyButton('fa-refresh', fresh).ap); L.easyButton('fa-taxi', this.follow).ap); this.followstate = false;
},
refresh() {
},
follow() {
if(this.followstate == true){
this.followstate = false;
this.changeView = null;
this.marker.closePopup();
}
else{
this.followstate = true;
this.changeView = this._changeView ;
this.marker.openPopup();
}
},
_changeView(){
},
}
})
'''
def producePath(latlngs, times, deltatime=50, filename="./path_rendering.html"):
rendering = Template(path_template).render(
latlngs = latlngs,
times = times,
deltatime = deltatime,
)
with open(filename, 'w', encoding='utf-8') as path_rendering:
path_rendering.write(rendering)
封装为python包并上传
制作python包稍微有点⿇烦,之前做了个简陋的脚⼿架⼯具帮助我创建⼀些基本的⽂件,省得再动⼿了。
python默认安装路径使⽤pip install mwrz安装该⼯具,然后在⼯作⽬录下执⾏命令⾏fastpypi --packagename=carpathview产⽣⼀个myNewPackage的⽂件夹,⾥⾯有个名为carpathview的包及⼀些基本⽂件。
按照命令⾏输出的提⽰,我们需要先修改myNewPackage⽂件夹中的.pypirc⽂件,将your_username和your_password改为你的⽤户名和密码,如果没有的话先去pypi与testpypi注册。修改好之后将它剪切到⽤户配置⽬录,windows下使⽤echo %HOMEPATH%命令到该⽬录。
然后修改setup.py⽂件,⾸先这次不需要产⽣命令⾏脚本,注释掉scripts所在⾏,然后由于我们的程序使⽤了2.9版本的jinja2,在
install_requires⾏添加依赖库,改为install_requires = ['jinja2>=2.9'],,其他作者之类信息看情况修改,关系不⼤。项⽬说明写在README.md⽂件中。
进⼊carpathview包中,这是真正的项⽬⽬录。删除pyScript.py,将car.py拷贝到当前⽬录。修改__init__.py,添加⼀⾏from .car
import *,这⾥使⽤了相对引⼊。
最后回到myNewPackage⽬录下,使⽤提⽰的四个命令进⾏上传即可。
python setup.py register -r pypitest
python setup.py sdist upload -r pypitest
python setup.py register -r pypi
python setup.py sdist upload -r pypi
下载测试
然后就可以在程序中简单使⽤from carpathview import producePath调⽤该函数实现功能了。
其他
动态轨迹看到个⽤d3产⽣的效果,⽐较漂亮,不过当前这个简陋版已经满⾜我的需求,就不烦了。
本来想使⽤现成的plotly的地图效果,可惜⽀持好像不太好。
写完两天后,突然发现⼀个python-leaflet的库 - folium。在开源世界探索真像淘⾦,不知道什么时候你的痛点别⼈也遇到过,⽽且留下了解决⽅案。使⽤效果如下,还是很不错的,基本需求使⽤起来⾮常⽅便,但是特定场景还是需要再费⼯夫的。很巧,它也使⽤了jinja2,哈哈。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论