본문 바로가기
프로그래밍/API

Java : 기상청 좌표 얻기

by 밍구몬 2019. 6. 7.

이전 글에서는 사용법을 알아 보았고, 이번 글에서는 기상청 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 값을 가져왔다.