본문 바로가기
개발 공부 Today I Learned

[국비 83일차 TIL] geoserver 선택한 지역에 해당되는 레이어 표시하기

by 개발자신입 2024. 3. 22.
반응형

지오서버, 오픈레이어스를 활용하여 localhost에 지도 띄우기

postgreSQL 내 데이터 tl_sd, tl_sgg, tl_bjd 테이블 사용해서.

ServletController.java

package servlet.controller;

import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

import servlet.service.ServletService;

@Controller
public class ServletController {
	
	@Resource(name = "ServletService")
	private ServletService servletService;
	
	@RequestMapping(value = "/main.do")
	public String mainTest(ModelMap model) throws Exception {
		System.out.println("main start");
        List<Map<String, Object>> sdList = servletService.selectSD();
        List<Map<String, Object>> sggList = servletService.selectSGG();
        List<Map<String, Object>> bjdList = servletService.selectBJD();
        
        model.addAttribute("sdList", sdList);
        model.addAttribute("sggList", sggList);
        model.addAttribute("bjdList", bjdList);
        
		return "main/main";
	}	

}

 

RestFullController

package servlet.controller;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import servlet.service.ServletService;

@RestController
public class RestFullController {

    @Autowired
    private ServletService servletService;
    
    @PostMapping("/getSggList.do")
    public List<Map<String, Object>>  getSggList(@RequestParam("sdValue") String sdValue) {
    	System.out.println("ㅎㅇㅎㅇ");
      List<Map<String, Object>> list = servletService.getSggList(sdValue);
      System.out.println(list);
      return list;
    }
    @PostMapping("/getBjdList.do")
    public List<Map<String, Object>>  getBjdList(@RequestParam("sggValue") String sggValue) {
    	List<Map<String, Object>> list = servletService.getBjdList(sggValue);
    	System.out.println(list);
    	return list;
    }

}

 

ServletService

서비스는 인터페이스다.

package servlet.service;

import java.util.List;
import java.util.Map;

public interface ServletService {
	String addStringTest(String str) throws Exception;

	List<Map<String, Object>> selectSD();

	List<Map<String, Object>> selectSGG();

	List<Map<String, Object>> selectBJD();

	List<Map<String, Object>> getSggList(String sdValue);

	List<Map<String, Object>> getBjdList(String sggValue);

}

 

ServletImpl

package servlet.impl;

import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import egovframework.rte.psl.dataaccess.util.EgovMap;
import servlet.service.ServletService;

@Service("ServletService")
public class ServletImpl extends EgovAbstractServiceImpl implements ServletService{
	
	@Resource(name="ServletDAO")
	private ServletDAO dao;
	
	public String addStringTest(String str) throws Exception {
		List<EgovMap> mediaType = dao.selectAll();
		return str + " -> testImpl ";
	}

	@Override
	public List<Map<String, Object>> selectSD() {
		return dao.selectList("servlet.sdlist");
	}

	@Override
	public List<Map<String, Object>> selectSGG() {
		return dao.selectList("servlet.sgglist");
	}

	@Override
	public List<Map<String, Object>> selectBJD() {
		return dao.selectList("servlet.bjdlist");
	}

	@Override
	public List<Map<String, Object>> getSggList(String sdValue) {
		return dao.selectList("servlet.getSgg",sdValue);
	}

	@Override
	public List<Map<String, Object>> getBjdList(String sggValue) {
		return dao.selectList("servlet.getBjd",sggValue);
	}

}

 

servlet-SQL.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="servlet">

    <select id="sdlist" resultType="HashMap">
        SELECT sd_nm
        FROM tl_sd
    </select>
    
    <select id="sgglist" resultType="HashMap">
        SELECT sgg_nm
        FROM tl_sgg
    </select>
    
    <select id="bjdlist" resultType="HashMap">
        SELECT bjd_nm
        FROM tl_bjd
    </select>
    
    
    <select id="getSgg" parameterType="String" resultType="HashMap">
    	SELECT * FROM tl_sd WHERE sd_nm = #{sdValue}
    </select>

    <select id="getBjd" parameterType="String" resultType="HashMap">
    	SELECT * FROM tl_sgg WHERE sgg_nm = #{sggValue}
    </select>    

</mapper>

 

 

main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>지도</title>
<script
   src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"
   integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g=="
   crossorigin="anonymous" referrerpolicy="no-referrer"></script>

<!-- <script type="text/javascript" src="resource/js/ol.js"></script> OpenLayer 라이브러리
<link href="resource/css/ol.css" rel="stylesheet" type="text/css" > OpenLayer css -->
<script src="https://cdn.jsdelivr.net/npm/ol@v9.0.0/dist/ol.js"></script>
<link rel="stylesheet"
   href="https://cdn.jsdelivr.net/npm/ol@v9.0.0/ol.css">


<style type="text/css">
.map {
	height: 800px;
	width: 100%
}

.select-box-container {
	display: flex;
	justify-content: left;
	align-items: left;
	height: 50vh;
}

