shp文件自相交处理

21 篇文章 24 订阅
18 篇文章 0 订阅

今天基于GDAL使用shp文件对栅格影像进行裁剪时出现了下面的问题,提示多边形自相交了

Warning 1: Ring Self-intersection at or near point 112.48666420300003 34.830899357000078
ERROR 1: Cutline polygon is invalid.


很多人的第一反应是使用ArcGIS进行**拓扑检查**,或使用ArcToolBox里的**修复几何**。确实我的第一反应也是去做这些东西。但是结果缺没有检查出任务拓扑错误,几何修复也没有检查出问题。


使用ArcGIS检查不到的原因


强大的ArcGIS居然检查不到,最终找到了这个原因。
在ArcGIS 中无论是拓扑、shapefile文件、还是个人地理数据库都是设置有容差的,小于这个容差的自相交,都是无法检测到的。


解决方案


查阅了很多资料,最终整理了如下的解决方案。

  1. 使用PostGIS将shape文件导入Postgresql数据库,记得导入的时候要勾选下面的选项。
  2. 从表里提取出自相交的多边形
    CREATE TABLE temp1 as select * from m2 where ST_IsValid(geom) = false

     

  3. 删除原表中的自相交图形
    delete from  m2 where ST_IsValid(geom) = false

     

  4. 修复多边形

    update temp1 set geom =ST_Buffer(geom, 0.0) 
    -- update temp1 set geom =ST_MakeValid(geom) 也可以

     

  5. 修复完的数据恢复到原来的表

    insert into m2 select * from temp1

     

  6. 最后通过PostGIS插件导出shp文件即可

 结果检测

使用gdal对结果进行检测
 

from osgeo import ogr

shpFile = 'F:/m2.shp'  # 裁剪矩形

# # # 注册所有的驱动
ogr.RegisterAll()


def check_shp():
    # 打开数据
    ds = ogr.Open(shpFile, 0)
    if ds is None:
        print("打开文件【%s】失败!", shpFile)
        return
    print("打开文件【%s】成功!", shpFile)
    # 获取该数据源中的图层个数,一般shp数据图层只有一个,如果是mdb、dxf等图层就会有多个
    m_layer_count = ds.GetLayerCount()
    m_layer = ds.GetLayerByIndex(0)
    if m_layer is None:
        print("获取第%d个图层失败!\n", 0)
        return
    # 对图层进行初始化,如果对图层进行了过滤操作,执行这句后,之前的过滤全部清空
    m_layer.ResetReading()
    count = 0
    m_feature = m_layer.GetNextFeature()
    while m_feature is not None:
        o_geometry = m_feature.GetGeometryRef()
        if not ogr.Geometry.IsValid(o_geometry):
            print(m_feature.GetFID())
            count = count + 1

        m_feature = m_layer.GetNextFeature()
    print("无效多边形共" + str(count) + "个")


check_shp()

运行结果

 

