开源GIS--geos实现空间连接(快速)

开源GIS的官方教程为:https://www.osgeo.cn/pygis/ogr-ogrsa.html

其中关于空间计算的只有简单的判断

标题

而要真正实现空间连接,是需要将两个shp文件进行里外循环,例如,以其中一个shp的要素个数为外循环,以另一个shp要素数量为内循环,逐一判断是否存在空间上的关联(包含、被包含。。。)

如此做循环肯定会影响程序执行的速度。因此可以使用Rtree作为索引,加快循环的检索。

话不多说,下面上代码,以“包含”的空间关系做空间连接为例

    #-----------------打开OSM数据---------------------------osm_ds = ogr.Open(osmfile)osm_lyr=osm_ds.GetLayer(0)feat=osm_lyr.GetFeature(0)keys_osm=feat.keys()spatial=osm_lyr.GetSpatialRef()count=osm_lyr.GetFeatureCount()#---打开BUffer-----------buffer_s=ogr.Open(bufferfile)buff_lyr=buffer_s.GetLayer(0)buff_feature=buff_lyr.GetFeature(0)keys_buff=buff_feature.keys()#--创建索引--shp_index=index.Index()#--shp几何数据导入Rtree--for i,feat in enumerate(buff_lyr):# geom=feat.GeometryDef()geom = feat.GetGeometryRef()bbox=geom.GetEnvelope()#<class 'tuple'>--left,right,buttom,top# print("Type of bbox",type(bbox),":",bbox)shp_index.insert(i,(bbox[0],bbox[2],bbox[1],bbox[3]))#---idx.insert(0, (left, bottom, right, top))#--空间连接# print()gdal.SetConfigOption( "GDAL_FILENAME_IS_UTF8", "YES")gdal.SetConfigOption( "SHAPE_ENCODING", "UTF-8")Spatial_driver = ogr.GetDriverByName("ESRI Shapefile")spatial_ds = Spatial_driver.CreateDataSource(matchedfile)match_lyr = spatial_ds.CreateLayer('matched',spatial)  # 创建缓冲区#创建字段# print("osm_keys:",keys_osm)osm_def = osm_lyr.GetLayerDefn()# for i,each in enumerate(keys_osm):#     fielddef=osm_def.GetFieldDefn(i)#     if fielddef==None:#         break#     # print(fielddef)#     # print(each)#     fieldDefn = ogr.FieldDefn(each,fielddef.GetType())#     match_lyr.CreateField(fieldDefn)# print("Buffer_keys:", keys_buff)keys_match=keys_buff.copy()keys_match.extend(keys_osm)# print("matchedfile Fields:", keys_match)buff_def = buff_lyr.GetLayerDefn()count_field=0for i,key in enumerate(keys_match):field=Noneif key in keys_buff:field=buff_def.GetFieldDefn(i)count_field+=1else:field = osm_def.GetFieldDefn(i-count_field)if field is None:breakfieldDef= ogr.FieldDefn(key,ogr.OFTString)fieldDef.SetWidth(254)match_lyr.CreateField(fieldDef)#---添加几何属性和字段属性----------match_feat = ogr.Feature(match_lyr.GetLayerDefn())# print("--创建空间连接...")for i,osm_feat in enumerate(osm_lyr):# print(i+1,"/%d"%count,end=',')geom = osm_feat.geometry().Clone()match_feat.SetGeometry(geom)# print("type of  geom",type(geom))#--buffer属性feat_within=[]#--在Rtree中寻找相交的部分要素bbox=geom.GetEnvelope()feat_id = list(shp_index.intersection((bbox[0],bbox[2],bbox[1],bbox[3])))# for buffer_feat in buff_lyr:#     if geom.Within(buffer_feat.geometry().Clone()):#         feat_within.append(buffer_feat)#---被包含的要素--for idx in feat_id:feat_temp=buff_lyr.GetFeature(idx)if geom.Within(feat_temp.geometry().Clone()):feat_within.append(feat_temp)if len(feat_within)==1:for key in keys_match:if key in keys_osm:match_feat.SetField(key, str(osm_feat.GetField(key)))# print(key, "(one):", osm_feat.GetField(key), end=',')if key in keys_buff:# print(key, "(one):", feat_within[0].GetField(key), end=',')match_feat.SetField(key, (feat_within[0].GetField(key)))elif len(feat_within)>1:data = getMostvalue(feat_within)for key in keys_match:if key in keys_osm:match_feat.SetField(key, str(osm_feat.GetField(key)))# print(key, "(one of):", osm_feat.GetField(key), end=',')if key in keys_buff:# print(key,"(one of):",feat_within[data].GetField(key),end=',')match_feat.SetField(key,str(feat_within[data].GetField(key)))else:# --osm属性for key in keys_match:if key in keys_osm:match_feat.SetField(key, str(osm_feat.GetField(key)))# print(key, "(None):", osm_feat.GetField(key), end=',')else:match_feat.SetField(key,"None")print(key, "(None):","None", end=',')match_lyr.CreateFeature(match_feat)# print()feat_within.clear()#--进度条---# time.sleep(0.5)# sys.stdout.write("创建空间连接...  %2f%%   \r" % (100*(i+1)/count))# sys.stdout.flush()# print()spatial_ds.Destroy()

