查看原文
其他

互联网地图矢量数据Python获取方法

袁荣政 慧天地 2020-09-16

点击左上方蓝色字体“慧天地”即可订阅


1.获取高德地图路况信息


1)不使用密钥的方法(5分钟获取一次,只有全国主要城市)


主要利用的网址是

http://report.amap.com/index.do

 

点北京市,网址

http://report.amap.com/detail.do?city=110000

我们主要需要道路和商圈的实时信息

通过F12,我们可以得到动态的URL链接,根据链接,就可以爬取数据了


道路代码

import pandas as pd

import requests

import time

while True:

   t=time.strftime("%H%M%S",time.localtime())

   r=requests.get("http://report.amap.com/ajax/roadRank.do?roadType=0&timeType=0&cityCode=110000")#可以换成其他城市代码

    s=r.json()

    a=[]

    for i in range(len(s["tableData"])):

        for j in range(len(s["tableData"][i]["coords"])):

            a.append([s["tableData"][i]["coords"][j]["lon"],s["tableData"][i]["coords"][j]["lat"],s["tableData"][i]['name'],s["tableData"][i]['index'],s["tableData"][i]['speed']])

    c = pd.DataFrame(a)

    c.to_csv(t+'road.csv')

    time.sleep(300)


商圈代码

import pandas as pd

import time

import requests

while True:

    t = time.strftime("%H%M%S", time.localtime())

    r=requests.get("http://report.amap.com/ajax/districtRank.do?linksType=3&cityCode=110000")#可以换成其他城市代码

    s=r.json()

    a=[]

    for i in range(len(s)):

        for j in range(len(s[i]['coords'][0][0])):

    a.append([s[i]['coords'][0][0][j]['lon'],s[i]['coords'][0][0][j]['lat'],s[i]['name'],s[i]['index'],s[i]['speed'],s[i]['number']])

    c = pd.DataFrame(a)

    c.to_csv(t+'new.csv')

    time.sleep(300)

   

程序运行后,将会每5分钟自动生成csv文件

每一列数据分别代表序号,经纬度,道路名称,车速(km/s)和高德拥堵指数

2)使用密钥的方法

1.申请key

2.查看url

https://restapi.amap.com/v3/traffic/status/circle?location=116.3057764,39.98641364&radius=1500&key=你的密钥&extensions=all

3.代码

import pandas as pd

import requests

r=requests.get("https://restapi.amap.com/v3/traffic/status/circle?location=116.3057764,39.98641364&radius=1500&key=你的密钥&extensions=all")

s=r.json()

a=s["trafficinfo"]["roads"]

x=[]

for i in range(len(a)):

    s2=a[i]["polyline"]

    s3=s2.split(";")

    for j in range(len(s3)):

        s4=s3[j].split(",")

        x.append([a[i]["name"],a[i]["status"],a[i]["speed"],i,s4[0],s4[1]])

c = pd.DataFrame(x)

c.to_csv('roadss.csv')

   

4.csv结果  排序、路名、车速、路段id、经度、纬度


0,丹棱街,3,10,0,116.311104,39.9787865

1,丹棱街,3,10,0,116.312195,39.978714

2,丹棱街,3,10,0,116.312408,39.9786949

3,丹棱街,3,10,0,116.31282,39.9786491

4,丹棱街,3,10,0,116.313072,39.9786301

5,丹棱街,3,10,0,116.313423,39.9786263

 

5.使用arcgis处理后的结果

 


2.获取高德地图行政边界矢量

1.获取高德地图web服务key

2.行政区域查询API服务地址:

https://restapi.amap.com/v3/config/district?parameters

3.我们以山东省为例,看看山东行政边界

url地址

https://restapi.amap.com/v3/config/district?keywords=山东&subdistrict=0&key=你的密钥&extensions=all

subdistrict=0不返回下级行政区划,共0到3

extensions (base/all)的含义:

base:不返回行政区边界坐标点;

all:只返回当前查询district的边界值,不返回子节点的边界值;

目前不能返回乡镇/街道级别的边界值

4.返回的结果是json,我们看一下形式,使用Notepad++的json查看器

我们要的是polyline,即为行政区边界坐标点

需要注意的是,当一个行政区范围,由完全分隔两块或者多块的地块组成,每块地的 polyline 坐标串以 | 分隔 。我的思路是,先取出polyline部分,再以|分组,接着以;分组,得到一个经纬度的数组。

代码如下:我已将每条线进行了分组,以arcgis便于后续生成线和面(0,"120.903347,38.381733,0")序号,经纬度,组号

import pandas as pd

import requests

r=requests.get("https://restapi.amap.com/v3/config/district?keywords=山东&subdistrict=0&key=你的密钥&extensions=all")

s=r.json()

poly=s["districts"][0]["polyline"]

p=poly.split("|")

x=[]

for i in range(len(p)):

    a=p[i].split(";")

    for j in range(len(a)):

        x.append([a[j].split(",")[0],a[j].split(",")[1],i])

c = pd.DataFrame(x)

c.to_csv('xzqh.csv')

   

至于如何生成shp格式,这就是arcgis的使用问题了,有问题请找arcgis帮助,哈哈

csv文件前几行

,0,1,2

0,120.900577,38.382,0

1,120.900577,38.382,0

2,120.900577,38.382,0

3,120.900577,38.382,0

4,120.900577,38.382,0

5,120.900577,38.382,0

6,120.900577,38.382,0


生成结果图

 


3. python获取人口数据(500m网格)GeoQ智图api

1.注册智图GeoQ,获得api的key

2.分析url

url='http://api.geoq.cn/你的密钥/filterservice/regionfilter'

3.筛选条件

values={

       "codes":"310000",#城市代码

       "extent":[120.9327,30.6014,122.2339,31.8480],#查询空间范围

       "inSR":4326,#坐标系编号,默认3857,返回结果也是3857的

       "grid":"square",#网格形状

       "radius":500,#网格半径,可以更小,最小为250m

       "condition":{"pop":[0,1100000]}#筛选条件,照大的写

}

   

 4.关键代码,本次使用python2,因为python3的requests库始终无法识别刷选条件最后一条condition的条件,该条件是GeoQ规定的条件。本次不使用神器pandas,就用自带的numpy来写,数值分别为经纬度,人口数,分组ID

import urllib2

import urllib

import json

import numpy as np

values={

     筛选条件

    }

requestData = urllib.urlencode(values)

url='http://api.geoq.cn/你的密钥/filterservice/regionfilter'

req=urllib2.Request(url,requestData)

response = urllib2.urlopen(req)

t = response.read()

d = json.loads(t)

d1= d["result"]["features"]

x=[]

for i in range(len(d1)):

    for j in range(len(d1[i]["geometry"]["rings"][0])):

        x.append([你想要的数据])

a=np.array(x)

np.set_printoptions(precision=10)

np.savetxt("beijing.csv",a,delimiter=",")   


 5.使用ArcGIS处理结果,出图

更多Python和GIS内容,请浏览作者的博客:

https://blog.csdn.net/qq_912917507

作者微信号(w912917507)


荐读

点击下文标题即可阅读

完美Python入门基础知识点总结

200个精选ML、NLP、Python及数学最佳教程(附链接)

CCAI2018 | 贺志强:下一代互联网是什么?

编辑 / 刘雪   审核 / 刘雪 杨志如

指导:万剑华教授(微信号wjh18266613129)

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存