SHSubway项目笔记3-D3+LeafLet绘图
最近又把之前读的论文找出来重读,寄希望在反复阅读中能找到灵感,这个过程有点难过,就像刚刚接触一样东西,盲人摸象一样,好像知道它大概是个什么,又深觉不得要领。
而读论文又不像写代码,可以明确的知道写了多少行,做了什么效果。成果很难衡量,所以最近常常苦恼。
下面继续整理最近解决的问题,结构目录如下:
- 1.在leaflet绘制的地图上,用D3添加元素
- 2.JavaScript的Date对象,加上一段时间
- 3.line chart的转折点的光滑处理
- 4.D3坐标轴样式
1.在leaflet绘制的地图上,用D3添加元素
需求就是像下图这样,在渲染好的地图上使用svg绘制各个地铁站点以及线路的信息。
已有的数据是各个站点的经纬度坐标,问题就是怎样将这些坐标对应到地图上相应的点。
这里用到了leaflet的一个函数latLngToLayerPoint
这是一篇专门介绍latLngToLayerPoint使用的博客:
http://bl.ocks.org/d3noob/9267535
在使用这个函数的过程中,我遇到了一个问题,随着地图的缩小,原来相对精准的点偏移的越来越严重,最后飘到了海里去……
后来发现是理解上的错误,我原以为latLngToLayerPoint是在点原有坐标(31.xxx,121.xxx)的基础上做偏移,这样就需要在circle元素上设置cx, cy,然后再transform,像下面这样:
1 | stations |
这里补充说明一点,当circle元素的cx, cy未设置的时候,circle的圆心在页面的坐标原点上。
其实,latLngToLayerPoint是相对于页面的原点偏移的,即不需要设置cx, cy即可,所以我相当于在精确位置上,多加了cx, cy,当地图很大的时候,这个值微乎其微;而当地图缩到很小的时候,就严重偏移了。去掉上面代码中注释的两个attr就恢复正常了。
2.JavaScript的Date对象,加上一段时间
如题,我想在下面time上增加一小时
1 | var time = new Date('2016 5 27 22:20:00 +0800'); |
于是,我就想到了这样:
1 | var time = new Date('2016 5 27 22:20:00 +0800'); |
如你所见,它真的就在末尾加了3600000ms ,输出了这样一串 Fri May 27 2016 22:20:00 GMT+0800 (中国标准时间)3600000
搜了一下这个问题,解决办法如下:
1 | var time = new Date('2016 5 27 22:20:00 +0800'); |
3.line chart的转折点的光滑处理
先看一下对比图
原生的图转折点很锋利,而D3中圆滑化处理也很方便,只需要加.interpolate(“basis”),如下:
1 | var line = d3.svg.line() |
Smoothing out the lines in d3.js这篇文章有更细致的说明
4.D3坐标轴样式
之前看到百度地图的出租车OD平台,很喜欢他的数据图。
刚巧在D3的官网上发现了一组坐标轴样式,其中一个可以实现上图的效果,更多样式见:
https://github.com/d3/d3/wiki/SVG-Axes