住所ディレクトリAPIとは、日本の住所の階層データを検索できるAPIです。
たとえば東京都の住所コードで検索すると、足立区、荒川区などの下層の住所データを簡単に検索できます。このAPIを利用することで、全国の都道府県一覧や各都道府県の市区町村を簡単に表示できます。

Yahoo! Open Local Platform (YOLP)で、新たに住所ディレクトリAPIを公開しました - Yahoo!デベロッパーネットワーク

住所ディレクトリAPIで取得した住所と緯度経度から、地図と白地図を表示するサンプルを書いてみた。
住所ディレクトリ x 地図 x 白地図

以下、サンプルのスクリーンショット。

日本を指定(ac=JP)
住所ディレクトリ x 地図 x 白地図

北海道を指定(ac=01)
住所ディレクトリ x 地図 x 白地図

北海道赤平市を指定(ac=01218)。住所ディレクトリAPIでは、この階層で地図を出せるような緯度経度情報を取得できない。
住所ディレクトリ x 地図 x 白地図

東京都(ac=13)とか。
住所ディレクトリ x 地図 x 白地図

愛知県(ac=23)とか。
住所ディレクトリ x 地図 x 白地図

愛知県(ac=23)とか。
住所ディレクトリ x 地図 x 白地図

住所ディレクトリAPIで取得できる値は、階層によってデータがあったりなかったりするのでそのへんを考慮してプログラム書かないといけない。

また、指定した住所コードの緯度経度は返ってくるけど、その下層の住所データは住所コード・名称・読みだけしか取得できなくて緯度経度が無いので、またその住所コードでAPIを叩かないと緯度経度を取得できないのでたいへん。

住所ディレクトリ x 地図 x 白地図 では、最初に ac=JP と日本を指定して下層の住所である47都道府県の地図と白地図を表示している。

これは、住所ディレクトリAPIにて、ac=JPでjsonを取得した後、ac=01, ac=02, ac=03 とAPIを47回コールして47個のjsonを取得。
その後、スタティックマップAPIにて、47個の地図画像と47個の白地図画像を取得している。

1画面表示するだけで、1 + 47 + 47 + 47 = 142回もAPIをコールしているんだけど、これBANされたりしないかちょっと心配。。。

参考までに、以下にAPIレスポンスのサンプル。

URL: http://search.olp.yahooapis.jp/OpenLocalPlatform/V1/addressDirectory?appid=nilabinfo&ac=JP


<?xml version="1.0" encoding="utf-8"?>
<YDF xmlns="http://olp.yahooapis.jp/ydf/1.0" totalResultsReturned="47" totalResultsAvailable="47" firstResultPosition="1">
  <ResultInfo>
    <Count>47</Count>
    <Total>47</Total>
    <Start>1</Start>
    <Status>200</Status>
    <Description></Description>
    <Copyright></Copyright>
    <Latency>0.12</Latency>
  </ResultInfo>
  <Feature>
    <Name></Name>
    <Property>
      <CassetteId>b22fee69b0dcaf2c2fe2d6a27906dafc</CassetteId>
      <Country>
        <Code>JP</Code>
        <Name>日本</Name>
      </Country>
      <Address></Address>
      <GovernmentCode></GovernmentCode>
      <AddressDirectory>
        <AreaCode>01</AreaCode>
        <Name>北海道</Name>
        <Kana>ほっかいどう</Kana>
      </AddressDirectory>
      <AddressDirectory>
        <AreaCode>02</AreaCode>
        <Name>青森県</Name>
        <Kana>あおもりけん</Kana>
      </AddressDirectory>
(以下略)

URL: http://search.olp.yahooapis.jp/OpenLocalPlatform/V1/addressDirectory?appid=nilabinfo&ac=01


