데이터를 ListMap에 넣어 사용하면서 필요한 내용만 골라서 사용해야 하는 경우 Loop를 돌리는 방법도 있지만 stream을 이용하면 쉽게 필터링이 가능 합니다.

 

stream을 이용하기 때문에 리턴값이 stream으로 넘어오지만 collect를 사용하여 필요한 형태로 가공하여 받아올 수도 있습니다.

 

 

 

 

먼저 List에 있는 데이터를 필터링 하는 방법입니다.

 

        List<String> list = new ArrayList<>();
        list.add("test");
        list.add("atest");
        list.add("test1");
        list.add("btest");
        list.add("ctest");
        list.add("test2");
        list.add("dtest");
        list.add("etest");
       
        Stream<String> filter = list.stream().filter(l->l.startsWith("t"));
        filter.forEach(System.out::println);
 
        List<String> lst = list.stream().filter(l->l.startsWith("t"))
                       .collect(Collectors.toList());
        System.out.println("List : " + lst);

 

첫번째 system.outstream으로 받아온 예제이고

두번째는 collect를 이용하여 다시 List로 받아오는 내용입니다.

 

첫번째 결과는

test
test1
test2

 

두번째는

 

List : [test, test1, test2]

 

 

다음은 Map<String, String>을 필터링 하는 방법입니다.

 

Map<String, String> map = new HashMap<>();
              
map.put("aa", "ba");
map.put("baa", "abb");
map.put("abb", "bbb");
map.put("caa", "acc");
map.put("aac", "aac");
map.put("aad", "cad");
              
Map<String, String> filterMap = map.entrySet()
        .stream().filter(f->f.getKey().startsWith("a"))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println("key : " + filterMap);
              
Map<String, String> filterVal = map.entrySet()
        .stream().filter(f->f.getValue().startsWith("a"))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println("value : " + filterVal);
              
Map<String, String> conMap = map.entrySet()
        .stream().filter(f->f.getKey().contains("a"))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println("contain : " + conMap);

 

첫번째는 key 값이 “a”로 시작하는 내용만 필터링하고

두번째는 value 값이 “a”로 시작하는 내용만 필터링하고

세번째는 key 값에 “a”가 들어있는 내용만 필터링하는 예제 입니다.

 

각각의 결과는

 

key : {aa=ba, abb=bbb, aac=aac, aad=cad}
value : {caa=acc, aac=aac, baa=abb}
contain : {aa=ba, abb=bbb, caa=acc, aac=aac, baa=abb, aad=cad}

 

 

이번에는 Map<Integer, String>을 필터링 하는 방법입니다.

 

Map<Integer, String> intMap = new HashMap<>();
              
intMap.put(10, "ba");
intMap.put(20, "abb");
intMap.put(30, "bbb");
intMap.put(40, "acc");
intMap.put(50, "aac");
intMap.put(60, "cad");
              
Map<Integer, String> intFilter = intMap.entrySet()
        .stream().filter(x->x.getKey() > 30)
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println("intMap : " + intFilter);
              
              
Map<Integer, String> intMap2 = new HashMap<>();
for(Map.Entry<Integer, String> intmap : intMap.entrySet()) {
        if(intmap.getKey() > 30)
               intMap2.put(intmap.getKey(), intmap.getValue());
}
System.out.println("intMap : " + intMap2);

 

key 값이 숫자인 경우 조건식으로 필터링 하는 방법입니다.

결과는 동일한데 추출하는 방법을 하나는 for문을 사용해 봤습니다.

 

intMap : {50=aac, 40=acc, 60=cad}
intMap : {50=aac, 40=acc, 60=cad}

 - copy coding -

 

Google Map에는 개인이 지도에 정보를 표시할 수 있는 여러가지 기능을 제공하고 있습니다.  그중에 오늘은 좌표를 이용해 지도에 표시하고 나타내는 방법을 알아보려고 합니다.

 

먼저 지도에 표시할 좌표와 명칭을 만들어야 합니다.

가장 쉬운 방법으로 엑셀을 이용하여 문서 하나를 생성했습니다.

 

 

첫줄은 지도에 올릴때 무시되니 위도, 경도가 아니더라도 의미있는 단어로 기록 합니다.

이것으로 좌표관련 문서 작업은 완료 입니다.

 

개인이 google map에 정보를 표시한다고 했으니 먼저 google에 로그인을 해야 사용이 가능 합니다.

 

