64 lines
2.1 KiB
Python
64 lines
2.1 KiB
Python
import csv
|
|
import json
|
|
import time
|
|
from geopy.geocoders import Nominatim
|
|
from geopy.exc import GeocoderTimedOut
|
|
|
|
code_to_name = {}
|
|
with open('wilayah_dapodik_final.csv', mode='r', encoding='utf-8') as f:
|
|
reader = csv.DictReader(f)
|
|
for row in reader:
|
|
|
|
kab = row['Kabupaten_Kota'].replace('Kab. ', '').replace('Kota Adm. ', '').replace('Kota ', '')
|
|
prov = row['Provinsi'].replace('Prov. ', '')
|
|
|
|
if prov == 'D.K.I. Jakarta':
|
|
prov = 'Jakarta'
|
|
elif prov == 'D.I. Yogyakarta':
|
|
prov = 'Yogyakarta'
|
|
|
|
if kab == 'Adm. Kep. Seribu':
|
|
kab = 'Kepulauan Seribu'
|
|
|
|
if prov == 'Luar Negeri':
|
|
query = kab
|
|
else:
|
|
query = f"{kab}, {prov}, Indonesia"
|
|
code_to_name[row['Kode_Kabupaten']] = {
|
|
"name": row['Kabupaten_Kota'],
|
|
"query": query
|
|
}
|
|
|
|
geolocator = Nominatim(user_agent="sista_mif_ta_tracer_study")
|
|
coords = {}
|
|
|
|
print(f"Mulai mencari koordinat untuk {len(code_to_name)} wilayah...")
|
|
|
|
for code, info in code_to_name.items():
|
|
query = info['query']
|
|
name = info['name']
|
|
max_retries = 3
|
|
for attempt in range(max_retries):
|
|
try:
|
|
time.sleep(1)
|
|
location = geolocator.geocode(query, timeout=5)
|
|
if location:
|
|
coords[code] = {"name": name, "coords": [location.latitude, location.longitude]}
|
|
print(f"Geocoded: {code} -> {query} -> {coords[code]['coords']}")
|
|
else:
|
|
print(f"NOT FOUND: {code} -> {query}")
|
|
break
|
|
except GeocoderTimedOut:
|
|
print(f"TIMEOUT (Percobaan {attempt + 1}/{max_retries}): {code} -> {query}")
|
|
if attempt == max_retries - 1:
|
|
print(f"GAGAL setelah {max_retries} percobaan: {code} -> {query}")
|
|
else:
|
|
time.sleep(2) # Jeda lebih lama sebelum mencoba ulang
|
|
|
|
# Menyimpan hasil ke file JSON baru
|
|
output_file = 'kabupaten_coords.json'
|
|
with open(output_file, 'w') as f:
|
|
json.dump(coords, f, indent=4)
|
|
|
|
print(f"Selesai! Data koordinat berhasil disimpan ke '{output_file}'")
|