无先验知识的GIS数据抓取算法研究

gis核密度分析工具_抓取公共服务设施POI后,用GIS进行核密度分析的可视化过程... 近年来,“城市大数据”已成为规划领域的热门词汇,利用大数据进行深入、准确的“精准规划”逐步成为规划领域的共识,尤其在分析区域格局,市域城乡关系,城市空间结构方面,大数据能发挥无可替代的优势,但是,对于很多规划从业人员而言,对如何获取大数据以及如何将庞大的数据转化成“炫酷”的可以指导规划的可视化图纸比较茫然。本篇文章主要介绍通过抓取相关电子地图区域内公共服务设施POI后,用GIS进行核密度分析的可视... 阅读详情

无先验知识的GIS数据抓取算法研究

1 问题背景

ArcGIS Server将GIS空间库中的数据可以以服务的方式发布出来,服务中提供了查询接口,可以将关心的字段等内容返回给我们,也可以选择将所有的数据返回回来。其中有一个小问题:服务端默认是返回查询记录的1000条记录。在默认情况下,如果查询记录大于1000,那么就会丢失剩余的查询数据,通常有两种解决办法:

  1. 修改服务端的默认返回值,可以修改为大于1000的数据,如2000、2500……
  2. 设计一个简单的算法,分段进行检索,因为返回结果中的编号ID通常是从1开始,在查询条件中设置为ID每1000会返回一次,这样就可以一个不剩的获取所有数据

ArcGIS Server抓取服务查询

ArcGIS Server查询返回结果1

ArcGIS Server查询返回结果2

但是,本文遇到的问题要复杂的多,采用上面两种方法都无法解决,概括起来主要是对待抓取的数据中的ID没有先验知识,这种没有先验知识表现在:

  1. ID不是从0开始编号
  2. 返回结果的个数(即ID个数)远大于1000,服务端无法事先指定(指定太多可能导致返回超时)
  3. 不知返回结果中ID的起止,相邻ID也可能不是连续,例如:4, 7, 15, 29, 765 …
  4. 返回结果的ID分布也不清楚,有可能(2000, 5000)比(6000, 10000)分布的数据更多

正是上面条件的限制,给数据的批量抓取带来了新的问题和挑战。

2 解决思路

问题的解决应该分为两步:

  1. 第一步:通过探查法获取ID的大致范围,这个探查不需要获取准确范围,同时探测时只关心ID的字段,其他字段不必关心(这样可以减小请求次数,以及请求的内容大小,从而减少处理时间)
  2. 第二步:精确获取所有的目标结果,此时不能遗漏结果,以及各个字段的值

3 算法1:获取ID大致范围

算法的思路用一句话概括起来:跨数量级,两边逼近。
我们的目标是获得最小ID和最大ID所在的数量级,前面提到的“大致范围”就体现在这里的“所在的数量级”上,之所有采用跨数量级是因为第一步只是初步获取一个范围,时间是放在第一位的,没有必要非要提取出准确的最大最小ID值(与其将时间花费在求取准确的最大最小ID上还不如花费在后面的准确抓取上)。
两边逼近说的是最小ID从个位数开始往大的方向茶皂,最大ID从一个足够大的数(例如1亿、10亿)往小的方向查找。
查找过程中需要注意如何判断是否找到最大最小ID值。废话不多说,看下面代码:

   def estimate_interval(self):
        #  估计id最大最小值所在区间
        self.estimate_lower()
        self.estimate_upper()
        
        if self.LOWER >= self.UPPER:
            return [False, 'self.LOWER >= self.UPPER']
        else:
            # 区间入栈
            self.interval_stack.push([self.LOWER, self.UPPER])
            return [True, 'Succeed']
    
        
    def estimate_upper(self):
        # 确定最大id所在数量级
        upper = self.iter_estimate_upper(self.MAX_VALUE)
        self.UPPER = upper
    
    
    def iter_estimate_upper(self, max_value):
        # 迭代确定最大id所在数量级
        feature_num = self.stat_feature_num(max_value/10, max_value)
        if feature_num > 0:
            return max_value-1
        else:
            return self.iter_estimate_upper(max_value/10)
    
    
    def estimate_lower(self):
        # 确定最小id所在数量级
        lower = self.iter_estimate_lower(1)
        self.LOWER = lower
      
        
    def iter_estimate_lower(self, min_value):
        # 迭代确定最小id所在数量级
        feature_num = self.stat_feature_num(min_value, min_value * 10)
        if feature_num > 0:
            return min_value
        else:
            return self.iter_estimate_lower(min_value * 10)

4 算法2:精确抓取所有数据

精确抓时,采用了二分法,用stack存取所有区间,以及递归调用,代码如下:

