부천시 약국 위치 정보 데이터를 db에서 가져와 카카오맵에 다중 마커 생성하고 마커를 클릭할때마다 해당 마커에 오버레이만 열리도록 구현하려고 했다.

 

문제는 다른 마커를 클릭했을 때 기존에 열려있던 오버레이를 닫게 하고 싶었는데 모든 오버레이가 닫히는 문제가 발생했다.

 

[해결방법] 

https://devtalk.kakao.com/t/topic/60502

 

Kakao DevTalk

카카오 데브톡. 카카오 플랫폼 서비스 관련 질문 및 답변을 올리는 개발자 커뮤니티 사이트입니다.

devtalk.kakao.com

 

전역 변수를 하나 두고 클릭할 때마다 이 변수에 할당되어 있는 overlay(clickedOverlay)를 setMap(null) 하고 현재 클릭된 overlay를 해당 변수에 재할당하여 계속하여 이 전 overlay(clickedOverlay)를 지우는 방식을 사용해서 문제를 해결했다.

var clickedOverlay;
 
// 마커를 클릭했을 때 커스텀 오버레이를 표시합니다
kakao.maps.event.addListener(marker, 'click', function() {

  // 마커 클릭 정보가 전역변수에 담은 오버레이 삭제
  if (clickedOverlay) {
      clickedOverlay.setMap(null);
  }
  overlay.setMap(map); 
  clickedOverlay = overlay;
});

 

[결과] 

 

화면 크기에 따라 지도 확대, 축소를 제어하려고 한다.

var map;
window.onload = function () {
    var zoomable = $(window).width() > 500? false: true;
    var mapContainer = document.getElementById('map'), // 지도를 표시할 div
        mapOption = {
            center: new kakao.maps.LatLng(37.56682, 126.97865), // 지도의 중심좌표
            level: 3, // 지도의 확대 레벨
            zoomable: zoomable,
            mapTypeId: kakao.maps.MapTypeId.ROADMAP // 지도종류
        };
    // 지도를 생성한다
    map = new kakao.maps.Map(mapContainer, mapOption);
}

$(window).resize(function () {
    if ($(window).width() > 500) {
        alert('지도 확대,축소 비활성화');
        map.setZoomable(false); // 지도 확대,축소 막기 
    }else{
    	alert('지도 확대,축소 활성화'); 
        map.setZoomable(true); 
    }
  });

최초로 화면이 로드될 때 화면 크기가 500이상인 경우는 지도 확대, 축소를 비활성화 한다.
그 후 화면이 resize 될 때마다 화면 크기를 구해 500이상인 경우 지도 확대, 축소를 비활성화 하고 그렇지 않으면 활성화한다.
*map에 확대,축소를 설정하려면 먼저 map이 생성되야 한다.



참고 : https://apis.map.kakao.com/web/sample/enableDisableZoomInOut/

저번글에서는 open Api를 json으로 파싱해서 콘솔창에 출력했다.

이번에는 xml 방식으로 파싱을 하려고 한다.

 

xml 방식으로 받아오기 위해 url의 returnType을 xml로 변경한다.

import org.json.simple.parser.ParseException;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import java.io.IOException;
import java.net.URLEncoder;

public class apiXmlPasingTest {
    public static void main(String[] args) throws IOException, ParseException, XPathExpressionException, ParserConfigurationException, SAXException {
        String serviceKey = "발급받은 서비스키";
        String urlStr = "http://apis.data.go.kr/B552584/UlfptcaAlarmInqireSvc/getUlfptcaAlarmInfo";
        urlStr += "?" + URLEncoder.encode("serviceKey", "UTF-8") + "=" + serviceKey;
        urlStr += "&" + URLEncoder.encode("returnType", "UTF-8") + "=xml";
        urlStr += "&" + URLEncoder.encode("numOfRows", "UTF-8") + "=10";
        urlStr += "&" + URLEncoder.encode("pageNo", "UTF-8") + "=1";
        urlStr += "&" + URLEncoder.encode("year", "UTF-8") + "=2021";

        // xml 파싱
        Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(urlStr);
        XPath xpath = XPathFactory.newInstance().newXPath();

        NodeList clearVal = (NodeList) xpath.evaluate("//items/item/clearVal", document, XPathConstants.NODESET);
        NodeList sn = (NodeList) xpath.evaluate("//items/item/sn", document, XPathConstants.NODESET);
        NodeList districtName = (NodeList) xpath.evaluate("//items/item/districtName", document, XPathConstants.NODESET);
        NodeList dataDate = (NodeList) xpath.evaluate("//items/item/dataDate", document, XPathConstants.NODESET);
        NodeList issueVal = (NodeList) xpath.evaluate("//items/item/issueVal", document, XPathConstants.NODESET);
        NodeList issueTime = (NodeList) xpath.evaluate("//items/item/issueTime", document, XPathConstants.NODESET);
        NodeList clearDate = (NodeList) xpath.evaluate("//items/item/clearDate", document, XPathConstants.NODESET);
        NodeList issueDate = (NodeList) xpath.evaluate("//items/item/issueDate", document, XPathConstants.NODESET);
        NodeList moveName = (NodeList) xpath.evaluate("//items/item/moveName", document, XPathConstants.NODESET);
        NodeList clearTime = (NodeList) xpath.evaluate("//items/item/clearTime", document, XPathConstants.NODESET);
        NodeList issueGbn = (NodeList) xpath.evaluate("//items/item/issueGbn", document, XPathConstants.NODESET);
        NodeList itemCode = (NodeList) xpath.evaluate("//items/item/itemCode", document, XPathConstants.NODESET);

        for (int j = 0; j < clearVal.getLength(); j++) {
            System.out.println("발령일 : "+ dataDate.item(j).getTextContent()
                    + ", 지역명 : "+districtName.item(j).getTextContent()
                    +", 권역명 : "+moveName.item(j).getTextContent()
                    +", 항목명 : "+itemCode.item(j).getTextContent()
                    + ", 경보단계 : "+issueGbn.item(j).getTextContent()
                    + ", 발령일 : "+issueDate.item(j).getTextContent()
                    + ", 발령시간 : "+issueTime.item(j).getTextContent()
                    + ", 발령농도 : "+issueVal.item(j).getTextContent()
                    +", 해제일 : "+clearDate.item(j).getTextContent()
                    + ", 해제시간 : "+clearTime.item(j).getTextContent()
                    +", 해제농도 : "+clearVal.item(j).getTextContent());
        }

    }

}

