[Flutter] 앱 내 기기의 카메라 화면 표출
플러터에서 제공하는 Camera 라이브러리를 사용하여 앱 내에서 핸드폰의 카메라를 볼 수 있다. 1. 플러터 제공 Camera 라이브러리 의존성 추가 dependencies: camera: ^0.10.5+9 - 해당 코드 추가 후 flutter pub get 실행 2. main 함수 내에 카메라를 가져오는 코드 작성 void main() async{ WidgetsFlutterBinding.ensureInitialized(); final cameras = await availableCameras(); // 현재 사용 가능한 카메라 목록을 가져옴. final firstCamera = cameras.first; // 핸드폰 기기의 후면카메라를 선택 runApp( MaterialApp( home: MyApp( ..
2024.01.20
no image
[Flutter] 플러터에 대해서 간단히 알아보자!
얼마 전.. 약 6개월 간 작업하던 프로젝트가 마무리 되고 나서 회사의 내부 사정으로 인해 앱개발을 찍먹해보게 되었다.. IOS와 안드로이드 둘다 개발을 해야하지만, Swift, Kotlin 등 네이티브 언어를 깊게 공부할 시간이 충분하지 않기에 빠르게 업무에 투입해야 하기 때문에 범용성 있는 플러터를 사용하기로 했다. 그래서 요즘 플러터를 한창 공부중인데 그러한 기념으로 플러터에 대해서 간단히 알아보자!! 1. Flutter(플러터)란? - 2017년 5월 구글에서 출시한 모바일, 웹, 데스크톱 크로스 플랫폼 GUI 애플리케이션 프레임워크다. 해당 프레임워크로 안드로이드, 리눅스, Windows, macOS, iOS 및 웹 브라우저에서 모두 동작되는 앱을 제작할 수 있다. 앞서 범용성 있는 플러터라고 ..
2024.01.15
[OpenCV] OpenCV 미니 창에 마우스 이벤트 처리하기
OpenCV의 기본적인 기능에는 이미지를 처리하기 위해 해당 이미지를 표시하는 창을 띄운다. 더불어, 해당 창을 특별한 기능이 담긴 프로젝트로 제작하기 위해 마우스 이벤트를 처리하는 기능을 제공하고 있다. 1. 마우스 이벤트 핸들러 함수 정의 - 마우스의 이벤트에 따라 원하는 동작을 수행하도록 하는 말그대로 이벤트 핸들러 함수를 정의한다. import cv2 def mouse_event(event, x, y, flags, param) : if event == cv2.EVENT_LBUTTONDOWN: print('왼쪽 마우스 클릭') elif event == cv2.EVENT_LBUTTONUP: print('왼쪽 마우스 클릭 해제 ') elif event == cv2.EVENT_LBUTTONDBLCLK: ..
2023.12.30
no image
[OpenCV] OpenCV를 이용하여 동영상 출력
OpenCV (Computer Vision)란? - 다양한 영상 (이미지) / 동영상 처리에 사용되는 오픈소스 라이브러리 => ex) 이미지를 흑백으로 변경, 이미지의 특정 영역을 잘라내기 - OpenCV의 기능을 이용하여 여러 응용 프로젝트를 제작할 수 있다 => ex) 문서 스캐너, 얼굴 인식, 모션 인식 1. OpenCV 설치 - 파이썬을 실행하는 에디터에 맞는 프롬프트에서 해당 명령어를 입력한다. (Jupyter Notebook: Anaconda Prompt, PyCharm: 에디터 터미널) 2. OpenCV 라이브러리 Import - OpenCV를 설치 했으면 파이썬 코드 내에서 cv2라는 이름으로 OpenCV를 임포트 할 수 있다. import cv2 3. 동영상 파일 읽어오기 1) cv2.V..
2023.12.19
[OpenLayers] WFS API 호출 with Vworld
브이월드에서 제공하는 API를 이용하여 WFS 방식의 지도 레이어를 그려보자 먼저, 알아야할 몇가지들을 보자 WFS 란? - 지도를 호출하는 방식 중에, 지도서버 내에서 지도와 관련된 데이터 자체를 호출하는 방식의 프로토콜이다. - 호출된 해당 데이터 중에 피처(Feature) 라고 하는 공간 및 지리정보 데이터를 이용하여 지도 위에 다양한 기능을 추가 할 수 있다. 1. API 신청 - https://www.vworld.co.kr 브이월드 홈페이지에서 API 신청을 할 수 있다. 2. WFS를 호출하기 위한 GET 방식 URL 파라미터 설정 - 지도에 추가할 특정 기능을 위해 본인이 원하는 레이어 종류가 있을 것이다. 그런것들을 포함하여 피처 데이터 값을 받는 방식, 피처의 최대 갯수 등의 여러 부가정..
2023.10.31
no image
[OpenLayers] WMS API 호출 with Vworld
브이월드에서 제공하는 API를 이용하여 WMS 방식의 지도 레이어를 그려보자 먼저, 알아야할 몇가지들을 보자 WMS 란? - 지도를 호출하는 방식 중에, 지도서버 내에서 지도와 관련된 데이터를 이용하여 생성된 이미지를 호출하는 방식의 프로토콜이다. - 보통, 타일 방식으로 생성된 기본 지도 위에 특별한 기능을 추가하기 위해 선을 그리거나, 지도에서 건물을 감싸는 레이어를 호출하는 목적으로 사용 된다. 1. API 신청 - https://www.vworld.co.kr 브이월드 홈페이지에서 API 신청을 할 수 있다. 2. WMS를 호출하기 위한 파라미터 설정 - 지도에 추가할 특정 기능을 위해 본인이 원하는 레이어 종류가 있을 것이다. 그런것들을 포함하여 해당 지도 정보 값을 받는 방식, 이미지의 크기 등..
2023.10.23
[jQuery] 마우스 드래그로 스크롤 하기
웹에서는 기본적으로 마우스 휠을 이용하여 스크롤하지만, 모바일웹에서는 터치 드래그를 이용하여 스크롤을 한다. 이처럼 웹에서도 비슷하게 마우스 클릭 드래그를 이용하여 스크롤기능을 만들어보자. 텍스트나 이미지 등의 콘텐츠가 그것을 담는 div 태그보다 콘텐츠의 사이즈가 큰 경우, 해당 태그는 overflow 속성을 사용하기 때문에 스크롤이 생기게 된다. 이 때 해당 브라우저에서 자바스크립트의 스크롤을 하는 기능과 마우스의 여러 이벤트를 적절히 조합해서 클릭 드래그 기능을 구현 할 수 있다. 사용할 마우스의 이벤트로는 mousedown, mousemove, mouseup 3가지가 있다. 코드 부분을 간략하게 보자 var dragFlag = false; var x, y, pre_x, pre_y; $(functi..
2023.10.16
no image
[Spring] PropertyPlaceholderConfigurer 클래스를 이용한 프로필 설정 파일 불러오기
내 카톡 프로필 Spring 프로필 별로 다르게 설정되는 프로퍼티들이 있다.예를 들어 Local, Develope 프로필 별로 DB 설정을 다르게 해주어야 한다거나, 프로젝트 내 변수값을 다르게 설정해야 하는 상황이 있다. 이럴 때 프로필 별 외부설정 파일에서 프로퍼티를 불러와야 하는데 각각 다른 프로퍼티 값을 가지고 있는 local.config, dev.config 라는 외부 프로퍼티 파일이 있다고 가정할 때 해당 두 가지 파일 중에, 프로젝트 실행 시 적용된 프로필에 맞는 파일을 선택하고 해당 파일 내 프로퍼티를 사용하는 방법을 알아보자. 1.PropertyPlaceholderConfigurer 빈 등록  - dispatcher-servlet에서 해당 클래스를 빈으로 등록하고 불러오고 싶은 파일 경로..
2023.08.20
728x90

플러터에서 제공하는 Camera 라이브러리를 사용하여 앱 내에서 핸드폰의 카메라를 볼 수 있다.

 

1. 플러터 제공 Camera 라이브러리 의존성 추가

dependencies:
  camera: ^0.10.5+9

  - 해당 코드 추가 후 flutter pub get 실행

 

 

2. main 함수 내에 카메라를 가져오는 코드 작성

void main() async{
  WidgetsFlutterBinding.ensureInitialized();

  final cameras = await availableCameras(); // 현재 사용 가능한 카메라 목록을 가져옴.
  final firstCamera = cameras.first; // 핸드폰 기기의 후면카메라를 선택

  runApp(
    MaterialApp(
      home: MyApp(
          camera: firstCamera, // 이 곳에서 만든 카메라를 앱 내에 state로 전송
      ),
	  )
  );
}

  - main 함수 내에 앱을 실행하기 전에 카메라를 가져오는 코드를 작성한다.

 

 

3. 카메라를 표출할 위젯에서 initState 함수 내에 카메라 컨트롤러 설정

class CameraScreen extends StatefulWidget { 
  const CameraScreen({super.key, required this.camera}); 
  final CameraDescription camera; // main 함수에서 만든 카메라를 전달 받음

  @override
  State<CameraScreen> createState() => _CameraScreenState();
}

class _CameraScreenState extends State<CameraScreen> { 
  late CameraController _controller;
  late Future<void> _initializeControllerFuture;

  @override
  void initState() {
    super.initState();
    _controller = CameraController( // 전달받은 카메라를 이용하여 카메라 컨트롤러 설정
      widget.camera, // 설정할 카메라 지정
      ResolutionPreset.high, // 카메라 화면의 화질 설정
    );
    _initializeControllerFuture = _controller.initialize(); // 지정해준 설정으로 초기화
  }

  - main 함수에서 만든 카메라를 state로 전달 받아 CameraController를 이용하여 카메라에 대한 설정을 한다.

 

 

4. 설정된 카메라의 화면을 최종적으로 앱 내 표출

@override
  Widget build(BuildContext context) {
    return FutureBuilder<void>(
        future: _initializeControllerFuture, // 카메라 설정 초기화 진행 (비동기)
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.done) {
						// 카메라 설정 초기화가 완료가 되었는지 판단
            return CameraPreview(_controller); // 카메라 화면 표출
          } else {
            return Center(child: CircularProgressIndicator()); // 로딩화면 표출
          }
        },
      ),
    ); 
  }
}

  - 앞서 카메라 설정을 초기화 해주는 부분 _initializeControllerFuture = _controller.initialize(); 이 부분이

    비동기식으로 작동하여 Future를 반환하기 때문에 FutureBuilder를 이용하여 동기식으로 변환하여 표출한다.

