Ogr python kullanarak bir vektör şekil dosyası nasıl arabelleğe alınır?


10

Http://www.naturalearthdata.com/downloads/50m-cultural-vectors/ adresinden ülkeyi ve nüfuslu yer veri kümelerini kullanarak python'da ogr kullanmayı öğrenmeye çalışıyorum. Ben adlandırılmış bir ülkenin (ne_50m_admin_0_countries.shp özellik sınıfı ADMIN filtre) belirli bir arabellek içinde noktaları (ne_50m_populated_places.shp) bulmak için filtreleri ve arabellekleri kullanmaya çalışıyorum. Sorun, tampon () için hangi birimleri kullanacağımı anlamıyorum gibi görünüyor. Senaryoda ben sadece senaryonun çalışıp çalışmadığını test etmek için 10 keyfi değerini kullandım. Komut dosyası çalışır, ancak adlandırılmış 'Angola' ülkesi için Karayipler bölgesindeki nüfuslu yerleri döndürür. İdeal olarak, 500 km gibi bir arabellek mesafesi belirleyebilmek istiyorum, ancak bunu nasıl yapacağımı anlayamıyorum çünkü anlayışım buffer () wgs84 lat / long biçiminde olacak country.shp birimlerini kullanıyor . Bunu başarmak için yöntem önerileri çok takdir edilecektir.

# 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()

Yanıtlar:


2

Düşünebileceğim iki seçenek:

  1. 500 kilometrelik derece eşdeğerini hesaplayın. Daha sonra buffer () fonksiyonunu girebilirsiniz. Bir derecenin sabit bir metrik eşdeğeri olmadığından dikkatli olmanız gerekir. Hangi enlemde olduğunuza bağlıdır. Bu rotaya gitmek istiyorsanız Haversine formülüne göz atabilirsiniz .

  2. Başka bir seçenek şekil dosyasını UTM'ye yeniden tasarlamak olabilir. Böylece doğrudan 500 kilometreyi kullanabilirsiniz. Yine de ilgi alanınız için UTM bölgesini bulacaksınız. ( Yanılmıyorsam Angola için UTM bölgesi 32S olmalı )


3
Ekvatorun yakınında yaklaşık olarak küçük mesafeler hariç, 500 kilometrelik "derece eşdeğeri" ne de başka bir mesafe yoktur: çünkü mesafeler ve dereceler arasındaki ilişki, yatak ve enlem ile değişir. Bu nedenle, ilk seçenek genellikle düzgün çalışmaz.
whuber

0
  1. Dereceleri kullanarak tampon yapmak istiyorsanız, ekvatorun yakınında olmadığınızda derecelerin yöne bağlı olarak oldukça farklı bir mesafeye sahip olduğunu düşünün. Enlem aynı kalır, ancak yüksek enlemlerde bir derece boylam çok daha küçüktür. Aşağıda, farklı enlemlerde derece cinsinden 500 km'lik kareler masam var. Sangola değeri 4,4 için yüksek hassasiyete ihtiyacınız yoksa iyi bir tahmin olabilir sanırım.
  2. Okuma sırasında python ogr'daki nesneleri (bunun için Dönüştürme işlevi vardır) yeniden projeksiyon yapabilirsiniz, daha sonra şekil dosyası dönüşümlerine gerek yoktur.
Lat 0.0'da 500 km 4.491576420597608 x 4.486983030705042 derece
Lat 10.0'da 500 km 4.491576420597608 x 4.389054945583991 derece
Lat 20.0'da 500 km 4.491576420597608 x 4.16093408959923 derece
En geç 30.0'da 500 km 4.491576420597608 x 3.8117296267699388 derece
Lat 40.0'da 500 km 4.491576420597608 x 3.3535548944407267 derece
Enlem 50.0'da 500 km 4.491576420597608 x 2.8010165014556634 derece
Enlem 60.0'da 500 km 4.491576420597608 x 2.170722673038327 derece
En geç 70.0'de 500 km 4.491576420597608 x 1.4808232946314916 derece
En geç 80.0'da 500 km 4.491576420597608 x 0.7505852760718597 derece
Son 84.0'da 500 km 4.491576420597608 x 0.4516575041056399 derece

4
User @Dave X, bu tablonun hatalı olduğunu belirtir: sabit bir mesafe , daha az değil, daha yüksek enlemlerde daha fazla dereceye yayılır . Görünüşe göre bölünmenin gerekli olduğu bir çarpma işlemi yapılarak oluşturulmuş olabilir. Yine de, bu tutarsızlıkları tam olarak açıklamaz: yüzde birkaç oranında hatalar var. Bu sayıları tam olarak nasıl hesapladınız?
whuber
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.