参照ソース:https://blog.csdn.net/weixin_47796965/article/details/108372378
AutoNavi MapのPOIデータは公開されています。最近、参考記事を見て、試してみることにしました。無料使用リクエストは最大1000個の情報を返します。この記事では、主に対象エリアのブロックリクエストを使用して、制限を回避し、問題を解決するという目標を達成します。
手順:
1。AutoNaviマップのターゲットエリアの範囲を取得します
2.ターゲット範囲を適切なエリア数に分割して中心点を生成し
ます3.中心点の4つの点を計算し、中心点を割り当てます
4 。プログラムを作成します。AutoNavi Map LBSのオープンポリゴン検索機能により、各エリアのPOI検索・取得を実現
1.例として昆明を取り上げます-Gaodeマップで昆明市のスコープを取得します
高ポンドプラットフォームを開き、個々の開発者を登録および認証してログインします
https://lbs.amap.com/api/webservice/guide/api/district/
下の図に示すようにパラメータを入力して、下の図
で明確に示されているポリラインパラメータなど、点のような境界範囲を取得します。それをワールドにコピーし、小さな領域の座標を見つけて削除し、残りのデータを行のExcelにコピーしてから、Excelで列操作を実行し、xヘッダーとyヘッダーを追加してExcel97として保存します。 -2013xlsファイル。次のアークマップ操作を容易にするため。
ここで、原作者は深センでのデータ処理の過程で小さな領域に起因する異常の問題に遭遇しましたが、昆明でのデータ処理の問題には遭遇しませんでしたが、すべてのデータを保存できないという問題に遭遇しましたしたがって、この記事では、ストレージにcsv形式を使用し、関連するデータ正規化操作はpythonを使用して直接処理されるため、若干の違いがあります。
ここでのデータ規制は主に次のとおりです。1。緯度と経度を列に分割します。2。「;」を2つの新しい行に変更します。コードデータと結果は次のとおりです。
#%%
with open(r"\kunming_poi.csv",'rb') as csvfile:
f.write('x,y')
for i in csvfile:
line_value = str(i,encoding='utf8')
\#print(i,type(i))
csvfile.close()
\# %%
value_list = line_value.split(';')
print(value_list)
with open(r'result.csv','w') as f:
for value in value_list:
f.write(value)
f.write('\n')
f.close()
変換結果
次に、ArcGISは座標点を空間範囲に変換します
csvデータをArcGISにインポートし、データをSHPファイルに変換してから、データに対してポイントツーライン操作を実行します。
これらはすべて日常的な操作であるため、説明はしません。必要に応じて、メッセージを残して、それを補足する記事を作成します。原作者の記事を参考にできます
データをインポートするときは、座標系をWGS1984に設定する必要があります。AutoNaviMapの座標系とは異なりますが、差はそれほど大きくなく、多少の誤差があるかもしれませんが、県の調査では最小限である可能性があります。レベルの都市。
3.魚網を描き、魚網の中心点の座標を取得します
目標は、Gaode Mapsが提供するポリゴンPOI検索機能を使用して、漁網によって構築された4対1の範囲を使用することです。
- 網タイツの生成
arctoolbox >>データ管理ツール>>フィーチャクラス>>フィッシュネットの作成
ランクを構成する
最後に、漁網を図に示し
、冗長グリッドの外側のポイントを削除して、冗長データのダウンロードを減らします。最終結果は次のとおりです
魚網の4対範囲の範囲を確認し、各グリッドの4対4を決定し、4対緯度と経度の座標を中心点に割り当てます。
- 漁網の中心点の緯度と経度、および
クンミン市の4から4の座標の座標を計算し、各漁網のサイズを計算します。これが写真です。
水平方向に10グリッドを設定したので、水平方向の長さ各グリッドの:)/ 10
15グリッドを垂直に設定したので、垂直グリッドの長さは(上下)/ 15です。
点が中心点であるため、前の手順で中心点の座標がわかっているため、同じ仕様のグリッドパラメータを使用して、各中心点の4つの点をバッチで設定できます。
上=緯度+(上-下)/ 15/2
Bottom = latitute-(上-下)/ 15/2
左= logitute-(右-左)/ 10/2
右= logitute +(右-左)/ 10/2
ここにエラーがあり、データ収集が不完全になる可能性があります。生成されたグリッドに従って、上、下、左、および右の中心線を再計算するだけです(2021/01/07)
結果の例は次のとおりです。
最後に参考記事のコードを添付します。ここでいくつか変更しましたが、毎回100ページをトラバースするという問題がありますが、ページ数が少ない場合があります。説明を探したところ、ページ数を返すパラメータがないため、コードの効率をさらに向上させることができます。(セグメント化された同時実行性を使用することもできます)
ここでは、データのページ数を確認するために1回リクエストしてから、さらにリクエストを行うことができます。これにより、無効なリクエストを減らし、効率を向上させることができます(2021/01/07)
——————————————————————————————
残念ながら、上記の方法は実行不可能であり、カウントは取得されたデータの量を表していません。リクエストの数を節約して効率を向上させるために、null値からのみ判断できます。そうしないと、データ損失などの問題が発生します(1月9日)。 、2021)
#%%
import pandas as pd
import requests
key = r'******************' #高德地图开发者平台申请的key
keywords = "商场|超市|商店"
types = "060000"
url_head = r"https://restapi.amap.com/v3/place/polygon?"
text1 = pd.read_csv(r"昆明市范围_高德数据采集点.txt") #从arcmap中导出的text文件地址
#%%
print(len(text1))
#输入表头
with open("poi_gaode.txt", 'a') as f:
f.write('poi_name;poi_adname;poi_address;poi_location;poi_tel\n")
f.close()
#%%
#for i in range(0, len(text1)): #获取全部矩阵数据时,有可能超过高德地图配置的每天30000条数据限额,可选择先获取前35条,第二天再获取剩余数据
for i in range(51, 124):
#经度和纬度用","分割,经度在前,纬度在后,坐标对用"|"分割,经纬度小数点后不得超过6位。
con_location = str(round(text1["long_left"][i], 6)) + ',' + str(round(text1['lat_top'][i], 6)) + '|' + str(round(
text1['long_right'][i], 6)) + ',' + str(round(text1['lat_bottom'][i], 6))
url_ttl = url_head + "polygon=" + con_location + "&keywords=" + keywords + "&key=" + key + "&types=" + types + "&output=json&offset=20&extensions=all"
# rep0 = requests.get(url_ttl)
# json0 = rep0.json()
# count0 = json0["count"]
print("开始进行第%d个网格的数据提取." % i)
# print("一共%d条数据" % int(count0))
for p in range(1, 101): #遍历100页
url = url_ttl + '&page=' + str(p)
rep1 = requests.get(url)
json1 = rep1.json()
pois_data = json1['pois']
for poi in pois_data:
poi_name = str(poi["name"])
poi_adname = str(poi["adname"])
poi_address = str(poi.get("address", "无详细地址"))
poi_location = str(poi["location"])
poi_tel = str(poi.get("tel", "无联系方式"))
poi_info = poi_name + ";" + poi_adname + ";" + poi_address + ";" + poi_location + ";" + poi_tel + "\n"
poi_info = poi_info.encode('gbk', 'ignore').decode("gbk", "ignore") #避免编码错误
with open("poi_gaode.txt", 'a') as f:
f.write(poi_info)
print("正在写入数据...")
print("数据提取完成")
f.close()
私のビジネスはここでは発展していません。30,000回の電話で十分です。。
結果は次のとおりです。
元の作者の貢献に改めて感謝します。
@wenlulan
参考記事:https://blog.csdn.net/weixin_47796965/article/details/108372378