728x90
728x90

얼마 전.. 약 6개월 간 작업하던 프로젝트가 마무리 되고 나서

회사의 내부 사정으로 인해 앱개발을 찍먹해보게 되었다..

IOS와 안드로이드 둘다 개발을 해야하지만,

 

Swift, Kotlin 등 네이티브 언어를 깊게 공부할 시간이 충분하지 않기에

빠르게 업무에 투입해야 하기 때문에 범용성 있는 플러터를 사용하기로 했다.

 

그래서 요즘 플러터를 한창 공부중인데 그러한 기념으로 플러터에 대해서 간단히 알아보자!!

1. Flutter(플러터)란?

  - 2017년 5월 구글에서 출시한 모바일, 웹, 데스크톱 크로스 플랫폼 GUI 애플리케이션 프레임워크다.

    해당 프레임워크로 안드로이드, 리눅스, Windows, macOS, iOS 및 웹 브라우저에서

    모두 동작되는 앱을 제작할 수 있다. 

    앞서 범용성 있는 플러터라고 수식어를 덧붙였는데, 이러한 이유로 범용성이 있다고 생각했음.

 

    물론, 앱을 제작하는 목적에 따라 모바일 기기에 최적화 된 성능의 앱을 만들 수 있는

    네이티브 언어에는 못 미치는 단점이 있겠지만

    

    간단한 목적의 앱을 만든다면 충분히 가능하다는 점과 범용성이 좋다는 점에서 큰 매력을 가지고 있는 녀석같음.

    

 

