明日から本気出す開発日記

2016/10/31 fc2ブログより引っ越しました。更新はまた明日から本気だす

AS3 OpenStreetMap

【FLEX】【OpenStreetMap】FLEXでOpenStreetMapのAPI(Overpass API, APIv0.6)を実行

2016/10/31

Overpass API: データのダウンロードしか出来ないが高速。データ形式はJSON, XMLを選択できる。
API v0.6: データのダウンロードも更新も出来る。データ形式はXML。

【Overpass API編】

public function run_overpass(): void
{
    var service: HTTPService = new HTTPService();

    //URLは以下のように(一例)
    // 緯度経度指定して周囲1000mのコンビニ(ノード)一覧
    service.url = "http://overpass-api.de/api/interpreter?data=[out:json];node(around:1000,36.0628,136.2228)[shop=convenience];out;"
    // ノード番号1912537438を取得
    //service.url = "http://overpass-api.de/api/interpreter?data=[out:json];node(1912537438);out;"
    // ノード番号1912537438と1912537439を取得
    //service.url = "http://overpass-api.de/api/interpreter?data=[out:json];(node(1912537438);node(1912537439););out;"

    service.method = "GET";

    service.addEventListener("result", httpResult);
    service.addEventListener("fault", httpFault);
    service.send(parameters);
}

public function httpResult(event: ResultEvent): void
{
    var result: Object = JSON.parse(event.result.toString());
    // ArrayCollectionに突っ込んだ方が使いやすそうなので突っ込む
    arrRESPONSE: ArrayCollection = new ArrayCollection(result.elements);

    // hasOwnPropertyしたほうがいいかも
    trace(arrRESPONSE[i].tags.name + "," + arrRESPONSE[i].lat + "," + arrRESPONSE[i].lon);
}

public function httpFault(event: FaultEvent): void
{
    var faultstring:String = event.fault.faultString;
    trace(faultstring);
}

【API v0.6編】
API v0.6では、GETやPOST以外にPUTやDELETEリクエストも送る必要がある。
PUTやDELETEはAIRでしかサポートしていないので、AIR以外でPUTリクエストを送るには
リクエストヘッダを偽装すること。

データを更新する場合、基本的に流れは
①チェンジセット番号の新規取得
②ノードのアップデートとか・・
③チェンジセットのクローズ

①と③はほとんど同じ処理になるのでクローズについては少しはしょった。

①チェンジセット番号の新規取得

private    var    srcXML:XML    =    
    <osm version="0.6" generator="Example Flex Editer"    copyright="OpenStreetMap and contributors" attribution="http://www.openstreetmap.org/copyright"    license="http://opendatacommons.org/licenses/odbl/1-0/">
        <changeset>
            <tag k="created_by"    v="Example Flex    Editer 0.1">
            <tag k="comment"    v="API v0.6 test">
        </changeset>
    </osm>

public fucntion api06(): void
{
    var urlLoader:URLLoader = new URLLoader();
    var urlString:String = "http://api.openstreetmap.org/api/0.6/changeset/create";
    var urlRequest:URLRequest = new URLRequest(urlString);
    urlRequest.contentType = "application/xml";

    // AIRならPUTにしても良い。AIRでないならばPUTは使えないのでとりあえずPOST
    urlRequest.method = URLRequestMethod.POST;

    var encoder:Base64Encoder = new Base64Encoder();
    encoder.encode(OSMのユーザ名 + ":" + OSMのパスワード);
    urlRequest.requestHeaders = [new URLRequestHeader("Authorization", "Basic " + encoder.toString())];

    // AIRでurlRequest.methodをPUTにしたならばこの一行いらない。AIRでなければPUTリクエストに偽装する。
    urlRequest.requestHeaders.push(new URLRequestHeader("X-HTTP-Method-Override", "PUT"));
    urlRequest.data = srcXML;
    
    urlLoader.addEventListener(Event.COMPLETE, resultHandler);
    urlLoader.addEventListener(IOErrorEvent.IO_ERROR , faultHandler);
    urlLoader.load(urlRequest);
}

public function resultHandler(event:Event):void
{
    //チェンジセットの番号が返ってくる
    trace(event.target.data.toString());
}

protected function faultHandler(event:IOErrorEvent):void
{
    trace(event.toString());
}

②ノードの変更

        private    var    srcXML2:XML    =    
            <osm version="0.6" generator="Unotecjapan    Flex    Editer"    copyright="OpenStreetMap    and    contributors"    attribution="http://www.openstreetmap.org/copyright"    license="http://opendatacommons.org/licenses/odbl/1-0/">
                <node id="1912548272"    version="1"    changeset="取得したチェンジセット番号"    lat="36.0675246"    lon="136.2183579">
                    <tag k="name"    v="ローソン">
                    <tag k="shop"    v="convenience">
                    <tag k="source"    v="Bing    2010">
                    <tag k="wheelchair"    v="yes">
                </node>
            </osm>;    

public fucntion upload(): void
{
    var urlLoader:URLLoader = new URLLoader();
    var urlString:String = "http://api.openstreetmap.org/api/0.6/node/1912548272";
    var urlRequest:URLRequest = new URLRequest(urlString);
    urlRequest.contentType = "application/xml";

    // AIRならPUTにしても良い。AIRでないならばPUTは使えないのでとりあえずPOST
    urlRequest.method = URLRequestMethod.POST;

    var encoder:Base64Encoder = new Base64Encoder();
    encoder.encode(OSMのユーザ名 + ":" + OSMのパスワード);
    urlRequest.requestHeaders = [new URLRequestHeader("Authorization", "Basic " + encoder.toString())];

    // AIRでurlRequest.methodをPUTにしたならばこの一行いらない。AIRでなければPUTリクエストに偽装する。
    urlRequest.requestHeaders.push(new URLRequestHeader("X-HTTP-Method-Override", "PUT"));
    urlRequest.data = srcXML2;
    
    urlLoader.addEventListener(Event.COMPLETE, resultHandler2);
    urlLoader.addEventListener(IOErrorEvent.IO_ERROR , faultHandler);
    urlLoader.load(urlRequest);
}

public function resultHandler2(event:Event):void
{
    //チェンジセットの番号が返ってくる
    trace(event.type); // complete
}

protected function faultHandler2(event:IOErrorEvent):void
{
    trace(event.toString());
}

③チェンジセットのクローズ

public function closeChangeset(): void
{
    // チェンジセット番号の新規取得と中身ほぼ同じ
    // 違う箇所は以下の部分のみ
    var urlString:String = "http://api.openstreetmap.org/api/0.6/changeset/"+取得したチェンジセット番号+"/close";
}

 

-AS3, OpenStreetMap