0

我正在绘制地址点并检查它们是否在一个大的 shapefile 中。但是,现在我还想检查它们是否属于 URBAN 类型。此信息以特征列表的形式出现,其中一列是 TYPE。如果我想要的点是城市的,我会通过(urban=True)

我的硬币点代码:

def get_random_point_in_polygon(region, urban=None):
    while True:
        address = ogr.Geometry(ogr.wkbPoint)    
        address.AddPoint(random.uniform(region.get_region().geometry().GetEnvelope()[0],
                                    region.get_region().geometry().GetEnvelope()[1]),
                     random.uniform(region.get_region().geometry().GetEnvelope()[2],
                                    region.get_region().geometry().GetEnvelope()[3]))
        if region.get_region().geometry().Contains(address) and XXXXXXXXXX:
            return address

区域是一个很大的 shapefile 现在我还列出了其他 52 个都在区域内的特征。他们有一个包含信息 URBAN 或 RURAL 的 FIELD。

我想用这样的代码来完成我的 XXXXXX:“如果地址在列表中 FIELD = URBAN 的任何特征内”

有任何想法吗?就像是:

any(x in a for x in b)

但对于 shapefile...

4

1 回答 1

0

我想我找到了一个解决方案,虽然相当麻烦。ShapesInput.urban 是一个特征列表

但是,请注意,此代码非常昂贵。鉴于城市地区比农村地区小得多,这确实需要很长时间。

嗯,它的工作...

def get_random_point_in_polygon(region, urban=True):
    while True:
        address = ogr.Geometry(ogr.wkbPoint)
        address.AddPoint(random.uniform(region.get_region().geometry().GetEnvelope()[0],
                                    region.get_region().geometry().GetEnvelope()[1]),
                     random.uniform(region.get_region().geometry().GetEnvelope()[2],
                                    region.get_region().geometry().GetEnvelope()[3]))
        if region.get_region().geometry().Contains(address):
            if urban is True:
                for item in ShapesInput.urban:
                    if item.geometry().Contains(address):
                        return address
            else:
                return address
于 2016-02-01T12:29:15.730 回答