2. Dart(다트)

  - 플러터에서 여러 어플리케이션을 제작하기 위해 Dart(다트) 라는 언어를 사용한다고 한다.

    다트 역시 구글에서 제작한 언어이다.

 

    객체지향성이 강하다는 것이 가장 큰 장점이다. 이 때문에 앱을 개발하면서

    직관적으로 레고를 조립하는 듯한 느낌을 받았음.

 

    이러한 특징이 플러터 내에서 그대로 녹아드는 것 같다. 

 

    플러터에서는 앱 화면에 들어가는 모든 요소들을 위젯이라고 일컫는데,

    해당 위젯들을 모두 클래스 단위로 취급하여 각 위젯에서 사용하는 변수, 함수들을 정의한다.

 

    이렇게 각 분리되어 있는 객체들임에도 부모-자식 관계를 맺어주기도 너무 편하고,

    서로 State를 공유하기도 너무 쉽다.

    State를 따로 저장할 수 있는 공간을 만드는 라이브러리도 있다.

    거기서는 어떤 위젯이든지 다 갖다 쓸 수 있다. 참 신기한 놈이다.

 

    이 때문에 진짜 레고를 조립하는 듯한 느낌이 든다 ㅋㅋㅋ

 

 

3. 플러터 전망

  - 모든 개발자들이 작업하다 막힐 때 항상 방문하는 세계 최대규모 커뮤니티 스택오버플로우에서

    2023년 가장 많이 사용하는 프로그래밍 언어 순위 설문조사를 진행했다.

 

    그 결과 Dart 언어가 18위를 차지했다.

    https://survey.stackoverflow.co/2023/#technology

    

    일단 네이티브 언어인 코틀린은 다트보다 3위 앞선 15위를 차지했고,

    스위프트는 20위를 차지했다.

 

    구체적으로 해당 결과가 나온 이유에 대해서는 잘 모르겠지만,

 

    현재 다른 언어들과 함께 앱개발의 트렌드를 이끌어가는데 중심이 되는 언어라고 볼 수 있을듯 하다.

