目录
前言
二、实际步骤
1.准备基础数据
2.模拟登录
3.获取图斑标识码
4.获取图形信息
5.通过空间位置关系过滤不合格照片
5.通过深度学习模型过滤照片特征错误图斑
6.照片迁移
总结
前言
又到了一年一度国土变更调查的苦日子,因为项目规则原因,会出现变更调查图斑已经在日常变更模块,或增减挂钩模块已经完成过举证。为了不重复举证,平台开发了照片迁移功能。可以将同一图斑的照片云共享,迁移到新图斑,减少了外业的工作量。功能开发的出发点可以说是非常之好的,但是平台速度较慢,项目时间紧迫,我们的工作人员需要手动一个一个的点击照片迁移,还要人工筛选照片是否满足举证要求,无疑,一个区县的照片迁移,需要耗费大量的人力物力。
技术的出现就是为了解放生产力,FME自带Httpcaller转换器便能胜任这个工作。爬虫虽然是一门饱受争议的技术,但是我认为只要在合理合法,不以破坏计算机系统或盗取数据为目的,且取得了甲方的同意的情况下,批量完成数据处理,既节约了大量人力物力,又保证了数据的准确性,何乐而不为呢。
一、整体思路
二、实际步骤
1.准备基础数据
基础数据准备非常简单,只需要我们的内业人员制作一个简单的表格,需要迁移哪些图斑,需要从哪部分模块迁移照片即可
2.模拟登录
因为平台登录有验证码这个东西的存在,一般的爬虫模块就无法应对了。我们这儿稍微复杂一点,用深度学习卷积神经网络模型训练了一个验证码识别的小模型加在我们工作流中。
逻辑也非常简单,将验证码图片保存为二进制流,并通过我们的卷积神经网络,获取预测的验证码,将该验证码和账号密码请求一并发送,完成登录。
session=requests.session()rc = random.random()yzm_url = "http://www.sclandcloud.org.cn/landCloudWork/login/verifyLoginCode.do?w=100&h=38&rc={}".format(rc)yzm_img = session.get(yzm_url)print(yzm_img)yam = model.predict(yzm_img.content)print(yam)
3.获取图斑标识码
因为在平台后端中,并未使用图斑编号作为数据库的主键,而是拟定了一个随机uuid,我们需要用http请求来获取验证码。
4.获取图形信息
因为调查云平台的照片共享是通过发送图形的边界wkt数据格式,以及buff的范围 等信息进入数据库进行照片空间检索来获得共享照片信息
但是前端图形可视化是实用的geojson数据格式,那么我们这儿可以使用GeometryReplacer和GeometryExtractor来进行矢量数据格式转换,来获取wkt格式数据,最后发送请求即可完成查询
5.通过空间位置关系过滤不合格照片
如下图所示,如果我们不进行数据过滤,暴力的将图斑buff范围内的照片全部迁移下来
就会产生大量的不合格照片。
但是如果用简单的SpatialFilter来进行空间谓词过滤,又会丢失很多合格照片,所以我们应该通过照片的方位角和坐标来生成一个类似于视野的三角形,再通过模拟的视野三角形来进行空间过滤,这样可以直接去掉大量的不合格照片。
5.通过深度学习模型过滤照片特征错误图斑
主要的矛盾是因为耕地占补平衡以来,国家对耕地尤为重视,许多耕地不足的区县,采用了破土开荒耕种,在短时间内恢复了不少耕地,所以国家对图斑实际是否为合格耕地尤为重视。不做特征过滤,就会出现图片拍摄时间虽然只差距几个月,但是有些照片表现特征并不是耕地的情况。
所以我们继续使用卷积神经网络来做一个耕地照片识别,通过解析平台DB,获取耕地照片样本。
import fme
import fmeobjects
import requests
import os
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutordef download(road,url,x):dd=os.path.exists(road)if dd!=True:with open(road,mode='wb') as f:f.write(requests.get(url).content)print(x)class FeatureProcessor(object):"""Template Class Interface:When using this class, make sure its name is set as the value of the 'Classto Process Features' transformer parameter."""def __init__(self):self.aa=[]self.bb=[]"""Base constructor for class members."""passdef input(self, feature):try:path = os.makedirs(feature.getAttribute('os1'))except: passtry:ff=os.path.getsize(feature.getAttribute('os'))if ff==0:os.remove(feature.getAttribute('os'))except:pass self.aa.append(feature.getAttribute('URL'))self.bb.append(feature.getAttribute('os'))self.pyoutput(feature)def close(self):with ThreadPoolExecutor(50) as t:for i in range(0,len(self.aa)):t.submit(download,road=self.bb[i],url=self.aa[i],x=self.aa[i])print('图片下载完毕')pass
并将样本分为耕地和非耕地两种类型进行训练,这里直接使用以前搭建好的训练模板。
训练完成后,在主工作流中加入识别模块,并过滤非耕地照片
6.照片迁移
到这一步其实就非常简单了,将前面获取的图斑id,和照片的fjlist作为请求提交到接口即可。
到此为止就完成了整套流程,通过实际测试,在晚上平台使用人较少的情况下,完成6万张照片迁移花费20分钟。可以说是非常成功,主要原因也是因为FME2021版本以后的httpcaller引入了多线程请求模式,相比以前版本,速度提升了N倍。
总结
技术就好似一把刀,坏人用来伤害人,厨师用来做菜,全看人如何使用。爬虫虽然是一门敏感的技术,但是合理使用,在提高了生产力的同时,也保证了数据的准确性,同时因为是走的后端http直接请求接口,节约了平台的开销,对比以前的人海战术,该方法还能减少平台的资源占用,对软件平台方的日常维护也产生了巨大的价值。