def fetch_features(self):
        
        if self.interval_stack.size() < 1:
            return
            
        # 分批抓取features
        [id_lower, id_upper] = self.interval_stack.pop()
        print '** fetch_features() [id_lower, id_upper]=[', id_lower, ', ', id_upper, '], size=', self.interval_stack.size()  
        
        if id_upper - id_lower <= self.batch_size:
            # 直接查找、抓取入库
            self.fetch_export_toGdb(id_lower, id_upper)
            self.fetch_features() # 继续迭代
        else:
            # 探查[lower, upper)对应的feature个数
            feature_num = self.stat_feature_num(id_lower, id_upper)
            if feature_num < self.batch_size:
                # 直接查找、抓取入库
                self.fetch_export_toGdb(id_lower, id_upper)
                self.fetch_features() # 继续迭代
            else:
                # 折半探查
                id_middle = (int)(id_lower + id_upper)/2
                self.interval_stack.push([id_middle, id_upper])
                self.interval_stack.push([id_lower, id_middle])
                self.fetch_features() # 继续迭代

5 爬取结果

爬取了接近6万条记录的所有字段值

6 算法改进方向

  • 算法1:在坚持“只获取大致范围”和“时间花费尽量小”的原则上,尽可能的精确范围,毕竟精确一点还是好的;
  • 算法2:原算法中采用stack存取每一步的搜索区间这个想法是不错的,但二分发的思路可以改进一下,其实“算法1的跨数量级搜索”也是受了二分法思路的影响【二分法只是一个思路,而不是一个公式】。
数据——基于python的gis开发与应用 想要制作GIS,首先就需要获得我所需要的数据。没有数据,GIS就不配成为GIS,那就仅仅只是简单的、冰冷的地图而已,没有灵魂,没有生命,没有波动。 因此首要之急是寻找数据。 寻找数据 数据是死物,它们不会自己自觉地跑到我的手上的,这就需要我去寻找和搜集它们。现在是互联网时代,获取信息十分得便利。因此我想到搜集我所需要的数据方法可分为两种: 其一、在网上寻找其他人已经下载好的、整理好的并且打包好的数据,然后下载到自己电脑上保存。 其二、使用爬虫技术。任何语言都有爬虫技术,python由最为出色。因为 阅读详情

相关推荐

[Pyhon大数据分析] 五.人民网新闻话题抓取及Gephi构建主题知识图谱

前文分享了采用SnowNLP对微博话题进行简单的情感分析及文本挖掘。这篇文章将讲解Python抓取人民网新闻,并利用Gephi构建疫情主题知识图谱,发现各主题关键词的关联。希望这篇基础性文章对您有所帮助,也非常感谢参考文献中老师的分享!如果您有想学习的知识或建议,可以给作者留言~

杨秀璋的专栏 2万+

gisserver 服务 获取原始数据信息json

?f=pjson

josiecici的博客 442

7、基于移动GIS和网页抓取的位置导向旅游指南系统

本文介绍了一个基于移动GIS和网页抓取技术的位置导向旅游指南系统。该系统通过GPS获取用户精准位置,并结合高效的数字地图服务,动态提供与用户当前位置相关的旅游信息。系统利用服务本体和网络爬取技术实现服务发现,通过SOAP协议实现客户端与服务器之间的高效通信。文章详细描述了系统的架构、关键组件的实现细节以及工作流程,展示了如何解决传统静态地图和位置服务的局限性,为用户提供高效、动态、个性化的旅游指南体验。

time3的博客 71

GIS算法

GIS算法简介

china1000的专栏 1120

Python实现百度地图POI数据抓取工具

在如今的信息时代,地理信息系统(GIS)的应用变得越来越广泛,而百度地图API是其中一项重要的服务。它为开发者提供了一系列丰富的接口和功能,允许在应用程序中集成地图、路径规划、地点搜索以及交通信息等服务。无论是在Web应用程序还是移动应用中,百度地图API都能够帮助开发者构建功能强大的地理信息服务。GIS数据格式多种多样,包括矢量数据格式、栅格数据格式、网络数据格式等。

weixin_28793831的博客 1737

新加坡POI数据集:GIS与位置服务的宝贵资源

新加坡,作为东南亚的金融和技术中心,拥有高度发展的城市基础设施和先进的信息技术体系。为了满足不断增长的数据需求和为智能地图服务提供支撑,新加坡提供了丰富的POI(兴趣点)数据集。POI数据集是包含有地理坐标位置的个体地点信息,这些信息对于智能地图应用、城市规划、市场调研和学术研究都具有极其重要的价值。本文将详细探讨新加坡POI数据集的定义、构成及其在不同领域中的应用和价值。POI(Point of Interest,兴趣点)是指在地理信息系统(GIS)或智能地图服务中具有特定意义的位置。

weixin_35671843的博客 886

如何使用 simplegeo/libgeohash:一个纯C实现的Geohash算法库

如何使用 simplegeo/libgeohash:一个纯C实现的Geohash算法库 项目介绍 simplegeo/libgeohash 是一个用纯 C 语言编写的 Geohash 算法实现。Geohash 是一种将地理坐标编码为字符串的方法,广泛用于空间索引和地理信息存储。这个库提供了解码和编码功能,以及计算周围邻居的功能,适用于需要高效处理地理位置数据的应用场景。 项目快速启动 要开始使用 ...

gitblog_00298的博客 816

案例分析|一篇文章带你看懂养鸡场智慧管理系统

养鸡场智慧管理系统是为了满足现代化养鸡业对精细化管理的需求而设计的一款专业软件。随着科技的发展和农业产业的升级,传统的手工记录和管理方式已无法满足高效、准确和实时的数据跟踪需求。本软件旨在通过集成各种功能模块,帮助养鸡场主实现从鸡苗孵化、饲养管理、饲料控制到销售结算等全链条的智能化操作。该系统的核心目标是提升养鸡场的运营效率和盈利能力,通过自动化数据处理,减少人工误差,节省时间和精力。例如,孵化报表和记录模块可以帮助管理者实时监控孵化过程,及时调整策略;

muyu2980的专栏 930

gis基础算法

https://blog.youkuaiyun.com/qq_22929803/article/details/46818159

£Duan’yi! 264

FPGA设计中的扇出约束实战:从XDC到代码优化的全流程解析

本文全面解析FPGA设计中扇出约束的重要性与应用,详细介绍了从XDC约束文件设置到HDL代码优化的全流程实战技巧。通过MAX_FANOUT约束控制信号负载,结合寄存器复制和物理优化策略,有效解决高扇出导致的时序违例和布线拥塞问题,提升设计性能和可靠性。

nept的博客 797

OpenHarmony v4.1 Release设置应用随系统自动启动

OpenHarmony 4.1 版本中的 Ability Manager Service (AMS) 提供了应用自启动管理功能,允许系统控制哪些应用可以在系统启动时自动运行。这需要以下两个主要步骤:启用系统的自启动管理支持开发一个系统应用来管理自启动配置。

afufufufu的博客 1899

GIS源码下载与GIS经典算法

这哥们总结的真全,先照单全收 转自:http://www.3snews.net/html/48/5848-7107.html其他GIS相关代码下载索引 http://www.mygis.com.cn/codeindex10.htm 1.深度优先实现的路径分析源码 http://www.mygis.com.cn/codes/21-481-481.htm 2.用遗传算法编写的tsp源码 h

cnhome的专栏 1677

Linux故障排查和性能优化面试题及参考答案

在 Linux 系统中,负载(Load Average)是衡量系统繁忙程度的一个重要指标,它表示系统在特定时间间隔内运行队列中的平均进程数。负载值反映了系统当前的工作压力,主要包括 CPU 等待运行的进程数量和处于不可中断睡眠状态(通常是等待 I/O 操作完成)的进程数量。负载平均值通常有三个数值,分别代表过去 1 分钟、5 分钟和 15 分钟内的系统平均负载。例如,在使用uptime命令或查看文件时,会看到类似这样的输出,这三个数值依次表示过去 1 分钟、5 分钟和 15 分钟的负载平均值。

大模型大数据攻城狮的专栏 1081

抓取百度地图瓦片(离线GIS)

项目需要用到离线GIS,研究了一下,做个记录 需要百度离线api的js 参考: 于忠达 https://my.oschina.net/smzd/blog/548538 giao00000 https://blog.youkuaiyun.com/wml00000/article/details/82219015 第一个是api2.0 第二个是在此基础上的3.0,我用的是2.0 使用起来和在线的差不多,引入api...

恐惧来源于未知~ 1万+

从理论到实践:AI设备维护系统的架构实现

第一部分:理论基石——从设备维护的演进讲起,理解AI如何重塑维护模式;第二部分:架构设计——详解六层高可用系统架构,明确各层职责与技术选型;第三部分:核心技术——拆解数据处理、特征工程、模型训练、部署等关键环节的实现细节;第四部分:实践落地——8步流程带你从需求到上线,附代码示例与工具链;第五部分:案例研究——风电齿轮箱预测性维护系统的真实案例,从问题到方案再到效果;第六部分:挑战与展望——探讨当前技术瓶颈与未来趋势(数字孪生、联邦学习等)。准备好了吗?

大数据洞察的博客 1251

Claude Code 任务编排 头脑风暴与 疯狂拷问:Superpowers vs Grill-me 硬核对比与工程落地

Superpowers和Grill-me是AI编程中的互补工具:Superpowers提供工程化开发流程(从需求梳理到代码审查),确保规范执行;Grill-me通过持续追问帮助厘清需求,避免方向偏差。两者结合形成"构思-拷问-执行"工作流,前者负责方案生成与落地,后者专注需求审查。根据场景选择:个人项目可用Grill-me快速澄清需求,企业项目推荐Superpowers全流程,复杂开发则建议组合使用。它们分别解决"如何落地"和"是否对齐"的问题,共

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 325

GIS:带你用Python找工作!(一)

作为一名学gis的小白,初学Python总想爬点与gis相关的数据,梦想将gis与Python完美结合,成为一名会编程的giser,然后走上人生巅峰,一夜暴富,嫁给高富帅…奈何理想很丰满,现实很骨感,看到师兄师姐有转行的,有继续深造的,还有没找到工作的,内心慌得不行,于是就想爬一下gis招聘岗位,了解一下行情,废话不多说,进入正题。 寻找目标网站 这次找的是前程无忧网站,看了好几个网站,这个网站的...

weixin_42164004的博客 3042

【VS Code插件开发】通用功能(二)

本篇主要从command(命令)、menus(菜单)、快捷键三个方面讲解,都归于通用功能。

编码世界 1万+

【情报百科】如何从开放的地理信息系统(GIS)中获取数据——以ArcGis为例

图源:摄图网可商用图片 交通流量是指在选定时间段内通过道路某一地点、某一断面或某一车道的交通实体数或当量数,从车流量的大小可以判定交通的拥挤状况,从而决定当前采取何种交通管理措施,以及对未来交通变化趋势和道路建设规划给出量化的指导依据,因此对交通量的准确检测在交通工程以及未来发展占有十分重要的位置。 交通流量的统计信息,在国内的部分城市是可以在政府网站上查阅的,比如上海市公共数据开放平台就可以查到金山区道路交通流量。数据下载则需要注册和申请。 相比于国内,国外的交通流量数据开放程度..

fydata的博客 1963

北斗导航 | 卡尔曼滤波与因子图优化对比(附图优化matlab代码)

- 历史数据利用:因子图通过滑动窗口保留历史状态,优化时联合多帧数据;卡尔曼滤波仅依赖当前和上一帧状态 。 - 迭代优化:因子图通过多次迭代逼近最优解,卡尔曼滤波仅单次更新 。 - 误差抑制:因子图的多次线性化可有效抑制非线性误差(如GNSS伪距观测的非线性) 。

尘世冰封的专栏 1303

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

地学研究相关工具推荐0426

地学研究工具

浩瀚地学的博客 2040

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Tanon GIS 1D灰度定量导出文件批量宏处理

本次使用Excel或者wps软件的宏功能、对天能Tanon GIS 1D导出灰度定量文件进行批量汇总,节约手工汇总的时间。

weixin_41553497的博客 1989

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

建模软件Blender与Blender GIS插件安装教程

点击工具栏的GIS插件,导入数据、导出数据等一般不会出现报错,但有些特殊的坐标系可能会导致数据无法正常加载。点击Web geodata,尝试导入在线数据,可以导入底图、OSM、SRTM高程数据。#160,这是因为BlenderGIS 依靠各种 Web 服务直接获取数据,旨在轻松获取指定位置的数据,而不是用于下载大量数据。在这些服务策略方面,BlenderGIS 限制了最大 400 平方公里的处理范围。在导入底图(Basemap)时,需要注意使用的网络需要科学和魔法,并且可以设置底图数据源和图层。

weixin_43416590的博客 2602

【亲测免费】 探秘大数据宝藏:高效利用Python抓取高德POI数据的开源神器

探秘大数据宝藏:高效利用Python抓取高德POI数据的开源神器 【下载地址】Python抓取高德POI数据突破数据量限制 Python抓取高德POI数据,突破数据量限制本仓库提供了一个Python脚本程序及相关输入文件,帮助用户抓取高德地图的POI(Point of Interest)数据,并突破数据量的限制 ...

gitblog_09815的博客 830

基于python的gis分析_基于Python的GIS专业就业信息获取与分析

基于Python的GIS专业就业信息获取与分析古军伟;靳海亮;杜军;王超【期刊名称】《软件导刊》【年(卷),期】2020(019)002【摘要】GIS专业相关招聘数据缺乏,导致学生不能整体把握行业需求及就业前景.通过Python爬虫程序爬取智联招聘中与GIS开发相关的就业信息,将处理后的数据利用Echarts和Excel进行可视化分析.通过分析数据得出以下结论:本科学历为大多数单位的招聘门槛;省会...

weixin_39922534的博客 289

实战 抓取安徽省所有市、县、镇矢量坐标数据

爬取高德,省市县中心坐标位置,以及如何转换为矢量数据GeoJson或者shap,手把手教学。本文以安徽省所有市、县、区的中心点以及区域范围。

laker的博客 2969
上一篇: Json格式与对象之间的映射关系
下一篇: Ubuntu和Centos安装Tensorflow教程&PyTorch
chanhal
博客等级 码龄9年 30粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值