728x90
728x90

OpenCV의 기본적인 기능에는 이미지를 처리하기 위해 해당 이미지를 표시하는 창을 띄운다.

 

더불어, 해당 창을 특별한 기능이 담긴 프로젝트로 제작하기 위해 마우스 이벤트를 처리하는 기능을 제공하고 있다.

 

1. 마우스 이벤트 핸들러 함수 정의

  - 마우스의 이벤트에 따라 원하는 동작을 수행하도록 하는 말그대로 이벤트 핸들러 함수를 정의한다. 

import cv2

def mouse_event(event, x, y, flags, param) :
    if event == cv2.EVENT_LBUTTONDOWN:
        print('왼쪽 마우스 클릭')
    elif event == cv2.EVENT_LBUTTONUP:
        print('왼쪽 마우스 클릭 해제 ')
    elif event == cv2.EVENT_LBUTTONDBLCLK:
        print('왼쪽 마우스 더블 클릭')
    elif event == cv2.EVENT_MOUSEMOVE:
        print('마우스 이동')
    elif event == cv2.EVENT_RBUTTONDOWN:
        print('오른쪽 버튼 클릭')

  - 이벤트 핸들러 내의 함수는 5개의 파라미터를 받을 수 있다. 주로 사용하는 것은 아래 3가지다.

    1) event: 창 내에서 발생하는 마우스 이벤트 자체

    2) x: 이벤트가 발생한 마우스의 X좌표

    3) y: 이벤트가 발생한 마우스의 Y좌표

  - 마우스의 동작에 따라 각 이벤트 변수가 아래와 같이 지정되어 있다.

cv2.EVENT_LBUTTONDOWN #왼쪽 마우스 클릭
cv2.EVENT_LBUTTONUP #왼쪽 마우스 클릭 해제 
cv2.EVENT_LBUTTONDBLCLK #왼쪽 마우스 더블 클릭
cv2.EVENT_MOUSEMOVE #마우스 이동
cv2.EVENT_RBUTTONDOWN #오른쪽 버튼 클릭

 

