(O+P)ut

(O+P)ut

(O+P)ut = Out + Put >> OutPut

【Java】Jacksonを用いたJSON利用

f:id:mtiit:20181031092050p:plain
私ごとですが、先日北野天満宮に自転車で移動をした際に、行きと帰りで勾配に差があったように感じたので、標高を取得して確認してみた際の備忘録です。

標高APIからJSONで標高取得

標高API - 地理院地図に公開されているAPIを使ってみます。形式はJSONです。

まず、JavaJSONを使うために
http://wiki.fasterxml.com/JacksonDownloadからjarファイルをゲットしました。

この3つのjarファイル

  • jackson-core
  • jackson-databind
  • jackson-annotations

をゲットすればいいです(coreとdatabindだけで今回のプログラムは動きます)。

f:id:mtiit:20150305142522p:plainのように、Maven等がなくても3つ全てダウンロードできました。

あとは、このjarファイルにパスを通して、標高を取得しました。

実際のコード

Javaのコードは以下となります。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class UseJson {
 public static void main(String[] args) {
  ObjectMapper mapper = new ObjectMapper();
  URL apiUrl=null;
  double start_lon =135.779286;
  double start_lat = 35.028779;
  //  double stop_lon = 135.735928;
  //  double stop_lat = 35.028131;
  String json2 = null;
  String json = null;	

  try {
   String url_base = "http://cyberjapandata2.gsi.go.jp/general/dem/scripts/getelevation.php?";
   String url_lon = "lon="+	Double.toString(start_lon);
   String url_lat = "lat="+Double.toString(start_lat);
   String url = url_base+ url_lon+"&"+url_lat+"&outtype=JSON";
   apiUrl = new URL(url);
   BufferedReader reader = new BufferedReader(new InputStreamReader(apiUrl.openStream(),"UTF-8"));
   String line = null;

   while((line = reader.readLine()) != null){
    json+=line;
   }
   reader.close();
   json2 = json.substring(4,json.length());
   JsonNode rootNode = mapper.readTree(json2);

   for(JsonNode node:rootNode){
    System.out.println(node);
   }
  }
  catch (IOException e) {
   e.printStackTrace();
  }
 }
}

このサンプルの出力結果は

55.8
"5m(レーザ)"

といった形式で出力されます。

JSON形式の標高値elevationが上でいう55.8 です。ちなみに、経緯度は手動で入れてます...*1

ちなみに、プログラムの

json2 = json.substring(4,json.length());

jsonにnull{"elevation":55.8,"hsrc":"5m\uff08\u30ec\u30fc\u30b6\uff09"}が入っていてnull部分を泥臭く消しています。

スタートとゴールの間を100で刻んで取得した標高は以下のようになりました。

f:id:mtiit:20150305143628p:plain

やっぱり少し坂のようになっていたことが確認できました。以上、同様のデータを取得する際はご参考ください。

*1:経緯度はGoogleMapで右クリックをすれば「この場所について」でその地点の経緯度が見れました