Ok Ben, ini asumsi saya:
1) Anda sudah mendapatkan data Anda (saya punya beberapa titik alamat di sebuah shapefile, dan saya mengunduh trus sensus dan shapefile blok sensus untuk Missouri).
2) Anda telah melakukan geocode pada poin alamat Anda dan Anda merasa nyaman memproyeksikan data.
3) Anda merasa nyaman dengan solusi OGR / PostGIS (keduanya gratis).
Berikut adalah beberapa instal catatan jika Anda tidak memiliki perangkat lunak ini: Cara menginstal PostGRE dengan dukungan PostGIS . (Oleh BostonGIS. Tolong jangan tersinggung dengan judul mereka, saya hanya berpikir itu cara terbaik untuk melakukannya di luar sana.) Juga, inilah satu , dua , dan tiga situs yang menjelaskan cara menginstal GDAL / OGR dengan binding Python.
Peringatan : Sebelum melakukan analisis yang sebenarnya (yaituST_Contains
hal-hal di bawah) Anda harus memastikan semua layer Anda dalam proyeksi yang sama ! Jika Anda memiliki shapefile, mudah untuk menerjemahkan dari satu proyeksi ke proyeksi lainnya menggunakan Quantum GIS (QGIS) atau OGR (atau ArcGIS jika Anda memilikinya). Sebagai alternatif, Anda dapat melakukan transformasi proyeksi dalam database menggunakan fungsi PostGIS. Pada dasarnya pilih racun Anda, atau beri tahu kami jika ini adalah batu sandungan.
Dengan givens tersebut, ini adalah bagaimana saya menambahkan traktat dan blokir ke beberapa data titik alamat menggunakan PostGIS:
Pertama saya biasa ogr2ogr
mengimpor ketiga shapefile ke PostGIS:
Impor alamat menggunakan ogr2ogr:
ogr2ogr -f "PostGreSQL" PG:"host=127.0.0.1 user=youruser dbname=yourdb password=yourpass" "E:\path_to\addresses.shp" -nln mcdon_addresses -nlt geometry
Sensus Impor saluran (Missouri) menggunakan ogr2ogr: The spMoWest
akhiran menyiratkan Saya sudah diterjemahkan data saya untuk Kaki Missouri State Plane Barat.
ogr2ogr -f "PostGreSQL" PG:"host=127.0.0.1 user=youruser dbname=yourdb password=yourpass" "E:\path_to\st_tract10_spMoWest.shp" -nln mo_tracts_2010 -nlt geometry
Impor blok data (Missouri): Yang ini butuh waktu. Bahkan, komputer saya terus macet dan saya harus menaruh kipas di atasnya! Oh, juga, ogr2ogr
tidak akan memberikan umpan balik, jadi jangan terlalu keras; pastikan untuk menunggu dan akhirnya akan selesai.
ogr2ogr -f "PostGreSQL" PG:"host=127.0.0.1 user=youruser dbname=yourdb password=yourpass" "E:\path_to\st_block10_spMoWest.shp" -nln mo_blocks_2010 -nlt geometry
Setelah impor data selesai, luncurkan PgAdmin III (GUI PostGREs), telusuri ke dalam basis data Anda dan berikan beberapa perintah perawatan cepat sehingga PostGREsql akan berjalan lebih cepat menggunakan data baru ini:
vacuum mcdon_addresses;
vacuum mo_tracts_2010;
vacuum mo_blocks_2010;
Selanjutnya, saya ingin tahu berapa banyak alamat penyuratan mentah yang saya impor, jadi saya melakukan quick COUNT(*)
. Saya biasanya melakukan penghitungan di awal tugas seperti ini untuk memberi saya pijakan untuk "cek kewarasan" nanti ..
SELECT COUNT(*) FROM mcdon_addresses;
-- 11979
Pada fase berikutnya, saya membuat dua tabel baru, secara bertahap menambahkan atribut traktat, dan kemudian atribut blok, ke tabel titik alamat asli saya. Seperti yang akan Anda lihat, ST_Contains
fungsi PostGIS melakukan pengangkatan berat, dalam setiap kasus membuat tabel poin baru, masing-masing mendapatkan atribut traktat dan memblok poligon yang berada di dalamnya.
Catatan! Untuk singkatnya, saya hanya mengambil beberapa bidang dari setiap tabel. Anda mungkin menginginkan hampir semuanya. Saya katakan hampir karena karena Anda harus menghilangkan ogr_fid
bidang (mungkin bahkan yang lain?) Dari tabel yang Anda gabungkan, jika tidak PostGRE akan mengeluh tentang kedua bidang yang memiliki nama yang sama ..
(PS Saya melakukan pengintaian di sekitar sini sambil mencari tahu ini: http://postgis.net/docs/manual-1.4/ch04.html )
Buat tabel baru dari titik-titik alamat dengan atribut traktat: Catatan Saya mengawali setiap kolom keluaran dengan petunjuk yang mengungkapkan tabel tempat dimulainya (saya akan menjelaskan mengapa di bawah).
CREATE TABLE mcdon_addresses_wtract AS
SELECT
a.wkb_geometry,
a.route AS addr_route,
a.box AS addr_box,
a.new_add AS addr_new_add,
a.prefix AS addr_prefix,
a.rdname AS addr_rdname,
a.road_name AS addr_road_name,
a.city AS addr_city,
a.state AS addr_state,
a.zip AS addr_zip,
t.statefp10 AS tr_statefp10,
t.countyfp10 AS tr_countyfp10,
t.tractce10 AS tr_tractce10,
t.name10 AS tr_name10,
t.pop90 AS tr_pop90,
t.white90 AS tr_white90,
t.black90 AS tr_black90,
t.asian90 AS tr_asian90,
t.amind90 AS tr_amind90,
t.other90 AS tr_other90,
t.hisp90 AS tr_hisp90
FROM
mcdon_addresses AS a,
mo_tracts_2010 AS t
WHERE
ST_Contains(t.wkb_geometry, a.wkb_geometry);
Pertahankan tabel agar PostGREs terus berjalan dengan lancar:
vacuum mcdon_addresses_wtract;
Sekarang saya punya dua pertanyaan ..
Apakah ST_Contains benar-benar berfungsi? ..dan .. Apakah jumlah alamat yang dikembalikan masuk akal mengingat input data yang saya gunakan?
Saya dapat menjawab keduanya menggunakan kueri yang sama:
select count(*) from mcdon_addresses_wtract;
-- returns 11848
Refleksi cepat tentang kerugian: Pertama, saya memeriksa di ArcGIS (Anda juga bisa melakukan ini di QGIS) dan mengembalikan jumlah yang sama. Jadi, mengapa bedanya? Pertama, beberapa alamat jatuh di luar Missouri, dan saya hanya membandingkannya dengan poligon risalah Missouri. Kedua, pada analisis lebih dekat, tampaknya ada beberapa contoh digitalisasi buruk pada data alamat. Secara khusus, banyak titik yang tidak ditangkap ST_Contains
memiliki bidang atribut kosong, yang merupakan pertanda baik ada yang tidak beres selama digitalisasi; itu juga berarti mereka bukan data yang bisa digunakan. Pada titik ini, saya merasa nyaman dengan perbedaan karena saya dapat kembali dan meningkatkan data secara wajar, memungkinkan untuk analisis yang lebih bersih.
Selanjutnya, langkah selanjutnya adalah menambahkan tabel alamat / traktat dengan atribut dari data blok. Demikian pula, saya melakukan ini dengan membuat tabel baru, sekali lagi awalan setiap bidang output untuk menunjukkan tabel asalnya (awalan cukup penting Anda akan melihat):
CREATE TABLE mcdon_addr_trct_and_blk AS
SELECT
a.*,
b.pop90 AS blk_pop90,
b.white90 AS blk_white90,
b.black90 AS blk_black90,
b.asian90 AS blk_asian90,
b.amind90 AS blk_amind90,
b.other90 AS blk_other90,
b.hisp90 AS blk_hisp90
FROM
mcdon_addresses_wtract AS a,
mo_blocks_2010 AS b
WHERE
ST_Contains(b.wkb_geometry, a.wkb_geometry);
Tentu saja, pertahankan meja:
vacuum mcdon_addr_trct_and_blk;
Alasan saya awalan setiap bidang output adalah karena jika saya tidak, beberapa bidang akan memiliki nama yang sama, dan tidak mungkin untuk membedakan mereka satu sama lain dalam produk akhir (juga .. PostGREs mungkin telah mengeluh di tengah jalan ke dalam ini, tapi karena saya mengganti nama, saya tidak memberikan kesempatan). Pertimbangkan, misalnya, dua bidang berikut dari kedua langkah, di atas. Anda dapat melihat mengapa saya mengganti nama mereka ..
t.pop90 AS tr_pop90 -- would have been simply pop90
b.pop90 AS blk_pop90 -- also would have been pop90 !
Sekarang kita memiliki alamat dengan traktat dan blok dataset, apakah kita masih memiliki jumlah poin yang sama?
select count(*) from mcdon_addr_trct_and_blk;
-- 11848 (thumbs up!)
Ya, benar! Jika mau, Anda dapat melanjutkan dan menghapus tabel pertama yang kami buat mcdon_addresses_wtract
,. Kami tidak lagi membutuhkannya untuk analisis.
Sebagai tindakan terakhir, Anda mungkin ingin mengekspor data Anda dari PostGREs ke dalam bentuk ESRI sehingga Anda dapat melihatnya dengan program lain, seperti ArcGIS (catatan, QGIS dapat membaca data PostGIS tanpa masalah). Jika Anda tertarik, inilah cara Anda dapat melakukan konversi menggunakan ogr2ogr:
ogr2ogr -f "ESRI Shapefile" "E:\path_to\addr_trct_blk.shp" PG:"host=127.0.0.1 user=youruser dbname=yourdb password=yourpass" "mcdon_addr_trct_and_blk"
Terakhir, ketika Anda menjalankan perintah ini, Anda mungkin akan mendapatkan beberapa peringatan seperti ini:
Peringatan 6: Nama bidang yang dinormalisasi / dicuci: 'tr_statefp10' hingga 'tr_statefp'
Ini hanya berarti OGR harus mempersingkat nama bidang itu, karena nama bidang dalam sebuah shapefile hanya bisa sangat panjang.
Tentu saja, ini hanya satu dari banyak cara untuk menyelesaikan pekerjaan ini.