欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python如何利用fiona判定那些point在那些polygon内

程序员文章站 2022-04-19 12:33:21
```pythonfrom shapely.geometry import LineStringfrom shapely.geometry import Pointfrom shapely.geometry import Polygonfrom shapely.geometry import MultiLineStringimport fionakansas_c = fiona.open('D:/20200309/shujushouji/python+jupyternoterbook/zuo....

如何利用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。

python如何利用fiona判定那些point在那些polygon内
python如何利用fiona判定那些point在那些polygon内
要根据安装机器的操作系统是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