python经纬度转化为xy坐标系,python经纬度转xy坐标的函数

  python经纬度转化为xy坐标系,python经纬度转xy坐标的函数

  导读最近有博主在做地理数据可视化的研究。pyecharts提供了一个很好的工具,它提供了很多图形,尤其是地图和Geo,其中一个是地图,另一个是地理信息地图。PyCharts的基础是echart,这是一个开源的JS库,用于百度地图的数据可视化。从我个人使用来看,目前PyCharts(博主pyecharts版本为0.5.11)有这两个问题:

  这张地图不够精确。目前pyecharts提供的地图级别有世界地图、各国地图、中国各省地图、中国各城市地图、区县地图。一旦到了区县,就不细分了。如果我想看某条路的具体信息,那就很难实现了。经纬度定位“不准确”。不属于pyecharts是问题,应该属于百度地图的地理编码特征。当然不是说百度地图的地理编码不准确,而是博主目前正在做的项目。地理位置比较特殊,很难用百度地图或者AMap(高德地图)定位的特别准确。由于pyecharts的底层地图是百度地图,因此似乎pyecharts的定位“不准确”。要解决第一个问题,就是想要一个更高级别的地图,就需要改变可视化包,也就是把pyecharts改变成一个包含其他更高级别的地图的可视化包。博主用的是叶,这个包也很厉害。pyecharts的优势在于其与echart的可视化功能,而folium则体现在地图及其扩展应用中。Folium目前支持OpenStreetMap、AMap等地图,不支持百度地图。曾经吐血,为什么我用过的两个包的底图不能通用?但其实博主为了用好这两个包,研究了百度和高德的开发文档,现在记录了他们的地理编码方法。

  开发环境:

  Python3.7肾盂造影0 . 5 . 11;Pycharm百度地图地理编码开发文档在这里。使用前需要申请AK,最好申请开发者认证,可以提高准入限制。其实开发文档写的很详细,无非就是爬虫get和json解析。我会直接上传代码。

  import JSON import pandas as PD import numpy as NP from URL lib . request import URL open,Quote import requests def scene 2 coordinate Baidu map(filename):data=PD . read _ CSV(filename)result=[]I=1j=1 for k in data[ place ]:address=Quote(k)# 1 URL= http://API . map . Baidu . com/geocoder/v2/?address= address output=JSON AK=your AK # 2 req=urlopen(URL)RES=req . read()。decode()temp=JSON . loads(RES)try:# 3 result . append(temp[ result ][ location ])print( catch %d \ N % I)I=I 1 except:result . append({ lat : null , LNG : null })print( fail % d \ N % j)j=j 1 print(成功定位% d个片段,成功率% .2f%%% (I-1,(I-1)* 100/(I j-2))df=PD . data frame(result访问百度地图API返回的数据都是json格式的数据。要分析数据,json包、熊猫、numpy常规包自然少不了,基本都难以避免。后两个是web数据采集的包。高德的地图地理编码也是其中的一个包,所以后面不再赘述。

  一些注意事项:

  # 1报价功能是获取GBK的网址代码,国内网站代码都是GBK代码;

  #2把url中的AK改成你申请的AK,而不是字符串yourAK

  #3为什么要用尝试来处理它?因为不是所有的地理编码都能成功。如果不使用try来处理,很容易报错,程序就会中断。

  这个函数写的很详细。如果您提供一个包含名为“地点”的列的CSV文件,您可以将所有填写的地点转换为纬度和经度。当然也有不成功的,总体成功率在95%左右。总的来说定位效果还可以,但是如果很多位置数据填写不规范,虽然通过地理编码解决了经纬度,但是很多都有问题,比如解决的点不在正确的位置,如下图所示。

  这些点都应该出现在无锡的地图上,但是还有很多点在无锡以外,也就是说分析不正确。有什么问题?Blogger再次回头看文档,它说请求的参数不仅是address,还有city,也就是城市。不要求写入该参数。如果是写的,会正确吗?于是,我找了一个落在无锡地图外的点,把请求网址写成这样:

  http://api.map.baidu.com/geocoding/v3/?地址=城市=南湖大道双清桥公交站前=output=JSON AK=your AK callback=show location。返回的数据如下:

  show location show location({ status :0, result :{ location :{ LNG :120.31700801956372, lat: 31.5378952709309}, precision: 0, confidence :

  博主不知所措。早上明显不对,就想到写博客解决这个问题。回头看,因为我早上写的请求URL是这样的:

  http://api.map.baidu.com/geocoding/v3/?地址=南湖大道双清桥公交站前的城市=无锡市输出=JSON AK=your AK callback=show location无锡市。我在里面放了引号,但是没必要放引号。

  所以,其实在请求URL中加入城市名称,可以保证经纬度转换时所有点都落在你想要的城市里。

  不停吐血,这个博客还要写吗?我早上已经按照我的解决方案,高德地图地理编码高德地图到百度地图pyecharts位置上面,这个套路,分析了3000的位置。

  我已经写了3000多字了,继续写吧。

  点击此处查看高德地图地理编码开发文档。

  技术细节和百度地图基本相同。我改变了请求的格式,以便读者可以更灵活地使用爬虫的技能。

  上部代码

  DEF Scene2坐标amap(文件名):data=pd.read _ csv(文件名)SGDD=data [事故现场]。to list()geo=[]key= your key base= 3359restapi.amap.com/V3/geocode/geo j=1k=1 for I in range(len(SGDD)):parameters={ address :SGDD[I], key: key, city :无锡 } response=requests.get(base,parameters)answer=response . JSON()try:pos=answer[ geocodes ][0][ location ]pos=pos . split(,),pos[1]=pos[1],pos[0] geo.append index=false,columns=[LNG , LAT]) print(成功定位%d,成功率% .2f%) (j-1) * 100/(j k-2)))为什么我写了无锡? 你能理解吗?我的高德就是这么写的。

  如你所见,和百度的地图请求方式有点不同。我使用requests.get来请求。事实上,更多的在线推荐是通过这种方式请求的,而不是使用urlopen。不过我个人习惯用urlopen。哪种方式都可以。

  事实上,从高德到百度地图,没有必要写经纬度,因为两者差不多。

  在这里看文档,上传代码。

  def AMap2BaiduMap(文件名):data=pd.read_csv(文件名)base= http://API . map . Baidu . com/geoconv/v1/?coords= tail= from=3to=5ak=your AK trans pos=[]j=1k=1 for I in range(len(data)):URL=base str(data . iloc[I][ LNG _ Amap ]), str(data . iloc[I][ lat _ Amap ])tail req=URL open(URL)RES=req . read()。decode()temp=JSON . loads(RES)try:pos=list(temp[ result ][0]。values())# dictionary turn list trans pos . append(pos)print( catch % d \ N % j j=J1 except:trans pos . append([ null , null ])print( fail % d \ N % k)k=k1 tran=PD . data frame(trans pos)tran . to _ csv(高德到百度. CSV ,index=false,columns=[LNG , lat]) print(成功转换% d,成功率% .2f%% )

  从=3到=5,官方文件解释如下:

  源坐标类型:

  1:1:GPS设备获取的角度坐标,WGS84坐标;

  2:通过2获得的公制坐标:GPS和搜狗地图使用的坐标;

  3:3的坐标:谷歌地图、搜搜地图、阿里云地图、mapabc地图、amap地图,GCJ02的坐标;

  公制坐标对应于4: 3中的列表地图坐标;

  5:百度地图采用的经纬度坐标;

  6:百度地图采用的公制坐标;

  7: Mapbar地图坐标;

  8: 51地图坐标

  目标坐标类型:

  5: BD 09LL(百度经纬度坐标);

  6: BD 09 MC(百度公制经纬度坐标)

  我从高德经纬度到百度经纬度,自然从=3到=5。

  换算经纬度后看pyecharts-Geo地图。

  都在无锡了,也搞定了,虽然没用()

  结束

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: