经常遇到这样一个问题,想要一个县市地图的时候,找不到也买不到shp底图。曾经是淘宝上30元买一个底图,还经常没有最新的shp文件。因此,一直在找一个省钱省力的方法,那么本文告诉你如何自己构建一个shp,并且能够在页面上展示,结果不可思议哦~
本文分成两个部分:
(1)运用Global mapper实现shp或者kmz文件转换
(2)运用R语言的leaflet和leafletCN进行在线地图可视化展示
参考了这个回答:怎么利用百度地图API获取某个地区区域轮廓矢量图(链接:
https://zhidao.baidu.com/question/489614574694756692.html)
第一步:新建记事本:把上边链接页面的代码粘贴进去
第二步:把txt文件转为HTML文件(改后缀)
第三步:打开链接,输入一个地方,比如:我喜欢的桐乡市
百度地图API获取一个地方边界经纬度
第四步:复制下边的经纬度,然后粘贴到csv文件中,进行分列,整理后如图所示,经度(lon)一列,纬度(lat)一列(经验告诉,先分列分号,然后转置,再分列逗号和空格)。
此时边界的经纬度数据已经准备好了,在csv文件两列中。
整理经纬度为两列
2.运用Global Mapper转化为矢量图(shp、kmz等)
个人觉得Global Mappe比arcgis读取数据快对了,所以习惯用Global Mappe来进行,当然可以用arcgis实现,这个方法网页搜索一下就能实现。
第一步:Global Mappe导入csv:
在此,有一个问题需要指出来,我的边界是用百度地图的经纬度,所以,如果是用wgs84坐标系的话,那么经纬度是需要进行转化的,关于坐标转化(百度转为WGS84),可以查看我的文章:R语言:如何实现百度、高德、谷歌地球坐标系互相转换?
(链接:https://zhuanlan.zhihu.com/p/40355546)
第二步:转为矢量图
选择:File-Export Vector Format
导出,保存,就变成线图了!转换速度非常快,很便捷。
此时,你已经获得了一个桐乡市的矢量图了~相当于自己制作的哦^_^
第一步:加载需要的包:
library(leaflet)library(leafletCN)library(geoChina)library(maptools)
第二步:导入上边准备的csv数据,转换坐标系
##原始数据为百度地图数据,需要转为高德地图经纬度map = read.csv('tongxiangbaidumap.csv', header = TRUE,encoding='UTF-8')mapgcj=bd2gcj(map$lat,map$lon)
第三步:在线地图可视化
leaflet() %>% amap() %>% addPolylines(data=mapgcj,~lng,~lat,color='blue')
总结:leaflet包功能强大,这只用到了它的addPolylines函数,其他多种方法可以拓展学习。现在能够自己制作一个地方的shp了,也终于不再烦恼到处找人要底图,所以分享给大家,感觉这个方法非常非常棒~希望能够帮到大家。跟大家一起学习~
联系客服