2. 이미지 창 출력 및 해당 창에 이벤트 핸들러 적용

  - 위에 정의한 이벤트 핸들러 함수를 이미지 창에 적용해보자.

img = cv2.imread('dog.jpg')
cv2.namedWindow('dog')
cv2.setMouseCallback('dog', mouse_event)
cv2.imshow('dog', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

  - 해당 코드 내 중요한 부분은 2가지다.

    1) cv2.namedWindow('dog'): 'dog' 라는 타이틀의 이미지 창을 생성한다.

    2) cv2.setMouseCallback('dog', mouse_event): 앞서 생성한 'dog' 라는 이미지 창에

        위에서 정의한 핸들러 함수를 적용시킨다.

728x90
728x90

OpenCV (Computer Vision)란?

  - 다양한 영상 (이미지) / 동영상 처리에 사용되는 오픈소스 라이브러리

    => ex) 이미지를 흑백으로 변경, 이미지의 특정 영역을 잘라내기

  - OpenCV의 기능을 이용하여 여러 응용 프로젝트를 제작할 수 있다

    => ex) 문서 스캐너, 얼굴 인식, 모션 인식

 

1. OpenCV 설치

  - 파이썬을 실행하는 에디터에 맞는 프롬프트에서 해당 명령어를 입력한다. (Jupyter Notebook: Anaconda Prompt, PyCharm: 에디터 터미널)

 

2. OpenCV 라이브러리 Import

  - OpenCV를 설치 했으면 파이썬 코드 내에서 cv2라는 이름으로 OpenCV를 임포트 할 수 있다.

import cv2

 

3. 동영상 파일 읽어오기

  1) cv2.VideoCapture() 함수를 사용하여 읽어올 수 있다.

  2) 읽어온 영상 자체를 cap이라는 변수에 저장한다.

cap = cv2.VideoCapture('video.mp4')

  

4. 동영상 출력

  1) cap.isOpened() 함수를 사용하여 동영상 파일 업로드 성공 여부를 판단하여 반복문을 시작한다.

    => 동영상을 출력하기 위해 영상 내 프레임 단위의 이미지를 순차적으로 출력해야 하므로 반복문을 사용한다.

  2) cap.read() 함수를 사용하여 영상의 프레임 존재 여부와 프레임 자체를 가져온다.

  3) cv2.imshow() 함수 내 프레임을 삽입하여 해당 프레임 이미지를 출력한다.

  - 위 3단계가 프레임이 존재하지 않을 때까지 반복되어 연속된 프레임을 출력, 결국 영상이 출력된다.

while cap.isOpened(): # 동영상 파일이 올바르게 열렸는지?
    ret, frame = cap.read() # ret: 프레임 존재 여부, frame: 받아온 이미지 (프레임)
    if not ret:
        print('더 이상 가져올 프레임이 없어요')
        break
        
    cv2.imshow('video', frame) # 'video' 라는 이름의 창에 영상이 출력된다

 

5. 동영상 종료

   - 영상이 종료되었으므로 영상을 재생하는 메모리를 해제하여 자원을 반납하고, 해당 영상 창을 닫는다.

cap.release() #자원 해제
cv2.destroyAllWindows()

 

※ 전체 코드

import cv2
cap = cv2.VideoCapture('video.mp4')

while cap.isOpened(): # 동영상 파일이 올바르게 열렸는지?
    ret, frame = cap.read() # ret: 성공 여부, frame: 받아온 이미지 (프레임)
    if not ret:
        print('더 이상 가져올 프레임이 없어요')
        break
        
    cv2.imshow('video', frame)
        
cap.release() #자원 해제
cv2.destroyAllWindows()
728x90
728x90

브이월드에서 제공하는 API를 이용하여 WFS 방식의 지도 레이어를 그려보자

 

먼저, 알아야할 몇가지들을 보자

 

