Overpass API を使って OpenStreetMap から牛丼店の情報を取得し、Google マイマップに表示する
の続きです。
OpenStreetMap から牛丼店の情報を取得するまでは、
上記の記事を参考に。
Android に表示する
全ての店舗を表示するのではなく、
近くの店舗を表示するようにします。
Json を解析する
Gson を使います。
Gson : Java serialization/deserialization for JSON
Json の記述構造に対応した Java クラスを用意する。
public class OsmJson {
public String version;
public String generator;
public Osm3s osm3s;
public List<Element> elements;
public class Osm3s {
public String timestamp_osm_base;
public String copyright;
public class Element {
public String type;
public long id;
public double lat;
public double lon;
public Tags tags;
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のタグは多いので、どこまで対応するか悩ましい。
下記を参考にする。
プログラムの記述はこれだけ。
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 地図に マーカーを表示する
スクリーンショット
github にソースを公開した
OpenStreetMap から取得し牛丼店のJson ファイルを同封してます。