การค้นหาจำนวนมากของระบบสำรวจสำมะโนประชากรและบล็อกที่อยู่


16

มีวิธีฟรีหรือราคาถูกในการเขียนรหัสที่อยู่จำนวนมากและส่งคืนหรือต่อท้ายการสำรวจสำมะโนประชากรและบล็อกข้อมูลหรือไม่

มีหลายวิธีในการเข้ารหัสที่อยู่และให้เวลาในการละติจูดนาน แต่ฉันต้องได้รับการสำรวจสำมะโนประชากรและบล็อกข้อมูล

คำตอบ:


16

โอเคเบ็นนี่คือสมมุติฐานของฉัน:

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 สามารถยาวได้เพียงเท่านั้น

แน่นอนว่านี่เป็นเพียงหนึ่งในหลายวิธีที่จะทำให้งานนี้สำเร็จ


9

FCC มี API: http://www.fcc.gov/developer/census-block-conversions-api


2
+1 ไซต์ที่ค่อนข้างคลุมเครือ (ใครจะไปที่ FCC สำหรับข้อมูลการสำรวจสำมะโนประชากร?) จะปรากฏขึ้นเพื่อเสนอวิธีการแก้ปัญหาที่ทรงพลังและสามารถนำไปใช้ได้โดยตรง ยินดีต้อนรับสู่ชุมชนของเรา Bob!
whuber

ไซต์ fcc นั้นไม่ได้ให้คำตอบที่ถูกต้องเมื่อฉันเปรียบเทียบกับแผนที่ระดับบล็อกที่เผยแพร่โดยการสำรวจสำมะโนประชากร ใช้ lat / long จาก google maps census.gov/geo/maps-data/maps/block/2010/place/…
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.