WFS 란?

  - 지도를 호출하는 방식 중에, 지도서버 내에서 지도와 관련된 데이터 자체를 호출하는

    방식의 프로토콜이다.

  - 호출된 해당 데이터 중에 피처(Feature) 라고 하는 공간 및 지리정보 데이터를 이용하여

    지도 위에 다양한 기능을 추가 할 수 있다.

 

1. API 신청

  - https://www.vworld.co.kr 브이월드 홈페이지에서 API 신청을 할 수 있다.

 

 

2. WFS를 호출하기 위한 GET 방식 URL 파라미터 설정

  - 지도에 추가할 특정 기능을 위해 본인이 원하는 레이어 종류가 있을 것이다.

    그런것들을 포함하여 피처 데이터 값을 받는 방식, 피처의 최대 갯수 등의 여러 부가정보를 설정할 수 있다.
    자세한 것은 브이월드 홈페이지에 나와있는 공식 API문서를 확인해야 한다.

let wfsUrl = `https://api.vworld.kr/req/wfs?
SERVICE=WFS&  -- 지도 호출 방식
REQUEST=GetFeature&
TYPENAME=lt_c_uq111& -- 지도 종류
BBOX=13987670,3912271,14359383,4642932&
PROPERTYNAME=mnum,sido_cd,sigungu_cd,dyear,dnum,ucode,bon_bun,bu_bun,uname,sido_name,sigg_name,ag_geom& -- 호출할 데이터
VERSION=1.1.0& -- 버전
MAXFEATURES=40& -- 최대 피처갯수
SRSNAME=EPSG:900913& -- 좌표계
OUTPUT=application/json& -- 데이터 받는 방식
EXCEPTIONS=text/xml&
KEY='API 인증키'&
DOMAIN='127.0.0.1:8201`

 

 

3. WFS 피처 호출

  - 앞서 파라미터를 설정해준 URL을 가지고 fetch 방식으로 호출해야한다.

fetch(url)
    .then(response => response.json())
    .then(data => {
	for(let i = 0; i < data.features.length; i++){
		const feature = new ol.format.GeoJSON().readFeature(data.features[i]);
			
		const source = new ol.source.Vector({
			features: [feature]
 		});
	
        	const layer = new ol.layer.Vector({
            		source: source,
        	});		
	 	mapView.addLayer(layer);
	}
    })

 

  - 데이터를 호출하고 레이어까지 생성하는 코드이다. 하나씩 살펴보자.

 

 

4. 호출된 피처(Feature)를 GeoJSON으로 변환하기

  - GeoJSON은 간단하게 공간, 지리, 위치 정보를 가진 JSON이라 할 수 있다.

    원본 Feature 값으로는 해당 정보들을 처리 할 수 없기 때문에 JSON으로 변환을 시켜주는 것이다.

const feature = new ol.format.GeoJSON().readFeature(data.features[i]);

 

 

5. VectorSource 생성

  - 변환된 GeoJSON을 가지고 Vector 객체를 만들어준다.

const source = new ol.source.Vector({
    features: [feature]
});

 

 

6. VectorLayer 생성

  - 앞서 생성한 VectorSource를 가지고 기존의 베이스 맵 객체를 가져와 최종 레이어를 생성한다.

const layer = new ol.layer.Vector({
        source: source,
});		
mapView.addLayer(layer); // 레이어 추가

 

이렇게 공간정보 전문 플랫폼에서 제공하는 WFS API 레이어를 생성하기 위해서는

1. WFS API 호출

2. Feature 정보를 GeoJSON으로 변환

3. VectorSource 생성

4. VectorLayer 생성

5. 레이어 추가

 

이와 같은 과정이 필요하다.

 

그리고,

1. OpenLayers의 ol.source.Vector 와 ol.layer.Vector 객체의 적절한 조합이 중요하다.

2. Feature 데이터를 무조건 GeoJSON으로 변환할 것.

 

이 두가지를 명심하자.

 

 

728x90

'웹개발 > OpenLayers' 카테고리의 다른 글

[OpenLayers] WMS API 호출 with Vworld  (1) 2023.10.23
728x90

