확장자가 shp인 파일은 GIS에서 사용하는 Shapefile로 지리 공간에 대한 벡터 데이터를 담고 있는 파일 입니다바탕이 되는 지도 이미지에 레이어로 추가해서 정보를 보여주기 위해 사용을 하는데 QGIS를 설치하고 파일을 열어보는 부분까지 설명을 합니다.

 

https://www.qgis.org/en/site/forusers/download.html

 

다운로드 하기 위해서는 위에 있는 주소에 들어가보면


QGIS shp shapefile


운영체제 별로 프로그램이 준비되어 있습니다설치하려는 OS를 선택합니다저는 Windows를 선택했습니다.


QGIS shp shapefile


운영체제가 몇 bit로 작동하는지 그리고 어떤 버전을 사용할 것인가를 결정하고 파일을 선택합니다저는 최신 버전인 3.16(64bit)를 선택 했습니다.

설치는 다운로드 받은 파일을 실행해서 진행하고 특별한 변경사항이 없다면 그냥 끝까지 Next 버튼을 클릭하면 완료 됩니다화면 캡쳐 이미지만 나열해 보았습니다.


QGIS shp shapefile



QGIS shp shapefile



QGIS shp shapefile



QGIS shp shapefile



QGIS shp shapefile



QGIS shp shapefile


설치가 완료 되었습니다.

QGIS를 실행해 봅니다.


QGIS shp shapefile


처음이자 마지막으로 볼 수 있는 화면으로 [시작합시다!]를 클릭 합니다.


QGIS shp shapefile


QGIS가 실행된 모습입니다프로젝트 하나를 열어보겠습니다. QGIS는 프로젝트 단위로 관리를 합니다.


QGIS shp shapefile


보유하고 있는 프로젝트가 있으면 메뉴에서 프로젝트>열기를 선택해서 프로젝트를 가져옵니다.


QGIS shp shapefile


만일 프로젝트가 아닌 shp 파일만 가지고 있다면


QGIS shp shapefile


메뉴에서 프로젝트>새로 생성을 선택 합니다.


QGIS shp shapefile


그리고 메뉴에서 레이어>레이어 추가>벡터 레이어 추가를 선택 합니다.


QGIS shp shapefile


레이어를 추가하는 팝업을 볼 수 있는데 여기에서 원본 항목에 [...] 버튼을 이용하여 shp 파일을 선택해 주고 추가 버튼을 클릭 합니다.


QGIS shp shapefile


선택한 shp 파일을 볼 수 있습니다. 컴퓨터가 너무 오래돼서 사이즈가 큰 벡터이미지를 불러오면 버퍼링이 발생하는 군요벡터이미지로 할게 있는데 느긋한 마음으로 작업을 해야겠습니다.


- copy coding -


예전에 구글에서 제공하는 소스를 이용하여 구글 맵에 현재의 위치를 표시하는 앱을 만들었는데 최근에 다시 가보니 현재의 Android Studio 버전에 적용되는 library들로 source code가 변경이 되어 있네요오랜만에 다시 구현을 해보았습니다.

Android Studio 4.0을 사용해서 구현한 화면 입니다.


android place not authorized


 

모든 동작은 예전처럼 잘 되는데 이상하게 우측 [GET PLACE]를 누르면 아무런 동작도 하지 않습니다.  logcat을 살펴 보니 오류가 발생 하는 군요

 

21814-21814/copycoding.tistory.mylocation E/MainActivity: Exception: %s

 com.google.android.gms.common.api.ApiException: 9011: This API project is not authorized to use this API.

at com.google.android.libraries.places.internal.zzce.then(com.google.android.libraries.places:places@@2.3.0:6)

 

com.google.android.libraries.places를 사용할 권한이 없다는 건데 예전 소스코드에서 library의 변화가 있었나 봅니다권한이 없다고 하니 문제를 해결하러 API 관리 페이지에서 답을 찾아봅니다.


Google API 관리 사이트로 가보면 사용 설정된 API 목록을 볼 수 있습니다.


android place not authorized


현재 2개의 API를 사용하고 있다고 나오는 군요.

바로 아래쪽에 추가 API 목록이 있습니다.


android place not authorized


아무래도 여기에 있는 Places API가 원인인 것 같은데 선택을 합니다.


android place not authorized


[사용설정] 버튼을 클릭하면 권한을 받아오고 상단의 사용 설정된 API에 추가 됩니다.


android place not authorized


잘 추가가 되었군요.

