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 파일을 동봉합니다.

좋은 웹페이지 즐겨찾기