브이월드에서 제공하는 API를 이용하여 WMS 방식의 지도 레이어를 그려보자

 

먼저, 알아야할 몇가지들을 보자

 

WMS 란?

  - 지도를 호출하는 방식 중에, 지도서버 내에서 지도와 관련된 데이터를 이용하여

    생성된 이미지를 호출하는 방식의 프로토콜이다.

  - 보통, 타일 방식으로 생성된 기본 지도 위에 특별한 기능을 추가하기 위해 선을 그리거나,

    지도에서 건물을 감싸는 레이어를 호출하는 목적으로 사용 된다.

 

1. API 신청

  - https://www.vworld.co.kr 브이월드 홈페이지에서 API 신청을 할 수 있다.

 

 

2. WMS를 호출하기 위한 파라미터 설정

  - 지도에 추가할 특정 기능을 위해 본인이 원하는 레이어 종류가 있을 것이다.

    그런것들을 포함하여 해당 지도 정보 값을 받는 방식, 이미지의 크기 등을 설정할 수 있다.
    자세한 것은 브이월드 홈페이지에 나와있는 공식 API문서를 확인해야 한다.

let mapParam = {
    SERVICE: 'WMS',  // 지도 호출 방식
    REQUEST: 'GetMap',
    VERSION: '1.3.0',  // 버전
    LAYERS: ['lp_pa_cbnd_bonbun','lp_pa_cbnd_bubun'],  // 지도 종류
    STYLES: ['lp_pa_cbnd_bonbun','lp_pa_cbnd_bubun'],  // 지도의 스타일 종류(지도 색상, 글자크기 등)
    CRS: EPSG,
    WIDTH: '256',  // 이미지 너비
    HEIGHT: '256',  // 이미지 높이
    FORMAT: 'image/png',  // 지도 정보 값 받는 방식
    TRANSPARENT: 'TRUE',
    BGCOLOR: '0xFFFFFF',
    EXCEPTIONS: 'text/xml',
    KEY: 'API 인증키',  // 브이월드에서 신청한 API 인증 키값을 넣으면 된다.
    DOMAIN: '127.0.0.1:8201',
};

 

 

3. WMS 레이어 생성

  - 지도를 본격적으로 셋팅해주는 OpenLayers의 기능을 사용하여 레이어를 생성해주자

let wmsLayer = new ol.layer.Tile({
    source: new ol.source.TileWMS({
        url: 'https://api.vworld.kr/req/wms',
        params: mapParam,
    })
});

  - 브이월드 API URL을 입력하고 앞에서 설정한 파라미터를 넣어주면 생성이 완료된다. 

 

 

4. 생성된 레이어 그리기

  - WMS를 호출하기 이전에 기본 지도가 존재한다는 것을 가정하고

    해당 지도 오픈레이어스 객체의 함수를 이용하여 추가해주기만 하면 된다.

mapView.addLayer(wmsLayer);

 

 

 

 

 

 

 

 

 

728x90

'웹개발 > OpenLayers' 카테고리의 다른 글

[OpenLayers] WFS API 호출 with Vworld  (0) 2023.10.31
728x90

웹에서는 기본적으로 마우스 휠을 이용하여 스크롤하지만,

모바일웹에서는 터치 드래그를 이용하여 스크롤을 한다.

 

이처럼 웹에서도 비슷하게 마우스 클릭 드래그를 이용하여 스크롤기능을 만들어보자.

 

텍스트나 이미지 등의 콘텐츠가 그것을 담는 div 태그보다 콘텐츠의 사이즈가 큰 경우,

해당 태그는 overflow 속성을 사용하기 때문에 스크롤이 생기게 된다.

 

이 때 해당 브라우저에서 자바스크립트의 스크롤을 하는 기능과 마우스의 여러 이벤트를 적절히 조합해서 클릭 드래그 기능을 구현 할 수 있다.

 

사용할 마우스의 이벤트로는 mousedown, mousemove, mouseup 3가지가 있다.

 

코드 부분을 간략하게 보자

