Geocoding API v4 memperkenalkan beberapa metode baru yang menggantikan fungsi di API v3. Panduan ini menunjukkan cara memigrasikan aplikasi Anda untuk menggunakan metode v4 baru.
Anda dapat menggunakan kunci API yang ada dengan metode v4 baru. Namun, jika Anda telah meminta peningkatan kuota di API v3, Anda harus meminta peningkatan di API v4 yang baru.
Bermigrasi dari Geocoding Maju v3
Jika Anda menggunakan Geocoding v3 untuk melakukan geocoding alamat, Anda harus bermigrasi ke metode Geocode an address v4, yang menerima permintaan GET.
API v4 mengubah nama, struktur, dan dukungan untuk beberapa parameter. Sebaiknya Anda menggunakan mask kolom untuk menentukan kolom yang ingin ditampilkan dalam respons.
Meminta perubahan parameter
| Parameter v3 | Parameter v4 | Catatan |
|---|---|---|
address, components |
address |
Alamat tidak terstruktur (v3 address) kini diteruskan di jalur URL. Komponen alamat terstruktur (v3 components) dapat diteruskan sebagai parameter kueri address.*. Lihat Mereproduksi filter komponen v3. |
bounds |
locationBias.rectangle |
Diganti namanya; struktur diubah menjadi objek. |
language |
languageCode |
Diganti namanya. |
region |
regionCode |
Diganti namanya. |
extra_computations |
Dihapus | Digantikan oleh metode SearchDestinations. |
Perubahan kolom respons
| Kolom v3 | Kolom v4 | Catatan |
|---|---|---|
status, error_message |
Dihapus | v4 menggunakan kode status HTTP dan isi error. |
results.address_components.long_name / results.address_components.short_name |
results.addressComponents.longText / results.addressComponents.shortText |
Diganti namanya. |
results.geometry.location_type |
results.granularity |
Diganti namanya. |
results.geometry.location |
results.location |
Nama kolom: lat/lng -> latitude/longitude. |
results.geometry.viewport |
results.viewport |
Nama kolom: northeast/southwest -> high/low. |
results.postcode_localities |
results.postalCodeLocalities |
Diganti namanya. Sekarang ditampilkan untuk satu atau beberapa lokalitas (v3 diperlukan >1). |
results.partial_match |
Dihapus | |
| Baru | results.addressComponents.languageCode |
Bahasa komponen alamat tertentu. |
| Baru | results.bounds |
Batas eksplisit menggunakan high/low. |
| Baru | results.place |
Nama resource untuk tempat. |
| Baru | results.postalAddress |
Objek PostalAddress terstruktur. |
Mereproduksi filter komponen v3
Geocoding Maju di Geocoding v3 menyertakan parameter components yang memungkinkan
pemfilteran ketat hasil untuk komponen tertentu (misalnya,
components=country:US). Geocoding Maju di v4 tidak mendukung jenis
pemfilteran ketat ini dalam parameter permintaan. Di v4, Anda dapat memberikan informasi alamat sebagai satu string tidak terstruktur di jalur atau sebagai parameter kueri terstruktur seperti address.addressLines, address.locality, address.administrativeArea, address.postalCode, dan address.regionCode.
Parameter terstruktur tidak berfungsi sebagai filter tetap. Sebagai gantinya, semua komponen yang diberikan digabungkan untuk membentuk alamat lengkap yang akan dicoba di-geocode oleh API. API menelusuri kecocokan terbaik untuk seluruh alamat yang ditentukan di semua komponen. Menyediakan komponen secara terstruktur dapat membantu API
memahami maksud dengan lebih baik, terutama saat informasi alamat
dikumpulkan dari kolom formulir terpisah. Hal ini dapat membantu API menangani kesalahan ketik atau ambiguitas kecil dalam setiap komponen, karena jenis informasi di setiap kolom sudah jelas.
Untuk mendapatkan perilaku yang mirip dengan filter komponen tetap v3, Anda harus menerapkan
pemfilteran sisi klien pada array results yang ditampilkan oleh v4 API berdasarkan
objek postalAddress dan addressComponents dalam respons.
Tabel berikut menunjukkan kecocokan terbaik antara filter components v3 dan
kolom postalAddress v4:
| Filter komponen v3 | Kolom respons v4 |
|---|---|
country |
postalAddress.regionCode |
postal_code |
postalAddress.postalCode |
administrative_area |
postalAddress.administrativeArea atau addressComponents |
Contoh pemfilteran sisi klien
Contoh berikut menunjukkan cara memfilter hasil untuk mencapai perilaku yang mirip dengan pemfilteran komponen v3 untuk kolom yang didukung: negara, wilayah administratif, dan kode pos. Sebaiknya jangan memfilter kolom lain karena kriteria pemfilteran yang andal tidak ada.
Memfilter menurut Negara
Cocokkan address.regionCode dari permintaan Anda dengan postalAddress.regionCode di setiap hasil. Perhatikan bahwa meskipun API menerima kode wilayah huruf kecil dalam permintaan, API selalu menampilkannya dalam huruf besar dalam respons, jadi Anda harus menormalisasi input ke huruf besar sebelum perbandingan.
Contoh Kode Python
def filter_by_country(results, region_code): return [ res for res in results if res.get('postalAddress', {}).get('regionCode') == region_code.upper() ] # Example usage: # v4_response = ... # API call response # filtered = filter_by_country(v4_response.get('results', []), 'US')
Contoh Kode Node.js
function filterByCountry(results, regionCode) { return results.filter(res => res.postalAddress?.regionCode === regionCode.toUpperCase()); } // Example usage: // const v4Response = ... # API call response // const filtered = filterByCountry(v4Response.results, 'US');
Memfilter menurut Wilayah Administratif
Cocokkan address.administrativeArea dari permintaan Anda dengan postalAddress.administrativeArea di setiap hasil. Mirip dengan kode negara, Anda harus menormalisasi input ke huruf besar sebelum perbandingan. Hal ini hanya dapat diandalkan jika administrativeArea dalam permintaan Anda diberikan dengan singkatan 2 huruf standar. postalAddress.administrativeArea dalam respons mungkin tidak langsung cocok dengan sufiks kode ISO 3166-2 karena beberapa alasan. Pertama, di beberapa area, subdivisi yang sesuai dengan kode ISO 3166-2 bukan merupakan bagian dari representasi standar alamat pos. Misalnya, di Spanyol, area administratif level 1 (misalnya, "CN" untuk Canarias) mungkin ada di addressComponents, tetapi postalAddress.administrativeArea mungkin berisi area level 2 (misalnya, "Santa Cruz de Tenerife"). Kedua, di beberapa area, singkatan
subdivisi tidak umum digunakan dan ditampilkan di postalAddress.administrativeArea
dengan nama yang lebih panjang (untuk alasan serupa, addressComponents.shortText untuk komponen alamat
yang sesuai dengan subdivisi mungkin tidak cocok dengan sufiks kode ISO 3166-2 subdivisi). Selain itu, subdivisi dalam beberapa kasus dapat ditampilkan di komponen alamat untuk administrative_area_level_n dengan n lebih besar dari 1.
Untuk hasil yang paling komprehensif, Anda harus memeriksa kecocokan di postalAddress.administrativeArea dan addressComponents apa pun dengan jenis administrative_area_level_n (misalnya, administrative_area_level_1).
Contoh Kode Python
def filter_by_admin_area(results, admin_area): target = admin_area.upper() filtered = [] for res in results: # Check postalAddress pa_aa = res.get('postalAddress', {}).get('administrativeArea', '') if pa_aa == target: filtered.append(res) continue # Check all administrative area levels in addressComponents for comp in res.get('addressComponents', []): is_admin_level = any(t.startswith('administrative_area_level_') for t in comp.get('types', [])) if is_admin_level: short = comp.get('shortText', '') if short == target: filtered.append(res) break return filtered # Example usage: # filtered = filter_by_admin_area(v4_response.get('results', []), 'CA')
Contoh Kode Node.js
function filterByAdminArea(results, adminArea) { const target = adminArea.toUpperCase(); return results.filter(res => { // Check postalAddress.administrativeArea if (res.postalAddress?.administrativeArea === target) { return true; } // Check addressComponents for any administrative area level return res.addressComponents?.some(c => { const isAdmin = c.types?.some(t => t.startsWith('administrative_area_level_')); return isAdmin && c.shortText === target; }); }); } // Example usage: // const filtered = filterByAdminArea(v4Response.results, 'CA');
Memfilter menurut Kode Pos
Cocokkan address.postalCode dari permintaan Anda dengan postalAddress.postalCode di setiap hasil. Anda harus menormalisasi kode pos input dan hasil sebelum perbandingan. Logika normalisasi sangat bergantung pada wilayah. Pendekatan dasar melibatkan penghapusan spasi dan tanda hubung serta konversi ke huruf yang konsisten.
Normalisasi yang lebih canggih mungkin diperlukan untuk menangani awalan kode pos (misalnya, "L2" di Inggris Raya) atau akhiran (misalnya, "+4" di kode pos AS). Logika normalisasi spesifik yang diperlukan akan bervariasi, bergantung pada negara dan format kode pos yang terlibat. Anda mungkin perlu menyesuaikan fungsi normalisasi yang disediakan atau menerapkan logika yang lebih canggih untuk region yang Anda targetkan.
Contoh yang diberikan menangani kode pos AS dan memungkinkan pencocokan pada basis 5 digit meskipun ZIP+4 diberikan atau ditampilkan.
Contoh Kode Python (berfokus pada Kode ZIP AS)
import re def normalize_postal_code_us(pc): # Basic normalization for US: uppercase, alphanumeric only if not pc: return "" normalized = re.sub(r'[^A-Z0-9]', '', pc.upper()) # Return only the first 5 digits for US ZIP codes return normalized[:5] def filter_by_postal_code_us(results, postal_code): normalized_input = normalize_postal_code_us(postal_code) if not normalized_input: return [] filtered_results = [] for res in results: pa_pc = res.get('postalAddress', {}).get('postalCode', '') if normalize_postal_code_us(pa_pc) == normalized_input: filtered_results.append(res) return filtered_results # Example usage: # Matches '94043', '94043-1351', '940431351' # filtered = filter_by_postal_code_us(v4_response.get('results', []), '94043') # filtered = filter_by_postal_code_us(v4_response.get('results', []), '94043-1234')
Contoh Kode Node.js (berfokus pada Kode ZIP AS)
function normalizePostalCodeUs(pc) { // Basic normalization for US: uppercase, alphanumeric only const normalized = (pc || '').toUpperCase().replace(/[^A-Z0-9]/g, ''); // Return only the first 5 digits for US ZIP codes return normalized.substring(0, 5); } function filterByPostalCodeUs(results, postalCode) { const normalizedInput = normalizePostalCodeUs(postalCode); if (!normalizedInput) { return []; } return results.filter(res => { const paPc = res.postalAddress?.postalCode || ''; return normalizePostalCodeUs(paPc) === normalizedInput; }); } // Example usage: // Matches '94043', '94043-1351', '940431351' // const filtered = filterByPostalCodeUs(v4Response.results, '94043'); // const filtered = filterByPostalCodeUs(v4Response.results, '94043-1234');
Bermigrasi dari Geocoding Terbalik v3
Jika Anda menggunakan v3 Reverse Geocoding untuk mengubah koordinat menjadi alamat, Anda harus bermigrasi ke metode v4 Reverse geocode a location, yang menerima permintaan GET.
API v4 mengubah nama, struktur, dan dukungan untuk beberapa parameter. Sebaiknya Anda menggunakan mask kolom untuk menentukan kolom yang ingin ditampilkan dalam respons.
Meminta perubahan parameter
| Parameter v3 | Parameter v4 | Catatan |
|---|---|---|
language |
languageCode |
Diganti namanya. |
region |
regionCode |
Diganti namanya. |
result_type |
types |
Diganti namanya; menggunakan parameter kueri berulang. |
location_type |
granularity |
Diganti namanya; menggunakan parameter kueri berulang. |
extra_computations |
Dihapus | Digantikan oleh metode SearchDestinations. |
Perubahan kolom respons
| Kolom v3 | Kolom v4 | Catatan |
|---|---|---|
status, error_message |
Dihapus | v4 menggunakan kode status HTTP dan isi error. |
results.address_components.long_name / results.address_components.short_name |
results.addressComponents.longText / results.addressComponents.shortText |
Diganti namanya. |
results.geometry.location_type |
results.granularity |
Diganti namanya. |
results.geometry.location |
results.location |
Nama kolom: lat/lng -> latitude/longitude. |
results.geometry.viewport |
results.viewport |
Nama kolom: northeast/southwest -> high/low. |
| Baru | results.addressComponents.languageCode |
Bahasa komponen alamat tertentu. |
| Baru | results.bounds |
Batas eksplisit menggunakan high/low. |
| Baru | results.place |
Nama resource untuk tempat. |
| Baru | results.postalAddress |
Objek PostalAddress terstruktur. |
Bermigrasi dari deskriptor Alamat v3
Jika Anda menggunakan address_descriptor untuk mendapatkan informasi tambahan tentang lokasi dengan Geocoding v3, Anda harus bermigrasi ke penggunaan kolom landmarks dari SearchDestinationsResponse.
Bermigrasi dari geocoding Place v3
Jika Anda menggunakan place_id untuk mendapatkan alamat untuk ID Tempat tertentu dengan Geocoding
v3, Anda harus bermigrasi ke metode Place
Geocoding v4, yang
menerima permintaan GET.
API v4 mengubah nama, struktur, dan dukungan untuk beberapa parameter. Sebaiknya Anda menggunakan mask kolom untuk menentukan kolom yang ingin ditampilkan dalam respons.
Meminta perubahan parameter
| Parameter v3 | Parameter v4 | Catatan |
|---|---|---|
place_id |
Kolom place dalam proto permintaan |
ID Tempat kini diberikan sebagai parameter jalur places/{place}, misalnya: https://geocode.googleapis.com/v4/geocode/places/ChIJj61dQgK6j4AR4GeTYWZsKWw. Hal ini dipetakan ke kolom tempat dalam permintaan yang mendasarinya. |
language |
languageCode |
Diganti namanya. |
region |
regionCode |
Diganti namanya. |
Perubahan kolom respons
| Kolom v3 | Kolom v4 | Catatan |
|---|---|---|
status, error_message |
Dihapus | v4 menggunakan kode status HTTP dan isi error. |
results |
(root) | v4 menampilkan satu objek hasil, bukan array results. |
results.address_components.long_name / results.address_components.short_name |
addressComponents.longText / addressComponents.shortText |
Diganti namanya. |
results.geometry.location_type |
granularity |
Diganti namanya. |
results.geometry.location |
location |
Nama kolom: lat/lng -> latitude/longitude. |
results.geometry.viewport |
viewport |
Nama kolom: northeast/southwest -> high/low. |
results.postcode_localities |
postalCodeLocalities |
Diganti namanya. Sekarang ditampilkan untuk satu atau beberapa lokalitas (v3 diperlukan >1). |
| Baru | addressComponents.languageCode |
Bahasa komponen alamat tertentu. |
| Baru | bounds |
Batas eksplisit menggunakan high/low. |
| Baru | place |
Nama resource untuk tempat. |
| Baru | postalAddress |
Objek PostalAddress terstruktur. |
Bermigrasi dari Data Hyperlokal Geocoding ke Tujuan
Fitur berikut di Geocoding API v3 digantikan oleh metode SearchDestinations Geocoding API v4:
- Masuk
- Titik navigasi
- Garis batas bangunan
- Area
Jika Anda menggunakan Geocoding API v3 untuk fitur di atas, gunakan dokumen ini
untuk membantu Anda menggunakan metode SearchDestinations sebagai gantinya untuk mendapatkan fitur ini.
Dokumen ini menjelaskan lokasi fitur ini dalam respons SearchDestinations, dan perbedaan cara fitur ini ditampilkan dalam respons API antara Geocoding API v3 dan metode SearchDestinations Geocoding API v4.
Masuk
Untuk mendapatkan pintu masuk yang terkait dengan
destination,
gunakan kolom destination.entrances.
Perhatikan bahwa format
entrance
sedikit berbeda dari format entri di Geocoding API
v3. Setiap pintu masuk
di destination.entrances memiliki kolom berikut:
displayName- ini adalah kolom opsional baru yang akan memiliki nama yang mudah dibaca untuk pintu masuk, misalnya "Gerbang B".location- ini adalah lokasi berjenisLatLng, yang berbeda dengan format yang digunakan di Geocoding API v3.tags- ini sama dengan kolomtagspintu masuk dari Geocoding API v3.place- serupa dengan kolombuildingPlaceIdpintu masuk dari Geocoding API v3. Namun, ID Tempat di kolom ini dapat berupa ID Tempat dari jenis apa pun, tidak harus berupa bangunan.
Titik navigasi
Untuk mendapatkan titik navigasi yang terkait dengan destination, gunakan kolom
destination.navigationPoints.
Perhatikan bahwa format
navigationPoint
sedikit berbeda dari format titik navigasi di Geocoding API
v3. Setiap titik
navigasi di destination.navigationPoints memiliki kolom berikut:
displayName- ini adalah kolom opsional baru yang akan memiliki nama yang dapat dibaca manusia untuk titik navigasi, misalnya "5th Ave".location- ini adalah lokasi berjenisLatLng, yang berbeda dengan format yang digunakan di Geocoding API v3.travelModes- ini mirip dengan kolomrestrictedTravelModesdari titik navigasi dari Geocoding API v3. Nilai enum yang mungkin sama, satu-satunya perbedaan adalah kolom ini sekarang menunjukkan mode perjalanan yang dapat diterima untuk titik navigasi, bukan mode perjalanan yang dibatasi.usage- ini adalah kolom baru yang berisi kasus penggunaan yang didukung oleh titik navigasi. Perhatikan bahwa sebagian besar titik navigasi akan memiliki penggunaanUNKNOWN, tetapi hal itu tidak berarti penggunaan titik navigasi dibatasi dengan cara apa pun.
Garis batas bangunan
Untuk mendapatkan garis batas bangunan yang terkait dengan destination, Anda harus menggunakan kolom displayPolygon dari objek placeView di destination yang merepresentasikan bangunan. Untuk setiap placeView, Anda
dapat memeriksa apakah itu adalah bangunan dengan
kolom placeView.structureType. Jika jenis struktur adalah BUILDING, Anda bisa mendapatkan garis batas dari kolom
placeView.displayPolygon. placeView juga akan memiliki kolom tambahan untuk bangunan yang tidak ada di Geocoding API v3.
destination dapat memiliki objek placeView yang merepresentasikan bangunan di kolom berikut:
destination.primary- ini adalah tempat utama untuk tujuan.destination.containingPlaces- ini adalah kolom berulang yang dapat menyimpan tempat yang lebih besar yang "berisi" tempat utama. Misalnya, jika tempat utama adalahsubpremise,containingPlacesbiasanya akan menyimpanplaceViewyang merepresentasikan bangunan.destination.subDestinations- ini adalah kolom berulang yang dapat menyimpan sub-tujuan dari tempat utama. Misalnya, unit apartemen individu dalam sebuah gedung. Kolom ini biasanya tidak memilikiplaceViewyang merepresentasikan bangunan.
Perhatikan bahwa format placeView.displayPolygon cocok dengan format outline bangunan
di Geocoding API
v3, yaitu
format GeoJSON, menggunakan format RFC 7946.
Area
Mirip dengan pembuatan garis besar, untuk mendapatkan alasan yang terkait dengan
destination, Anda harus menggunakan kolom displayPolygon objek placeView
dalam destination yang merepresentasikan alasan. Untuk setiap placeView, Anda
dapat memeriksa apakah itu adalah alasan dengan kolom placeView.structureType. Jika jenis struktur adalah GROUNDS, Anda bisa mendapatkan garis besarnya dari kolom placeView.displayPolygon. placeView juga akan memiliki kolom tambahan untuk alasan yang tidak ada di Geocoding API v3.
destination dapat memiliki objek placeView yang merepresentasikan alasan dalam kolom berikut:
destination.primarydestination.containingPlacesdestination.subDestinations
Perhatikan bahwa format placeView.displayPolygon cocok dengan format garis batas lapangan
di Geocoding API v3,
yaitu format GeoJSON, menggunakan format RFC 7946.
Presisi hasil
Di Geocoding API v3, kolom location_type dalam geometri respons menunjukkan presisi hasil, dan beberapa klien akan memberi peringkat atau memfilter hasil berdasarkan nilai ini (ROOFTOP, RANGE_INTERPOLATED, GEOMETRIC_CENTER, dan APPROXIMATE). Dalam migrasi Geocoding API v4 standar, kolom ini diganti namanya menjadi granularity.
Di Destinations API (v4 SearchDestinations), tidak ada kolom location_type. Sebagai gantinya, informasi spasial ditangani secara berbeda:
- Tidak memerlukan pemfilteran manual di sisi klien: Meskipun Geocoding standar memberikan beberapa hasil dengan perincian yang berbeda, metode
SearchDestinationsmeminimalkan ambiguitas dengan menyelesaikan ke satu tujuan yang dioptimalkan jika memungkinkan. Hal ini menghilangkan kebutuhan klien untuk memfilter menurut jenis lokasi guna menentukan hasil mana yang terbaik. - Informasi spasial yang diwakili oleh jenis struktur dan menampilkan poligon:
Geometri dan struktur spasial ditunjukkan oleh:
displayPolygon(untuk geometri persis).- Kolom
structureTypedalam objekplaceView.
- Pemetaan jenis struktur:
structureTypedariPOINT,BUILDING, atauSECTIONumumnya sesuai dengan apa yang disebutROOFTOPsebelumnya.structureTypeGROUNDSumumnya sesuai denganGEOMETRIC_CENTER.
Menggunakan mask kolom untuk meminta fitur ini
Metode SearchDestinations
memerlukan mask kolom, seperti yang dijelaskan dalam Memilih kolom yang akan ditampilkan. Mask kolom dapat disetel
ke * untuk menampilkan semua kolom, atau Anda dapat menyetelnya ke kolom tertentu
yang ingin Anda terima. Misalnya, permintaan API berikut menetapkan mask kolom
untuk menerima semua kolom yang diperlukan guna mendapatkan pintu masuk, titik navigasi, garis batas
bangunan, dan area tujuan:
curl -X POST -d '{"place": "places/ChIJG3kh4hq6j4AR_XuFQnV0_t8"}' \
-H "X-Goog-Api-Key: API_KEY" \
-H "Content-Type: application/json" \
-H "X-Goog-FieldMask: destinations.entrances,destinations.navigationPoints,destinations.primary,destinations.containingPlaces,destinations.subDestinations" \
https://geocode.googleapis.com/v4/geocode/destinations
Pertimbangan keamanan
Geocoding API v4 didesain sebagai API server-ke-server. Tidak ada jalur migrasi langsung untuk pengguna JavaScript dari v3 ke v4. Memanggil metode v4 langsung dari JavaScript sisi klien (misalnya, di browser) menggunakan kunci API membuat kunci API Anda berisiko tinggi dicuri dan disalahgunakan.
Pembatasan perujuk HTTP, meskipun berguna, tidak memberikan perlindungan yang memadai untuk endpoint layanan web karena dapat dengan mudah dilewati oleh penyerang yang memalsukan header Referer dalam permintaan mereka.
Pendekatan yang direkomendasikan
Cara yang direkomendasikan untuk menggunakan Geocoding API v4 adalah dari server backend Anda sendiri. Aplikasi klien Anda harus membuat permintaan ke server perantara ini, yang kemudian memanggil Google API secara aman menggunakan kunci API yang dilindungi (misalnya, kunci yang disimpan dalam variabel lingkungan atau secret manager). Hal ini memastikan bahwa kunci API Anda tidak pernah diekspos dalam kode frontend.
Alternatif untuk kebutuhan sisi klien
Jika Anda memiliki kebutuhan sisi klien yang memerlukan geocoding, pertimbangkan untuk menggunakan salah satu solusi sisi klien yang ada:
- Geocoding Service di Maps JavaScript API: Geocoding Service terus menggunakan backend v3 dan dirancang untuk digunakan di lingkungan browser.
- Kit UI Places: Gunakan Kit UI Places, termasuk elemen Place Autocomplete, untuk elemen antarmuka pengguna terkait alamat.