不使用arcpy地理处理shapefile的Python脚本示例


33

我想使用一个不是基于arcpy的Python脚本来执行诸如通过属性查询shapefile,通过选择创建新图层,计算多边形的面积并将多边形转换为点之类的事情。

有没有使用其他Python模块或库的代码示例?我可以使用arcpy轻松做到这一点,但我想探索其他选择。


geopandas是您矢量文件的朋友。栅格的栅格。
罗格H

Answers:


54

这很奇怪,好像人们突然发现Python的功能一样(没有ArcPy就是其中的一个Python模块),例如参见问题Visualize shapefile in Python

  • 保罗说,Python中的地理空间处理历史悠久,比Arcpy(或arcgisscripting)要早得多 ->保罗说,这里没有“模仿” ArcPy的功能,大多数早在ArcPy之前就已经存在。
  • Python模块的参考是Python包索引Pypi),并且有专门的部分:主题::科学/工程:: GIS
  • 您可以使用这些模块执行任何操作,并且它通常比ArcPy更轻松,更快捷,因为它是纯Python(没有游标...)。
  • Shapely是处理地理空间几何的这些模块之一->计算多边形的面积并将多边形转换为点。
  • 如果要处理矢量图层,可以使用osgeo / ogrFionaPyshp(以及其他不常用的)->通过属性查询shapefile,从选择中创建新图层,计算多边形的面积,将多边形转换为点
  • 用于处理栅格的标准是osgeo / gdal
  • 对于空间分析,有Pysal
  • 对于3D,您可以使用其他科学模块,例如numpyscipy(3D算法,网格,还可以使用统计,地统计,2D或3D)
  • 而且我不谈论mapnikmatplotlib / basemapGeodjango和...

您可以将所有(Pysal与shape,...)组合在一起,并将它们与其他Scientific模块混合使用。

因此,对于Python脚本示例,请在gis.stackexchange或Internet中搜索Pyshp Fiona,ogr,gdal或shape(很多示例,不仅是英语)。)
其中有一种法语(脚本和图形是通用的!):
- Python的:使用矢量和地质角度光栅层,没有GIS软件
的其他英语:
- GIS与Python,身材匀称,和Fiona
和西班牙
- 的使用顶点的坐标不规则多边形的面积确定
在gis.stackexchange
- 高度剖面线的每侧10公里
- 使用Pyshp更新属性
- 如何从栅格创建3D shapefile?
- 用于获取两点之间的高程差的Python脚本
-等

可以使用仅使用Python字典的Fiona来更简单地编写Aaron提出的脚本:

import fiona
with fiona.open('sites.shp', 'r') as input:
    with open('hw1a.txt', 'w') as output:
       for pt in input:
           id = pt['properties']['id']
           cover = pt['properties']['cover']
           x = str(point['geometry']['coordinates'][0])
           y = str(point['geometry']['coordinates'][21])
           output.write(id + ' ' + x + ' ' + y+ ' ' + cover + '\n')

并且如果您还匀称使用:

from shapely.geometry import shape
with fiona.open('sites.shp', 'r') as input:
    with open('hw1a.txt', 'w') as output:
       for pt in input:
           id = pt['properties']['id']
           cover = pt['properties']['cover']
           x = str(shape(pt['geometry']).x)
           y = str(shape(pt['geometry']).y)
           output.write(id + ' ' + x + ' ' + y+ ' ' + cover + '\n')

还有两本书:

Eric Westra的Python地理空间开发

在此处输入图片说明

使用 Joel Lawhead的Python学习地理空间分析

在此处输入图片说明

Python也可用作其他GIS应用,如QGIS(量子GIS),草地理信息系统,gvSIG或OpenJump或3D建模者脚本语言的Paraview(和搅拌机也!)。您可以在所有这些应用程序中使用大多数地理空间模块(请参阅使用Blender可视化QGIS数据


您所说的Python内容是什么;)
Nathan W

Fiona似乎在Windows上抛出DLL错误。
multigoodverse

您是如何安装Fiona的?对我来说没问题
基因

19

我强烈建议USU网站使用Python使用开放源GIS进行地理处理,以帮助您入门。在整个练习中,他们主要使用GDAL / OGR库。安装GDAL / OGR可能会有些困难,因此此博客文章可能对您有所帮助:在Windows上为Python安装GDAL(和OGR)。另请查看在GIS.SE使用Arcpy的替代方法

以下开放源代码地理处理脚本示例(来自USU站点)用于提取属性数据并将其写入文本文件:

# import modules
import ogr, os, sys

# set the working directory
os.chdir('f:/data/classes/python/data')

# open the output text file for writing
file = open('hw1a.txt', 'w')

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

# open the data source
datasource = driver.Open('sites.shp', 0)
if datasource is None:
  print 'Could not open file'
  sys.exit(1)

# get the data layer
layer = datasource.GetLayer()

# loop through the features in the layer
feature = layer.GetNextFeature()
while feature:

  # get the attributes
  id = feature.GetFieldAsString('id')
  cover = feature.GetFieldAsString('cover')

  # get the x,y coordinates for the point
  geom = feature.GetGeometryRef()
  x = str(geom.GetX())
  y = str(geom.GetY())

  # write info out to the text file
  file.write(id + ' ' + x + ' ' + y + ' ' + cover + '\n')

  # destroy the feature and get a new one
  feature.Destroy()
  feature = layer.GetNextFeature()

# close the data source and text file
datasource.Destroy()
file.close()

4
.Destroy是一个很棒的方法名称:p
Jason

5

您可能对GDAL / OGR感兴趣。

GDAL用于处理栅格,而OGR用于矢量。两者都是开源库。

如果要消除对ArcPy的依赖,可以通过将信息读取到数组并在纯Python中运行自己的计算来模拟某些功能。

我最近在一个多边形选择点,看到这样做这里。给定多边形顶点的坐标,它利用射线投射算法确定点是否位于多边形内。


1
在访问和阅读页面之前,请包括足够的解决方案的本质,以便可以理解和理解。随着时间的流逝,该页面可能不在该地址,因此该答案不是很有用。:)
马特·威尔基

1

我从来没有亲自使用过,但是办公室中的其他人喜欢匀称使用:https : //pypi.python.org/pypi/Shapely


您是否有可能使用shape发布一些示例代码?
sherpas


5
从长远来看,仅链接的答案无济于事,因为它们不可避免地会损坏。请提供有关目的地的足够信息,以便a)可以重新发现它的新家,并且b)在访问和阅读页面之前,可以理解和理解解决方案的本质。
马特·威尔基
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.