自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

默而识之者

在实践中学习

  • 博客(79)
  • 资源 (2)
  • 收藏
  • 关注

原创 What I Read(3) 地理空间数据库原理(C) 地理空间数据索引绪论

引用部分均为笔者思考.

2022-10-18 08:57:49 614 1

原创 What I Read(2) 地理空间数据库原理(B) 三维地理数据模型

相比二维数据,高于二维非整数的维度都会使得底层逻辑大大复杂,更别说真三维,可见维度的些许上升都会带来信息量的极大增加,进而对整个系统都有了更多要求.真三维数据的存储并没有万能的解决模型,都有着各自鲜明的优缺点,适合于不同的应用场景.从使用统一的数据组织形式就能解决绝大多数问题的二维时代走过来的人可能不会对此感到满意,因为这并不"优雅".针对不同领域的构模法差异很大,但在各自的领域中又确实好用,所以,追求一个解决所有问题的模型可能就像追求"统一场论"一样,在当前环境下,必要性不大.

2022-09-18 13:57:53 1616

原创 What I Read(1) 地理空间数据库原理(A) 绪论

地理空间数据库原理

2022-09-05 21:47:38 299

原创 How it works(26) Geotrellis是如何在Spark上计算的(G) 导出结果到GeoTiff文件

1. 引入在过去几章,我们从NDVI计算入手,深入到Geotrellis中了解了内置的各种算子.如今我们回归最初计算NDVI的DEMO代码,看一下如何将计算后的NDVI结果以GeoTiff的格式输出:val ndviTiledRDD: TileLayerRDD[SpatialKey] = // ... 省略计算ndvi的步骤// 1. 将TileLayerRDD[SpatialKey]对象拼接为一个Raster[Tile]对象val raster: Raster[Tile] = ndviTiledR

2022-05-11 08:18:56 715

原创 How it works(25) Geotrellis是如何在Spark上计算的(F) 地图代数之其他Focal类算子

1. 引入上一章我们研究了Focal类中最基础的游标(Cursor)类算子,游标类算子的核心思想代表了大多数Focal类算子的实现方法.当然,通用的往往更慢,Geotrellis中还有其他三类为特定使用场景优化的Focal类算子:核(kernel)算子:为卷积运算优化的游标类算子像元尺度(cellwise)类算子:为简单邻域优化的游标类算子表面点(surfacepoint)类算子:为山体运算优化的Focal类算子我们先从核算子入手.2. 核算子-以Convolve算子为例核算子是为卷积运

2022-05-04 11:15:10 304

原创 How it works(24) Geotrellis是如何在Spark上计算的(E) 地图代数之游标类算子

1. 引入上一章我们研究了Geotrellis中Local算子的实现.Local类算子种类较多,实现也较简单,其核心为:Tile中某个位置的值由另一个Tile中相同位置的值通过计算得到.Geotrellis中也存在更加复杂的Focal类算子,其核心为:Tile中某个像元位置的值由该像元周围若干像元(邻域)的值经过特定计算得到.可见,Focal类算子有两个关键点:定义邻域定义如何根据邻域内容计算结果我们首先看邻域是如何定义的.2. 邻域定义在Geotrellis中,邻域描述了某个像元周围哪些

2022-04-29 11:14:20 1121

原创 How it works(23) Geotrellis是如何在Spark上计算的(D) 地图代数之Local类算子

1. 引入在上一节,我们使用Tile对象的Map方法实现了计算NDVI的功能.但对于一些更复杂的功能,Map(f)的操作无法胜任或实现起来极为麻烦.好在Geotrellis实现了较为丰富的地图代数功能,能为我们节省不少时间.官方文档对此部分着墨不多,不过我们可以知道,内置的地图代数算子主要分为三大类:局部运算(Local):作用于单个像元焦点运算(Focal):作用于邻域内的所有像元分区运算(Zonal):作用于区域内的所有像元还有不属于三大类的水文相关算法(hydrology)地图代

2022-04-03 17:27:41 2307

原创 How it works(22) Geotrellis是如何在Spark上计算的(C) 计算模型初探