로그인을 하고 구글 맵으로 이동 합니다.

가능하면 google.co.kr로 로그인 해서 google map을 검색하고 map을 선택하길 바랍니다.  google.com에서 맵으로 넘어가면 한글을 잘 인식하지 못하는 현상이 발생할 수 있습니다.(메뉴가 영문으로 보이면 한글 인식에 문제가 있는것 같음.)

 

https://www.google.com/maps/?hl=ko

 

 

좌측에서 메뉴 아이콘(3개의 아이콘)을 클릭해서 메뉴를 확장 합니다.

 

 

[내 장소] 메뉴를 클릭 합니다.

 

 

내 장소의 하위 메뉴를 보면 모두 단어만 봐도 직관적으로 무슨 기능을 할것인지 잘 알 수 있습니다.  여기서는 좌표를 이용하여 지도를 만드는 작업을 하기위해 [지도]를 클릭 합니다.

 

 

아직은 생성한 지도가 없어 지도가 없음으로 리스트가 나타나지 않습니다. 

 

이제 하단에 있는 [지도 만들기]를 클릭해 줍니다.  웹 브라우저 바닦에 붙어있는 메뉴 입니다.

 

 

화면이 변경되고 지도관련 정보를 설정하는 창이 있습니다.

여기서 [가져오기]를 클릭하면 파일을 올리거나 다른곳에서 가져와서 등록을 하는 창이 나타납니다.

 

 

좌표값이 들어있는 파일을 개인 PC뿐 아니라 다른곳 에서도 가져올 수 있습니다.

처음에 만들어 놓은 엑셀 파일을 파일 탐색기에서 드래그앤 드롭으로 추가 합니다.

 

 

엑셀에 저장된 값의 순서를 알 수 없으므로 위도와 경도를 맵핑하도록 선택기능이 있습니다.  엑셀 데이터를 위도와 경도가 맞도록 매칭 시켜줍니다. 

 

 

위도와 경도만 선택하면 [계속] 버튼이 활성화 됩니다.

“여기서는 장소명을 선택하지 않습니다.”

위도와 경도 선택이 완료되면 [계속] 버튼을 클릭 합니다.

 

 

여기에서 엑셀에서 장소명으로 입력한 컬럼인 마커위치의 이름을 선택하면 됩니다. 

[완료] 버튼일 클릭하여 선택을 완료하면 지도에 위치가 표시 됩니다.

 

 

기본 제공하는 지도를 꾸미는 기능이 있는데 몇개만 알아 봅니다.

 

 

마커를 변경하려면 페인트 칠하는 브러쉬모양을 클릭하여 하나씩 변경해 봅니다.

[균일 스타일]의 기준을 [숫자의순서]로 수정하면 마커를 숫자로 변경해서 볼 수도 있습니다.

 

 

이번에는 스타일을 변경한 경우입니다.  기타 아이콘등 여러가지를 변경할 수 있습니다.

작업하면서 개인적으로는 뭔가 부족하다는 느낌을 받았지만 무료로 사용하는거니 그러려니...

 

- copy coding -

 

우리나라는 지도를 해외로 반출할 수 없기 때문에 지도를 사용하려면 데이터를 사용해야 합니다.  그러나 해외에 나가서 현지의 지도를 사용하는 경우에는 미리 해당 지역을 다운로드 받으면 데이터를 사용하지 않고도 필요한 기능을 사용할 수 있습니다.  다운로드 방법도 매우 간단 합니다.

 

1. 저장 위치 검색

 

제일먼저 해야할 일은 구글에 로그인을 하고 구글 맵을 다운받아 실행하여 저장하려는 위치를 검색해서 지도 중앙에 놓이도록 합니다.

 

 

그리고 하단에 있는 뒤로가기(<)를 클릭해 줍니다.

 

 

2. 메뉴 활성화

 

뒤로가기를 했다면 아래와 같은 화면이 보여야 정상 입니다.

 

여기서 검색 입력창의 우측에 로그인 사용자 이름의 첫글자가 나오는 원을 클릭하면 다양한 메뉴가 나타 납니다.

 

 

메뉴의 중간쯤에서 지금 하려는 [오프라인 지도]를 선택해 줍니다.

 

 

3. 지도 다운로드

 

오프라인 지도 창으로 화면이 이동 되고

오프라인 지도 메뉴에서 [나만의 지도 선택]을 클릭 해주면

 

 

 