<?xml version="1.0" encoding="utf-8"?>
<YDF xmlns="http://olp.yahooapis.jp/ydf/1.0" totalResultsReturned="194" totalResultsAvailable="194" firstResultPosition="1">
  <ResultInfo>
    <Count>194</Count>
    <Total>194</Total>
    <Start>1</Start>
    <Status>200</Status>
    <Description></Description>
    <Copyright></Copyright>
    <Latency>0.114</Latency>
  </ResultInfo>
  <Feature>
    <Name>北海道</Name>
    <Geometry>
      <Type>point</Type>
      <Coordinates>141.34680702,43.06461407</Coordinates>
      <BoundingBox></BoundingBox>
    </Geometry>
    <Property>
      <CassetteId>b22fee69b0dcaf2c2fe2d6a27906dafc</CassetteId>
      <Country>
        <Code>JP</Code>
        <Name>日本</Name>
      </Country>
      <Address>北海道</Address>
      <GovernmentCode>01</GovernmentCode>
      <AddressDirectory>
        <AreaCode>01456</AreaCode>
        <Name>愛別町(上川郡)</Name>
        <Kana>あいべつちょう(かみかわぐん)</Kana>
      </AddressDirectory>
      <AddressDirectory>
        <AreaCode>01409</AreaCode>
        <Name>赤井川村(余市郡)</Name>
        <Kana>あかいがわむら(よいちぐん)</Kana>
      </AddressDirectory>
(以下略)

URL: http://search.olp.yahooapis.jp/OpenLocalPlatform/V1/addressDirectory?appid=nilabinfo&ac=01456


<?xml version="1.0" encoding="utf-8"?>
<YDF xmlns="http://olp.yahooapis.jp/ydf/1.0" totalResultsReturned="14" totalResultsAvailable="14" firstResultPosition="1">
  <ResultInfo>
    <Count>14</Count>
    <Total>14</Total>
    <Start>1</Start>
    <Status>200</Status>
    <Description></Description>
    <Copyright></Copyright>
    <Latency>0.038</Latency>
  </ResultInfo>
  <Feature>
    <Name>北海道上川郡愛別町</Name>
    <Geometry>
      <Type>point</Type>
      <Coordinates>142.57797289,43.90650301</Coordinates>
      <BoundingBox>142.51036852,43.82867733 142.77450882,44.02932032</BoundingBox>
    </Geometry>
    <Property>
      <CassetteId>b22fee69b0dcaf2c2fe2d6a27906dafc</CassetteId>
      <Country>
        <Code>JP</Code>
        <Name>日本</Name>
      </Country>
      <Address>北海道上川郡愛別町</Address>
      <GovernmentCode>01456</GovernmentCode>
      <AddressDirectory>
        <AreaCode>01456</AreaCode>
        <Name>愛山(字)</Name>
        <Kana>あいざん(あざ)</Kana>
      </AddressDirectory>
      <AddressDirectory>
        <AreaCode>01456</AreaCode>
        <Name>愛別(字)</Name>
        <Kana>あいべつ(あざ)</Kana>
      </AddressDirectory>
(以下略)

以下に、サンプルコードの一部を抜粋。都道府県のデータには Geometry.BoundingBox が存在しないので Geometry.Coordinates で代用している。


function get_static_map_image_url(f, width, height){
 
  var bbox = null;
  var lat = null;
  var lon = null;
  if(f.Geometry.BoundingBox){
    var a = f.Geometry.BoundingBox.split(' ');
    var b = a[0].split(',');
    var c = a[1].split(',');
    bbox = b[1] + ',' + b[0] + ',' + c[1] + ',' + c[0];
  }else if(f.Geometry.Coordinates){
    var ll = f.Geometry.Coordinates.split(',');
    lat = ll[1];
    lon = ll[0];
  }
 
  var url = 'http://map.olp.yahooapis.jp/OpenLocalPlatform/V1/static';
  url += '?appid=' + appid;
  if(bbox){
    url += '&bbox=' + bbox;
  }else if(lat && lon){
    url += '&lat=' + lat;
    url += '&lon=' + lon;
    url += '&z=7';
  }
  url += '&width=' + width;
  url += '&height=' + height;
  return url;
}
 