XPath xml 문서의 특정요소나 속성 접근하기 위한 경로로 xml 문서의 일부분을 선택하고 처리하기 위한 것이다.

 

결과

 

저번글에서는  json방식으로 api를 호출해서 데이터를 확인했다.

이번에는 api를 json으로 파싱을 해보려고 한다.

 

json관련 라이브러리 추가 방법과 파싱방법은 이전 게시글에 게시해놓았다.

2021.05.04 - [프로그래밍&IT/java] - [java 자바] JSON 파싱

 

[java 자바] JSON 파싱

JSON을 이용해 파싱을하려고 한다. 먼저 JSON을 사용하기 위해 JSON에 필요한 라이브러리(jar) 추가가 필요하다. 라이브러리 추가 방법은 두가지가 있다. 1. 직접 jar파일을 다운 받아서 추가 ohgbu88.tist

ohgbu88.tistory.com

 

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

public class apiTest {
    public static void main(String[] args)  throws IOException, ParseException {
        String serviceKey = "발급받은 서비스키값";
        String urlStr = "http://apis.data.go.kr/B552584/UlfptcaAlarmInqireSvc/getUlfptcaAlarmInfo";
        urlStr += "?" + URLEncoder.encode("serviceKey", "UTF-8") + "=" + serviceKey;
        urlStr += "&" + URLEncoder.encode("returnType", "UTF-8") + "=json";
        urlStr += "&" + URLEncoder.encode("numOfRows", "UTF-8") + "=10";
        urlStr += "&" + URLEncoder.encode("pageNo", "UTF-8") + "=1";
        urlStr += "&" + URLEncoder.encode("year", "UTF-8") + "=2021";

        URL url = new URL(urlStr);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Content-type", "application/json");
        //System.out.println("Response code: " + conn.getResponseCode());
        BufferedReader rd;
        if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
            rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        } else {
            rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
        }
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = rd.readLine()) != null) {
            sb.append(line);
        }
        rd.close();
        conn.disconnect();
        String result= sb.toString();

        // JSONParser를 이용해 String 값을 Json 객체로 만들어준다.
        JSONParser parser = new JSONParser();

        // 만들어진 JSON 객체를 JSONObject클래스를 사용해 저장한다.
        JSONObject obj = (JSONObject) parser.parse(result);

        //JSONObject에서 key값이 response인 value를 추출하기 위해 get()을 이용한다.
        JSONObject parse_response = (JSONObject) obj.get("response");

        //JSONObject에서 key값이 body인 value를 추출하기 위해 get()을 이용한다.
        JSONObject parse_body = (JSONObject) parse_response.get("body");

        //JSONObject에서 key값이 items인 value를 추출하기 위해 get()을 이용한다.
        JSONArray item = (JSONArray)parse_body.get("items");

        for(int i=0;i<item.size();i++){
            JSONObject tmp = (JSONObject)item.get(i);
            //System.out.println("item.get(i) : " + item.get(i) );
            String dataDate = (String)tmp.get("dataDate");
            String districtName = (String)tmp.get("districtName");
            String moveName = (String)tmp.get("moveName");
            String itemCode = (String)tmp.get("itemCode");
            String issueDate = (String)tmp.get("issueDate");
            String issueTime = (String)tmp.get("issueTime");
            String issueVal = (String)tmp.get("issueVal");
            String clearDate = (String)tmp.get("clearDate");
            String clearTime = (String)tmp.get("clearTime");
            String clearVal = (String)tmp.get("clearVal");
            System.out.println("발령일 : "+dataDate + ", 지역명 : "+districtName +", 권역명 : "+moveName +", 항목명 : "+itemCode + ", 경보단계 : "+issueDate + ", 발령일 : "+issueDate + ", 발령시간 : "+issueTime + ", 발령농도 : "+issueVal +", 해제일 : "+clearDate + ", 해제시간 : "+clearTime +", 해제농도 : "+clearVal);
        }
    }

}

결과

+ Recent posts