답변:
Ok Ben, 여기 내 가정이 있습니다 :
1) 데이터가 이미 있습니다 (모양 파일에 주소 지점이 있고 미주리 주 인구 조사 및 인구 조사 블록 셰이프 파일을 다운로드했습니다).
2) 이미 주소 지점을 지오 코딩했으며 데이터를 편안하게 투사 할 수 있습니다.
3) OGR / PostGIS 솔루션에 만족합니다 (둘 다 무료).
다음 소프트웨어가없는 경우 몇 가지 설치 정보가 있습니다 . PostGIS 지원으로 PostGRE를 설치하는 방법 . (BostonGIS. 제목에 불쾌감을주지 말고, 그것이 가장 좋은 방법이라고 생각합니다.) 또한 파이썬 바인딩으로 GDAL / OGR을 설치하는 방법을 설명하는 1 , 2 , 3 사이트가 있습니다.
주의 사항 : 실제 분석 (즉ST_Contains
, 아래 내용)을수행하기 전에 모든 레이어가 동일한 투영 상태에 있는지 확인 해야 합니다 ! 쉐이프 파일이있는 경우 Quantum GIS (QGIS) 또는 OGR (또는 ArcGIS가있는 경우 )을 사용하여 한 투영에서 다른 투영으로 쉽게 변환할 수 있습니다. 또는 PostGIS 기능을 사용하여 데이터베이스에서 투영 변환을 수행 할 수 있습니다. 기본적으로 독을 선택하거나 이것이 걸림돌인지 알려주십시오.
그와 같은 방법으로 PostGIS를 사용하여 일부 주소 데이터에 트랙트 및 블록 특성을 추가했습니다.
먼저 ogr2ogr
세 가지 shapefile을 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 (PostGRE GUI)을 시작하고 데이터베이스를 탐색 한 후 빠른 유지 보수 명령을 던져서 새 데이터를 사용하여 PostGREsql이 더 빨리 실행되도록하십시오.
vacuum mcdon_addresses;
vacuum mo_tracts_2010;
vacuum mo_blocks_2010;
다음으로, 몇 개의 원시 주소 포인트를 가져 왔는지 궁금해서 빨리했습니다 COUNT(*)
. 나는 보통 이런 작업을 시작할 때 나중에 "위생 확인"을위한 발판을 마련하기 위해 카운트를한다.
SELECT COUNT(*) FROM mcdon_addresses;
-- 11979
다음 단계에서는 두 개의 새 테이블을 만들어 서서히 주소 속성 테이블에 tracts 속성을 추가 한 다음 블록 속성을 추가했습니다. 보시다시피 PostGIS ST_Contains
함수는 각각의 경우에 새로운 포인트 테이블을 생성하여 각각의 트랙과 속성의 폴리곤을 얻었습니다.
노트! 간결하게하기 위해 각 테이블에서 소수의 필드 만 가져옵니다. 당신은 아마 거의 모든 것을 원할 것입니다. 나는 당신이 결합하고있는 테이블에서 필드 를 생략해야하기 때문에 거의 말 ogr_fid
을합니다. 그렇지 않으면 PostGRE는 동일한 이름을 가진 두 필드에 대해 불평합니다.
(PS 나는 이것을 알아내는 동안 여기에서 스누핑을했습니다 : http://postgis.net/docs/manual-1.4/ch04.html )
tracts 속성을 사용하여 새 주소 지점 테이블을 만듭니다. 참고 각 출력 열 앞에 시작하는 테이블을 설명하는 힌트를 접두어로 붙입니다 (아래에서 이유를 설명하겠습니다).
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
는 빈 속성 필드 를 가졌으며 이는 디지털화 과정에서 무언가가 잘못되었다는 좋은 신호입니다. 또한 어쨌든 사용 가능한 데이터가 아니었다는 것을 의미합니다. 이 시점에서 저는 합리적으로 돌아가서 데이터를 개선하여보다 명확한 분석을 수행 할 수있는 차이점에 익숙합니다.
다음 단계는 블록 데이터의 속성과 함께 address / tracts 테이블을 추가하는 것입니다. 마찬가지로 새 테이블을 만들어 각 출력 필드에 접두사를 붙여 다시 테이블을 나타냅니다 (접두사가 매우 중요합니다).
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;
각 출력 필드 앞에 접두사를 붙인 이유는 그렇지 않은 경우 일부 필드의 이름이 같고 최종 제품에서 서로 구별하는 것이 불가능하기 때문입니다. PostGRE는 중간에 불만을 제기했을 수 있습니다. 그러나 이름을 바꾼 이후에는 기회가 없었습니다). 예를 들어, 위의 두 단계에서 다음 두 필드를 고려하십시오. 내가 이름을 바꾼 이유를 알 수 있습니다.
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
. 더 이상 분석에 필요하지 않습니다.
마지막 작업으로, 당신은 할 수 는 ArcGIS처럼, 그래서 ESRI의 모양 파일로 포스트 그레스에서 데이터를 내보낼 수는 다른 프로그램을 볼 수 원하는 (참고로, 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'
이것은 shapefile의 필드 이름이 너무 길 수 있기 때문에 OGR이 해당 필드 이름을 줄여야 함을 의미합니다.
물론이 작업을 수행하는 여러 가지 방법 중 하나 일뿐입니다.
FCC에는 API가 있습니다 : http://www.fcc.gov/developer/census-block-conversions-api