มีวิธีฟรีหรือราคาถูกในการเขียนรหัสที่อยู่จำนวนมากและส่งคืนหรือต่อท้ายการสำรวจสำมะโนประชากรและบล็อกข้อมูลหรือไม่
มีหลายวิธีในการเข้ารหัสที่อยู่และให้เวลาในการละติจูดนาน แต่ฉันต้องได้รับการสำรวจสำมะโนประชากรและบล็อกข้อมูล
มีวิธีฟรีหรือราคาถูกในการเขียนรหัสที่อยู่จำนวนมากและส่งคืนหรือต่อท้ายการสำรวจสำมะโนประชากรและบล็อกข้อมูลหรือไม่
มีหลายวิธีในการเข้ารหัสที่อยู่และให้เวลาในการละติจูดนาน แต่ฉันต้องได้รับการสำรวจสำมะโนประชากรและบล็อกข้อมูล
คำตอบ:
โอเคเบ็นนี่คือสมมุติฐานของฉัน:
1) คุณได้รับข้อมูลของคุณแล้ว (ฉันมีที่อยู่บางจุดในรูปแบบไฟล์และฉันดาวน์โหลดระบบทางเดินและสำมะโนประชากรและบล็อกเชพไฟล์สำหรับมิสซูรี่)
2) คุณระบุตำแหน่งที่อยู่ทางภูมิศาสตร์ของคุณแล้วและคุณสามารถคาดการณ์ข้อมูลได้อย่างสะดวกสบาย
3) คุณพอใจกับOGR / PostGIS solution (ทั้งฟรี)
นี่คือบางส่วนติดตั้งหมายเหตุหากคุณไม่ได้มีซอฟแวร์เหล่านี้: วิธีการติดตั้ง Postgres ด้วยการสนับสนุน (. โดย BostonGIS กรุณาอย่าใช้ความผิดในการใช้ชื่อของพวกเขาผมคิดว่ามันเป็นสิ่งที่ดีที่สุดวิธีการออกมี.) นอกจากนี้ที่นี่เป็นหนึ่ง , สองและสามเว็บไซต์อธิบายวิธีการติดตั้ง GDAL / OGR กับการผูกหลาม
Caveat : ก่อนดำเนินการวิเคราะห์จริง (เช่นST_Contains
สิ่งของด้านล่าง) คุณควรตรวจสอบให้แน่ใจว่าเลเยอร์ทั้งหมดของคุณอยู่ในรูปแบบเดียวกัน ! หากคุณมีรูปทรงไฟล์คุณสามารถแปลจากการฉายภาพหนึ่งไปอีกภาพหนึ่งได้อย่างง่ายดายโดยใช้ Quantum GIS (QGIS)หรือ OGR (หรือ ArcGIS หากคุณมี) หรือคุณสามารถทำการแปลงภาพในฐานข้อมูลโดยใช้ฟังก์ชั่น PostGIS โดยทั่วไปรับพิษของคุณหรือแจ้งให้เราทราบว่านี่เป็นบล็อกสะดุด
เมื่อใช้ givens เหล่านี้นี่คือวิธีที่ฉันเพิ่มส่วนทางเดินและบล็อกการเข้าถึงข้อมูลที่อยู่บางจุดโดยใช้ PostGIS:
ครั้งแรกที่ฉันogr2ogr
นำเข้าสามรูปร่างไฟล์ลงใน PostGIS:
นำเข้าที่อยู่โดยใช้ 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
นำเข้าสำรวจสำมะโนประชากรผืน (มิสซูรี) โดยใช้ ogr2ogr:spMoWest
ต่อท้ายหมายถึงฉันได้รับการแปลแล้วข้อมูลของฉันไปที่เท้าของรัฐมิสซูรีเครื่องบินตะวันตก
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
นำเข้าข้อมูลบล็อก (มิสซูรี่): อัน นี้ใช้เวลาสักครู่ ในความเป็นจริงคอมพิวเตอร์ของฉันยังคงพังและฉันต้องใส่แฟนไว้! โอ้ogr2ogr
จะไม่ให้ความคิดเห็นใด ๆ ดังนั้นอย่าทะเลาะวิวาท ตรวจสอบให้แน่ใจว่าจะรอและในที่สุดมันก็จะเสร็จสิ้น
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
เมื่อการนำเข้าข้อมูลสำเร็จแล้วให้เปิด PgAdmin III (PostGREs GUI) เรียกดูฐานข้อมูลของคุณและโยนคำสั่งการบำรุงรักษาอย่างรวดเร็วเพื่อให้ PostGREsql ทำงานได้เร็วขึ้นโดยใช้ข้อมูลใหม่เหล่านี้:
vacuum mcdon_addresses;
vacuum mo_tracts_2010;
vacuum mo_blocks_2010;
COUNT(*)
ถัดไปผมอยากรู้วิธีการหลายจุดที่อยู่ดิบผมนำเข้าดังนั้นฉันได้อย่างรวดเร็ว ฉันมักจะนับที่เริ่มต้นของงานเช่นนี้เพื่อให้ฉันตั้งหลักสำหรับ "การตรวจสอบสติ" ในภายหลัง ..
SELECT COUNT(*) FROM mcdon_addresses;
-- 11979
ในระยะถัดไปฉันสร้างตารางใหม่สองตารางค่อยๆเพิ่มคุณสมบัติของผืนเอกสารจากนั้นจึงบล็อกแอตทริบิวต์ไปยังตารางที่อยู่เดิมของฉัน อย่างที่คุณจะเห็นว่าST_Contains
ฟังก์ชั่นPostGIS นั้นยกของหนักขึ้นในแต่ละกรณีสร้างตารางคะแนนใหม่แต่ละอันได้รับคุณลักษณะของผืนดินและบล็อกรูปหลายเหลี่ยมที่อยู่ด้านใน
บันทึก! เพื่อความกะทัดรัดฉันแค่หยิบฟิลด์จากแต่ละตารางเท่านั้น คุณอาจต้องการเกือบทุกอย่าง ฉันพูดเกือบเพราะคุณจะต้องละเว้นogr_fid
ฟิลด์ (อาจจะเป็นคนอื่นหรือไม่) จากตารางที่คุณรวมมิฉะนั้น PostGREs จะบ่นเกี่ยวกับฟิลด์ทั้งสองที่มีชื่อเดียวกัน ..
(PS ฉันทำบางอย่างสอดแนมที่นี่ในขณะที่หาสิ่งนี้: http://postgis.net/docs/manual-1.4/ch04.html )
สร้างตารางที่อยู่ใหม่ที่มีแอตทริบิวต์ของผืนเอกสาร: หมายเหตุฉันจะใส่คำนำหน้าคอลัมน์เอาท์พุทแต่ละคอลัมน์พร้อมคำใบ้เกี่ยวกับตารางที่เริ่มต้น (ฉันจะอธิบายสาเหตุด้านล่าง)
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);
ดูแลตารางเพื่อให้ PostGRE ยังคงทำงานได้อย่างราบรื่น:
vacuum mcdon_addresses_wtract;
ตอนนี้ฉันมีคำถามสองข้อ ..
ST_Contains ใช้งานได้จริงหรือไม่ .. และ .. จำนวนที่อยู่ที่คืนกลับมาเหมาะสมหรือไม่จากข้อมูลที่ฉันใช้?
ฉันสามารถตอบทั้งคู่โดยใช้ข้อความค้นหาเดียวกัน:
select count(*) from mcdon_addresses_wtract;
-- returns 11848
ภาพสะท้อนที่ชัดเจนเกี่ยวกับการสูญเสีย: อันดับแรกฉันตรวจสอบใน ArcGIS (คุณสามารถทำสิ่งนี้ใน QGIS ได้) และมันก็นับการคืนค่าเดียวกัน ดังนั้นทำไมแตกต่างกันอย่างไร ครั้งแรกที่อยู่บางแห่งอยู่นอกรัฐมิสซูรีและฉันเปรียบเทียบกับรูปหลายเหลี่ยมของรัฐมิสซูรีเท่านั้น ประการที่สองจากการวิเคราะห์อย่างใกล้ชิดดูเหมือนว่ามีตัวอย่างบางส่วนของข้อมูลดิจิทัลที่ไม่ดีในข้อมูลที่อยู่ โดยเฉพาะอย่างยิ่งหลายจุดที่ไม่ได้จับST_Contains
มีเขตข้อมูลแอตทริบิวต์ที่ว่างเปล่าซึ่งเป็นสัญญาณที่ดีสิ่งที่เหม็นในระหว่างการแปลงเป็นดิจิทัล; มันยังหมายความว่าพวกเขาไม่ได้ใช้ข้อมูล ณ จุดนี้ฉันพอใจกับความแตกต่างเนื่องจากฉันสามารถย้อนกลับและปรับปรุงข้อมูลได้อย่างมีเหตุผล
ขั้นต่อไปคือการผนวกตารางที่อยู่ / ผืนด้วยคุณสมบัติจากข้อมูลบล็อก ในทำนองเดียวกันฉันทำสิ่งนี้โดยการสร้างตารางใหม่นำหน้าแต่ละฟิลด์เอาต์พุตอีกครั้งเพื่อระบุตารางที่มาจาก (คำนำหน้าค่อนข้างสำคัญที่คุณจะเห็น):
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);
แน่นอนรักษาตาราง:
vacuum mcdon_addr_trct_and_blk;
เหตุผลที่ฉันนำหน้าฟิลด์เอาต์พุตแต่ละฟิลด์เป็นเพราะถ้าฉันไม่ได้บางฟิลด์จะมีชื่อเหมือนกันและมันเป็นไปไม่ได้ที่จะแยกแยะความแตกต่างจากอีกอันหนึ่งในผลิตภัณฑ์สุดท้าย (เช่น .. PostGREs อาจบ่นกลางเรื่องนี้ แต่ตั้งแต่ฉันเปลี่ยนชื่อฉันไม่ได้ให้โอกาส) ตัวอย่างเช่นพิจารณาสองฟิลด์ต่อไปนี้จากทั้งสองขั้นตอนด้านบน คุณสามารถดูว่าทำไมฉันเปลี่ยนชื่อพวกเขา ..
t.pop90 AS tr_pop90 -- would have been simply pop90
b.pop90 AS blk_pop90 -- also would have been pop90 !
ตอนนี้เรามีที่อยู่พร้อมชุดข้อมูลและบล็อกชุดข้อมูลแล้วเรายังมีคะแนนเท่ากันหรือไม่
select count(*) from mcdon_addr_trct_and_blk;
-- 11848 (thumbs up!)
ใช่พวกเราทำ! หากคุณต้องการคุณสามารถไปข้างหน้าและลบตารางแรกที่เราสร้างขึ้นmcdon_addresses_wtract
ได้ เราไม่ต้องการการวิเคราะห์อีกต่อไป
เป็นการกระทำล่าสุดคุณอาจต้องการส่งออกข้อมูลของคุณจาก PostGREs ไปยังไฟล์รูปร่าง ESRI เพื่อให้คุณสามารถดูได้ด้วยโปรแกรมอื่น ๆ เช่น ArcGIS (จากบันทึกย่อ QGIS สามารถอ่านข้อมูล PostGIS ได้โดยไม่มีปัญหา) หากคุณสนใจนี่คือวิธีที่คุณสามารถทำการแปลงโดยใช้ 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"
สุดท้ายเมื่อคุณเรียกใช้คำสั่งนี้คุณอาจได้รับคำเตือนบางอย่างเช่นนี้:
คำเตือน 6: ชื่อเขตข้อมูลปกติ / ฟอก: 'tr_statefp10' ถึง 'tr_statefp'
นี่หมายถึงว่า OGR ต้องย่อชื่อฟิลด์นั้นให้สั้นลงเนื่องจากชื่อเขตข้อมูลใน shapefile สามารถยาวได้เพียงเท่านั้น
แน่นอนว่านี่เป็นเพียงหนึ่งในหลายวิธีที่จะทำให้งานนี้สำเร็จ