LoginSignup
1
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-02-24

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範囲
osm1_map.png

osm1_info.png

github にソースを公開した

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

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2