一、需求和问题
需求:我想找出pt这个坐标所在的图层的polygon的位置
我的代码如下:
import os
from osgeo import ogr
from shapely.geometry import Polygon, Point, MultiPolygon
#我的图层是多polygon数据
polygon_1106 = r'G:\shiya\lyr_name.shp'
ogr.UseExceptions() #捕获异常
driver = ogr.GetDriverByName("ESRI Shapefile")#获取驱动
input_dataset = driver.Open(polygon_1106,0) #1代表可写,0代表可
target_lyr = input_dataset.GetLayer(0)#获取图层
pt = Point(290073.9839023614,4205727.000051972)
for in_feat in target_lyr:
polygon = in_feat.geometry()
print(polygon.Contains(pt))
然后报错:
二、分析问题
问题根源是ogr和shapely这两个包。我在创建点要素pt的时候,用的是from shapely.geometry import Polygon, Point, MultiPolygon
,该方法创建的要素的类型是class 'shapely.geometry.point.Point'
;
而我在读取polygon图层的时候用的是from osgeo import ogr
,该方法返回的要素类型是class 'osgeo.ogr.Geometry'
。而这两种类型是不可相互兼容的。
from osgeo import ogr
from shapely.geometry import Polygon, Point, MultiPolygon
pt = Point(290073.9839023614,4205727.000051972)
print(type(pt))
for in_feat in target_lyr:
polygon = in_feat.geometry()
print(type(polygon))
三、解决问题
import os
from osgeo import ogr
#我的图层是多polygon数据
polygon_1106 = r'G:\shiya\lyr_name.shp'
ogr.UseExceptions() #捕获异常
driver = ogr.GetDriverByName("ESRI Shapefile")#获取驱动
input_dataset = driver.Open(polygon_1106,0) #1代表可写,0代表可
target_lyr = input_dataset.GetLayer(0)#获取图层
x,y = 290073.9839023614,4205727.000051972
pt = ogr.Geometry(ogr.wkbPoint)
pt.AddPoint(x,y)
print(type(pt))
for in_feat in target_lyr:
polygon = in_feat.geometry()
if polygon.Contains(pt):
print(polygon)
print(type(polygon))