다운받으려는 지역 표시가 나타납니다.  여기서 필요한 지도의 영역을 선택하면 되는데 지도를 점점 축소 또는 확대 해서 오프라인으로 사용하려는 지도가 검은색 사각형 안쪽으로 들어가도록 합니다.  지도가 축소될 수록 다운받아야하는 양이 많아지고 하단에 용량도 표시가되니 적당하게 선택을 해줍니다.

사용할 영역을 선택했으면 하단에 있는 [다운로드] 버튼을 클릭하여 다운로드를 진행 합니다.

 

 

잠시후 다운로드가 완료 되었습니다. 

 

 

4. 오프라인 지도 사용 방법

 

다운받은 지도의 사용 방법은 오프라인 지도 화면에서 다운로드된 지도를 클릭 합니다.

 

 

여기서는 하나만 있으니 프랑크푸르트를 선택 합니다.

 

 

그리고 지도의 밝은 부분을 클릭하면 오프라인으로 사용이 가능 합니다.

 

 

 

5. 추가 기능

 

추가적인 기능을 사용하려면 우측의 점 3개를 클릭하면 됩니다.  저장된 지도에 대한 추가 기능은 4가지로 업데이트, 보기, 이름 변경, 삭제 입니다.

 

 

하나씩 메뉴에 대한 화면만 보도록 하겠습니다.

 

[업데이트]

 

다운로드 받은 지도의 내용이 변경되었을 수 있으니 최신 정보로 업데이트 하는 기능입니다.

 

 

[보기]

 

4번에서 살펴본 다운로드한 지도 사용법과 동일 합니다.

 

 

다운로드 받은 지도의 내용을 업데이트 할 수도 있고 음영 가운데 환한 부분의 지도를 클릭하면 오프라인으로 사용 가능한 화면으로 이동 합니다.

 

 

 

[이름변경]

 

 

저장한 지도의 이름을 변경합니다.

 

 

[삭제]

 

말 그대로 저장된 지도를 삭제합니다. 

 

 

팝업 창에서 []를 선택하면 저장된 지도가 바로 삭제됩니다.

 

- copy coding -

NAVER Map을 이용하여 Android App을 만들어 보려고 합니다.  Google Map을 이용하여 안드로이드 앱을 만들어 보았다면 네이버 맵도 쉽게 만드실 수 있습니다.  네이버도 구글과 비슷한 방법으로 맵 사용 권한을 부여 하고 있습니다.  구글 맵을 이용하여 앱을 만들어 보지 않았다면 사용 권한 키를 받는 과정이 다소 복잡해 보일 수 있습니다.  설명 방법은 그림 위주로 하며 다음 순서대로 진행합니다.

1. 네이버 맵 사용 등록

2. Client ID 생성(맵 사용 키)

3. 안드로이드 스튜디오에서 NAVER Map을 이용한 앱 생성

 

이용 신청을 위해 아래 주소를 이용하여 네이버 맵 사이트 접속합니다.

https://www.ncloud.com/product/applicationService/maps

 

[이용 신청 하기] 버튼을 클릭 합니다

 

 

[회원가입] 화면에서 개인 회원 또는 사업자를 클릭 합니다. 저는 [개인 회원]을 선택하고 [다음] 버튼을 클릭 하였습니다.

 

 

약관에 동의를 합니다광고를 받고 싶으면 광고 정보 수신을 꼭 선택하세요.

 

 

회원 정보를 입력합니다.   아이디는 메일 주소로 입력해야 하고 인증을 위해 전송 버튼을 클릭하여 발송된 메일을 클릭 해야 하니 정확히 입력해야 합니다.  메일 인증을 위해 입력한 아이디의 메일을 확인해 봅니다.

 

 

위 사진은 아이디로 입력한 메일로 수신된 인증 메일입니다. [메일 인증] 버튼을 클릭 해 줍니다.

 

 

나머지 주소 및 회원 정보도 입력을 하고 휴대폰 번호도 인증을 한 후 [다음] 버튼을 클릭합니다.

 

 

무조건 결제수단을 등록해야 하는데 특정 사용량을 넘겨야 하기 때문에 과금은 이루어지지 않는다고 생각하면 됩니다.

 

 

[휴대폰 인증하기]로 결제카드를 등록 합니다.

 

 

본인 확인을 위한 전화 인증을 진행 합니다.

 

 

 

