좌표 얻는 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")%> + '   ' +'경도 : ' + <%=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 |