이제 다시 앱을 실행해 볼까요?


android place not authorized


위치정보도 잘 가져오고 있습니다그 전에도 여기까지만 하고 손을 놓았는데 이번에는 꼭 뭔가를 만들어 보고 싶군요.


- copy coding -


핸드폰에 안드로이드로 구글 지도를 표시하려고 하는데 빈 화면만 나오는 경우가 있습니다개발을 하면서 소스를 다른 컴퓨터에 복사해서 사용하는 경우 또는 google api에 패키지를 등록할 때 깜빡 하고 저장 버튼을 누르지 않은 경우 발생할 수 있습니다.


android google map blank


이런 경우 오류 메시지를 살펴보면


android google map blank


D/OpenGLRenderer: Swap behavior 0

E/Google Maps Android API: Authorization failure.  Please see https://developers.google.com/maps/documentation/android-api/start for how to correctly set up the map.

E/Google Maps Android API: In the Google Developer Console (https://console.developers.google.com)

    Ensure that the "Google Maps Android API v2" is enabled.

    Ensure that the following Android Key exists:

          API Key: AIXxXxXxXXxXxXxXXXXXXxXXXXxXXXXXXXXN_L8

          Android Application (<cert_fingerprint>;<package_name>): 56:C8:12:AA:AA:AA:AA:AA: AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:A4:B8;copycoding.tistory.gpsmap

D/EGL_emulation: eglCreateContext: 0xa2605f00: maj 2 min 0 rcv 2

D/EGL_emulation: eglMakeCurrent: 0xa2605f00: ver 2 0 (tinfo 0xa26034f0)


API Key는 있지만 패키지에 연결된 SHA-1 값이 맞지 않아 인증 실패가 되었다는 메시지 입니다.

패키지를 등록 할 떄


android google map blank


항목 추가를 누르고 패키지와 SHA-1 지문을 입력하고 완료 만 누르면 반영이 되지 않습니다.


android google map blank


하단에 저장 버튼이 있어서 이것까지 눌려야 입력한 패키지가 반영이 됩니다만일 작업 컴퓨터가 변경이 되었다면 keytool로 다시 설치해서 SHA-1 값을 변경해서 저장하면 됩니다.


android google map blank


그러면 이번에는 지도가 잘 보입니다.


- copy coding -


구글에서 제공하는 안드로이드 용 지도 앱(단순히 정해준 위치의 지도를 보여주는 기능) 사용하기 예제를 이용하여 테스트 하고 사용 방법을 익혀 봅니다아주 단순하고 간단하게 만들어 볼 수 있습니다. 웹 주소는

https://developers.google.com/maps/documentation/android-sdk/start


이곳으로 여기에 가면 소스를 그대로 복사해서 테스트 해 볼 수 있습니다웹 페이지에 나와있는 순서대로 작업을 해봅니다물론 순서는 편리에 따라 바꾸어도 상관 없습니다.

 

Step 1. Download Android Studio


https://developer.android.com/studio/index.html


android google map sdk


자신의 운영체제에 맞는 패키지를 다운받아 설치 합니다. 현재 3.5버전 이고 다른 버전이라도 설치되어 있으면 패스. 저는 업데이트 했습니다.

 

Step 2. Install the Google Play services SDK


안드로이드 스튜디오 메뉴에서 팝업 창을 열고

Tools > SDK Manager > Appearance & Behavior > System Settings > Android SDK

우측에서 SDK Tools 탭을 선택 합니다.


android google map sdk


Google Play services 를 체크하여 설치 합니다기존에 설치를 했으면 패스.

 

Step 3. Create a Google Maps project


그냥 생각 나는 이름으로 프로젝트를 하나 생성 합니다.

Activityempty를 선택하고 생성 했습니다.


android google map sdk


Package nameAPI 사이트에 등록을 해야 하니 적당하게 입력 합니다저는 copycoding.tistory.mylocation으로 했습니다.


android google map sdk


Step 4. Get a Google Maps API key


구글에서 API를 사용할 수 있는 키를 생성 합니다. 그리고 package name을 이용하여 등록을 합니다.  기존에 생성한 API 키가 있다면 package name만 신규로 등록 합니다키 생성 방법은 검색하면 자세한 설명들이 바글바글 합니다저도 하나 설명한게 있습니다.

[안드로이드] google map 사용을 위한 API 생성(2018.11)


android google map sdk


Step 5. Hello Map! Take a look at the code


이제 프로젝트에 사이트에 있는 소스를 복사해서 붙여 넣기를 합니다사이트에는 두개의 소스가 있습니다.

 

activity_main.xml

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
   
xmlns:tools="http://schemas.android.com/tools"
   
android:layout_width="match_parent"
   
android:layout_height="match_parent"
   
android:id="@+id/map"
   
tools:context=".MapsActivity"
   
android:name="com.google.android.gms.maps.SupportMapFragment" />

 

MainActivity.java

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

   
private GoogleMap mMap;

   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
       
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(
this);
    }

   
