Java : 기상청 좌표 얻기
이전 글에서는 사용법을 알아 보았고, 이번 글에서는 기상청 api를 사용하기 위한 파라미터 x좌표와 y좌표를 얻기 위한 방법을 포스팅 하겠다.
http://www.kma.go.kr/DFSROOT/POINT/DATA/top.json.txt
위 사이트에 가면 아래와 같은 값을 얻을 수 있다.
(한글이 깨져서 보인다면 인터넷 익스플로어로 열어 마우스 우클릭 후 인코딩을 UTF-8로 변경해 주면 된다.)
[{"code":"11","value":"서울특별시"},{"code":"26","value":"부산광역시"},{"code":"27","value":"대구광역시"},{"code":"28","value":"인천광역시"},{"code":"29","value":"광주광역시"},{"code":"30","value":"대전광역시"},{"code":"31","value":"울산광역시"},{"code":"41","value":"경기도"},{"code":"42","value":"강원도"},{"code":"43","value":"충청북도"},{"code":"44","value":"충청남도"},{"code":"45","value":"전라북도"},{"code":"46","value":"전라남도"},{"code":"47","value":"경상북도"},{"code":"48","value":"경상남도"},{"code":"50","value":"제주특별자치도"}]
기상청의 지역코드는 top, mdl, leaf로 나누어져 있으며, top은 시, 도 mdl은 시, 구, 군 leaf는 동, 읍, 면, 리 단위이며,
Json 형태로 제공 된다.
http://www.kma.go.kr/DFSROOT/POINT/DATA/top.json.txt 에서 원하는 시의 지역코드를 얻고,
http://www.kma.go.kr/DFSROOT/POINT/DATA/mdl.[시 지역코드].json.txt 에서 원하는 구의 지역코드를 얻은 뒤,
http://www.kma.go.kr/DFSROOT/POINT/DATA/leaf.[구 지역코드].json.txt 에서 원하는 동의 좌료플 얻는다.
예를 들어 서울특별시의 종로구 종로1가를 찾는다고 하면
http://www.kma.go.kr/DFSROOT/POINT/DATA/top.json.txt 에서 서울특별시코드 11을 찾고,
http://www.kma.go.kr/DFSROOT/POINT/DATA/mdl.11.json.txt 에서 종로구에 해당하는 코드 11110을 찾은 뒤,
http://www.kma.go.kr/DFSROOT/POINT/DATA/leaf.11110.json.txt 에서 종로1가에 해당하는 x, y값(x : 60, y : 127)을
찾으면 된다.
자바 시, 구, 동에 대한 X, Y값 구하기
자바로 시, 구, 동에 대한 X, Y값 구하기를 구현하였다. 구현하기 위해서는
http://www.java2s.com/Code/Jar/j/Downloadjsonsimple111jar.htm 에서 Json 라이브러리를 다운받아 라이브러리를 추가해 주어야 한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
public class GetAreaCode {
public static void main(String[] args) throws IOException, ParseException {
// TODO Auto-generated method stub
String result;
String areaTop="서울특별시"; //지역
String areaMdl="종로구";
String areaLeaf="종로1가동";
String code=""; //지역 코드
String x;
String y;
URL url;
BufferedReader br;
URLConnection conn;
JSONParser parser;
JSONArray jArr;
JSONObject jobj;
//시 검색
url = new URL("http://www.kma.go.kr/DFSROOT/POINT/DATA/top.json.txt");
conn = url.openConnection();
br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
result = br.readLine().toString();
br.close();
//System.out.println(result);
parser = new JSONParser();
jArr = (JSONArray) parser.parse(result);
for(int i = 0 ; i < jArr.size(); i++) {
jobj = (JSONObject) jArr.get(i);
if(jobj.get("value").equals(areaTop)) {
code=(String)jobj.get("code");
System.out.println(areaTop+"코드 : "+code);
break;
}
}
//구 검색
url = new URL("http://www.kma.go.kr/DFSROOT/POINT/DATA/mdl."+code+".json.txt");
conn = url.openConnection();
br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
result = br.readLine().toString();
br.close();
//System.out.println(result);
parser = new JSONParser();
jArr = (JSONArray) parser.parse(result);
for(int i = 0 ; i < jArr.size(); i++) {
jobj = (JSONObject) jArr.get(i);
if(jobj.get("value").equals(areaMdl)) {
code=(String)jobj.get("code");
System.out.println(areaMdl+"코드 : "+code);
break;
}
}
//동 검색
url = new URL("http://www.kma.go.kr/DFSROOT/POINT/DATA/leaf."+code+".json.txt");
conn = url.openConnection();
br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
result = br.readLine().toString();
br.close();
//System.out.println(result);
parser = new JSONParser();
jArr = (JSONArray) parser.parse(result);
if(areaMdl.equals("종로구")) {
for(int i = 0 ; i < jArr.size(); i++) {
jobj = (JSONObject) jArr.get(i);
String leaf1=areaLeaf.substring(0,areaLeaf.length()-3);
String leaf2=areaLeaf.substring(areaLeaf.length()-3,areaLeaf.length()-2);
String leaf3=areaLeaf.substring(areaLeaf.length()-2,areaLeaf.length());
Pattern pattern = Pattern.compile(leaf1+"[1-9.]{0,8}"+leaf2+"[1-9.]{0,8}"+leaf3);
Matcher matcher = pattern.matcher((String) jobj.get("value"));
if(matcher.find()) {
x=(String)jobj.get("x");
y=(String)jobj.get("y");
System.out.println(areaLeaf+"의 x값 : "+x+", y값 :"+y);
break;
}
}
}else {
for(int i = 0 ; i < jArr.size(); i++) {
jobj = (JSONObject) jArr.get(i);
if(jobj.get("value").equals(areaLeaf)) {
x=(String)jobj.get("x");
y=(String)jobj.get("y");
System.out.println(areaLeaf+"의 x값 : "+x+", y값 :"+y);
break;
}
}
}
}
}
이 소스는 예제소스이므로 시, 구, 동을 모두 미리 입력해 놨다.
제일 처음 서울특별시의 코드를 얻고, 동 검색에서 원하는 동에 대한 코드값을 얻는다.
세번째로 x,y 좌표를 얻어야 하는데, 종로구만 아래와 같이 나와서 if문으로 종로구인지 체크를 하여 따로 만들었다.
종로구 일때는 문자열을 뒤에 2글자(가동) 그 앞 1글자(1) 그 다음 앞글자를 추출하여 정규표현식을 이용하여 일치하는지를 체크하여 x,y 값을 가져왔다.