GISとPython Baiduのマップストリートに基づいてクロール

街の通りの設計プロジェクトで、学習プロセスので、ソートBaiduのマップストリートをクロールのビットうち最近の家庭教師のアプリケーション要件分析、総括するためのシンプルな。

1百度のパノラマAPIの紹介

まず、添付のBaiduの公式文書を
簡単な分析パノラマAPIリクエストを構成しています:

"http://api.map.baidu.com/panorama/v2?ak=E4805d16520de693a3fe707cdc962045&width=512&height=256&location=116.313393,40.04778&fov=180&heading=0&pitch=0"

ここに画像を挿入説明
AK =キー、幅+高さ=画像サイズ、位置の緯度と経度の座標= Benpian任意パノラマ取得モード、FOV、ピッチと3つのパラメータを見出しは、特別な注意を必要とします。FOV = 360を省略することができる他の二つのパラメータの全体のパノラマビューをクロール;しかしストリート(FOV = 180)を変形しない、一般的に、以下に示すクロール所望の場合は、ピッチおよび方位の値を考慮する必要があります。繰り返し試験後、ピッチ= 20視野角は、道路の方位角に応じて、より正常である場合のサンプリング点(セクション4を参照)。

ここに画像を挿入説明

2、元の道路網を取得

:アイデアの道路ネットワークデータは、次のような、多くのある取得
OpenStreetMapのダウンロードから(1)
すべての後にOSMの国内データ、完全なので正確ではない、とBaiduは道路網のマッピングして、比較的大きな(すべての後、我々はBaiduの通りで登る)、テストのためにお勧めします非公式の使用。
(2)直接登るBaiduは道路網の地図に
明らかに最善の方法ですが、私は多分、機密データを推測し、直接クロールする方法を見つけるために周りに検索されませんでした。
(3)は、地図画像をインターセプトし、道路網のベクトル抽出
選んだ、ここで、電子地図ソフトへのオンラインアクセスをたくさんBaiduのマップインターセプタを(リングハウスの兄のマスターに、それが簡単にソフトウェアの原作者の学術的なメイクから、公開番号を指定できます「)ダウンロードで。0.5Betaと1.0Beta私は、問題を抱えている0.4Beta最終版の使用を試してみました。

ここに画像を挿入説明
このバージョンでは、ユニークな機能を持っているFirefoxブラウザを少しトラブルをインストールする必要が、しかし:あなたはストリートビューナビゲーション軌道(8上図)をダウンロードすることができ、路上でクロールすることは非常に便利な用語です。得られたPS図をダウンロードした後GISを導入することによって調整しました。

ここに画像を挿入説明

3ネットワーク・データ処理

ベクトル化処理が分割され、3つのステップを簡略化ジオリファレンス、最初の2つのステップを逆にしてもよいです。

3.1ベクトル化

(1)将png图片的band 1拖入GIS,右键按照合适的阈值进行二值化分类(阈值影响道路识别精度,具体情况具体分析),再Reclassify重分类(非道路类的数值可设为NoData),得到纯路网栅格图。

ここに画像を挿入説明
(2)栅格转polygon,再转回栅格。这一步是为了提高精度,让栅格边缘更顺滑,不讲究的也可省略。
(3)使用ArcScan工具提取道路中心线,完成初步矢量化。具体操作步骤可参考这个教程

ここに画像を挿入説明

3.2 地理配准

下载的图片不含地理坐标信息,可能和实际位置差了十万八千里,比例也可能不同,需要手动配准调整。这里使用了OSM的路网作为参照。
(1)坐标系问题:涉及到投影坐标系和地理坐标系之间的设置和转化,直观来看投影坐标下的地图会稍“瘦”“窄”一些(毕竟地球是个球面),具体使用哪个依据自己的需求定,只要和参照路网统一即可,不影响后续采样点的坐标获取。
(2)比例问题:可调出Scale工具在编辑模式下调节,也可并在下一步。
(3)配准问题:使用空间校正工具与参照点对点Link一定数量后即可配准。当然,艺高人胆大可以选择直接Move。

ここに画像を挿入説明

3.3 简化

经由栅格矢量化得到的路网比较复杂,有非常多不必要的转折和节点,可以使用Simplify Line(简化线)工具适当简化到近似直线的状态。如果道路断线太多也可以适当合并,具体方法暂时没研究。

*4 道路角度计算

*注:本步骤适用于普通视角街景图的爬取(fov=180),如果仅需要360°全景图(fov=360),则可跳过。

我们使用p1、p2两个变量分别存储同一条道路的两个相反方向对应的角度值,其中0≤p1≤180(代表自北向南和自西向东),180≤p2≤360(代表自南向北和自东向西)。可以根据实际需求(单向or双向街景)决定是否两者均要计算。
为得到p1、p2的值,需要先计算道路线段的绝对角度a,计算方法见一位师兄写的文档。经简单归纳,得:
p1 = a + 90 (0≤a≤90)
p1 = a - 90 (90≤a≤180)
p2 = p1 + 180

当然,肯定存在更简便直接的计算方法,本篇暂时不研究。

5 观测点采样

观测点的采样也有多种方式。我们使用Densify工具等距离增密道路的vertice,再通过Feature Vertices To Points转为采样点。经纬度坐标值可以使用Add XY Coordinates工具直接添加在属性表中。每个点对应的道路角度值和道路编号等信息用Spatial Join叠加获取。
完成后导出并整理采样点数据csv,举例如图(id=观测点编号):

ここに画像を挿入説明

6 Python街景爬取

爬取代码基于同门师兄的过往研究稍加修改得到,完整的代码网上有不少教程,这里就不赘述了。导入csv,使用数组读取并存储采样点信息,将相应数值填入API请求的url即可。

url = "http://api.map.baidu.com/panorama/v2?ak=" + baidumap_key + "&width=1024&height=512&location=" + 
	str(data[1]) + "," + str(data[2]) + "&coordtype=wgs84ll&fov=90&pitch=20&heading="
# 设置存储路径
url_a = os.path.join(outdir, str(data[0]) + "-" + str(data[3]) + ".bmp")
url_b = os.path.join(outdir, str(data[0]) + "-" + str(data[4]) + ".bmp")
# 设置heading的值,开始爬取
urllib.request.urlretrieve(url + str(data[3]), url_a)
urllib.request.urlretrieve(url + str(data[4]), url_b)

值得一提的是,百度全景图配额目前已降至100张/天,但实测可同时使用多个key,每个key可爬取约160-200张。然而,持续多天大量爬取有被监测到异常并封ip的可能,用ip修改工具(比如梯子?)或许可破。

发布了4 篇原创文章 · 获赞 0 · 访问量 112

おすすめ

転載: blog.csdn.net/qq_33440285/article/details/104444281