본문 바로가기

Java/Codes

주소로 좌표 구하기, 좌표로 주소 마커 표시하기 (카카오 맵)

좌표 얻는 json

package main;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONObject;

public class addrcheck {

//   public static void main(String[] args) throws IOException { //테스트용
//      test1.getGeoDataByAddress("신천동 29");
//   }
	
	
   public static Map<String, String> getGeoDataByAddress(String completeAddress) {//어디서나 접근할 수 있고, run하는 시점에 존재하는 데이터타입이 맵인 getGeoDataByAddress함수를 생성
       try {
    	   System.out.println("3.getGeoDataByAddress 매개변수 값 : " + completeAddress);
           String API_KEY = "사용자 키 값";//API키 변수 설정
           String surl = "https://maps.googleapis.com/maps/api/geocode/json?address="+URLEncoder.encode(completeAddress, "UTF-8")+"&key="+API_KEY;//구글 맵 api의 주소가 받은 변수(주소)인 completeAddress를 UTF-8 형식으로 받고, 키값을 API_KEY로 설정하여 surl변수에 넣는다. 
           URL url = new URL(surl);//URL생성시 surl를 파라미터 값으로 하여 url에 대입
           InputStream is = url.openConnection().getInputStream();//url안의 openConnection()안의 getInputStream()의 리턴 값을 데이터 타입이 InputStream인 변수 is에 담는다.
    
           BufferedReader streamReader = new BufferedReader(new InputStreamReader(is, "UTF-8"));//InputStreamReader을 생성 시 파라미터를 is로 가지는 리턴값을 BufferedReader 생성 시 파라미터로 가지고 그 리턴 값을 BufferedReader 데이터 타입의 streamReader 변수에 담는다.
           
           StringBuilder responseStrBuilder = new StringBuilder();//StringBuilder 생성하고 StringBuilder 데이터 타입의 responseStrBuilder 변수를 참조변수로 설정한다.
           String inputStr;//데이터 타입이 String인 변수 inputStr 생성 
           System.out.println("====================================== test1.java 접근 확인  ======================================");
           System.out.println(">>>>>>>>>> >>>>>>>>>> InputStream Start <<<<<<<<<< <<<<<<<<<<");
           while ((inputStr = streamReader.readLine()) != null) {//streamReader를 읽어온 값을 한줄 씩 inputStr에 넣고 더이상 넣을 값이 없으면 멈춘다.
               System.out.println(">>>>>>>>>>     "+inputStr);
               responseStrBuilder.append(inputStr);//responseStrBuilder 안의 append() 함수를 사용 할 때 inputStr를 파라미터로 갖는 리턴 값을 반환한다.
           }
           System.out.println(">>>>>>>>>> >>>>>>>>>> InputStream End <<<<<<<<<< <<<<<<<<<<");
    
           JSONObject jo = new JSONObject(responseStrBuilder.toString());//responseStrBuilder안의 toString() 함수의 리턴 값을 JSONObject 생성 시 파라미터 값으로 하여 데이터 타입 JSONObject을 가진 jo 변수 생성
           JSONArray results = jo.getJSONArray("results");//jo 안의 result 문자를 파라미터로 가진 getJSONArray 함수를 실행한 리턴값을 JSONArray 데이터 타입 results 변수에 대입한다.

           Map<String, String> ret = new HashMap<String, String>();//HashMap 생성 시 데이터 타입을 Map으로 가진 ret 참조변수로 생성한다.
           if(results.length() > 0) {//results 변수의 배열길이가 0보다 길면
               JSONObject jsonObject;//JSONObject 데이터 타입의 jsonObject 변수 생성
               jsonObject = results.getJSONObject(0);//results안의 getJSONObject(0) 값. 즉, 배열의 첫번째 값을 jsonObject 변수에 담는다.
               Double lat = jsonObject.getJSONObject("geometry").getJSONObject("location").getDouble("lat");//jsonObject안의 getJSONObject 사용 시 geometry문자를 파라미터로 가진 함수 안의 getJSONObject 사용 시 location문자를 파라미터로 가진 getDouble 사용 시 lat문자를 변수로 가진 함수를 실행한 리턴값을 Double 데이터 타입의 lat 변수에 담는다. 위도 뽑기
               Double lng = jsonObject.getJSONObject("geometry").getJSONObject("location").getDouble("lng");//jsonObject안의 getJSONObject 사용 시 geometry문자를 파라미터로 가진 함수 안의 getJSONObject 사용 시 location문자를 파라미터로 가진 getDouble 사용 시 lng문자를 변수로 가진 함수를 실행한 리턴값을 Double 데이터 타입의 lng 변수에 담는다. 경도 뽑기
               ret.put("lat", lat.toString());//ret안에 lat 이름으로 lat.toString() 값 담기
               ret.put("lng", lng.toString());//ret안에 lng 이름으로 lng.toString() 값 담기
               System.out.println("======================================");
               System.out.println("LAT(위도) : "+lat);//위도 확인용 콘솔출력
               System.out.println("LNG(경도) : "+lng);//경도 확인용 콘솔출력
               System.out.println("======================================");
               JSONArray ja = jsonObject.getJSONArray("address_components");//jsonObject안의 address_components를 파라미터로 가지는 getJSONArray 함수의 리턴 값을 JSONArray 데이터 타입으로 가지는 ja변수에 담는다.
               for(int l=0; l<ja.length(); l++) {//ja의 배열길이 만큼 반복
                   JSONObject curjo = ja.getJSONObject(l);//ja안의 JSONObject를 가져올때 파라미터 값을 l로 가진 리턴 값을 JSONObject 데이터타입의 curjo 변수에 담는다.
                   String type = curjo.getJSONArray("types").getString(0);//curjo안의 types의 문자를 파라미터로 가지는 getJSONArray함수 안의 getString(0) 즉 첫번째 리턴값을 String 타입의 type변수에 넣는다.
                   String short_name = curjo.getString("short_name");//curjo안의 short_name의 문자를 파라미터로 가지는 getJSONArray함수 리턴 값을 String 타입의 short_name에 담는다.
                   if(type.equals("postal_code")) {// type 안의 리턴 값이 postal_code문자와 일치하면
                       System.out.println("POSTAL_CODE: "+short_name);
                       ret.put("zip", short_name);//ret안에 zip를 키값으로 하는 short_name value를 담는다.
                   }
                   else if(type.equals("administrative_area_level_3")) {// type 안의 리턴 값이 administrative_area_level_3문자와 일치하면
                       System.out.println("CITY: "+short_name);
                       ret.put("city", short_name);//ret안에 city를 키값으로 하는 short_name value를 담는다.
                   }
                   else if(type.equals("administrative_area_level_2")) {// type 안의 리턴 값이 administrative_area_level_2문자와 일치하면
                       System.out.println("PROVINCE: "+short_name);
                       ret.put("province", short_name);//ret안에 province를 키값으로 하는 short_name value를 담는다.
                   }
                   else if(type.equals("administrative_area_level_1")) {// type 안의 리턴 값이 administrative_area_level_1문자와 일치하면
                       System.out.println("REGION: "+short_name);
                       ret.put("region", short_name);//ret안에 region를 키값으로 하는 short_name value를 담는다.
                   }                    
               }
               return ret;//함수 호출 종료 시 ret을 반환한다.
           }
       } catch (Exception e) {
           e.printStackTrace();
       } 
       return null;
   }
}

 