.select-box {
	margin: 0 20px;
}
</style>

</head>

<body>
	<div id="map" class="map"></div>

	<div class="select-box-container">
		<div class="select-box">
			<h2>시도 선택</h2>
			<select id="sdSelect">
				<option value="">선택</option>
				<c:forEach var="row" items="${sdList}">
					<option value="${row.sd_nm}">${row.sd_nm}</option>
				</c:forEach>
			</select>
		</div>
  		
  		<div class="select-box">
			<h2>시군구 선택</h2>
			<select id="sggSelect">
			<option value="">선택</option>
				<c:forEach var="row" items="${sggList}">
					<option value="${row.sgg_nm}">${row.sgg_nm}</option>
				</c:forEach>
			</select>
		</div>
		
		<div class="select-box">
			<h2>법정동 선택</h2>
			<select id="bjdSelect">
				<option value="">선택</option>
				<c:forEach var="row" items="${bjdList}">
					<option value="${row.bjd_nm}">${row.bjd_nm}</option>
				</c:forEach>
			</select> 
		</div>
	</div>
<!------------------------------------------------------------------------------------------------>
<!------------------------------------------------------------------------------------------------>



<script type="text/javascript">
	$(document).ready(function() {
	let map = new ol.Map(
			{ // OpenLayer의 맵 객체를 생성한다.
				target : 'map', // 맵 객체를 연결하기 위한 target으로 <div>의 id값을 지정해준다.
				layers : [ // 지도에서 사용 할 레이어의 목록을 정희하는 공간이다.
				new ol.layer.Tile(
			{
			source : new ol.source.OSM(
			{url : 'https://api.vworld.kr/req/wmts/1.0.0/5FEEDEDB-3705-3E32-8DC7-583B0B613B26/Base/{z}/{y}/{x}.png' // vworld의 지도를 가져온다.
			})
			}) ],
		view : new ol.View({ // 지도가 보여 줄 중심좌표, 축소, 확대 등을 설정한다. 보통은 줌, 중심좌표를 설정하는 경우가 많다.
			center : ol.proj.fromLonLat([ 128.4,
					35.7 ]),
			zoom : 7
		})
	});

    // 시도 선택 시 시군구 옵션 업데이트
    $('#sdSelect').on("change", function() {
        var sdValue = $(this).val(); 
        $.ajax({
            type: 'post',
            url: '/getSggList.do', 
            data: { 'sdValue': sdValue }, 
            dataType : "json",
            success: function(response) {
                alert("성공");

                // 시도에 해당하는 레이어 추가
                map.addLayer(new ol.layer.Tile({
                    source: new ol.source.TileWMS({
                        url: 'http://localhost/geoserver/korea/wms?service=WMS',
                        params: {
                            'VERSION': '1.1.0',
                            'LAYERS': 'korea:tl_sd',
                            'CQL_FILTER': "sd_nm LIKE '%" + sdValue + "%'",
                            'SRS': 'EPSG:3857',
                            'FORMAT': 'image/png'
                        },
                        serverType: 'geoserver'
                    }),
                    opacity: 0.5
                }));
            }
        });
    });

    // 시군구 선택 시 법정동 옵션 업데이트
    $('#sggSelect').on("change", function() {
        var sggValue = $(this).val();
        $.ajax({
            type: 'post',
            url: '/getBjdList.do',
            data: { 'sggValue': sggValue },
            dataType: "json",
            success: function(response) {
                alert("성공");

                // 시군구에 해당하는 레이어 추가
                map.addLayer(new ol.layer.Tile({
                    source: new ol.source.TileWMS({
                        url: 'http://localhost/geoserver/korea/wms?service=WMS',
                        params: {
                            'VERSION': '1.1.0',
                            'LAYERS': 'korea:tl_sgg',
                            'CQL_FILTER': "sgg_nm LIKE '%" + sggValue + "%'",
                            'SRS': 'EPSG:3857',
                            'FORMAT': 'image/png'
                        },
                        serverType: 'geoserver'
                    }),
                    opacity: 0.5
                }));
            }
        });
        });
       });
    // 시도, 시군구, 법정동 선택 시 해당 레이어 표시 및 숨김
	      $('#sdSelect, #sggSelect, #bjdSelect').change(function() {
	        var sdValue = $('#sdSelect').val(); 
	        var sggValue = $('#sggSelect').val();
	        var bjdValue = $('#bjdSelect').val();
	    }); 
</script>
</body>
</html>

 

 

 

3/22 현재의 상황

* 리스트는 다 나오는 상태.

    -> 시도 선택 시, 선택한 시도에 맞게 시군구 불러오기. (법정동도 똑같이)

 

* 선택한 곳의 레이어가 나오는 상태, 그러나 다른 지역을 선택하면 레이어가 삭제되지 않는 상태

    -> 다른 지역 선택 시 이전 레이어 삭제 코드 추가하기

반응형

댓글