@Override
   
public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

       
// Add a marker in Sydney, Australia, and move the camera.
       
LatLng sydney = new LatLng(-34, 151);
        mMap.addMarker(
new MarkerOptions().position(sydney).title("Marker in Sydney"));
        mMap.moveCamera(
CameraUpdateFactory.newLatLng(sydney));
    }
}

 

이 두가지로만 하면 오류가 발생 합니다.

사이트에 없지만 추가를 해야 하는 항목이 두개 있습니다간단해서 생략 했을 수도 있습니다.


AndroidManifest.xml

<meta-data
   
android:name="com.google.android.geo.API_KEY"
   
android:value="API 키 값" >
</
meta-data>

Step 4에서 생성한 API 키를 입력 합니다.

 

build.gradle(Module: app)

implementation 'com.google.android.gms:play-services-maps:10.2.0'

라이브러리도 추가 해줍니다.

 

Step 6. Connect an Android device


테스트를 진행하기 위해 가상 디바이스를 생성 하거나 실제 핸드폰을 연결 합니다


android google map sdk


Step 7. Build and run your app


이제 프로그램을 실행 하기만 하면 끝 입니다.


android google map sdk


GPS를 이용 하는게 아니라서 방구석 처밖혀 인터넷만 연결되면 테스트가 가능 합니다.

줌 기능을 추가하지 않아 그냥 세계지도를 보는 느낌이네요.

 

전체 소스

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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
xmlns:android="http://schemas.android.com/apk/res/android"
       
xmlns:tools="http://schemas.android.com/tools"
       
android:layout_width="match_parent"
       
android:layout_height="match_parent"
       
android:id="@+id/map"
       
tools:context=".MapsActivity"
       
android:name="com.google.android.gms.maps.SupportMapFragment" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
   
package="copycoding.tistory.gpsmap">
    <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/AppTheme">

        <meta-data
           
android:name="com.google.android.geo.API_KEY"
           
android:value="API Key "/>
        <activity
android:name=".MainActivity">
            <intent-filter>
                <action
android:name="android.intent.action.MAIN" />

                <category
android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

 

build.gradle(Module: app)

apply plugin: 'com.android.application'

android {
    compileSdkVersion
29
   
buildToolsVersion '29.0.2'
   
defaultConfig {
        applicationId
"copycoding.tistory.gpsmap"
       
minSdkVersion 16
        
targetSdkVersion 29
       
versionCode 1
       
versionName "1.0"
       
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
   
}
    buildTypes {
        release {
           
minifyEnabled false
           
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
       
}
    }
}

dependencies {
    implementation fileTree(
dir: 'libs', include: ['*.jar'])
    implementation
'androidx.appcompat:appcompat:1.1.0'
   
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
   
implementation 'com.google.android.gms:play-services-maps:10.2.0'
   
testImplementation 'junit:junit:4.12'
   
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
   
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

 

 

 

 

MainActivity.java

package copycoding.tistory.mylocation;

import
androidx.appcompat.app.AppCompatActivity;
import
androidx.fragment.app.FragmentActivity;

import
android.os.Bundle;

import
com.google.android.gms.maps.CameraUpdateFactory;
import
com.google.android.gms.maps.GoogleMap;
import
com.google.android.gms.maps.OnMapReadyCallback;
import
com.google.android.gms.maps.SupportMapFragment;
import
com.google.android.gms.maps.model.LatLng;
import
com.google.android.gms.maps.model.MarkerOptions;

public class
MainActivity extends FragmentActivity implements OnMapReadyCallback {

   
private GoogleMap mMap;

   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
       
setContentView(R.layout.activity_main);

       
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.
map);
       
mapFragment.getMapAsync(this);
   
}

   
@Override
   
public void onMapReady(GoogleMap googleMap) {
       
mMap = googleMap;

       
// Add a marker in Sydney, Australia, and move the camera.
       
LatLng sydney = new LatLng(-34, 151);
       
mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
       
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
   
}
}

 

 - copy coding -


123

+ Recent posts