function get_blank_map_image_url(f, width, height){
 
  var bbox = null;
  var lat = null;
  var lon = null;
  if(f.Geometry.BoundingBox){
    var a = f.Geometry.BoundingBox.split(' ');
    var b = a[0].split(',');
    var c = a[1].split(',');
    bbox = b[1] + ',' + b[0] + ',' + c[1] + ',' + c[0];
  }else if(f.Geometry.Coordinates){
    var ll = f.Geometry.Coordinates.split(',');
    lat = ll[1];
    lon = ll[0];
  }
 
  var url = 'http://map.olp.yahooapis.jp/OpenLocalPlatform/V1/static';
  url += '?appid=' + appid;
  if(bbox){
    url += '&bbox=' + bbox;
  }else if(lat && lon){
    url += '&lat=' + lat;
    url += '&lon=' + lon;
    url += '&z=7';
  }
  url += '&mode=blankmap';
  url += '&width=' + width;
  url += '&height=' + height;
  return url;
}
 
function get_map_images(list){
  for(var i=0; i<list.length; i++){
    var ad = list[i];
    get_map_image(ad);
  }
}
 
function get_map_image(ad){
 
  var url = "http://search.olp.yahooapis.jp/OpenLocalPlatform/V1/addressDirectory";
  var data = {
    ac: ad.AreaCode,
    appid: appid,
    mode: "2",
    output: "json"
  };
  
  $.ajax({
    url: url,
    dataType: "jsonp",
    data: data,
    success:function(result){
      if(result.Feature){
        var f = result.Feature[0];
        var mapsrc = get_static_map_image_url(f, 150, 150);
        var blanksrc = get_blank_map_image_url(f, 150, 150);
        var html = '';
        html += '<img src="' + mapsrc + '" />';
        html += '<img src="' + blanksrc + '" />';
        $('#' + ad.AreaCode + '_image').html(html);
      }
    },
    error: function(err){
      console.log(err);
    }
  });
}

function get_address_list(query){
 
  var url = "http://search.olp.yahooapis.jp/OpenLocalPlatform/V1/addressDirectory";
  var data = {
    ac: query,
    appid: appid,
    mode: "2", // 1:町村名を返却、郡名はカッコ書き(デフォルト) ex) 甲良町(犬上郡) 2:郡名と町村名を返却、郡名はカッコ書きしない ex) 犬上郡甲良町
    output: "json"
  };
  
  $.ajax({
    url: url,
    dataType: "jsonp",
    data: data,
    success:function(result){
      var html = '';
      var list = [];
      if(result.Feature){
        var f = result.Feature[0];
        html += '<h2 style="font-size: medium;">' + escape(f.Name) + '</h2>';
        if(f.Property.AddressDirectory){
          for(var j=0; j<f.Property.AddressDirectory.length; j++){
            var ad = f.Property.AddressDirectory[j];
            list.push(ad);
            if(query.length < 5){ // 5桁以上の下位の住所のBoundingBoxはない
              var s = '<div class="area"><a href="./address_tree_maps.html?q=' + escape(ad.AreaCode) + '">' + escape(ad.Name) + '(' + escape(ad.Kana) + ') ' + escape(ad.AreaCode) + '<br /><div id="' + escape(ad.AreaCode) + '_image"></div></a></div>';
            }else{
              var s = '<div class="area">' + escape(ad.Name) + '(' + escape(ad.Kana) + ') ' + escape(ad.AreaCode) + '<br /><div id="' + escape(ad.AreaCode) + '_image"></div></div>';
            }
            html += s;
          }
        }
      }else{
        html = 'Nothing!';
      }
      set_contents(html);
      if(query.length < 5){ // 5桁以上の下位の住所のBoundingBoxはない
        get_map_images(list);
      }
    },
    error: function(err){
      set_contents(err);
    }
  });
}

Wikipedia などの住所に関係しそうなデータも組み合わせると何か使えるものになるかも。あるいは、白地図と組み合わせてクイズとか。。。

Ref.

tags: yahoo_maps_api

Posted by NI-Lab. (@nilab)