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

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

评论

geopandas是您矢量文件的朋友。用于栅格的栅格。

#1 楼

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


geospatial processing in Python具有悠久的历史,比Arcpy(或arcgisscripting)要古老得多->保罗说,这里没有“模仿” ArcPy的功能,大多数已经在ArcPy之前存在。
Python模块的参考是Python软件包索引(Pypi)并有专门的部分:主题::科学/工程:: GIS

您可以使用这些模块执行任何操作,并且它比ArcPy更加容易和快捷,因为它是纯净的Python(无光标...)。

Shapely是用于处理地理空间几何的这些模块之一->计算多边形的面积并将多边形转换为点。.
如果要处理矢量图层,有osgeo / ogr,Fiona或Pyshp(以及其他较少使用的图层)->通过属性查询shapefile,创建新图层fr进行选择,计算多边形的面积,将多边形转换为点
用于处理栅格,标准是osgeo / gdal

用于空间分析,有Pysal

对于3D,您可以使用numpy或scipy等其他Scientific模块(3D算法,网格,也可以使用统计数据,地统计,2D或3D)
,我不会谈论mapnik,matplotlib / basemap,Geodjango和.. 。

您可以将所有(Pysal与shape,...)组合在一起,并将它们与其他Scientific模块混合。
因此获取Python脚本示例,搜索Pyshp Fiona,ogr,gdal或可以在gis.stackexchange或Internet中正常运行(很多示例,不仅是英语)。
其中一个是法语(脚本和图形是通用的!):


Python:在地质角度上使用矢量和栅格图层,而没有GIS软件
其他英语版本:

具有Python,Shapely和Fiona的GIS和西班牙语

/>
使用顶点的坐标确定不规则多边形的区域
gis.stackexchange
高程剖面线的每侧10 km
使用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学习地理空间分析
(来源:cloudfront.net)
Python还被QGIS(Quantum GIS),GRASS GIS,gvSIG或OpenJump等其他GIS应用程序用作脚本语言。或Paraview等3D建模器(还有Blender!)。您可以在所有这些应用程序中使用大多数地理空间模块(请参阅使用Blender可视化QGIS数据)

评论


您所说的Python这些是什么?

–内森·W
13年6月22日在8:03

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

–multigoodverse
16-4-27的14:42

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

–基因
16年4月27日在14:56

#2 楼

我强烈推荐USU网站使用开源GIS使用Python进行地理处理,以帮助您入门。在整个练习中,他们主要使用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()


评论


。销毁是一个很棒的方法名:p

–杰森·贝利诺(Jason Bellino)
13年6月21日在17:04

#3 楼

您可能对GDAL / OGR感兴趣。

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

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

我最近通过选择多边形中的点来做到这一点,如此处所示。给定多边形顶点的坐标,它利用射线投射算法确定点是否位于多边形内。

评论


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

–马特·威尔基
2013年6月21日19:23在

#4 楼

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

评论


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

–夏尔巴人
13年6月21日在16:33

github.com/Toblerity/Shapely/tree/master/shapely/examples

–杰森·贝利诺(Jason Bellino)
13年6月21日在16:43

从长远来看,仅链接的答案无济于事,因为它们不可避免地会损坏。请提供有关目的地的足够信息,以便a)可以重新发现它的新家,并且b)在访问和阅读页面之前,可以理解和理解解决方案的本质。

–马特·威尔基
2013年6月21日19:20在