좌표로 주소위치 마커 표시

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="springmap.test_0622.test1"%> 
<%@ page import="java.util.HashMap"%> 
<%@ page import="java.util.Map"%> 
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>주소로 장소 표시하기</title>
</head>
<body>
<%
	//String addname = "신천동 29";//테스트용
	request.setCharacterEncoding("utf-8");//한글 깨지지 않도록 utf-8설정
	String addname = request.getParameter("mapping");//주소명 
	System.out.println("2.mapping값 확인 : "+ request.getParameter("mapping"));
	Map<String, String> addr = test1.getGeoDataByAddress(addname);//getGeoDataByAddress함수에 주소 변수를 파라미터값으로 보내 받은 리턴값을 맵 데이터타입의 addr변수로 받는다.
	System.out.println("4.getGeoDataByAddress(addname)함수 리턴 값 : "+ addr);
	System.out.println("5.리턴값의 정보 중 사용할 위도, 경도 값 : "+ addr.get("lat") + ", " + addr.get("lng"));
%> 

<h1>1번문제</h1>
<div id="place"></div>
<h1>2번문제</h1>
<div id="map" style="width:100%;height:800px;"></div>

<!-- 카카오 웹상에 저장된 src를 사용하기위해 주소를 불러온다. javascript용 앱키를 넣어준다.-->
<script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=사용자 키 값"></script>
<script>

