Ok Ben, đây là giả định của tôi:
1) Bạn đã có dữ liệu của mình (Tôi có một số điểm địa chỉ trong một shapefile và tôi đã tải xuống đường điều tra dân số và shapefile khối điều tra dân số cho Missouri).
2) Bạn đã mã hóa các điểm địa chỉ của mình và bạn cảm thấy thoải mái khi chiếu dữ liệu.
3) Bạn cảm thấy thoải mái với giải pháp OGR / PostGIS (cả miễn phí).
Dưới đây là một số lưu ý cài đặt nếu bạn không có các phần mềm này: Cách cài đặt PostGRE với sự hỗ trợ của PostGIS . (Bởi BostonGIS. Xin đừng xúc phạm đến tiêu đề của họ, tôi chỉ nghĩ đó là cách tốt nhất để ra khỏi đó.) Ngoài ra, đây là một , hai và ba trang web mô tả cách cài đặt GDAL / OGR với các ràng buộc Python.
Nên biết trước : Trước khi thực hiện việc phân tích thực tế (tức làST_Contains
các công cụ, bên dưới), bạn nên đảm bảo tất cả các lớp của bạn trong cùng một chiếu ! Nếu bạn có shapefiles, thật dễ dàng để dịch từ phép chiếu này sang phép chiếu khác bằng cách sử dụng Quantum GIS (QGIS) hoặc OGR (hoặc ArcGIS nếu bạn có). Ngoài ra, bạn có thể thực hiện chuyển đổi chiếu trong cơ sở dữ liệu bằng các hàm PostGIS. Về cơ bản chọn chất độc của bạn, hoặc cho chúng tôi biết nếu đây là một vấp ngã.
Với những tặng phẩm đó, đây là cách tôi gắn thêm đường truyền và chặn tham chiếu vào một số dữ liệu điểm địa chỉ bằng PostGIS:
Đầu tiên tôi sử dụng ogr2ogr
để nhập ba shapefiles vào PostGIS:
Nhập địa chỉ bằng 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
Vùng điều tra dân số nhập khẩu (Missouri) sử dụng ogr2ogr: Các spMoWest
hậu tố có nghĩa tôi đã dịch dữ liệu của tôi để Missouri State Plane Tây Feet.
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
Nhập dữ liệu khối (Missouri): Cái này mất một lúc. Trong thực tế, máy tính của tôi liên tục bị hỏng và tôi phải đặt một cái quạt trên đó! Ngoài ra, ogr2ogr
sẽ không cung cấp bất kỳ thông tin phản hồi, vì vậy đừng nhận được đấm; hãy chắc chắn chờ đợi nó và cuối cùng nó sẽ kết thúc.
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
Sau khi hoàn thành quá trình nhập dữ liệu, hãy khởi chạy PGAdmin III (GUI PostGREs), duyệt vào cơ sở dữ liệu của bạn và đưa ra một số lệnh bảo trì nhanh để PostGREsql sẽ chạy nhanh hơn bằng cách sử dụng các dữ liệu mới này:
vacuum mcdon_addresses;
vacuum mo_tracts_2010;
vacuum mo_blocks_2010;
Tiếp theo, tôi tò mò có bao nhiêu điểm địa chỉ thô tôi đã nhập, vì vậy tôi đã làm nhanh COUNT(*)
. Tôi thường làm một số đếm khi bắt đầu một nhiệm vụ như thế này để cho tôi chỗ đứng cho "kiểm tra sự tỉnh táo" sau này ..
SELECT COUNT(*) FROM mcdon_addresses;
-- 11979
Trong giai đoạn tiếp theo, tôi đã tạo hai bảng mới, dần dần thêm các thuộc tính vùng và sau đó là các thuộc tính khối, vào bảng điểm địa chỉ ban đầu của tôi. Như bạn sẽ thấy, ST_Contains
hàm PostGIS đã thực hiện công việc nặng nhọc, trong mỗi trường hợp tạo ra một bảng điểm mới, mỗi điểm đạt được các thuộc tính của các vùng và chặn các đa giác mà chúng rơi vào bên trong.
Ghi chú! Để cho ngắn gọn, tôi chỉ lấy một số trường từ mỗi bảng. Có lẽ bạn sẽ muốn hầu hết mọi thứ. Tôi nói gần như bởi vì bạn sẽ cần bỏ qua ogr_fid
trường (thậm chí là các trường khác?) Khỏi các bảng bạn đang kết hợp, nếu không, PostGRE sẽ phàn nàn về cả hai trường có cùng tên ..
(PS tôi đã thực hiện một số rình mò ở đây trong khi tìm hiểu điều này: http://postgis.net/docs/manual-1.4/ch04.html )
Tạo một bảng điểm địa chỉ mới với các thuộc tính vùng: Lưu ý Tôi đang thêm tiền tố vào mỗi cột đầu ra với một gợi ý tiết lộ bảng nào đã bắt đầu (Tôi sẽ giải thích lý do tại sao bên dưới).
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);
Duy trì bảng để PostGRE tiếp tục chạy trơn tru:
vacuum mcdon_addresses_wtract;
Bây giờ tôi đã có hai câu hỏi ..
ST_Contains có thực sự hoạt động không? ..và .. Số lượng địa chỉ được trả về có hợp lý với các dữ liệu đầu vào tôi đã sử dụng không?
Tôi đã có thể trả lời cả hai bằng cùng một truy vấn:
select count(*) from mcdon_addresses_wtract;
-- returns 11848
Một phản ánh nhanh về các khoản lỗ: Đầu tiên, tôi đã kiểm tra ArcGIS (bạn cũng có thể thực hiện điều này trong QGIS) và nó đã trả lại số lượng tương tự. Vậy, tại sao lại có sự khác biệt? Đầu tiên, một số địa chỉ nằm ngoài Missouri và tôi chỉ so sánh với một đa giác vùng Missouri. Thứ hai, về phân tích kỹ hơn, dường như có một số ví dụ về số hóa xấu trong dữ liệu địa chỉ. Cụ thể, nhiều điểm không bị bắt bởi ST_Contains
có các trường thuộc tính trống, đó là một dấu hiệu tốt có gì đó bị lỗi trong quá trình số hóa; điều đó cũng có nghĩa là họ không thể sử dụng dữ liệu. Tại thời điểm này, tôi cảm thấy thoải mái với sự khác biệt vì tôi có thể quay lại và cải thiện dữ liệu một cách hợp lý, cho phép phân tích rõ ràng hơn.
Tiếp tục, bước tiếp theo là nối thêm bảng địa chỉ / vùng có các thuộc tính từ dữ liệu khối. Tương tự, tôi đã làm điều này bằng cách tạo một bảng mới, một lần nữa tiền tố mỗi trường đầu ra để chỉ ra bảng mà nó xuất phát (tiền tố khá quan trọng bạn sẽ thấy):
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);
Tất nhiên, duy trì bảng:
vacuum mcdon_addr_trct_and_blk;
Lý do tôi đặt trước mỗi trường đầu ra là vì nếu tôi không làm như vậy, một số trường sẽ có cùng tên và không thể phân biệt chúng với nhau trong sản phẩm cuối cùng (cũng có thể .. PostGRE đã phàn nàn giữa chừng về điều này, nhưng vì tôi đã đổi tên, tôi đã không cho nó cơ hội). Ví dụ, xem xét hai trường sau từ cả hai bước ở trên. Bạn có thể thấy lý do tại sao tôi đổi tên chúng ..
t.pop90 AS tr_pop90 -- would have been simply pop90
b.pop90 AS blk_pop90 -- also would have been pop90 !
Bây giờ chúng ta có một địa chỉ với các vùng dữ liệu và khối, dwe vẫn có cùng số điểm?
select count(*) from mcdon_addr_trct_and_blk;
-- 11848 (thumbs up!)
Vâng, chúng tôi làm! Nếu bạn muốn, bạn có thể tiếp tục và xóa bảng đầu tiên chúng tôi đã tạo mcdon_addresses_wtract
. Chúng tôi không còn cần nó để phân tích.
Như là một hành động cuối cùng, bạn có thể muốn xuất dữ liệu của mình từ PostGRE thành một shapefile ESRI để bạn có thể xem nó với các chương trình khác, như ArcGIS (lưu ý, QGIS có thể đọc dữ liệu PostGIS mà không gặp vấn đề gì). Nếu bạn quan tâm, đây là cách bạn có thể thực hiện chuyển đổi bằng cách sử dụng 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"
Cuối cùng, khi bạn chạy lệnh này, bạn có thể sẽ nhận được một số cảnh báo như thế này:
Cảnh báo 6: Tên trường được chuẩn hóa / giặt là: 'tr_statefp10' thành 'tr_statefp'
Điều này chỉ có nghĩa là OGR phải rút ngắn tên trường đó, vì tên trường trong shapefile chỉ có thể quá dài.
Tất nhiên, đây chỉ là một trong nhiều cách để hoàn thành công việc này.