जवाबों:
ठीक है बेन, यहाँ मेरी धारणाएँ हैं:
1) आप अपना डेटा पहले ही प्राप्त कर चुके हैं (मेरे पास आकृति में कुछ पते के बिंदु हैं, और मैंने मिसौरी के लिए जनगणना पथ और जनगणना ब्लॉक आकृतिफाइल्स डाउनलोड किया है)।
2) आप पहले से ही अपने पता बिंदुओं को जियोकोडेड कर चुके हैं और आप डेटा को प्रोजेक्ट करने में सहज हैं।
3) आप OGR / PostGIS समाधान (दोनों मुक्त) के साथ सहज हैं ।
यदि आपके पास ये सॉफ़्टवेयर नहीं हैं तो कुछ इंस्टॉल नोट हैं: PostGREs को PostGIS समर्थन के साथ कैसे स्थापित करें । (बोस्टनजीआईएस द्वारा। कृपया उनके शीर्षक के लिए अपराध न करें, मुझे लगता है कि यह सबसे अच्छा है कि कैसे आउट किया जाए।) इसके अलावा, यहां एक , दो और तीन साइटों का वर्णन है कि पायथन बाइंडिंग के साथ GDAL / OGR कैसे स्थापित करें।
कैविएट : वास्तविक विश्लेषण (यानीST_Contains
नीचे सामान)करने से पहले, आपको यह सुनिश्चित करना चाहिए कि आपकी सभी परतें एक ही प्रक्षेपण में हैं ! यदि आपके पास शेपफाइल्स हैं, तो क्वांटम जीआईएस ( क्यूजीआईएस ) या ओजीआर (या आर्कजीआईएस यदि आपके पास है)का उपयोग करके एक प्रक्षेपण से दूसरे में अनुवाद करना आसान है। वैकल्पिक रूप से, आप 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
अगले चरण में, मैंने दो नई तालिकाएँ बनाईं, धीरे-धीरे ट्रैक्ट्स विशेषताओं को जोड़ते हुए, और फिर ब्लॉक की विशेषताओं को, मेरे मूल पते बिंदु तालिका में। जैसा कि आप देखेंगे, PostGIS ST_Contains
फ़ंक्शन ने भारी-भार उठाया, प्रत्येक मामले में अंक की एक नई तालिका बनाई, प्रत्येक ने ट्रैक्स की विशेषताओं को प्राप्त किया और बहुभुज को ब्लॉक कर दिया जो वे अंदर गिर गए थे।
ध्यान दें! संक्षिप्तता के लिए, मैं केवल प्रत्येक तालिका से कुछ मुट्ठी भर खेत ले रहा हूं। आप शायद लगभग सब कुछ चाहते हैं। मैं लगभग इसलिए कहता हूं क्योंकि आपको ogr_fid
तालिकाओं से फ़ील्ड को छोड़ना होगा (शायद दूसरों को भी?), अन्यथा PostGREs एक ही नाम वाले दोनों क्षेत्रों के बारे में शिकायत करेंगे।
(पी एस मैंने इसे सूंघते हुए इधर-उधर कुछ सूंघा: 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);
तालिका बनाए रखें ताकि PostGREs आसानी से चलते रहें:
vacuum mcdon_addresses_wtract;
अब मेरे दो सवाल थे ।।
क्या ST_Contains वास्तव में काम करता था? ..और क्या मेरे द्वारा उपयोग किए गए डेटा इनपुट्स को दिए गए पते की संख्या समझ में आती है?
मैं एक ही क्वेरी का उपयोग करके दोनों का उत्तर देने में सक्षम था:
select count(*) from mcdon_addresses_wtract;
-- returns 11848
नुकसान पर एक त्वरित प्रतिबिंब: सबसे पहले, मैंने आर्कजीआईएस (आप क्यूजीआईएस में भी ऐसा कर सकते हैं) में जांच की और यह उसी गणना को वापस कर दिया। तो, अंतर क्यों? सबसे पहले, कुछ पते मिसौरी के बाहर गिर गए, और मैंने केवल एक मिसौरी ट्रैक्ट्स बहुभुज के खिलाफ तुलना की। दूसरा, करीब विश्लेषण पर, ऐसा लगता है कि पते के आंकड़ों में खराब अंकीयकरण के कुछ उदाहरण थे। विशेष रूप से, पकड़े गए अंकों में से कई में 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'
इसका मतलब यह है कि ओजीआर को उस क्षेत्र का नाम छोटा करना था, क्योंकि किसी आकृति में फ़ील्ड का नाम केवल इतना लंबा हो सकता है।
बेशक, यह इस काम को पूरा करने के कई तरीकों में से एक है।
FCC में एक API है: http://www.fcc.gov/developer/census-block-conversions-api