himorogiの日記

主にプログラミングに関することなど。少々ハード(電子工作)についても。

PowerShell で GoogleStreetView Image を取得

仕事で GoogleStreetView Image を大量に取得する必要があり、PowerShellスクリプトを作成した。
スクリプトで一括して取得するため StreetView Image は以下の条件とした。

  • 一つの場所につき、真北(0度)、真東(90度)、真南(180度)、真西(270度)の4つの方位角で StreetView Image を取得
  • いかなる場所も size(画素数)600x300、600fov(水平視野角)100度、pitch(俯角)10度

また、UI を簡潔にするため

  1. StreetView の撮影ポイントは、ID(ファイル名のベースとなる)、経度、緯度の値を、Unicode Text(UTF-16LE、Tab区切り、拡張子 .txt)のテキストファイルとして与える
  2. 上記テキストファイルは、スクリプトファイルと同じフォルダのサブフォルダ PointList に置かれるものとする
  3. 上記テキストファイルでは、先頭行は見出し、もしくは空行とする(スクリプトは読み飛ばす)
  4. 実行結果(テキストファイルの1レコードの情報に対して、4つの StreetView Image 取得)は、スクリプトファイルと同じフォルダのサブフォルダ Result に保存される

以上とした。

<#
    getStreetViewAtNEWS.ps1
    
    準備
    このスクリプトファイルと同じフォルダの子フォルダ:pointList に、
    1列目 pointId、2列目 latitude、3列目 longitude を記載し UnicodeText(UTF-16LE )として保存する
    ※ Excel から保存する場合は、ファイル形式 UnicodeText を指定すると UTF-16LE で保存される
    ※ スクリプトからは一行目を無視するので、見出し行が無い場合は先頭に改行コードを置くこと
    
    実行結果
    このスクリプトファイルと同じフォルダの子フォルダ:result に、
    pointList.txt の id,lon の位置から東西南北の street view image を取得してそれぞれ
    pointId_[EWNS].jpg ファイルが保存される。
    
#>

function getStreetViewNEWS( $fileName, $lat, $lon ){
    function getAStreetView($head){
        $dstFolder = join-path $pwd result
        switch($head){
            0{ $fp = join-path $dstFolder $($fileName + "_N.jpg");break }
            90{ $fp = join-path $dstFolder $($fileName + "_E.jpg");break }
            180{ $fp = join-path $dstFolder $($fileName + "_S.jpg");break }
            default{ $fp = join-path $dstFolder $($fileName + "_W.jpg") }
        }
        if( test-path $fp){ remove-item $fp }
        $fov = 100; $pitch =10
        $url = "https://maps.googleapis.com/maps/api/streetview?size=600x300&location=$lat,$lon&fov=$fov&heading=$head&pitch=$pitch"
        [System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }
        (New-Object System.Net.WebClient).DownloadFile($url, $fp) #>
        <# forDebug # write-host "$url`n$fp`n" #>
        $now = get-date -format g ;write-host "$now`t【処理開始】`t$fileName"
        start-sleep 1
        
    } # end of function
    (0,90,180,270)|%{ getAStreetView($_)}
}

$dummy = chcp 65001
$ScriptBase = Split-Path $MyInvocation.MyCommand.Path -parent
pushd $ScriptBase
    $xluniTxt = join-path $(join-path $pwd pointList ) pointList.txt
    $queue = gc $xluniTxt | ConvertFrom-CSV -delimiter "	" -header pointId,lat,lon | select -skip 1
     <# forDebug # $queue #>
    $queue | % { getStreetViewNEWS $_.pointId $_.lat $_.lon }
    $now = get-date -format g ;write-host "$now`t【処理完了】"
popd