python如何利用fiona判定那些point在那些polygon内
如何利用fiona判定那些point在那些polygon内)
问题来源,我有两个数据数据:一个是矢量面数据、一个是矢量point数据,那么如何判定那些point数据在包含在矢量面范围内,并把point在对应面的 属性表的字段,写入到point内;
什么是foina
fiona是一个用于读写矢量空间数据文件的Python包,是由Sean Gillies等人写的,其底层是C++开发的OGR库(一个开源GIS库)。
安装fiona包最好是下载wheel文件(编译发布的包)进行安装,因为用源码发布的包进行安装有一个编译(build)过程,如安装机器上没有相应的编译器,则会出现安装错误。此外,fiona的依赖包GDAL也是同样情况。
GDAL和fiona的wheel文件可以从Unofficial Windows Binaries for Python Extension Packages网站上下载。安装fiona前先要安装GDAL。
要根据安装机器的操作系统是64位还是32位;以及Python版本是python 2或者 python 3选择安装对应文件;
几何类型
在一个记录中,geometry键的值包含了该记录的几何类型及坐标值。
fiona定义的几何类型和GeoJSON是一致的,包括Point、LineString、Polygon、MultiPoint、MultiLineString以及MultiPolygon。
坐标值的表示方式与几何类型是相关的。
几何类型 | 坐标值形式 |
---|---|
Point | 点的x和y坐标组成的元组 |
LineString | 多个点坐标组成的列表(一层列表) |
Polygon | 多个环线(ring)坐标组成的列表(每个环线是多个点坐标组成的列表)(两层列表) |
MultiPoint | 多个点坐标组成的列表(一层列表) |
MultiLineString | 多个线坐标组成的列表(两层列表) |
MultiPolygon | 多个多边形坐标组成的列表(三层列表) |
注:Polygon的坐标形式实际上是由一个外边线和多个内边线坐标组成的列表,这种形式可以表示所有多边形(包括有孔洞的多边形)。
shapefile文件的几何(二维)类型只有4种:点(Point)、多点(MultiPoint)、线(Polyline)和多边形(Polygon),在文件层面没有区分LineString和MultiLineString、Polygon和MultiPolygon,但坐标的表示形式是不一样,可以通过每个记录的坐标进行区分。
代码展示
本文主要实现的是:将按矢量面范围剪裁处理的另一份矢量point数据,逐个点进行与 感兴趣区面进行intersects()叠加分析,如果是包含,那么就把矢量面包含的point数据写入到新的shp数据中,然后将矢量面数据的其中一个fileds写入到新的point数据的属性表内部;
from shapely.geometry import LineString
from shapely.geometry import Point
from shapely.geometry import Polygon
from shapely.geometry import MultiLineString
import fiona
kansas_c = fiona.open('D:/20200309/shujushouji/python+jupyternoterbook/zuoye1(1)/6栅格数据操作/sample_regions/sample_regions.shp', 'r')
#coordinates = kansas_c[0]['geometry']['coordinates'][0]
#polygon = Polygon(coordinates)
#kansas_c.close()
high_c = fiona.open('D:/20200309/shujushouji/python+jupyternoterbook/zuoye1(1)/6栅格数据操作/sample_regions/grid_points1.shp', 'r')
source_driver = high_c.driver
source_crs = high_c.crs
source_schema = high_c.schema
target = fiona.open('D:/20200309/shujushouji/python+jupyternoterbook/zuoye1(1)/6栅格数据操作/sample_regions/shuchupoint.shp', 'w',
driver=source_driver,
crs=source_crs,
schema=source_schema)
for record in high_c:
coordinates = record['geometry']['coordinates']
#print(coordinates)
record_line = Point(coordinates)
for i in range(0, len(kansas_c)):
coordinates = kansas_c[i]['geometry']['coordinates'][0]
polygon = Polygon(coordinates)
if record_line.intersects(polygon):
FIELDSS = kansas_c[i]['properties']['type']
#print(FIELDSS)
record['properties']['land_type']=FIELDSS
target.write(record)
target.close()
high_c.close()
利用了foina的那些函数
主要是:
(1)利用Collection对象的write(feature)或writerecords(feature_list)方法可以把要素或要素列表写入Collection对象中。要素写入到Collection对象后,并没并没有立即保存到文件,只有当关闭Collection对象时,Collection对象中的数据才会写到文件中。
Collection对象是可迭代对象,可以通过循环返回每条记录,也可以通过索引返回其中的一条记录。
返回的记录是一个字典,包含id、geometry、properties、type等键,类似GeoJSON中的Feature。
(2)利用sharpely空间拓扑分析
,利用空间分析的intersects()叠加分析确认是否:是否和另一个几何对象相交或有包含关系。
本文地址:https://blog.csdn.net/weixin_40625478/article/details/106806440