10 votos

Cómo búfer de un vector shapefile utilizando ogr python?

Estoy tratando de aprender a usar ogr en python usando el país y lugares poblados de conjuntos de datos de http://www.naturalearthdata.com/downloads/50m-cultural-vectors/. Estoy tratando de usar filtros y buffers para encontrar puntos (ne_50m_populated_places.shp) dentro de un búfer especificado de nombre de país (filtrado de la clase de entidad de ADMINISTRACIÓN en ne_50m_admin_0_countries.shp). El problema parece ser que no entiendo lo de las unidades utilizadas para el buffer(). En el script simplemente he utilizado un valor arbitrario de 10 para probar si el script funciona. La secuencia de comandos se ejecuta, pero devuelve lugares poblados de todo el Caribe la región de país llamado 'Angola'. Idealmente, quiero ser capaz de especificar una distancia intermedia, digamos 500 km, pero no se puede averiguar cómo hacerlo ya que en mi entendimiento es de búfer() es el uso de las unidades de los países.shp que será en wgs84 (lat/long formato. Asesoramiento sobre el método para lograr esto sería muy apreciada.

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

1voto

shsteimer Puntos 8749

Dos opciones que puedo pensar son:

  1. Calcular el grado equivalente de 500 kilómetros. Usted puede, a continuación, entrada de Buffer() función. Usted tendría que tener cuidado, aunque como un grado no tiene una constante equivalente métrico. Esto depende de la latitud en la que te encuentres. Usted puede comprobar fuera de la fórmula de Haversine si quieres ir a esta ruta.

  2. Otra opción sería la de reproject el shapefile a UTM. De esa manera, usted puede utilizar las 500 kilómetros directamente. Deberás encontrar la zona UTM para su área de interés, aunque. (Que debe ser UTM zona 32S para Angola si no me equivoco)

0voto

JaakL Puntos 786
  1. Si usted desea hacer buffer con Grados, a continuación, considere la posibilidad de que los títulos tienen bastante distancia diferente dependiendo de la dirección cuando usted no está cerca de ecuador. La latitud se mantiene igual, pero de un grado de longitud es mucho menor en las latitudes altas. A continuación es mi tabla de 500 kilómetros cuadrados en los grados en diferentes latitudes. Supongo que para Angola valor de 4,4 puede ser bueno supongo que si usted no necesita una alta precisión.
  2. Usted puede reproyectar los objetos en python ogr (no es función de Transformación de la misma) durante la lectura, entonces no hay necesidad de shapefile de las conversiones.
500 km en lat 0.0 es 4.491576420597608 x 4.486983030705042 grados
500 km en lat 10.0 es 4.491576420597608 x 4.389054945583991 grados
500 km en lat 20.0 es 4.491576420597608 x 4.16093408959923 grados
500 km en lat 30.0 es 4.491576420597608 x 3.8117296267699388 grados
500 km en lat 40.0 es 4.491576420597608 x 3.3535548944407267 grados
500 km en lat 50.0 es 4.491576420597608 x 2.8010165014556634 grados
500 km en lat 60.0 es 4.491576420597608 x 2.170722673038327 grados
500 km en lat 70.0 es 4.491576420597608 x 1.4808232946314916 grados
500 km en lat 80.0 es 4.491576420597608 x 0.7505852760718597 grados
500 km en lat 84.0 es 4.491576420597608 x 0.4516575041056399 grados

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X