### 回答1: Geodjango 是一个基于 Django 的地理信息应用程序框架,可以用来开发具有地理信息处理能力的 Web 应用程序。而 shp 文件是一种常用的地理信息数据格式,可以包含点、线、多边形等地理信息要素的空间和属性数据。Geodjango 支持使用 shp 文件作为输入数据源,可以通过以下步骤使用 shp 文件: 1. 在 Django 项目中安装 Geodjango 库,可以通过 pip install geodjango 命令来安装。 2. 创建一个包含地理信息模型的 Django 应用程序,可以在模型中使用 PointField、LineStringField、PolygonField 等字段来存储地理信息数据。 3. 使用 ogrinspect 命令生成模型的映射文件,可以通过以下命令生成: `python manage.py ogrinspect <shp 文件路径> <模型名称> --srid=<shp 文件投影坐标系> > <映射文件路径>` 4. 将生成的映射文件添加到 Django 应用程序的 models.py 文件中,并进行必要的修改。 5. 使用 Django 的管理命令导入 shp 文件数据到数据库中,可以通过以下命令导入: `python manage.py ogrinspect <shp 文件路径> <模型名称> --srid=<shp 文件投影坐标系> | python manage.py loaddata -` 6. 在 Django 应用程序中使用查询 API 查询和展示地理信息数据。 需要注意的是,Geodjango 使用的是 Proj.4 库来进行地理信息的投影转换,因此在使用 shp 文件时需要注意投影坐标系的设置。同时,shp 文件也需要符合相应的规范,例如必须包含 .shp、.shx 和 .dbf 文件,并且这些文件名必须相同。 ### 回答2: Geodjango是一个基于Django框架的地理信息处理库,它可以帮助开发者处理和管理地理信息数据。而shp文件,是一种常见的地理信息数据存储格式,可以包含矢量数据的几何信息和属性信息。 在Geodjango中,使用shp文件需要进行以下步骤: 1. 准备shp文件:首先需要准备一个shp文件,可以通过GIS软件(如QGIS或ArcGIS)创建或获取。shp文件通常由多个文件组成,并具有.shp、.shx、.dbf等扩展名。 2. 创建Django模型:在Django中,通过定义模型类来表示数据表。通过继承GeoModel抽象类,可以创建具有地理信息字段的模型类。可以使用PolygonField、PointField、LineStringField等字段来存储shp文件中的几何信息。 3. 导入数据:通过使用geoslibrary的fromfile()方法,可以加载shp文件并将其导入到数据库中。该方法从shp文件中读取几何信息,并将其转换为对应的模型字段的格式,然后保存到数据库中。 4. 执行空间查询:Geodjango提供了丰富的空间查询API来执行各种空间查询,如点在多边形内、线相交等。可以使用这些查询方法来获取与地理信息相关的数据。 5. 显示地图:通过使用Geodjango的地图模板标签和地图模板标签库,可以将地理信息数据在网页中以地图的形式显示出来。可以使用OpenLayers或Google Maps等地图插件来展示地图。 总之,使用Geodjango处理shp文件,可以方便地进行地理信息数据的管理和查询,并在网页中展示地理数据。这种方式大大简化了地理信息数据的处理过程,提高了开发效率。 ### 回答3: Geodjango 是一个基于 Django 框架的地理信息系统 (GIS) 框架,它提供了一种在 Python 中处理和管理地理数据的强大方式。Geodjango 支持使用 shp 文件来导入和显示地理数据。 shp 文件是一种常见的地理数据文件格式,主要用于存储点、线、面等几何图形的数据。要在 Geodjango 中使用 shp 文件,首先需要创建一个 Django 项目,并在项目的设置文件中配置 Geodjango。 配置完成后,可以使用 Geodjango 提供的模型类来定义地理数据的结构。可以通过继承 `django.contrib.gis.db.models.Model` 创建一个包含地理字段的模型类。地理字段可以用来存储点、线、面等地理数据。 在模型类定义完成后,可以使用 Django 的管理界面或编写自定义的 Python 脚本来导入 shp 文件。Geodjango 提供了一个 `LayerMapping` 类,可以非常方便地将 shp 文件中的数据映射到模型类中。 使用 `LayerMapping` 类的示例代码如下: ```python from django.contrib.gis.utils import LayerMapping from myapp.models import MyModel mapping = { 'geometry': 'POINT', 'name': 'Name', 'description': 'Description', } layer = LayerMapping(MyModel, 'path/to/shpfile.shp', mapping) layer.save() ``` 上述代码将会把 shp 文件中的数据映射到 `MyModel` 模型类中,并保存到数据库中。 在导入完成后,可以使用 Geodjango 提供的查询接口来对地理数据进行查询和分析。可以根据地理字段的特性进行空间查询,例如查找特定区域内的所有点。Geodjango 还支持在地理数据上进行缓冲区、交叉、包含等空间操作。 综上所述,Geodjango 提供了简单而强大的方式来使用 shp 文件处理地理数据。利用 Geodjango,可以轻松地导入、查询和分析 shp 文件中的地理数据,为地理信息系统开发提供了便利。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GIS开发者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值