为什么要这么做
把地图加到你的网站或者应用里有许多种方法,比如使用Google Maps, Mapbox, Leaflet等。
而且用法很简单,有些服务商甚至只需您点击几下即可完成。
但是当你需要自定义设计,显示一些数据集或做你想做的其它事情时,它会变得越来越糟糕。而且,在Vue或React中你只能调用抽象好的javascript API,而不能使用JSX来渲染。
另外,好多库对私人项目也不是免费的。
所以,当我再一次要在地图上显示一些数据时,我决定:我要完全控制我的代码,然后用更好的方式创建我自己的地图。
第1步:创建静态地图
让我们用vue-cli 3,Babel和sass开始创建我们的应用程序开始
我们需要D3和d3-tile(它不包含在d3的npm包中)来渲染地图块。
|
|
实际上我们不需要整个d3代码。对于一个简单的地图,我们只需要用d3-geo生成地图投影,用d3-tile生成切片。
接下来我们应该定义一些设置,如比例,宽度,高度和初始坐标。通常,我在mount时通过计算图表容器所在元素的大小动态确定图表大小。
现在定义投影生成器和切片生成器。
我总是把可计算的属性用到d3的函数中,因此当某些参数更改时,Vue会重新计算它们并更新我们的组件。
现在我们拥有了显示地图所需的一切,我们来渲染生成的图块:
在这里,我们由d3-tile生成切片,再从切片服务器请求图像。
您可以在这里找到其他服务商,或者甚至可以使用自定义样式托管自己的服务。
不要忘记添加版权。
|
|
现在我们有了卡萨布兰卡的静态地图。
第2步:添加地图控件
对我来说最令人兴奋的是Vue如何简化创建交互式地图的方式。我们只是更新了投影参数,地图就会同步更新。
我们将来制作缩放按钮和拖动方式的位置控制。
让我们从拖动开始吧。
我们需要在组件数据中定义投影转换属性,在svg元素上定义一些鼠标事件监听(或者你可以在tiles组上监听它们)。
|
|
哇!我们只是更新了translate的值,新图块就已经加载了。我们可以探索世界了。但是还没有变焦控制,让我们来实现它。
我们把scale
加到组件的data中,并添加zoom属性和渲染缩放按钮。
根据我的经验,最小和最大平铺的缩放级别是10和27(老实说,我不太确定这对所有服务商都是正确的)。
只是两个步骤,我们就使用Vue,D3和OpenStreetMap创建了简单的交互式地图。
结论
使用D3和Vue来创建自己的地图组件并不困难。
最重要的事情之一就是完全控制DOM,而不是使用一些抽象的地图渲染器API。
当然,要制作一个功能强大的地图,我们需要实现更多功能,如平滑缩放,最大边界等。
不过所有的功能都是可定制的,所以你可以尝试你想做或需要的一切。