var mapContainer = document.getElementById('map'), // 지도를 표시할 div 
    mapOption = {
        center: new kakao.maps.LatLng(33.450701, 126.570667), // 지도의 중심좌표
        level: 3 // 지도의 확대 레벨
    };  

var map = new kakao.maps.Map(mapContainer, mapOption); // 지도를 생성한다    
var geocoder = new kakao.maps.services.Geocoder();// 주소-좌표 변환 객체를 생성한다

geocoder.addressSearch('<%=addname%>', function(result, status) { // 변수에 입력 된 주소로 좌표(아이티에듀넷)를 검색한다
     if (status === kakao.maps.services.Status.OK) {// 정상적으로 검색이 완료됐으면 
        var coords = new kakao.maps.LatLng(<%=addr.get("lat")%>, <%=addr.get("lng")%>);//중심 좌표를 맵안의 키값을 get하여 value(위도 값, 경도 값)를 구한다.
        var message = '위도 : ' + <%=addr.get("lat")%> + '&nbsp&nbsp&nbsp' +'경도  : ' + <%=addr.get("lng")%>;//위도와 경도 정보를 담고 있는 addr.get("lat"), addr.get("lat")을 massage 변수에 담는다.
		var resultDiv = document.getElementById('place'); //document안의 getElementById의 파라미터값 place를 넣은 후 resultDiv변수에 대입한다.
		resultDiv.innerHTML = message; //메시지를 resultDiv변수 안의 innerHTML안에 대입한다.
        var marker = new kakao.maps.Marker({map: map, position: coords});// 결과값으로 받은 위치를 마커변수에 대입한다
        var infowindow = new kakao.maps.InfoWindow({content: '<div style="width:150px;text-align:center;padding:6px 0;"><%=addname%></div>'}); // 인포윈도우로 장소에 대한 설명을 인포윈도우변수에 대입한다
        infowindow.open(map, marker);//infowindow안의 open함수에 map과 marker를 파라미터값으로 넘긴다.
        map.setCenter(coords);// 지도의 중심을 결과값으로 받은 위치로 이동시킨다.
    } 
});    

</script>

<button type="button" onClick="location.href='index.jsp'" style="position: absolute; margin-top: 20px;">주소검색</button>

</body>
</html>

 

주소검색 폼. 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>주소로 장소 표시하기</title>
</head>
<body>
	<form action="address.jsp" method="post">
		주소 : <input type="text" id="mapping" name="mapping">
		<input type="submit">
	</form>
	<% System.out.println("1.검색창 실행"); %>
</body>
</html>

 

pom.xml 의존 설정

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>springmap</groupId>
  <artifactId>test_0622</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <name>test_0622</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
   	<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.1.2.RELEASE</version>
	</dependency>
	<dependency>
	  <groupId>org.springframework</groupId>
	  <artifactId>spring-web</artifactId>
	  <version>5.3.21</version>
	</dependency>
	<dependency>
	  <groupId>com.google.code.geocoder-java</groupId>
	  <artifactId>geocoder-java</artifactId>
	  <version>0.16</version>
	</dependency>
	<dependency>
	  <groupId>javax.servlet</groupId>
	  <artifactId>jstl</artifactId>
	  <version>1.2</version>
	</dependency>
	<dependency>
	  <groupId>com.github.richygreat</groupId>
	  <artifactId>commonutil</artifactId>
	  <version>1.1</version>
	</dependency>
	<dependency>
	  <groupId>org.json</groupId>
	  <artifactId>json</artifactId>
	  <version>20220320</version>
	</dependency>

  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

 

WEB-INF의 lib에 json.jar와 json-simple-1.1.1.jar를 넣어줘야 된다.

'Java > Codes' 카테고리의 다른 글

선풍기 (스레드)  (0) 2022.03.24
선풍기 (싱글턴)  (0) 2022.03.23
선풍기  (0) 2022.03.23
함수를 사용하여 사칙연산 계산기 만들기  (0) 2022.03.14
2022 대선 투표 프로그램  (0) 2022.03.14