Menggunakan metode replaceAll Java-asli pada
String melakukan trik. Ya, saya sangat menyadari bahwa argumen pertama dari
replaceAll adalah ekspresi reguler. Hidup panjang dan makmur, teman Vulcan
saya. 9.2 Geocoding Data Anda Jadi, dalam 65 baris kode Groovy, kami beralih
dari data CSV dalam file flat ke pernyataan SQL dan 7.018 catatan dalam
database. Masalah dengan catatan ini adalah bahwa mereka masih hampir spasial.
Mari kita secara geocode mem-address-kan alamat untuk mendapatkan titik lat /
long yang sebenarnya bisa kita petakan. Ingat set data Biro HARIMAU Sensus A.S.
yang kita bicarakan di Bagian 2.8, Amerika Yang Dapat Diunduh, di halaman 32?
Kami telah bekerja dengan shapefile batas negara sejak. Data Biro Sensus A.S.
lebih dalam dari garis negara sederhana — jauh lebih dalam. Tetapi daripada
harus mengunduh data dan bergulat dengan format file ASCII yang funky itu
sendiri, bagaimana jika seseorang telah melakukan semua pekerjaan kotor untuk
Anda dan mengeksposnya sebagai situs web yang ramah. Bagaimana jika, memang?
Jalankan peramban web Anda, dan kunjungi Geocoder.us.3 Situs web ini,
dipelihara oleh penulis Mapping Hacks (O’Reilly), adalah cara paling ramah
untuk berinteraksi dengan kumpulan data TIGER tanpa harus benar-benar
mengunduhnya. (Lihat Gambar 9.1, di halaman berikutnya.) Masukkan alamat jalan
Anda — lihat apakah Biro Sensus A.S. tahu di mana Anda tinggal pada tahun 2000.
(Ingat, data Biro Sensus A.S. diperbarui setiap sepuluh tahun.) Meskipun
bekerja dengan situs web secara interaktif adalah hal yang menyenangkan, namun
kurang menyenangkan mengetikkan 7.019 alamat dengan tangan. Untungnya,
Geocoder.us menawarkan layanan web dan juga situs web. Gulir ke bagian bawah
halaman beranda dan cari bagian berjudul "Bagaimana Saya Bisa
Menggunakannya?" Ini menawarkan SOAP, XML-RPC, RESTful, dan bahkan layanan
berbasis CSV.
Meskipun keren bahwa kita bisa mendapatkan data
kembali sebagai XML, kami sudah cukup bagus dalam menangani data CSV. Coba ini
sebagai gantinya: Kami akan melakukan kueri ini dalam kode sesaat lagi. Sebelum
kita melanjutkan, apakah Anda melihat ada perbedaan halus antara alamat yang
kami kirimkan dan alamat yang dikembalikan? Alamat kami dinormalisasi. Tetapi
apakah "W Maxwell Blvd" dan "Maxwell Blvd E" benar-benar
merupakan lokasi yang sama? Ketikkan yang berikut ini ke browser web Anda: Pada
peta yang dihasilkan, "E Maxwell" dan "W Maxwell" berada di
kedua sisi jendela info. Saya merasa cukup nyaman bahwa alamat mendapat geocode
dengan benar. (Hanya untuk menyeringai, coba kirimkan sebagai "W
Maxwell" ke Google. Perhatikan bahwa itu juga membingungkan.) Oke, mari
kita coba alamat selanjutnya pada daftar: Kutukan! Digagalkan pada upaya kedua
kami. Apa yang dikatakan Google tentang hal itu? Google menariknya ke atas.
Mungkin sebaiknya kita menggunakan geocoder4 Google saja. Dokumentasi
menunjukkan contoh menggunakannya dalam JavaScript serta permintaan HTTP GET.
Anda bisa mendapatkan hasilnya kembali sebagai CSV, XML, KML, atau JSON. Untuk
menggunakannya, yang harus Anda lakukan adalah mendaftar untuk kunci API
gratis.5 Ini permintaan untuk geocoder Google:
Dan jawabannya? Nilai pertama adalah kode
kembali. Yang kedua adalah tingkat akurasi. Yang ketiga adalah garis lintang,
dan yang keempat adalah garis bujur. Jadi, apa artinya 602? Alamat tidak
ditemukan. Hah? Tapi kami menemukannya di peta. Google jelas tahu di mana itu.
Apa yang menyebabkannya? Saya akan melakukan riset Internet untuk Anda saat
ini. Dalam entri basis pengetahuan berjudul "Mengapa geocoder API
menyediakan lokasi yang berbeda dari Google Maps?" 6 kalimat pertama
mengatakan semuanya: "Geocoder API dan geocoder Google Maps bergantung
pada dua sumber data yang berbeda." (Jangan ragu untuk bergumam pelan.
Saya melakukannya ....) Ini adalah dugaan murni di pihak saya, tapi itu
kedengarannya seperti masalah lisensi bagi saya. Google membeli geodata-nya
dari penyedia komersial, dan penyedia itu kemungkinan besar membatasi beberapa
cara Google dapat mengekspos data. Google Maps? Tidak masalah. API terprogram?
Tidak terlalu cepat, Bub .... Oke, mari kita coba sekali lagi. Yahoo juga
menawarkan geocoder gratis.7 Seperti Google, Anda harus mendaftar untuk
mendapatkan ID aplikasi gratis. Hasilnya kembali kepada Anda sebagai XML atau
PHP:
Aha! Kami mendapat hit saat ini. Tapi tunggu dulu
— di mana alamatnya? Perhatikan atribut presisi di elemen hasil? Itu berarti
bahwa Yahoo mencoba melakukan geocode pada alamat dan gagal, sehingga jatuh
kembali ke geocode kode ZIP. Jika Anda kembali dan melihat lebih dekat pada
hasil Google Maps — yang berhasil — perhatikan sesuatu yang berbeda tentang
alamat itu? Alamat yang kami kirimkan adalah "4107 Meridian St, Normal, AL
35762." Respons yang kami dapatkan adalah "4107 Meridian St N,
Huntsville, AL 35811." Itu bukan hanya alamat jalan yang berbeda tetapi
juga kota dan kode ZIP yang sama sekali berbeda. Peta tersebut menunjukkan
titik tepat di tepi kampus, sehingga sebagian besar kemungkinan merupakan
pukulan yang bagus, tetapi ini menunjukkan betapa geocoding permainan yang
rumit. Sebagai upaya terakhir, Anda dapat melakukan geocode data dengan tangan.
InfoS-ports8 menyediakan layanan yang menarik. Mereka memasang peta Google Maps
dan memungkinkan Anda mengklik peta untuk menemukan lat / long sendiri. Tidak
ada cara bagi Anda untuk memasukkan alamat, jadi itu tidak banyak membantu
kami. Ini hanyalah contoh menarik dari geocoder titik-dan-klik. Mengkode
Geocoding Karena sepertinya tidak ada peluru perak untuk masalah geocoding
kami, mari gunakan pilihan pertama kami — Geocoder.us — pada kumpulan data
lengkap dan lihat berapa banyak hit yang kami dapatkan. Saya tidak mengharapkan
100%, tetapi saya berharap kami akan melakukan lebih baik daripada 50% yang
kami dapatkan dalam dua upaya. Mari kita jalankan skrip Groovy kami yang didukung
Geoserver.us baru terhadap kumpulan sampel kami dan lihat bagaimana kami
melakukannya:
Berita baiknya adalah bahwa data kami sekarang
berisi titik lat / long. Kabar buruknya adalah bahwa skrip kami membutuhkan
waktu lebih lama untuk berjalan (rata-rata sekitar sepuluh hingga dua belas
detik per permintaan — jangka waktu yang lengkap membutuhkan waktu lebih dari
tiga puluh jam). Untuk keperluan bab ini, mari kita tetap dengan file
sample.csv. (Anda dapat menemukan hasil lengkap dari Geocoder.us di college-gecoder.us.sql.)
Mari kita lihat kode yang menyelesaikan ini. Untuk memulai, kami memperluas
pernyataan ddl untuk memasukkan bidang baru: lat, long, dan alamat yang
di-normalisasi dikembalikan dari geocoder. Tidak ditampilkan di sini, kami juga
memperluas bidang dalam pernyataan SQL INSERT: Hal berikutnya yang kami lakukan
adalah membuat kelas Addr. Ini tidak hanya merupakan tempat yang nyaman untuk
menyimpan nilai-nilai kami — kami juga dapat menggantung beberapa fungsi khusus
Addr darinya. Tampaknya tidak masuk akal untuk membaut metode geocode ke semua
menggunakan metaprogramming. Karena kita perlu memiliki bidang khusus bernama
cara tertentu, itu lebih masuk akal untuk membuat kelas. Inilah bidang-bidang
kelas. Perhatikan bahwa kami membuat konstruktor yang menarik nilai dari array
token kami yang ada dan mengisi kelas.
Dan di sini adalah metode geocode yang mengambil
nilai-nilai dan mengirimkannya ke Geocoder.us: urlStart harus terlihat familier
— itu adalah alamat layanan web. url-Body merangkai variabel bersama dalam
urutan yang tepat. Sebelum kita dapat mengirimnya ke Geocoder.us, kita perlu
URLEncode9 string.
Ini mengonversi spasi menjadi +, koma ke% 2C, dan
seterusnya. URLEncoder adalah kelas Java asli yang menangani logistik untuk
kami. Setelah kami memiliki URL yang terbentuk dengan baik, Groovy memudahkan
kami untuk memanggil layanan web. URL baru (urlEncoded) menciptakan panggilan.
EachLine melakukan panggilan dan, seperti namanya, memungkinkan kita untuk
beralih melalui baris respon demi baris. Anda mungkin telah memperhatikan
sebelumnya bahwa geocoder dapat berpotensi mengembalikan lebih dari satu baris.
(Lihat “Universitas Kristen Selatan.”) Kode kami menjebak untuk respons
multiline, menyimpan baris terakhir di objek Addr. Mari kita lihat semua ini
dalam aksi. Kami membuat Addr baru, melewati array token. Kami memanggil metode
geocode. Akhirnya, kita memanggil toSql dan menambahkannya ke string
insertMiddle:
9.3 Menambahkan Bidang PostGIS Script kami adalah
jagoan dalam membuat bidang String. Mengapa kita tidak mencoba membuat bidang
spasial sekarang? Ingat dari Bagian 5.3, Menambahkan Kolom Geometrik dengan
Tangan, di halaman 113, bahwa AddGeometryColumn menyisipkan bidang ke dalam
tabel Anda dan tabel geometry_columns: Setelah kita memiliki kolom geometri di
tempatnya, kita perlu mengubah pernyataan SQL INSERT kita untuk memanggil
GeomFromText: Berikut ini adalah metode geocode baru kami yang membuat string
SQL yang terbentuk dengan baik jika geocoder mengembalikan data, atau jika
tidak maka hanya akan membuat field null: Jalankan kode Anda untuk terakhir
kalinya. Ketik psql -U postgres -d g4wd -f college.sql untuk memasukkan data
Anda. Butuh kurang dari 200 baris Groovy untuk beralih dari data mentah dari
NCES ke database PostGIS yang terisi penuh. Itu akan menjadi kurang dari 150
baris jika saya tidak begitu suka dengan semua komentar, printlns, dan file
hasil. Secara keseluruhan, itu tidak terlalu buruk. Statistik terakhir untuk
Geocoder.us juga tidak terlalu buruk. Dari 7.018 catatan, ia mengembalikan
alamat untuk 5.103, atau hanya sedikit dari 75%. Kelemahannya adalah prosesnya
membutuhkan waktu lebih dari tiga puluh jam untuk diselesaikan.
Komentar
Posting Komentar