카드정보를 입력하고 [등록하기] 버튼을 클릭 합니다.

 

 

결제 카드 등록이 완료 되었습니다.

 

 

 

10만원 상당의 크레딧을 제공한다고 하는데 필요하면 신청을 합니다단 유효 기간은 3개월 입니다.

 

 

회원가입을 완료하고 로그인 후 다시 처음 화면으로 왔습니다.  [이용 신청 하기] 버튼을 클릭 합니다.

 

 

여러 API들이 소개 되고 있는데 현재는 선택하는 게 아니므로 하단으로 이동합니다.

 

 

본인이 만든 프로그램을 등록하는 화면인데 개인적으로는 순서가 바뀌지 않았나 하는 생각이 듭니다.  어째든 [Application 등록] 버튼을 클릭합니다.

 

 

약관 동의를 하고 [확인] 버튼을 클릭 합니다.

 

 

이제 사용하려는 애플리케이션을 선택하고 등록할 수 있습니다이번에도 스크롤을 하단으로 이동합니다.  물론 네이버 맵이 아니라면 다른걸 선택하면 되겠죠.

 

 

모바일 맵을 사용 하기한 등록을 시작 합니다.  [Mobile Dynamic Map]을 체크하고 안드로이드 앱 패키지 이름도 등록합니다등록시 [추가] 버튼을 클릭해야 등록 됩니다.  패키지를 입력했으면 [등록] 버튼을 클릭합니다.

 

 

드디어 얻으려는 인증 정보 단계에 도착했습니다.  키 모양 아이콘이 있는 [인증 정보] 버튼을 클릭 합니다.

 

 

인증 정보 팝업에서 [Client ID]를 복사해 잘 보관 합니다.  ID가 있어야 앱에서 네이버 맵을 불러올 수 있습니다.

 

 

Client ID를 생성 하였으니 네이버 맵을 이용한 앱을 하나 만들어 봅니다.

 

템플릿을 하나 선택 하고

 

 

Package name Naver에 입력한 것으로 적어줍니다. 네이버 지도 SDK는 안드로이드 OS 버전 4.0.3(API 레벨 15) 이상에서 사용할 수 있으니 Minimum SDK도 확인하고 [Finish] 버튼을 클릭해 줍니다.

 

프로젝트가 생성되면 추가적인 설정값을 입력해 줍니다.

 

build.gradle(Project)

allprojects {
   
repositories {
       
google()
        jcenter()
        maven {
            url
'https://naver.jfrog.io/artifactory/maven/'
       
}
    }
}

 

build.gradle(Module)

 

dependencies {
    implementation 'com.naver.maps:map-sdk:3.10.2'
}

 

그리고 Manifast에 복사해 놓은 Client_ID를 추가해주고 android.permission.INTERNET도 추가 합니다.

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    
package="copycoding.tistory.navermap">
    <
uses-permission android:name="android.permission.INTERNET" />
    <
application
        
android:allowBackup="true"
        
android:icon="@mipmap/ic_launcher"
        
android:label="@string/app_name"
        
android:roundIcon="@mipmap/ic_launcher_round"
        
android:supportsRtl="true"
        
android:theme="@style/Theme.NaverMap">
        <
activity android:name=".MainActivity">
            <
intent-filter>
                <
action android:name="android.intent.action.MAIN" />

                <
category android:name="android.intent.category.LAUNCHER" />
            </
intent-filter>
        </
activity>
        <
meta-data
            android:name="com.naver.maps.map.CLIENT_ID"
            android:value="Client_ID입력" 
/>
    </
application>

</
manifest>

 

Layout에 맵용 fragment를 추가해 줍니다.

 

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    
xmlns:app="http://schemas.android.com/apk/res-auto"
    
xmlns:tools="http://schemas.android.com/tools"
    
android:layout_width="match_parent"
    
android:layout_height="match_parent"
    
tools:context=".MainActivity">

    <
fragment android:layout_width="match_parent"
        
android:layout_height="match_parent"
        
android:id="@+id/map"
        
android:name="com.naver.maps.map.MapFragment" 
/>

</
androidx.constraintlayout.widget.ConstraintLayout>

 

프로그램은 이것으로 끝이고 실행해 볼까요?

 

 

기본적인 지도를 볼 수 있습니다.  Client ID를 얻는 과정이 프로그램보다 더 힘이 드는군요.

 

- copy coding -


123

+ Recent posts