Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีหา Latitude Longitude จากที่อยู่ใน Android

ภาพรวม

ตัวอย่างนี้สาธิตการแปลงที่อยู่ (Address) เป็น พิกัดภูมิศาสตร์ (Latitude/Longitude) โดยใช้ Geocoder

ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่

เปิด Android Studio → File → New Project และกรอกข้อมูลที่จำเป็น

ขั้นตอนที่ 2: เลย์เอาต์ (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textViewAddress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Enter Address"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_alignParentStart="true" />

    <EditText
        android:id="@+id/editTextAddress"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_toEndOf="@+id/textViewAddress"
        android:singleLine="true"
        android:hint="กรอกที่อยู่" />

    <Button
        android:id="@+id/addressButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Show Lat/Long"
        android:layout_below="@+id/textViewAddress"
        android:layout_toEndOf="@+id/textViewAddress"
        android:layout_marginTop="50dp" />

    <TextView
        android:id="@+id/latLongTV"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_centerVertical="true"
        android:layout_toEndOf="@+id/textViewAddress" />

</RelativeLayout>

ขั้นตอนที่ 3: Activity หลัก (src/MainActivity.java)

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    Button addressButton;
    TextView textViewAddress;
    TextView textViewLatLong;

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

        textViewAddress = findViewById(R.id.textViewAddress);
        textViewLatLong = findViewById(R.id.latLongTV);
        addressButton = findViewById(R.id.addressButton);

        addressButton.setOnClickListener(v -> {
            EditText editText = findViewById(R.id.editTextAddress);
            String address = editText.getText().toString().trim();
            
            if (address.isEmpty()) {
                textViewLatLong.setText("กรุณากรอกที่อยู่");
                return;
            }

            GeoCodingLocation locationAddress = new GeoCodingLocation();
            locationAddress.getAddressFromLocation(
                address, 
                getApplicationContext(), 
                new GeoCoderHandler()
            );
        });
    }

    private class GeoCoderHandler extends Handler {
        @Override
        public void handleMessage(Message message) {
            String locationAddress;
            switch (message.what) {
                case 1:
                    Bundle bundle = message.getData();
                    locationAddress = bundle.getString("address");
                    break;
                default:
                    locationAddress = null;
            }
            textViewLatLong.setText(locationAddress);
        }
    }
}

ขั้นตอนที่ 4: คลาส Geocoding (GeoCodeLocation.java)

import android.content.Context;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import java.io.IOException;
import java.util.List;
import java.util.Locale;

class GeoCodeLocation {
    private static final String TAG = "GeoCodeLocation";

    public static void getAddressFromLocation(final String locationAddress,
                                               final Context context,
                                               final Handler handler) {
        Thread thread = new Thread() {
            @Override
            public void run() {
                Geocoder geocoder = new Geocoder(context, Locale.getDefault());
                String result = null;

                try {
                    List<Address> addressList = geocoder.getFromLocationName(locationAddress, 1);
                    
                    if (addressList != null && !addressList.isEmpty()) {
                        Address address = addressList.get(0);
                        StringBuilder sb = new StringBuilder();
                        sb.append("Latitude: ").append(address.getLatitude()).append("\n");
                        sb.append("Longitude: ").append(address.getLongitude()).append("\n");
                        result = sb.toString();
                    }
                } catch (IOException e) {
                    Log.e(TAG, "Unable to connect to Geocoder", e);
                } finally {
                    Message message = Message.obtain();
                    message.setTarget(handler);
                    
                    if (result != null) {
                        message.what = 1;
                        Bundle bundle = new Bundle();
                        result = "Address: " + locationAddress + "\n\nLatitude and Longitude:\n" + result;
                        bundle.putString("address", result);
                        message.setData(bundle);
                    } else {
                        message.what = 1;
                        Bundle bundle = new Bundle();
                        result = "Address: " + locationAddress + "\n Unable to get Latitude and Longitude for this address location.";
                        bundle.putString("address", result);
                        message.setData(bundle);
                    }
                    message.sendToTarget();
                }
            }
        };
        thread.start();
    }
}

ขั้นตอนที่ 5: AndroidManifest.xml (เพิ่ม Permissions)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.sample">

    <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/AppTheme">

        <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>

การทดสอบ

รันแอป กรอกที่อยู่ เช่น "Bangkok, Thailand" กดปุ่ม Show Lat/Long จะแสดงพิกัด

วิธีหา Latitude Longitude จากที่อยู่ใน Android วิธีหา Latitude Longitude จากที่อยู่ใน Android

คำแนะนำเพิ่มเติม

  • Geocoder ต้องการ Internet - ต้องมีสิทธิ์ INTERNET
  • รันบน Background Thread - ไม่ให้รันบน Main Thread (ANR)
  • จำกัดอัตราการเรียก (Rate Limit) - ไม่ควรเรียกบ่อยเกินไป
  • ผลลัพธ์อาจไม่แม่นยำ 100% - ขึ้นกับข้อมูล Google Maps

ทางเลือกสมัยใหม่: Google Maps Geocoding API

สำหรับ Production ควรใช้ REST API แทน:

https://maps.googleapis.com/maps/api/geocode/json?address=Bangkok&key=YOUR_API_KEY

ให้ผลลัพธ์แม่นยำกว่า มี Quota และ Billing ต้องตั้งค่าใน Google Cloud Console