1.引入在上一章结尾我们最终生成了MultibandTileLayerRDD[SpatialKey]对象,一切都是为了最重要的步骤——计算——做准备.2. 计算NDVI首先我们回顾一下计算代码:val ndviTiledRDD: TileLayerRDD[SpatialKey] = tiledRDD.withContext { rdd => rdd.mapValues { tile => tile.convert(DoubleConstantNoDataCellT

2021-12-04 23:09:09 2084

原创 How it works(21) Geotrellis是如何在Spark上计算的(B) 转换索引

1. 引言在上一章我们已经讨论了数据读取的实现,了解了Geotrellis如何从本地将若干Geotiff文件读取为RDD[(ProjectedExtent, MultibandTile)]对象的.为了进行下一步的计算操作,我们需要将原始的ProjectedExtent索引转换为SpatialKey索引.具体步骤如下:// 1. 提取数据集元数据val (_, metadata) = geoTiffRDD.collectMetadata[SpatialKey](FloatingLayoutScheme

2021-08-11 22:50:19 386 1

原创 How it works(20) Geotrellis是如何在Spark上计算的(A) 数据读取

引入我们会使用Geotrellis自然是因为它能利用spark进行高效的分布式计算,而分布式计算无论在数据读取还是计算上都与常规计算有许多不同.我们就以计算一张影像的NDVI结果为例,看看Geotrellis是如何在spark上读取计算的:package demoimport geotrellis.layer._import geotrellis.util._import geotrellis.spark._import geotrellis.spark.store.hadoop.Had.

2021-07-18 10:26:54 395 1

原创 How it works(19) Geotrellis是如何读取GeoTiff的(D) 锦上添花的宏模型

1. 引入宏在Geotrellis中更类似于一种锦上添花的存在:没有它不会动摇整体的功能,使用它则会带来许多方便.在官方文档中,宏的使用被放置在额外的high-performance-scala一节.如同官方文档所说,宏的存在是为了提高效率:计算的效率:不使用传统的泛型,避免拆装箱的消耗.增强某些算法的速度.编程的效率:提高某些代码的可读性.自动生成部分重复代码.宏编程属于元编程领域,本身具有一定的难度和不稳定性,相关的功能也在随着Scala的演进而更新,因此在此并不十分

2021-05-26 23:03:23 131

原创 How it works(18) Geotrellis是如何读取GeoTiff的(C) Segment模型

1. 引入上一篇我们讨论了Geotrellis如何设计底层的数据类型模型,Geotrellis实际上如何从tiff文件中将数据读取出来呢?我们再次回顾下方的类结构图:绿色的为类继承红色的为特征实现可以发现,UInt32GeotiffTile类中引入的特质大部分与两类行为有关:与Segment相关的特质与宏相关的特质我们首先讨论与Segment相关的特质.在引入对Segment模型的解析之前,需要补充Geotiff中数据排列布局的相关知识.2. 图像数据在tiff文件中的排布方式

2021-05-23 21:36:07 432

原创 How it works(17) Geotrellis是如何读取GeoTiff的(B) 数据判断模型

1. 引入上一篇我们解析了如何读取元数据,有了元数据,我们就可以创建一个GeoTiffTile对象:def readSingleband(byteReader: ByteReader, streaming: Boolean, withOverviews: Boolean, byteReaderExternal: Option[ByteReader]): SinglebandGeoTiff = { def getSingleband(geoTiffTile: GeoTiffTile, info:

2021-05-09 20:44:00 244

原创 国内使用Node-fontnik

1. 引入Node-fontnik的安装本身很顺畅,但因为过程中需要从亚马逊s3下载相关二进制包,可能会被墙阻隔,因此在普通环境下不容易安装成功.况且Node-fontnik默认只兼容Linux和Mac的,尤其是在Linux下想要翻越避障,难度又增加了.不过好在Node-fontnik本身是一个低频应用.只要在一个合适的环境中安装好了,我们使用其成果即可.所以在国内,较好的使用体验是将Node-fontnik的环境封装为一个Docker镜像,这样就无需安装,并能兼容Windows系统了.2. 安装我

2021-04-11 15:27:49 642

原创 How it works(16) Geotrellis是如何读取GeoTiff的(A) 读取元数据

Geotrellis是如何读取GeoTiff的(A):读取元数据1. 引入Geotrellis是如何读取Geotiff?先看官方文档中读取单波段GeoTiff的样例:val path: String = "path/to/geotrellis/raster/data/geotiff-test-files/lzw_int32.tif"val geoTiff: SinglebandGeoTiff = GeoTiffReader.readSingleband(path)我们可以追踪GeoTiffRea

2021-03-29 23:00:27 684

原创 纯离线的无限级别中国地图解决方案

首先,这不是一个教程.而是一个现成的产品包,包括了资源与服务,可以开箱即用.1. 引入1.1 它解决了哪些问题下载地图瓦片不可能下载很多级别,有时候遇到特定缩放级别没有地图十分尴尬的问题内网同时有使用矢量和栅格瓦片的场景,无法同时应对的问题后续数据扩展不方便的问题1.2 它解决不了的问题因为使用的是OSM免费数据,地物相当少,因此大多数情况无法看清详细的地物使用栅格影像时,因为中国地图的样式十分复杂,又是实时渲染,因此渲染时间较长1.3 注意使用的是OSM数据源,请遵守该数据源

2021-01-16 20:58:27 773 1

原创 在Linux主机中安装windows虚拟机

与网上的许多教程相反,这次的主机是服务版的Ubuntu,没有UI界面,纯命令行.需要在里面的VirtualBox(以下简称vbox)上安装一个Win10的虚拟机.需要满足如下的需求:使用远程桌面程序可以直接连接到虚拟机中的Win10需要与主机的ubuntu共享文件夹需要安装/准备好:(我这里使用5.1.38版本)+扩展:以便远程可视化安装windowswin10的iso,我这里使用win10_2004版本的iso与vbox版本一致的VBoxGuestAdditions.iso:用于共享文

2020-10-06 17:28:36 4761

原创 How it works(15) OpenDroneMap结构简析

引入OpenDroneMap(以下简称ODM),是一套非常完整的开源无人机影像三维重建服务,我以前写过的NodeODM源码阅读就是ODM的子项目.当时我所在的公司主营业务是无人机相关,基于ODM我们打造了一套全自动化无人机数据处理链路:无人机影像在线回传,自动构建成最终的正摄影像.ODM是一个好产品.举个例子:就算我梳理了ODM的脉络,我其实依旧不理解SLAM,毕竟这是一个门槛比较高的领域,但这并不妨碍我对ODM进行二次服务化的服务平稳好用的运行了大半年.什么是好的产品?ODM整个项目在我完全不了解

2020-08-22 21:01:44 2947 5

原创 gdal切火星偏移的瓦片

支持火星偏移默认改为谷歌瓦片模式(/z/x/y),原来是/z/x/-y支持瓦片压缩# -*- coding=utf-8 -*-import platformfrom xml.etree import ElementTreeimport jsonfrom osgeo import gdal, osrfrom uuid import uuid4import sysimport shutilimport tempfileimport osimport mathfrom multip.

2020-05-27 10:30:28 1111 5

原创 Matlab编译为python在docker中运行

0. 准备本文只讨论将matlab封装成python,并在docker中运行python脚本的情况要让matlab运行在docker里,你需要:在本机,你需要安装matlab和对应版本的matlab compiler runtime(简称mcc),在这里下载需要准备一个和你本机的matlab版本相同的MCC的Docker镜像,所幸有现成的,在这里1. 将matlab函数编...

2020-05-03 20:59:52 1951 6

原创 How it works(14) GDAL2Tiles源码阅读

引入gdal2tiles(以下简称g2t),这个历史悠久的切图脚本依然能发挥其功用,因为它稳定的做好了它应做的东西.相比前面说过的gdal2mbtiles(以下简称g2m),我倒是更喜欢它,单文件脚本,运行只安装一个GDAL库足矣.同样因为有了g2m,我也是带着对比的心态提出几个问题:从表现来看,g2t更慢慢的原因是什么可以采用g2m加速吗与g2m对比,其算法有何差异精简原...

2020-01-21 13:31:34 1366

原创 How it works(13) Tileserver-GL源码阅读(B) 栅格瓦片的渲染

serve_rendered.js是什么使tileserver如此的无可替代?是他的栅格瓦片渲染.当Tilestrata和Tilestache还在用需要复杂配置文件的mapnik时,tileserver却将web页面的mapbox直接搬到了服务端,达到了前后端配置文件与效果的完全统一,在maputnik的帮助下,样式的调整也变得方便异常.这就造就了整个tileserver里最大的模块:...

2019-07-03 21:35:35 1035

原创 How it works(12) Tileserver-GL源码阅读(A) 服务的初始化

引入Tileserver-GL(以下简称tileserver),klokantech公司出品的nodejs编写的地图服务,也是我们已经用于生产环境的地图服务.它是少有的开箱即用的且带有图形界面的轻量级地图服务了,这也是我们能快速的将它应用于实际的原因.Tileserver方便且美观的地图渲染且能与maputnik完美结合,这几乎是我第一次找到能完全替代geoserver的组合,而它同时也包含了...

2019-06-22 14:29:42 594

原创 How it works(11) NodeODM源码阅读(B) 任务控制与任务后处理

任务运行时上一节的最后,通过"TaskManager.singleton().addNew(task);"方法,新建的任务被加入进了任务管理器,自此,任务的一切都交由任务管理器来调控了.由上方的代码可以看出,TaskManager是一个单例实例.原因是保证当Taskmanager(下面简称任务管理器)在不同模块被引用时,都指向唯一的任务管理器实例.//在整个应用启动时,执行TaskManag...

2019-03-22 20:01:19 548

原创 How it works(10) NodeODM源码阅读(A) 鉴权与任务初始化

引入OpenDroneMap(ODM)是一款非常强大的无人机成果处理软件,可以直接将无人机拍摄的照片处理成正摄影像甚至进行三维建模.ODM本身是基于python的OpenSFM编写的命令行工具,为了方便实际使用,NodeODM出现了.NodeODM是Nodejs编写的一套带有可视化界面的API,实现了通过接口上传图片,修改配置,获取进度等常用功能.因此我们一般用的都是NodeODM,很少会直接...

2019-03-19 22:15:13 467

原创 How it works(9) GDAL2Mbtiles源码阅读(C) 影像预处理与核心流程

gdal.pygdal.py封装了所需的与gdal相关的操作.主要用来进行切割前的处理.主要操作有投影变换与抽取波段:def preprocess(inputfile, outputfile, band=None, spatial_ref=None, resampling=None, compress=None, **kwargs): # 所有要进行的预...

2019-03-03 13:00:13 487

原创 How it works(8) GDAL2Mbtiles源码阅读(B) 影像切割与处理

vips.py最重要的切图模块,使用的是libvips这一快速轻量的c++模块的py绑定pyvips,这也是g2m里最大的一个模块.切图主要分为两部分:瓦片分隔波段处理瓦片分割瓦片分割是g2m的核心功能.基本流程是:获取图片(直接使用原片或重采样后的图片)从图片中裁取固定大小计算该部分所属行列号,进行存储.因为实际使用中,基本不可能只取某个特定的级别,因此对于低缩放级别...

2019-03-03 12:59:40 794

原创 How it works(7) GDAL2Mbtiles源码阅读(A) 框架与存储

引入gdal2Mbtiles是个小工具(以下简称g2m),其作用是将栅格地图(主要是Tiff格式)切成瓦片,存入Mbtiles格式的数据库中,以便于其他支持Mbtiles格式的地图服务器直接调用.一开始我也是为了用它来切割Tiff底图,发布Tileserver-GL服务的,不过用了一下,发现其切图速度比较快.所以想看一下其内部结构.觉得其代码并不简单,也是一个深思熟虑的系统.整体架构通观...

2019-03-03 12:58:54 880

原创 How it works(6) TileStache源码阅读(B) 自带功能模块

引入TileStache的核心阅读完了,就可以看看具体的功能部分是如何运行的.功能部分有4大类:Caches.pyPixelEffects.pyPixels.pyProviders.py模块Caches.py缓存的使用在上一篇已经看过了:读取缓存不需要锁写入缓存必须先加锁,再写入,再解锁所有的缓存都必须实现如下的方法:savereadlock/unlock...

2019-03-03 12:57:43 144

原创 How it works(5) TileStache源码阅读(A) 核心框架

引入作为一个维护时间更长久的地图服务器(从2010年至今),Python编写的TileStache有着跟Nodejs编写的Tiletrata不同的设计理念:全面专业.包含较多常用或不常用的专业地理信息功能.配置文件.与Tilestrata的代码即配置不同,TileStache完全基于一个独立的配置文件来调配整个系统.功能相比Tilestrata的只编写框架,功能完全靠插件加载,Til...

2019-03-03 12:57:06 268

原创 How it works(4) Tilestrata源码阅读(B) 地图负载均衡

引入阅读Tilestrata的源码是绕不开Tilestrata-Balancer(以下简称TB)这个默认的负载均衡服务的.其特性是:支持动态增加,减少节点定时检查节点健康状况简单的请求过滤大多数服务会采取专业的负载均衡或者反向代理,比如常见的nginx.理论上讲,nodejs的http-proxy性能是拍马也不及nginx的,但对于地图瓦片服务,绝大多数瓶颈在瓦片的生成,而非反向代理...

2019-03-03 12:56:11 245

原创 How it works(3) Tilestrata源码阅读(A)

引入什么是Tilestrata在地图服务领域,我们的选择其实是不多的.商业的首推arcgis server,开源的一般是mapserver和geoserver.这些专业地图服务其专业性很强,强大到可以满足几乎所有地图需求.不过正是因为有许多我们日常几乎用不到的专业功能,它们都十分的重,无论是从代码结构还是运行消耗(使用java编写的geoserver和arcgis server尤甚)上.轻量...

2019-03-03 12:55:36 422

原创 How it works(2) autocannon源码阅读(A)

autocannon是纯node实现的接口压力测试工具,市面上类似的产品很多,老牌的AB,带有图形界面的soap ui等.不过autocannon可以方便的进行命令行调用,甚至在代码内调用,这对于nodejs项目的单元测试来说是相当方便的.下面就来简单分析一下他的源码.综述上一篇我对winston框架做了源码分析,其核心关键词是流,通过流将模块链接起来.而对于autocannon,关键词是...

2019-03-03 12:54:41 499

原创 How it works(1) winston3源码阅读(A)

winston 是我在 nodejs 下最常用的日志框架,那么他到底是如何工作的呢?winston 的运行核心winston 中有两个关键词: 记录器(logger)和传输器(transport).记录器负责收集/修饰分配进入的每一条日志,传输器则负责最终把日志记录到的哪,整个 winston 其实就是多个流(stream)的链式调用.记录器继承了交换流(transform),而传输器...

2019-03-03 12:53:11 461

原创 Sequelize的原始查询的时区问题

在postgres数据库sequelize的raw query也是受时区影响的.同样的语句,用sequelize直接执行某些跟时间相关的query和在数据库执行是不一样的.语句如下:update table_A set is_enable=1 where EXTRACT(hour from now())+(EXTRACT(MINUTE from now()))/60 >= start_...

2018-10-26 09:57:31 2956

原创 从零开始的Docker ELK+Filebeat 6.4.0日志管理

我们自己的地图服务会打印如下json格式的日志:(时间字段和位置字段已针对ELK的处理){"apikey":"XXXXXXX","ip":"192.168.3.208","tilesize":"512","x":100,"y&quo

2018-09-28 08:32:50 2013

原创 C#修改JPG图片EXIF信息中的GPS信息

/// <summary> /// 设置图片的经纬高 /// </summary> /// <param name="IN_File">文件路径</param> /// <param name="IN_Lat">纬度</param&amp

2018-03-13 11:26:04 4493 7

原创 记一次断电恢复ORA-01033错误

客户的电脑因为频繁断电,造成orcle无法连接,报ORA-01033:oracle初始化或者关闭错误.按照传统方法进入cmdsqlplus sys/password@user as sysdba 可以连接.关闭数据库shutdown immediateORA-01109: 数据库未打开已经卸载数据库。ORACLE 例程已经关闭。再重新打开,就打不开了,提示

2017-01-04 16:39:13 4006

原创 Arcsde报ora-29861: 域索引标记为loading/failed/unusable错误

连接数据库的软件在编辑要素时突然报出这个错误:解决方法很简单,找出错误索引,再删除这个错误索引.先执行 select owner,index_name from all_indexes where domidx_status != 'VALID' or domidx_opstatus !='VALID'; 找出所有错误的,然后删除它们 drop index CONTR

2016-12-27 11:53:51 1678

原创 Arcsde表空间自动增长

Pl/Sql中执行"alter database datafile 'E:\app\Administrator\product\11.2.0\dbhome_1\database\SDE_TBS' autoextend on;"E:\app\Administrator\product\11.2.0\dbhome_1\database\SDE_TBS为表空间所在位置、SDE_TBS为默认表空间名称

2016-10-09 13:32:46 1093

AE开发指南(中文)

arcgis engine开发指南 适合需要arcgs 3d开发的用户

2014-04-04

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除