var dragFlag = false;
var x, y, pre_x, pre_y;

$(function () {
    $('.content-right').mousedown(
        function (e) {
            dragFlag = true;
            var obj = $(this);
            x = obj.scrollLeft();
            y = obj.scrollTop();

            pre_x = e.screenX;
            pre_y = e.screenY;
        }
    );

    $('.content-right').mousemove(
        function (e) {
            if (dragFlag) {
                var obj = $(this);
                obj.scrollLeft(x+ 2.2*(pre_x-e.screenX));
                obj.scrollTop(y - e.screenY + pre_y);
                return false;
            }
        }
    );

    $('.content-right').mouseup(
        function () {
            dragFlag = false;
        }
    );
});

먼저, 클릭으로 인해 mousedown 이벤트가 발생하면  특정 boolean 값의 변수, dragFlag를 true로 변경하여,

드래그 상태임을 나타낸다.

 

두 번째로, mousemove 이벤트에서는 드래그 상태인지 아닌지를 판별하여 드래그 상태에서만

스크롤이 될 수 있도록 로직이 담겨있다. 

mousemove 이벤트가 발생하면서 드래그 상태라면, 즉 마우스를 꾹 누르고 있는 상태에서 마우스가 움직이면 스크롤을 진행하는 로직을 담는다.

 

마지막으로, mouseup 이벤트를 통해, 마우스 클릭 상태가 풀리면 드래그 상태를 false로 변경하여 더 이상 마우스를 움직여도 스크롤이 되지 않는다.

 

 

 

 

 

 

 

 

728x90
728x90

내 카톡 프로필

 

Spring 프로필 별로 다르게 설정되는 프로퍼티들이 있다.

예를 들어 Local, Develope 프로필 별로 DB 설정을 다르게 해주어야 한다거나, 프로젝트 내 변수값을 다르게 설정해야 하는 상황이 있다.

 

이럴 때 프로필 별 외부설정 파일에서 프로퍼티를 불러와야 하는데

 

각각 다른 프로퍼티 값을 가지고 있는 local.config, dev.config 라는 외부 프로퍼티 파일이 있다고 가정할 때

 

해당 두 가지 파일 중에, 프로젝트 실행 시 적용된 프로필에 맞는 파일을 선택하고 해당 파일 내 프로퍼티를 사용하는 방법을 알아보자.

 

1.PropertyPlaceholderConfigurer 빈 등록

  - dispatcher-servlet에서 해당 클래스를 빈으로 등록하고 불러오고 싶은 파일 경로를 주입해주자.

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>/WEB-INF/config/${spring.profiles.active}.config</value>
        </list>
    </property>
</bean>

    => 말그대로 빈으로 등록함과 동시에 원하는 외부 프로퍼티 설정 파일 경로를 주입해주었다.

    => 현재 상황은 적용된 프로필에 해당하는 외부 설정 파일을 사용해야 하는 상황이다.

    => 현재 적용된 프로필 네임은 spring.profiles.active를 통해 불러올 수 있다.

    => 이렇게 하면 스프링 컨테이너에 파일이 등록돼서, 어느 곳에서나 해당 파일의 프로퍼티를 사용할 수 있다.

 

2. 파일 내 정의되어 있는 프로퍼티 사용

  - 이제 파일 내에 있는 프로퍼티를 사용해야할 차례이다. 파일 내에 app.file.path 라는 프로퍼티를 사용한다 가정하겠다.

# dev.config

app.file.path=C:\\image\\path\\
@Value("${app.file.path}")
    private String myVariable;

    => 첫 번째 코드가 dev.config 즉, 설정 프로퍼티 파일이고, 두 번째 코드가 해당 파일 내 app.file.path를 사용하는 코드.

    => 해당 파일이 빈으로 등록 되었기 때문에, @Value 어노테이션을 이용하여 컨테이너에서 해당 프로퍼티를 가져올 수 있다.

    => 현재 적용된 프로필이 dev 라면 myVariable 변수에는 "C:\\image\\path\\" 가 들어있을 것.

728x90