OpenStreetMap から牛丼店の情報を取得し、Android に表示する


Overpass API を使って OpenStreetMap から牛丼店の情報を取得し、Google マイマップに表示する
の続きです。

OpenStreetMap から牛丼店の情報を取得するまでは、
上記の記事を参考に。

Android に表示する

全ての店舗を表示するのではなく、
近くの店舗を表示するようにします。

Json を解析する

Gson を使います。

Gson : Java serialization/deserialization for JSON

Json の記述構造に対応した Java クラスを用意する。

OsmJson.java
public class OsmJson {

  public String version;
  public String  generator;
  public Osm3s  osm3s;
  public List<Element> elements;
Osm3s.java
public class Osm3s {

  public String timestamp_osm_base;
  public String  copyright;
Element.java
public class Element {

  public String type;
  public long  id;
  public double  lat;
  public double  lon;
  public Tags tags;
Tags.java
public class Tags {

public String name;
public String branch;
public String opening_hours; 

// コロンが入っているキー名は、変数名として使えない
@SerializedName("addr:full")
public String addr_full;

public String getInfo() {
    StringBuilder builder = new StringBuilder();

    if(branch != null) {
          builder.append(branch);
         builder.append(LF);
    }
    if(opening_hours != null) {
           builder.append("営業時間: ");
          builder.append(opening_hours);
         builder.append(LF);
    }
// その他のタグ
    return builder.toString();
}

OSMのタグは多いので、どこまで対応するか悩ましい。
下記を参考にする。

OpenStreetMatsuya

プログラムの記述はこれだけ。

    Gson gson = new Gson();
    OsmJson osm = gson.fromJson( text, OsmJson.class);

SQLite に格納する

名称(name)、緯度(lat)、経度(lon)、情報(info) をカラムに持つ DB を作成する。

List<Element> elements = osm.getElements();
for (Element ele: elements) {
        NodeRecord r = new NodeRecord( ele.getName(), ele.getLat(), ele.getLon(), ele.getInfo() );
        mHelper.insert( r );
    }

近くの牛丼店を検索する

現在地を東西南北の枠で囲み、その中にある店舗を検索する
下記のような条件句を使う。

    String where =  " ( " + "lat" + " > " +  北側  ;
    where +=  " AND " + "lat" + " < " + 南側  ;
    where +=  " AND " + "lon" + " > " +  西側  ;
    where +=  " AND " + "lon" + " < " +  東側 + " ) "  ;

緯度方向の地球の円周は、約4万kmなので、
1mあたりの緯度の度数は、360度 / 4万km

東京付近(緯度35度)における経度方向の地球の円周は、約3.3万kmなので、
1mあたりの経度の度数は、360度 / 3.3万km

マ−カーで表示する

下記を参考に

osmdroid を使って Android の OpenStreetMap 地図に マーカーを表示する

スクリーンショット

横浜市役所から5Km範囲

github にソースを公開した

OpenStreetMap から取得し牛丼店のJson ファイルを同封してます。