Làm thế nào để đệm một shapefile vector bằng ogr python?


10

Tôi đang cố gắng học cách sử dụng ogr trong python bằng cách sử dụng các bộ dữ liệu địa điểm và dân cư từ http://www.naturalearthdata.com/doads/50m-cestation-vector/. Tôi đang cố gắng sử dụng các bộ lọc và bộ đệm để tìm điểm (ne_50m_population_places.shp) trong một bộ đệm được chỉ định của một quốc gia được đặt tên (được lọc từ lớp tính năng ADMIN trong ne_50m_admin_0_countries.shp). Vấn đề dường như là tôi không hiểu đơn vị nào sẽ sử dụng cho bộ đệm (). Trong kịch bản, tôi chỉ đơn giản sử dụng giá trị tùy ý là 10 để kiểm tra xem tập lệnh có hoạt động không. Kịch bản chạy nhưng trả lại những nơi đông dân từ khắp vùng Carribean cho quốc gia được đặt tên là 'Angola'. Lý tưởng nhất, tôi muốn có thể chỉ định khoảng cách bộ đệm, giả sử là 500km, nhưng không thể tìm ra cách thực hiện điều này vì sự hiểu biết của tôi là bộ đệm () đang sử dụng các đơn vị của country.shp sẽ ở định dạng wks84 lat / long . Tư vấn về phương pháp để đạt được điều này sẽ được nhiều đánh giá cao.

# import modules
import ogr, os, sys


## data source
os.chdir('C:/data/naturalearth/50m_cultural')

# get the shapefile driver
driver = ogr.GetDriverByName('ESRI Shapefile')

# open ne_50m_admin_0_countries.shp and get the layer
admin = driver.Open('ne_50m_admin_0_countries.shp')
if admin is None:
  print 'Could not open ne_50m_admin_0_countries.shp'
  sys.exit(1)
adminLayer = admin.GetLayer()

# open ne_50m_populated_places.shp and get the layer
pop = driver.Open('ne_50m_populated_places.shp')
if pop is None:
  print 'could not open ne_50m_populated_places.shp'
  sys.exit(1)
popLayer = pop.GetLayer()

# use an attribute filter to restrict ne_50m_admin_0_countries.shp to "Angola"
adminLayer.SetAttributeFilter("ADMIN = ANGOLA")

# get the Angola geometry and buffer it by 10 units
adminFeature = adminLayer.GetFeature(0)
adminGeom = adminFeature.GetGeometryRef()
bufferGeom = adminGeom.Buffer(10)

# use bufferGeom as a spatial filter on ne_50m_populated_places.shp to get all places
# within 10 units of Angola
popLayer.SetSpatialFilter(bufferGeom)

# loop through the remaining features in ne_50m_populated_places.shp and print their
# id values
popFeature = popLayer.GetNextFeature()
while popFeature:
  print popFeature.GetField('NAME')
  popFeature.Destroy()
  popFeature = popLayer.GetNextFeature()

# close the shapefiles
admin.Destroy()
pop.Destroy()

Câu trả lời:


2

Hai lựa chọn tôi có thể nghĩ đến là:

  1. Tính toán mức độ tương đương 500 km. Sau đó, bạn có thể nhập hàm Buffer (). Bạn phải cẩn thận mặc dù bằng cấp không có số liệu tương đương không đổi. Nó phụ thuộc vào vĩ độ bạn đang trên. Bạn có thể kiểm tra công thức Haversine nếu bạn muốn đi theo con đường này.

  2. Một lựa chọn khác là r eproject shapefile thành UTM. Bằng cách đó, bạn chỉ có thể sử dụng 500 km trực tiếp. Bạn sẽ tìm thấy khu vực UTM cho khu vực bạn quan tâm mặc dù. (Nên là UTM khu 32S cho Angola nếu tôi không nhầm)


3
Không có "mức độ tương đương" 500 km, cũng như không có khoảng cách nào khác, ngoại trừ khoảng cách nhỏ gần xích đạo: đó là vì mối quan hệ giữa khoảng cách và độ thay đổi theo phương hướng cũng như vĩ độ. Do đó, tùy chọn đầu tiên thường sẽ không hoạt động chính xác.
whuber

0
  1. Nếu bạn muốn tạo bộ đệm bằng Độ, thì hãy xem xét rằng độ có khoảng cách khá khác nhau tùy theo hướng khi bạn không ở gần đường xích đạo. Vĩ độ vẫn giữ nguyên, nhưng kinh độ một độ nhỏ hơn nhiều ở vĩ độ cao. Dưới đây là bảng của tôi về các ô vuông 500 km tính theo độ ở các vĩ độ khác nhau. Tôi đoán rằng với giá trị 4,4 của Angola có thể là dự đoán tốt nếu bạn không cần độ chính xác cao.
  2. Bạn có thể định nghĩa lại các đối tượng trong python ogr (có chức năng Transform cho nó) trong khi đọc, sau đó không cần phải chuyển đổi hình dạng.
500 km tại lat 0,0 là 4,491576420597608 x 4.486983030705042 deg
500 km tại lat 10.0 là 4.491576420597608 x 4.389054945583991 deg
500 km tại lat 20.0 là 4.491576420597608 x 4.16093408959923 deg
500 km tại lat 30.0 là 4.491576420597608 x 3.8117296267699388 deg
500 km tại lat 40.0 là 4.491576420597608 x 3.3535536144407267 deg
500 km tại lat 50.0 là 4.491576420597608 x 2.8010165014556634 deg
500 km tại lat 60.0 là 4.491576420597608 x 2.170722673038327 deg
500 km tại lat 70.0 là 4.491576420597608 x 1.4808232946314916 deg
500 km tại lat 80.0 là 4.491576420597608 x 0.7505852760718597 deg
500 km tại lat 84.0 là 4.491576420597608 x 0.4516575041056399 deg

4
Người sử dụng @ Dave X ghi chú rằng bảng này là sai lầm: một nhịp khoảng cách cố định một lớn hơn số độ ở vĩ độ cao hơn, không phải là một ít. Có vẻ như nó có thể đã được xây dựng bằng cách nhân lên trong đó cần phải có một phép chia. Mặc dù vậy, điều đó không giải thích đầy đủ về sự khác biệt: vẫn còn lỗi theo thứ tự vài phần trăm. Chính xác thì bạn đã tính những con số này như thế nào?
whuber
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.