一、点线面要素制作
1、点要素
(1)Arcmap制作
(3)根据线生成
import xlwt
import pandas as pd
import random
import requests
import json
key='445ee7843bccc2c188cf62d34a3827ec' #填入自己的key
def getlnglat(address):
url='https://restapi.amap.com/v3/geocode/geo'
params = {'key':key,
'address':address}
requests.adapters.DEFAULT_RETRIES = 5
res = requests.get(url, params)
json_data = json.loads(res.text)
return json_data
book1 = xlwt.Workbook()
sheet1 = book1.add_sheet("0", cell_overwrite_ok=True)
new_file1 = '7.xls'
sheet1.write(0, 0, 'OBJECTID')
sheet1.write(0, 1, 'x')
sheet1.write(0, 2, 'y')
sheet1.write(0, 3, 'roadName')
sheet1.write(0, 4, 'district')
def sel(rymd):
md = pd.read_excel(rymd)
x = md["x"]
y = md['y']
x1 = md["x1"]
y1 = md['y1']
dress = md['Name']
i = 24999
count = 1
for x_x in x[25000:]:
i = i+1
road = getlnglat('长沙市'+dress[i])['geocodes'][0]
for r in range(0,random.randint(1,3)):
sheet1.write(count, 0, i)
if float(x_x) > float(x1[i]):
x_r = random.uniform(x1[i],x_x)
y_r = (x_r-x_x)/(x1[i]-x_x)*(y1[i]-y[i])+y[i]
sheet1.write(count, 1, x_r)
sheet1.write(count, 2, y_r)
sheet1.write(count,3,dress[i])
if len(road['district']) ==0:
continue
else:
sheet1.write(count,4,road['district'])
print(i)
else:
x_r = random.uniform(x_x,x1[i])
y_r = (x_r-x_x)/(x1[i]-x_x)*(y1[i]-y[i])+y[i]
sheet1.write(count, 1, x_r)
sheet1.write(count, 2, y_r)
sheet1.write(count,3,dress[i])
if len(road['district']) ==0:
continue
else:
sheet1.write(count,4,road['district'])
print(i)
count +=1
book1.save(new_file1)
sel("line.xls")
(2)高德地图POI映射
import requests
import pandas as pd
import json
import time
import math
#各下级行政区的代码,若是嫌逐个复制麻烦可以通过读取文件的方式实现,此处不进行讲解
arr=['500000']
#API的URL,在这里进行了结构化处理
url1="https://restapi.amap.com/v3/place/text?keywords=医院&city="
url2="&output=JSON&offset=20&key=0fb8677da809afaa03b93f31ac9b4e85&extensions=all&page="
#用于储存数据
x=[]
#用于计数
num=0
#循环各下级行政区进行POI检索
for i in range(0,len(arr)):
#当前行政区
city=arr[i]
#因为官方对API检索进行了45页限制,所以只要检索到45页即可
for page in range(1,46):
#若该下级行政区的POI数量达到了限制,则警告使用者,之后考虑进行POI类型切分
if page==45:
print("警告!!POI检索可能受到限制!!")
#构造URL
thisUrl=url1+city+url2+str(page)
#获取POI数据
data=requests.get(thisUrl)
#转为JSON格式
s=data.json()
#解析JSON
aa=s["pois"]
#若解析的JSON为空,即当前行政区的数据不够45页(即没有达到限制),返回
if len(aa)==0:
break
#对每条POI进行存储
print(page)
for k in range(0,len(aa)):
s1=aa[k]["name"]
s2=aa[k]["type"]
s3=aa[k]["address"]
s4=aa[k]["adname"]
s5=aa[k]["location"].split(",")
x.append([s1,s2,s3,s4,float(s5[0]),float(s5[1])])
num+=1
print("爬取了 "+str(num)+" 条数据")
#将数据结构化存储至规定目录的CSV文件中
c = pd.DataFrame(x)
c.to_csv('./cq_hospital.csv',encoding='utf-8-sig')
1、线要素制作
(1)arcmap制作
(2)路径规划生存
(3)根据图片生成
3、面要素
(1)arcmap手画
(2)深度学习目标检测
4、excel转shp
5、OpenstreetMap获取
步骤一:
进入openstreetmap(osm)官网:https://www.openstreetmap.org/
在搜索框内搜索你想要查询的城市,如:贵阳市
得到一下信息:
步骤二:
进入osm overpass api :http://www.overpass-api.de/
点击上图中红圈
进入以下页面
输入如下代码:
<osm-script>
<query type="relation">
<has-kv k="boundary" v="administrative"/>
<has-kv k="name:zh" v="海口市"/>
</query>
<print/>
</osm-script>
(此处的k=”name:zh” v=”贵阳市”,说明了步骤一的目的,因为国内和国外的名称写法不一样,如果为k=”name” v=”贵阳市”,运行代码后得不到想要结果,此处应根据步骤一中截图的name写法,还有值来输入)
输完代码后,点击右下角“Query”键,下载文件,得到一个名为“interprept”文件,用记事本打开
找到
即得到贵阳市边界id :2782246
(当然该id在步骤一搜索“贵阳市”时即可看到)
完成以上步骤后,再次中输入一下代码,获取城市的路网数据:
<osm-script timeout="1800" element-limit="100000000">
<union>
<area-query ref="3602784613"/>
<recurse type="node-relation" into="rels"/>
<recurse type="node-way"/>
<recurse type="way-relation"/>
</union>
<union>
<item/>
<recurse type="way-node"/>
</union>
<print mode="body"/>
</osm-script>
:
为了得到城市的路网数据,需再原边界id的基础上加上“360000000”
360000000
+ 2782246
————————
3602782246
(注意对齐哦!)
得到城市的最终编号: 3602782246
最后点击右下角“Query”,同样得到“interprept”文件
文件中即包含了城市的路网信息
**
文件转换
https://geoconverter.infs.ch/vector 将interpret文件转化文shp文件格式
效果展示
6、阿里云获取
使用阿里云地图选择器工具:http://datav.aliyun.com/tools/atlas
打开后只要在左上角位置输入需要的行政区划范围名称,就可以快速获取到该范围的矢量底图数据。提供的获取方式有JSON API,也可以直接下载geojson或者svg格式。
如果直接下载了geojson格式的数据,可以通过mapshaper工具:https://mapshaper.org/转换成shapefile格式数据,大功告成。
7、软件获取
推荐软件91地图、Bigemap。直接下载(但是没钱)可以淘宝价格便宜