타닥타닥 개발자의 일상

코틀린 kotlin 구글 맵스 이용하여 위도,경도 주소로 바꾸기 / 위도,경도 주소로 바꾸기 하는 안드로이드 화면 만들기 본문

코딩 기록/Kotlin

코틀린 kotlin 구글 맵스 이용하여 위도,경도 주소로 바꾸기 / 위도,경도 주소로 바꾸기 하는 안드로이드 화면 만들기

NomadHaven 2022. 2. 16. 22:43
폴더 및 파일 구성

 

AndroidManifest.xml에 인터넷 접속 및 위치 추적 가능하게 하는 아래의 코드 삽입

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.INTERNET"/>

 

코드 삽입된 전체 코드는 아래와 같다.

 

AndroidManifest.xml 
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.geocoding">

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <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.Geocoding">
        <activity
                android:name=".MainActivity"
                android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

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

</manifest>

 

 


activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    <TextView
            android:layout_width="436dp"
            android:layout_height="116dp"
            android:text="Hello World!"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.774"
            android:id="@+id/textView"/>
    <TextView
            android:text="위도"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:textSize="20dp"
            android:id="@+id/textView2"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintHorizontal_bias="0.149"
            app:layout_constraintVertical_bias="0.049"/>
    <TextView
            android:text="경도"
            android:layout_width="50dp"
            android:textSize="20dp"
            android:layout_height="50dp"
            android:id="@+id/textView3"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintHorizontal_bias="0.149"
            app:layout_constraintVertical_bias="0.171"/>
    <EditText
            android:layout_width="287dp"
            android:layout_height="45dp"
            android:inputType="textPersonName"
            android:ems="10"
            android:id="@+id/editTextlat"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintHorizontal_bias="0.552"
            app:layout_constraintVertical_bias="0.054"/>
    <EditText
            android:layout_width="287dp"
            android:layout_height="45dp"
            android:inputType="textPersonName"
            android:ems="10"
            android:id="@+id/editTextlong"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintHorizontal_bias="0.552"
            app:layout_constraintVertical_bias="0.17"/>

    <EditText
            android:layout_width="287dp"
            android:layout_height="45dp"
            android:inputType="textPersonName"
            android:ems="10"
            android:id="@+id/editTextadd"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintHorizontal_bias="0.552"
            app:layout_constraintVertical_bias="0.438"/>
    <TextView
            android:text="주소"
            android:layout_width="50dp"
            android:textSize="20dp"
            android:layout_height="50dp"
            android:id="@+id/textView4"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintHorizontal_bias="0.149"
            app:layout_constraintVertical_bias="0.435"/>
    <Button
            android:text="지도"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/mapButton1"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintHorizontal_bias="0.726"
            app:layout_constraintVertical_bias="0.285"/>
    <Button
            android:text="주소로 변환"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/addrButton"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintHorizontal_bias="0.455"
            app:layout_constraintVertical_bias="0.285"/>

    <Button
            android:text="위도/경도 변환"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/latButton"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintHorizontal_bias="0.475"
            app:layout_constraintVertical_bias="0.552"/>
    <Button
            android:text="지도"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/mapButton2"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintHorizontal_bias="0.726"
            app:layout_constraintVertical_bias="0.552"/>


</androidx.constraintlayout.widget.ConstraintLayout>

디자인 화면

 

 


MainActivity.kt
package com.example.geocoding

import android.content.Intent
import android.location.Address
import android.location.Geocoder
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import java.io.IOException

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //여행 -> 사진 : 위치 > 주소 > 위도, 경도

        val textView = findViewById<TextView>(R.id.textView)
        var addrBtn = findViewById<Button>(R.id.addrButton)
        var mapBtn1 = findViewById<Button>(R.id.mapButton1)
        var latBtn = findViewById<Button>(R.id.latButton)
        var mapBtn2 = findViewById<Button>(R.id.mapButton2)


        var latEdit = findViewById<EditText>(R.id.editTextlat)
        var lonEdit = findViewById<EditText>(R.id.editTextlong)
        var addrEdit = findViewById<EditText>(R.id.editTextadd)

        val geocoder: Geocoder = Geocoder(this)

        //변환 : 위도, 경도 > 주소
        addrBtn.setOnClickListener {
            var list:List<Address>? = null


            try {
                val d1: Double = latEdit.text.toString().toDouble()
                val d2: Double = lonEdit.text.toString().toDouble()

                list = geocoder.getFromLocation(d1, d2, 10) //10개의 데이터를 얻어오겠다.

            } catch (e: IOException) {
                Log.d("위도/경도", "입출력 오류")
            }

            if (list != null) {
                if (list.isEmpty()) {
                    textView.text = "해당되는 주소는 없습니다."
                } else { //정상적으로 산출된 주소
                    textView.text = list[0].toString()

                }
            }
        }

        mapBtn1.setOnClickListener {
            val d1: Double = latEdit.text.toString().toDouble()
            val d2: Double = lonEdit.text.toString().toDouble()

            val intent = Intent(Intent.ACTION_VIEW, Uri.parse("geo:$d1,$d2"))
            startActivity(intent)
        }

        //주소 > 위도, 경도
        latBtn.setOnClickListener {
            var list:List<Address>? = null
            val str = addrEdit.text.toString()

            try {
                list = geocoder.getFromLocationName(str, 10)
            } catch (e: IOException) {
                                        }
                if (list != null) {
                    if(list!!.isEmpty()){
                        textView.text = "해당되는 주소는 없습니다."
                    }else{
                        //textView.text = list!![0].toString()
                        textView.text = list!!.get(0).latitude.toString() + " " +
                                list!!.get(0).longitude.toString()
                    }
                }
            }

            mapBtn2.setOnClickListener {
                var list: List<Address>? = null
                val str = addrEdit.text.toString()

                try {
                    list = geocoder.getFromLocationName(str, 10)
                } catch (e: IOException) {
                }
                if (list != null) {
                    if (list!!.isEmpty()) {
                        textView.text = "해당되는 주소는 없습니다."
                    } else {
                        val addr = list!![0]
                        val lat = addr.latitude
                        val lon = addr.longitude
                        val geo = String.format("geo:%f,%f", lat, lon)
                        val intent = Intent(Intent.ACTION_VIEW, Uri.parse(geo))
                        startActivity(intent)
                    }
                }
            }
        }
    }

 

 


실행 화면

입력한 위도와 경도 주소로 변환했을시

 

입력한 위도와 경도의 위치를 구글맵스로 표시
입력한 주소의 정도를 위도/ 경도로 변환했을시
입력한 주소를 출력하는 구글맵스

Comments