以上是个人在做的一个项目的程序,简单的实现了快速的空间连接,关于Rtree的教程,可以百度搜索Rtree,使用的库包为geos和rtree。

在CSDN上很少看到有开源GIS方面的,这个东西还是太小众了hhh

开源GIS--geos实现空间连接相关推荐

  1. 开源GIS平台空间数据管理与发布技术研究

    毕业论文(设计) 题目: 开源GIS平台空间数据管理与发布技术研究 2014 年 5 月 摘要 本文系统地分析了网络地理信息系统(Web GIS)工作原理,阐述了使用免费.开源的GIS平台的开发模式. ...

  2. 开源GIS库GDAL/GEOS在Windows下的编译与 Codeblocks配置

    最近在研究开源GIS库GDAL,我是采用自己下载源码编译的方式,主要进行以下几个步骤: 编译GEOS,参考自GEOS的wiki 下载GEOS源代码,目前的版本为3.5.0,解压到C盘根目录.打开VS2 ...

  3. 专著《Python与开源GIS:数据处理、空间分析》

    封面 购买链接: 京东:https://item.jd.com/12758842.html 当当:http://product.dangdang.com/28487364.html 作者简历 卜坤(1 ...

  4. ArcGIS基础:CAD数据转换为GIS数据(符号化显示、数据转换、线转面、空间连接)

    1.[符号化显示]: CAD数据加载进来有很多列表,可以通过查看后缀名识别,包含了点[point].线[polyline].面[polygon].标注数据[Annotation]等数据,本次实验我们需 ...

  5. 开源GIS软件初探(转载)

    到GIS软件,首先让我们想到的便是GIS界的龙头大哥ESRI公司旗下的ArcGIS产品,从最初接触的version 9.2到如今的version 10.1,其发展可谓风生水起.MapInfo软件也不错 ...

  6. 开源GIS浅谈 【转】

    http://blog.csdn.net/happyduoduo1/article/details/51773850 谈到GIS软件,首先让我们想到的是GIS界的龙头大哥ESRI公司旗下的ArcGIS ...

  7. 开源Gis简介(转)

    开源GIS简介 C++开源GIS中间件类库: GDAL(栅格)/OGR(矢量)提供了类型丰富的读写支持 GEOS(Geometry Engine Open Source)是基于C++的空间拓扑分析实现 ...

  8. 即插即用,基于阿里云Ganos快速构建云上开源GIS方案

    对于轻量级GIS应用,选择具备时空能力的云上数据库再搭配开源GIS软件,能够快速构建稳定.廉价.实用的GIS解决方案.Ganos是阿里云自研时空基础设施(PaaS层)的核心引擎,该引擎整合了云上异构计 ...

  9. python与开源gis_GitHub - geodoer/GISandPython: 开源GIS与Python

    开源GIS与Python 主题:使用Python实现GIS的相关处理 内容:入门+示例+应用代码 Markdown-toc [项目文件目录介绍] GISandPython 0StudyMaterial ...

  10. 主要开源WebGIS介绍、自由及开源GIS软件、组件产品

    WebGIS由四部分构成,从名称上也能看到至少包括 Web 与 GIS ,涉及技术复杂.从 WebGIS 方面来看,开源的工具可以分为组件产品与全栈产品两类. 自由及开源软件.开放规范与开放数据 当前 ...

最新文章

  1. 剑指offer-反转链表
  2. Windows、WSL 与 Linux 的性能对比
  3. 图解谷歌大脑丶城市大脑丶全球脑与互联网大脑的关系
  4. kafka数据 落盘_Kafka架构原理?也就这么回事!
  5. ***解决方案的选择
  6. redis 源码 object.c 实现
  7. 服务器安装rabbitmq教程
  8. nginx配置文件祥解
  9. 从0开始学习 GitHub 系列之「团队合作利器 Branch」
  10. Android查看支持硬编解码器(十五)
  11. SVN如何回滚到指定版本
  12. 计算机硬件毕业论文题目,最新计算机硬件论文选题参考 计算机硬件论文题目哪个好...
  13. 拯救者Y9000P+因特尔11代+3060Ubuntu驱动安装
  14. 解决JSON页面乱码
  15. 巨潮网站爬虫程序修改
  16. gz是什么意思饭圈_网上看不懂的字母缩写!知道Xs是什么意思吗?不是尺寸!...
  17. python小应用之整理手机图片_手把手:扫描图片又大又不清晰?这个Python小程序帮你搞定!...
  18. Poc/Exp漏洞验证利用脚本编写
  19. Android弹性反弹:Facebook Rebound
  20. 论文解读:为了数据中心的未来,存算这对CP竟然又离了

热门文章

  1. ansi 软件测试,VB中的Unicode和Ansi格式
  2. AutoCAD二次开发学习文档
  3. 电容屏物体识别_电容屏物体识别技术简介
  4. 推荐一款不错的杀毒软件,还在找卡巴激活码的网友不妨进来看看!
  5. JavaScript --------WebS APIs学习之本地存储
  6. 如何理解移动侦测录像与人体红外感应
  7. python 修改pdf_使用Python编辑PDF
  8. SCRUM敏捷开发教程
  9. java iplimage 头文件_在javacv中将IplImage转换为Mat
  10. 共享WiFi码项目一天赚3000,一个月6W,背后逻辑与源代码分析