关于gis:使用HHDBCS快速修改GIS数据

GIS(地理信息系统)是一种基于计算机的工具,它能够对空间信息进行剖析和解决(简而言之,是对地球上存在的景象和产生的事件进行成图和剖析)。 GIS 技术把地图这种独特的视觉化成果和地理分析性能与个别的数据库操作(例如查问和统计分析等)集成在一起。而地理信息只是一堆数记录,须要有适合的软件去把它示意进去;与此同时,地理信息数据库的建设,亦有赖适合软件的帮忙,把天文数据信息化。同时,数据的批改,图形化体现,也须要软件的反对。应用HHDBCS操作pg数据库,能够完满实现这一操作。本篇简略介绍,如何应用HHDBCS批改地图信息。 1 导入数据连贯Pg数据库,点击地图治理;点击增加图层;抉择增加门路(本篇应用的是本地数据);注:SHP 格局是一种二进制文件格式,易于读取和应用。它也容易转换成其余格局的文件。SHP 文件能够不便地进行编辑,包含增加、删除和批改矢量数据等。此时增加了第一个图层;按原办法增加第二个图层,会叠加在图层一之上;(拖动鼠标能够调整图层程序) 2 批改数据点击红框,能够调整地图色彩;此步骤是一项暗藏的应用技能——批改地图,用于文档、PPT等,用于配图。点击地图,在弹框中呈现该坐标的经纬度,可对数据进行保留;实现后点击按钮将数据保留至数据库,或者导出都可;(需装置gis扩大) 3 总结GIS技术具备、可视化、多维度剖析、快速反应、精确定位、数据集成等劣势,因而广受好评。而它的毛病便是技术较简单。因而,Esri曾提出“用天文设计丑化生存、将地理知识人人共享”的理念。将空间信息技术普适化,从业余人员逐渐走向公众,这是gis须要走过的路,也是公众的须要。应用HHDBCS,则能够做到这一点——将简单的事件简单化。本文用简略的列子,抛砖引玉,期待各位用户挖掘更多新性能。点击下载HHDBCS

February 22, 2024 · 1 min · jiezi

关于gis:gis-开发中-pixelmetertilelnglat-互相转换

残缺源码:pixel、meter、tile、lnglat 相互转换在地图开发中,会遇到 pixel(像素)、meter(米)、tile(瓦片)、lnglat(经纬度) 之间的转换 它们之间的转化看似很简单,其实只有了解了其中的原理,就会发现它们之间的转换是很简略的,它们最底层的转换是: pixel 和 meter 之间的转换lnglat 和 meter 之间的转换其余的转换都是基于这个转换的 原点偏移量原点偏移量是指地图的原点(左上角)绝对于地球的原点(左下角)的偏移量:originShift = 2 * Math.PI * 6378137 / 2.0 地图瓦片分辨率初始分辨率为:initialResolution = (2 * Math.PI * 6378137) / tileSize 计算以后层级分辨率:resolution = initialResolution / Math.pow(2, zoom) 像素转米公式:像素坐标 * 以后层级分辨率 - 原点偏移量 x 方向绝对简略,都是从左往右,所以间接套用公式就能够失去米了:meterX = pixelX * resolution - originShift y 方向就比较复杂了,因为像素坐标是从上往下的,而米是从下往上的, 所以须要算出以后层级的像素高度:Math.pow(2, zoom) * 256 而后用像素高度减去像素坐标:Math.pow(2, zoom) * 256 - pixelY 再套用公式就能够失去米了:meterY = (Math.pow(2, zoom) * 256 - pixelY) * resolution - originShift ...

June 25, 2023 · 3 min · jiezi

关于gis:数据处理车辆飞机轨迹点位抽稀处理

背景需要: 须要实现飞机仿真实时挪动地位,然而提供的数据量较为宏大,而咱们的数据都是通过kafka发送,再由ue4承接数据来做渲染。然而数据量较为宏大,在增大飞行速度的同时渲染比拟吃力,于是想到点位个数压缩,数据推送频率不变来实现。构思原理:利用普克拉斯算法,通过该点位压缩算法来压缩点的个数这里提供的数据是excel,我打算把他解决成geosjon格局数据,而后用leaflet加载,判断是否和原数据是否重合。 '''Author: nicoDate: 2023-06-07 10:21:42LastEditTime: 2023-06-07 10:21:46Description: '''import mathimport pandas as pddef douglas_peucker(coords, epsilon): # 找到间隔端点最远的点 dmax = 0 index = 0 for i in range(1, len(coords)-1): d = distance(coords[i], coords[0], coords[-1]) if d > dmax: index = i dmax = d # 如果最大间隔大于阈值,则递归地对两个子段进行解决 if dmax > epsilon: results1 = douglas_peucker(coords[:index+1], epsilon) results2 = douglas_peucker(coords[index:], epsilon) # 将后果合并 return results1[:-1] + results2 else: # 如果最大间隔小于阈值,则保留该段的终点和起点 return [coords[0], coords[-1]] def distance(p, p1, p2): # 计算点到线段的间隔 x0, y0 = p x1, y1 = p1 x2, y2 = p2 dx = x2 - x1 dy = y2 - y1 if dx == 0 and dy == 0: return math.sqrt((x0 - x1)**2 + (y0 - y1)**2) else: t = ((x0 - x1) * dx + (y0 - y1) * dy) / (dx*dx + dy*dy) if t < 0: px, py = x1, y1 elif t > 1: px, py = x2, y2 else: px, py = x1 + t*dx, y1 + t*dy return math.sqrt((x0 - px)**2 + (y0 - py)**2)# 示例用法def getData(): # 读取Excel数据到DataFrame df = pd.read_excel('data.xlsx') # 将经纬度转换为坐标点 coordinates = [] for index, row in df.iterrows(): coordinates.append([row['lat'], row['lon']]) return coordinatescoords = getData()epsilon = 0.0000009print(len(coords))simplified_coords = douglas_peucker(coords, epsilon)new_list = [[sublist[1], sublist[0]] for sublist in simplified_coords]print(len(new_list),new_list)simplified_geojson = { "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": {}, "geometry": { "type": "LineString", "coordinates":new_list } } ]}# 将GeoJSON写入文件with open('chouxi10.json', 'w') as f: f.write(str(simplified_geojson))原作者地址:https://segmentfault.com/u/yourena_c这里我用leaflet来测试造成的geojson是否和未解决的元数据合乎,所以经纬度对位也同时做了解决。 ...

June 7, 2023 · 2 min · jiezi

关于gis:GIS智慧燃气数字孪生三维可视化运维管理系统

在低碳经济疾速倒退的明天,天然气在我国能源构造的占比逐年进步,平安供气成为关乎民生福祉、经济倒退和社会谐和的小事。 自我国发展燃气铺设以来,通过长期经营的家用燃气和工业燃气设备管道设施设施根底差、检培修难度大,且传统燃气行业巡逻检修等都以人工为主,难以满足当下对燃气设备的综合化监测需要。2021年我国城镇燃气管网里程已达105万公里,骨干天然气管道总里程达11.6万公里,天然气消费量达3690亿立方米,宏大的规模使得燃气智慧化成为大势所趋。 智慧燃气零碎概述 智慧燃气是基于物联网、大数据、云计算、5G等先进技术,联合燃气行业特色,通过智能设施全面感知生产、环境、状态等信息的全方位变动,对海量感知数据进行传输、存储和解决,实现大数据时代下对数据的智能剖析,以更加精密、动静的形式治理燃气企业生产、经营、服务和治理的各个环节,从而达到“智慧”的状态。 智慧燃气政策背景2021.03.《中华人民共和国国民经济和社会倒退第十四个五年布局和2035年近景指标大纲》,推动能源反动,建设清洁低碳、平安高效的能源体系,进步能源供应保障能力。2021.11.《“5G+工业互联网”第二批十个典型利用场景和五个重点行业实际》,通过内置5G模块的仪器仪表,实时采集企业用电、水、燃气等各类能源数据;实现大规模终端的海量数据秒级采集和能效状态实时监控。2022.02.《“十四五”国家应急体系布局》,推动城市电力、燃气、供水、排水管网和桥梁等城市生命线及地质灾害隐患点、重大危险源的城乡平安监测预警网络健身。推动淘汰落后技术、工艺、资料和设施。智慧燃气零碎介绍仿真全景概览 基于数字孪生理念,联合Sovit3D可视化平台,以理论燃气生产基地为底本,建设数字孪生3D模型,实现基地三维实景可视化,对基地的整体产量、储气量、进口流量、环境、设施等,进行全面实时监控。通过2D组态界面,灵便、高效、牢靠的实现对基地设施、工艺流程的实时监测、自动控制、智能调节、剖析决策、零碎互动等综合治理性能;近程在线监测基地设施的运行状态、评估设施的检修周期,进步基地安全等级,缩小场站事变产生。 管网监测零碎 智能管网监测零碎基于GIS零碎建设,联合二三维一体化、物联网技术,对地理信息进行高效的存储、更新、操作、剖析及显示;在管网及设施保护、停气抢修、打算作业工作中提供精确的坐标地位、地图参考、管径尺寸、管网埋深等信息数据,并且在应急抢修利用中能够进行爆管模仿,剖析出需敞开的阀门和受影响的用户,通过综合调度短信或者电话告诉用户停气状况,为用户提供更贴心的服务。 主动巡检零碎 基于先进的移动机器人平台零碎,应用巡检机器人帮助燃气企业进行基地的日常巡检工作,实现表计辨认、红外测温、燃气透露检测、声音剖析、高清视频监控等性能。不须要对现有燃气设备设施进行革新,无需加装任何附加安装,可代替人工实现大部分巡检工作,有工作效率高、无疲劳、巡检品质稳固等特点。 设施管理系统 设施运维管理系统是对基地设施、管网设施(调压设施、阀井设施、阴保设施等)进行规范化、高效、信息化的运维管理系统。从设施投运到报废全程记录设施巡逻、培修、颐养状况。实现对设施颐养及时揭示,利于缩短设施使用寿命。统计分析、培修效率、设施状态高深莫测,回顾剖析全生命周期体现,欠缺流程和人员治理。 视频监控零碎 采纳图像处理、模式识别和计算机视觉技术,通过在监控零碎中减少智能视频剖析模块,自动检索异样指标,对视频源中的次要和无效信息内容发展解析和获取,迅速精准定位事发现场,分辨监控显示屏中的异常现象,并以更快、最好的办法传出报警,从而无效进行事先预警,事中解决,预先及时取证的实时监控。 周界安防零碎 集视频监控、人脸视频、自然环境采集、核心存储、报警联动、解码上墙、地图查看等技术,采纳在围栏上或砖墙上挂装智能入侵探测器,实现围界入侵指标检测、辨认及定位,并能精确区别入侵者与非入侵行为。智能监测入侵、攀高、翻越围墙等状况,实现报警视频联动,无效防备周界异常现象产生。 智能预警系统 针对设施故障、突发火情等各类安全事件,基于工夫、空间、指标等多个维度建设数据阈值告警触发规定,并反对集成视频巡检、流量监测、电子围栏等零碎数据,主动监控各类焦点事件的倒退状态,进行可视化主动告警。 消防管理系统 接入现有的消防水零碎、火灾主动报警零碎等,实时对消防设备设施运行状态进行监测,当产生异样(火灾、爆炸等)情况时,可联动报警点左近摄像头弹窗,显示实时监控画面,并计算人员逃生的路线,近程启动灭火流程等;有序进行撤退,保障人员生命安全、财产损失。 应急指挥系统 整合险情起源渠道,利用地理信息数据、实时监控信息、内部资源信息及以往事变材料、历史数据和维抢修状况等根底材料,对险情进行对立受理、调度及监控。买通调度核心与现场人员的沟通渠道,实现应急抢险工作的快、准、便,无效排除险情,升高事变损失。 智慧燃气建设价值基于人工智能、物联网、5G、大数据等先进技术,采纳 数维图(以下简称 SovitJS )翻新的 2D/3D 可视化组态和三维建模技术,数字孪生燃气站三维可视化零碎,对基地内的人、设施、环境进行全面感知,赋能燃气产业向信息化、可视化、绿色化环保方向倒退。 智慧燃气我的项目交付数字孪生智慧燃气站三维可视化综合管理系统基于Sovit3D可视化平台开发,WebGL规范B/S架构,采纳HTML5+JavaScript技术作为前端根底,产品开发的二次代码及我的项目源文件(模型+程序+近程领导等)全副提供客户,既可部署在云端,也可本地化部署。

March 29, 2023 · 1 min · jiezi

关于gis:基于游戏引擎的数字孪生技术方案

一.背景介绍 目前国内的数字孪生在toG方向比拟成熟,“数字孪生”是一种利用于修建科技的新技术,简略说就是利用物理修建模型,应用各种传感器全方位获取数据的仿真过程,在虚拟空间中实现映射,以反映绝对应的实体修建的全生命周期过程。二.技术计划施行路线 webgl游戏引擎技术栈threejs、cesiumue4+webrtc长处快捷,不便画质材质着色器成果好,比拟吃服务器性能毛病吃用户电脑性能须要大团队配合做建模和场景搭建,繁琐三.基于游戏引擎所用技术功能模块拆解hint:以下技术模块路线是比拟宽泛的一条 场景搭建 这里场景搭建能够抉择“51、优诺、博能”这些厂商的场景构建工具产品,这些产品都大抵囊括了: 天气切换 工夫切换 点线面增加 根底gis剖析 漫游 视频交融 osgb、bim、obj等模型管制压平剖切 数据集成交融 二三维地图治理场景基于webrtc云渲染这里我所理解的是“平行*”这家厂商,他将ue打包后的exe我的项目包上传至他们的服务器,再通过他基于webrtc二次封装的通信js包就能够操作云渲染场景。前端基于webrtc连贯云渲染视频 <iframe id="myframe" src="" frameborder="0"></iframe>angular框架import { Component,OnInit } from '@angular/core';import { StorageService } from "../../service/storage.service"@Component({ selector: 'app-effect', templateUrl: './effect.component.html', styleUrls: ['./effect.component.css']})export class EffectComponent implements OnInit { storages: any = {}; constructor(private storageService:StorageService){ this.storages = storageService.dataList } scene:any={}; ngOnInit():void{ this.initScene_local() } titleList: string[] = ['装置UE','装置构建工具','搭建场景','公布部署场景','可视化平台二次开发','通过web进行二次开发','常见问题']; initScene_local():void { console.log('start'); this.scene = new window.CloudRenderApi.Scene('myframe', { sceneID: "1073239029270446080", //200 server: "http://10.8.35.1:8181", // 云渲染本地服务地址 saas: true }) this.scene.on('left_click',(res:any) => { console.log(res); }) }}四.演绎总结 ...

February 28, 2023 · 1 min · jiezi

关于gis:GISer与魔方

前段时间在听吴军老师的《硅谷来信》,外面屡次提到,要少做事件,把事件做精,做到极致,这样更容易胜利。 要做到极致可不容易,这个过程中必然会遇到很多艰难,艰难包含技术上的,也包含心里上的。 只有克服这些艰难才有可能做到极致,而这种克服困难的教训,是能够复制到其它事件上的。 我听后心田很有感触,决定试一试,找一找克服困难的感觉。 刚好媳妇儿网购时,凑单买了个魔方,那天灵光一闪,决定就从魔方这件事上找找感觉。 从网上理解到三阶魔方的还原工夫,10秒以内就属于相对的大神了,普通人刚入门的工夫广泛在3分钟以上,我给本人定的指标是1分钟,因为练习魔方必然须要大量的工夫和精力,我是第一次尝试,不筹备打持久战。 我的想法是将魔方这件事在业余时间的优先级提到最高,速战速决。 我先调研并选定了魔方教程,又买了较量级别的新魔方(之前凑单的那个魔方只能用来哄小孩儿),还动员了全家一起玩。 很快我就达到了1分半的程度。 所有貌似都挺顺利的,然而接下来就遇到问题了。 教程中,第二步公式比拟多,本人卡在了这里,速度始终提不下来,造成了瓶颈,工夫久了有点打击积极性,开始缓缓懈怠下来。 当积极性下来后,更多问题扑面而来。 首先,三分钟热度过来后,没有达到1分钟的预期指标,这根本宣告了速战速决打算的幻灭,情绪多少有点丧气。 其次,业余时间的原有打算因为魔方这件事而停滞的越来越久,本人感到了压力。 随着瓶颈的持续时间越来越久,本人开始对这件事件的意义和重要水平产生了狐疑,比方: 是不是能够间接在GIS上练习做到极致,而不是先在这里拐个弯? 是不是像技术博客这种同样重要的事件不应该停下来,而是应该和魔方同时搞? 总而言之,过后的状况就是感觉有很多重要的事件等着去做,但因为魔方这个事件都被卡住了,本人又不确定还要多久能力搞定这件事,于是开始纠结是跳过这个去做其它的,还是持续在这个下面死磕。 这种感觉并不是第一次呈现,之前在钻研技术问题时,也会常常遇到。 以往的教训是,只有跳过去了,就再也不会被捡起来。 所以,想一想这次玩魔方的初心,就是为了积攒克服困难的教训,而当初它呈现了,所以肯定要坚持下去。 既然决定了,就开始踊跃寻找冲破瓶颈的办法, 技术上,感觉教程看的还是不够,不纯熟的中央要多看几遍。 心态上,要致力让本人烦躁的心平静下来。 练习上,继续练习,不能懈怠。 就这样,又通过一段时间,最终达到了1分钟还原魔方的指标。 回望这段时间的经验,有这么几点感悟: 这个世界上绝大多数事件都不难,只有肯保持钻研就能达到一个很高的程度,难的是你是否保持下来,因为这个过程可能会很漫长,两头会遇到各种各样的问题。登程前肯定要找一个弱小的理由,这个理由要不容易被颠覆,能力让本人长期坚持下去,肯定要把这个理由和本人过后的想法都写下来保留好,越细越好,因为工夫久了会忘,真的会忘!!!设定一个机制,每隔一段时间比方半年或一年,把当初记下来的理由翻出来看一看,总结一下,它能鼓励本人,避免跑偏。 记得2014年,一个让我通宵了4次的我的项目验收了,在我的项目总结会上,我把我的项目经验教训总结成了一句话分享给大家,看着ppt上的那句话我感慨万千,想着这都是血淋淋的教训。 但当我扭过头看大家时,大多数人的表情都是木讷的,因为他们没有经验过这个我的项目,领会不到这句话的意义,对他们而言这句话和教室墙上凉飕飕的名言警句没有什么区别,只有那些亲身经历过的共事能力领会到这句总结背地蕴含了多少辛酸。 我总感觉,有些教训它就是一种感觉,这种感觉无奈通过语言和文字传递,只有亲身经历了,才有可能真正的把他人的教训变成本人的。 愿大家早日找到属于本人的克服困难的感觉。 原文地址:http://gisarmory.xyz/blog/index.html?blog=GISerMagicCube 欢送关注《GIS兵器库》 本文章采纳 常识共享署名-非商业性应用-雷同形式共享 4.0 国内许可协定 进行许可。欢送转载、应用、从新公布,但务必保留文章署名《GIS兵器库》(蕴含链接: http://gisarmory.xyz/blog/),不得用于商业目标,基于本文批改后的作品务必以雷同的许可公布。

October 31, 2022 · 1 min · jiezi

关于gis:gis开发总结

--应用技术-- 服务端:iserver; 客户端:iclient web 端gis开发工具: 二维:iclient javascript: 集成Leaflet、openlayers、MapboxGL三种地图类库, 集成ECharts、D3、MapV 等支流的图表库; 反对跨终端、跨浏览器、多源数据地图; 基于古代web技术栈三维:iClient3D for WebGLiClient JavaScript 11i(2022) 体系图: 本篇简略总结基于openlayers的二维技术选用openlayers的起因:性能、扩展性较好、反对h5个性、较欠缺的生态、WebGL+canvas渲染毛病也比拟显著:并重,文档可读性差、学习老本高 这里大略总结一下地图相干的类库的区别和分类 在线地图lbs(location based server)服务:以百度api、腾讯、高德api为例,开发者应用须要申请密钥,且api调用有次数限度,次要实用于互联网利用的lbs服务,做简略的数据展现,不适宜企业、政府大型Gis利用开发GIS地图库:企业级地图利用开发库,以openlayers、arcgis为例实用方向:交互简单、业余的地图我的项目。易用性比照:开源:leaflet(挪动端反对度高) > mapbox > openlayer图商:高德 > 百度(echarts深度交融) > 腾讯 > 天地图 openlayers框架体系的外围大类: Map: 容器Layer:图层Source:图层的数据源Feature: 根底地物单元View: 视图交互控件: Control和InteractionOpenLayers的DOM元素组织构造OpenLayers会在自定义的div容器中创立一个viewport容器,地图中的所有内容都搁置在viewport中出现,viewport容器中有三个要害的元素层: 地图渲染层(ol-layers):这是一个canvas元素,地图基于canvas 2D形式渲染。内容叠加层(ol-overlaycontainer):用于搁置叠置层(Overlay),如在地图上增加弹窗。地图控件层(ol-overlaycontainer-stopevent):用于搁置控件,默认状况下会搁置Zoom(用于管制地图放大、放大)、Rotate(用于管制地图旋转)、Attribution(用于管制地图右下角标记)这三个控件 1. 地图配置(1) 图层与图层源 图层次要是对 矢量数据(矢量图层) 和 栅格数据(瓦片图层、图片图层)的可视化表白// 地图数据源次要分为三大类, 对应四大类图层1. 图片图层ImageLayer:服务端渲染可能是曾经渲染好的图像,或者是每一次申请,都依据申请内容定制化地生成一幅图2. 切片/瓦片图层TileLayer: 服务端渲染,个别底图应用切片图层利用网格将一幅地图切成大小相等的小正方形当申请地图的时候,会申请视口可见的区域内蕴含的切片,其余的切片不会申请,这样就节俭了网络带宽,而且个别这些切片都是事后切好的,且分为不同的缩放级别,依据不同的缩放级别分成不同的目录。个别将这些切片地图放到缓存中,达到更快的访问速度preload选项参数:是在还没有将相应分辨率的切片渲染进去的时候,将低分辨率的切片先放大到以后分辨率(可能会有含糊),填充到相应地位直至以后分辨率的切片渲染实现, 这也就是为什么当网速慢时,地图会先是含糊的,而后再变清晰的起因3. 矢量图层VectorLayer(蕴含VectorImage、VectorTile等): 客户端渲染,须要通过style来管制图层外观4. 热度图层heatMapLayer: 客户端渲染将矢量数据渲染成热度图图层源a: tileLayer OSM/BingMapsOGC规范的WMS/WMTS服务...b: VectorLayer vectorSource: geojson/kml等格局的矢量数据...c: ImageLayer imageCanvasimageStatic...// 以加载天地图瓦片数据(采纳OGC WMTS规范)为例http://t0.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={x}&TILECOL={y}&tk=您的密钥new TileLayer({source: new Tianditu({ ... })})class Tianditu extends WmtsSource { // opt: { layerType: 'xx', projection: 'xx', cacheSize: 'xxx' } constructor(opt) { // some config thing // 瓦片加载实现的回调 callback() { // do something (including adding tiles to cache) } }}参考链接: http://lbs.tianditu.gov.cn/server/MapService.html ...

June 16, 2022 · 1 min · jiezi

关于gis:mapboxgl-地图样式-唯一值渲染

mapboxgl 中提供了弱小的地图款式编辑性能,款式表达式是其一大特色。 惟一值渲染是GIS中常见的专题图渲染形式,明天咱们来看一下如何用 mapboxgl 中的款式表达式实现这一成果。 在网上找了一份北京市的行政区划图,指标是各个区设置上不同的色彩。成果如下: 形式一:应用 case 表达式这种做法的益处是能够灵便批改每个区的色彩。 "fill-color":[ "case", ["boolean",["==",["get","name"],"怀柔区"],false],"#FFFFCC", ["boolean",["==",["get","name"],"密云区"],false],"#CCFFFF", ["boolean",["==",["get","name"],"平谷区"],false],"#FFCCCC", ["boolean",["==",["get","name"],"通州区"],false],"#FFFF99", ["boolean",["==",["get","name"],"房山区"],false],"#CCCCFF", ["boolean",["==",["get","name"],"延庆区"],false],"#FFCC99", ["boolean",["==",["get","name"],"门头沟区"],false],"#CCFF99", ["boolean",["==",["get","name"],"大兴区"],false],"#66CCFF", ["boolean",["==",["get","name"],"顺义区"],false],"#99CCFF", ["boolean",["==",["get","name"],"海淀区"],false],"#CCCCCC", ["boolean",["==",["get","name"],"西城区"],false],"#CCFFCC", ["boolean",["==",["get","name"],"东城区"],false],"#CC99CC", ["boolean",["==",["get","name"],"朝阳区"],false],"#99CC99", ["boolean",["==",["get","name"],"石景山区"],false],"#CCCC99", ["boolean",["==",["get","name"],"昌平区"],false],"#FF9969", ["boolean",["==",["get","name"],"丰台区"],false],"#999999", "black"]下面表达式的意思是,从数据中获取 name 属性的值,判断是哪个区,而后设置相应的色彩。 case表达式语法,详见官网阐明 mapboxgl 表达式的根本语法: 1、一组中括号[ ]代表一个残缺的表达式,中括号中第一个参数申明表达式的类型,前面是表达式的参数。 2、表达式能够嵌套。 对于表达式的具体介绍,后续会用独自一篇文章来写,这里只做个简略阐明。 下面这段表达式如果翻译成 js 大抵是这样的: function getColor(feature){ //feature是geojosn格局中的Feature if(feature.properties.name === "怀柔区"){ return "#FFFFCC" } else if(features[i].name === "密云区"){ return "#CCFFFF" } ... else{ return "black" }}在线示例,浏览器 F12 能够查看残缺代码。 形式二:应用 match 表达式match 和 case 相似,但在写法上更为简洁 ...

March 11, 2022 · 2 min · jiezi

关于gis:未经投影的地理坐标系如何显示为平面地图

缘起应用Leaflet做点缓冲,也就是调用“L.circle()”绘制圆形,传入半径100米,绘制进去的圆却笼罩了寰球,过后就猜测,应该是把半径按100度来绘制了,但看了Leaflet API介绍,外面形容的半径单位就是用的“米”。 而后想起来这次用的地图底图为天地图,在初始化地图时,通过批改crs,将地图坐标系批改为了“EPSG:4490”(通过Proj4Leaflet定义),而Leaflet默认采纳的是“EPSG:3857”,看来问题应该是出在了这里。 于是通过三角函数,将100米换算成度再次绘制,能够胜利绘制。 const newRadius = Math.asin(radius / 6371000) * 180 / Math.PI //将米转为度,6371000为地球赤道半径而后就引发了思考,“EPSG:4490”是天文坐标系,也叫球面坐标系,默认应该是个球,而二维地图是个立体,球要在立体展现就须要投影,那么未经投影的“EPSG:4490”坐标系是如何绘制到立体上的呢? 接下来就钻研下天文坐标系和立体坐标系,以及未经投影的天文坐标系到底是如何显示为立体地图的。 根底概念首先理解几个根底概念: 天文坐标系:或称球面坐标系,参考立体是椭球面,个别是指由经度、纬度和高度组成的坐标系,可能标示地球上的任何一个地位。常见的天文坐标系有WGS84(EPSG:4326)、CGCS2000(EPSG:4490)、GCS_Xian_1980(EPSG:4610)。 投影:天文坐标系是三维的,而咱们要在地图或者屏幕上显示就须要转化为二维,这个过程被称为投影。罕用的投影有墨卡托投影(Mercator)、高斯-克吕格投影、伪墨卡托投影(Web Mercator)。 投影坐标系:通过投影后的坐标系就是投影坐标系,坐标单位个别是米、千米等。能够认为投影坐标系就是天文坐标系+投影。常见的投影坐标系有EPSG:3857(也就是WGS84 +伪墨卡托投影)。 经纬度等距离直投理解下面这几个概念后,回到结尾的问题,天文坐标系“EPSG:4490”或者“EPSG:4326”,是如何显示到立体上的呢? 其实在咱们应用二维形式展现地图,而坐标系为天文坐标系时,用到了是一种非凡的投影形式,经纬度等距离直投。 经纬度等距离直投:英文叫法是Platte Carre projection,是等距矩形投影(Equirectangular projection)基准点纬度取0°(赤道)时的非凡状况。它的特点是雷同的经纬度距离在屏幕上的间距相等,没有简单的坐标变换。咱们可简略的了解为,在笛卡尔坐标系中,将赤道作为X轴,子午线作为Y轴,而后把原本应该在南北两极相交的经线一根一根屡直了,成为了相互平行的经线,而每条纬线的长度也在这个过程中都变为与赤道等长。 在经纬度等距离直投中,经度范畴是-180到180,纬度范畴是-90到90,因而他的地图是长方形,且长宽比是2:1。 在地图API中,当定义地图坐标系为天文坐标系时,个别会默认采纳这种投影形式,这也是咱们能看到天文坐标系的立体地图的起因。 然而经纬度等距离直投有个很显著的毛病,就是在低纬度地区长度、角度、面积、形态变动比拟小,越向高纬度,程度间隔变长越大,很小的纬圈都变得和赤道一样长,然而经线长度始终保持不变。这样就导致因素通过投影后会角度会发生变化,比方十分规范的十字路口,两条路“十分垂直”,而通过“经纬度等距离直投”投影后,两条路成了斜交。 正是因为经纬度直投的这些毛病,特地是投影后角度的变动,导致它在一些畛域是无奈利用的,比如说航海中航线的表白(原本的直角转弯,在地图上显示的可能是钝角或锐角)。 当然,要把球面坐标投影到立体展现,不可避免都会产生这样那样的变形,而每种地图投影也都有本人的长处和毛病,这就须要咱们依据不同的利用场景来抉择适合的投影了。 接下来咱们再理解下日常最常见的一种投影,墨卡托投影,而后再将经纬度等距离直投和墨卡托投影做下比照,这样能够更直观的察看出各自的优缺点。 墨卡托投影墨卡托投影,又名“等角正轴圆柱投影”,荷兰地图学家墨卡托(Mercator)在1569年拟定,假如地球被围在一个中空的圆柱里,其赤道与圆柱相接触,而后再假想地球核心有一盏灯,把球面上的图形投影到圆柱体上,再把圆柱体开展,这就是一幅标准纬线为零度(赤道)的“墨卡托投影”绘制出的世界地图。 墨卡托投影最大长处就是在地图上放弃方向和角度的正确,如果循着墨卡托投影地图上两点间的直线航行,方向不变,能够始终达到目的地,因而它对船舰在航行中定位、确定航向都具备有利条件,给航海者带来很大不便。这也是目前的大部分互联网地图抉择墨卡托投影(伪墨卡托投影或者基于墨卡托投影做加密偏移)的起因之一,因为人们心愿在地图上看到的地物与理论地物长得类似,并且导航方向不变。 Web Mercator投影,也就是“EPSG:3857”,也被称为“伪墨卡托投影”,这个投影办法是Google Map最先创造并应用的,它的天文上的不严谨性在于,在投影过程中,将示意地球的椭球面作为正球面解决,传说中是因为谷歌程序员懒得用椭球面来编程计算屏幕坐标...想具体理解,能够参考Web Mercator 公开的小机密对于墨卡托投影来说,也有个显著的毛病,就是越到高纬度,大小扭曲越重大,到两极会被放到无限大,因而墨卡托投影并不能体现出南北两极。为了方便使用,互联网地图应用的Web Mercator投影,通过对两极地区的裁剪,把地图搞成一个正方形,这样在定义缩放级别、地图切图等解决时就会更清晰易懂。具体相干原理计算可参考https://www.jianshu.com/p/434...。 通过下图,能够看到墨卡托投影下每个国家的大小和理论大小的差别。 上面两张图片来自天地图网站截图,咱们能够看出,地图层级同样是18级,黑龙江漠河(上图)与海南三亚(下图)的地图比例尺差异还是很大的。 经纬度等距离直投 VS 墨卡托投影下图来自 Mercator vs. well…not Mercator (Platte Carre),活泼地阐明经纬度等距离直投(Platte Carre)和 墨卡托投影(Mercator)这两种投影下的失真状况: 左图示意地球球面上大小雷同的圆形,右上为墨卡托投影,投影后依然是圆形,然而在高纬度时物体被重大放大了。右下为经纬度等距离直投,圆的大小变动绝对较小,然而高纬度时的图像显著被拉长了。 查看天地图传统版网站https://map.tianditu.gov.cn/2...,能够切换下投影形式,比照看一下不同投影的区别(能够把地图拖到哈尔滨地区,区别更显著)。通过上面动态图能够看出不同投影在哈尔滨地区的差别,其中“球面墨卡托”,采纳的是web墨卡托投影(EPSG:3857);“经纬度”,采纳的是EPSG:4326的经纬度等距离直投。 总结未经投影的天文坐标系之所以能够显示为立体地图,是因为它默认采纳了经纬度等距离直投的投影形式。大部分互联网地图都是采纳Web Mercator(EPSG:3785),或者是基于Web Mercator做了加密偏移。经纬度等距离直投在高纬度地区的立体变形重大,大小和角度都会产生显著变动。Web Mercator在高纬度地区的立体会显著被拉大,然而角度不会发生变化。对于地图投影,没有最好的,只有最合适的,须要依据本人的利用场合来抉择。参考资料: ...

February 24, 2022 · 1 min · jiezi

关于gis:在-esmodule-环境下使用-jsts

1 阐明jsts 齐全就是依据其老妈 jts 的 java 包构造移植的,除了局部剖析性能须要额定留神外,基本上所有的子模块的根门路位于 jsts/org/locationtech/jts 模块下。 Geometry 类Geometry 类合乎 OGC 简略因素标准的设计。它有若干个子类,例如点线面等。 Geometry 在 JTS 上有十分多实用的空间剖析函数: buffer, buffer, buffer, compareTo, compareTo, contains, convexHull, copy, coveredBy, covers, crosses, difference, disjoint, distance, equals, equals, equalsExact, equalsNorm, equalsTopo, geometryChanged, getArea, getCentroid, getEnvelope, getEnvelopeInternal, getFactory, getGeometryN, getInteriorPoint, getLength, getNumGeometries, getPrecisionModel, getSRID, getUserData, hashCode, intersection, intersects, isRectangle, isValid, isWithinDistance, norm, overlaps, relate, relate, setSRID, setUserData, symDifference, toString, toText, touches, union, union, within然而不见得所有的都在 JSTS 中有,见第 3 节的 buffer 举例。 ...

February 14, 2022 · 1 min · jiezi

关于gis:记录mapbox开发遇到的关于CSS-transform-问题

先记录一个issue,有工夫再更新 https://github.com/mapbox/map...

February 10, 2022 · 1 min · jiezi

关于gis:GISer如何突破二次开发瓶颈

年初时,我写的《一个GISer的使命》那篇文章中,提出了GISer的技术晋升门路能够分为四个大的阶段: 阶段一,能应用商业GIS软件去解决问题。阶段二,能应用开源GIS软件去解决问题。阶段三,有能力去解决开源GIS中的问题。阶段四,有能力去解决GIS行业前沿问题。在阶段一、阶段二中,咱们属于GIS二次开发人员,在阶段三、阶段四中咱们开始缓缓转向GIS底层开发人员。 这种转变不是天天做我的项目就会天然的实现的,天天做我的项目会让咱们成为一名GIS二次开发老司机,但永远不会成为GIS底层开发的赛车手,他们之间差的是对某些底层专业知识技能的”刻意练习“。 咱们明天就来讨论一下,如何从一个GIS二次开发人员转变为GIS底层开发人员。 被忽视的GIS底层原理前段时间学了一个大神的计算机图形学课程。课程开篇就说:咱们不会去讲OpenGL API,咱们只会讲计算机图形学的原理和算法,原理和算法学会了再去看API什么的,那都太简略了,甚至你本人都能够写一套渲染引擎进去。 学完那个课程后我最大的领会就是:原来计算机里的所有货色,背地都是数学。也看到了在计算机领域,只有能深刻讲到数学层面的货色才是真正的实现原理。 记得之前所在的公司下工作让员工申请专利,有个共事写了个GIS的专利,后果被打了回来,理由是实现办法太依赖于ArcGIS软件。 这可能从侧面反映出了GIS开发普遍存在的问题,就是更关注如何应用各种的GIS软件和GIS开发框架,却漠视了GIS底层原理的重要性。 这同样也是国内开设GIS业余的高校普遍存在的问题,高校里都在讲GIS实践、GIS软件应用、GIS二次开发,但很少讲GIS底层的实现原理。 GIS开发须要逆势而上吴军在《硅谷来信》一书中提到过一个高势能业余的概念。所谓高势能的业余,就是指那些绝对难学,而又绝对是其余业余的根底的业余。比方数学业余绝对计算机专业就是高势能的,计算机专业绝对GIS业余是高势能的,从高势能转到低势能的业余绝对恶化,但反过来会比拟艰难。 GIS开发除了要把握GIS的原理外,还要夯实计算机根底,因为计算机是GIS的实现伎俩,计算机根底不扎实是做不好GIS的。 GIS底层开发要把握的技能上面是我认为GISer须要进一步增强的底层技能 1、GIS基础知识WebGIS实现原理GIS罕用空间剖析算法实现原理2、计算机基础知识数据结构、算法。精通一门开发语言。这里的精通不仅包含熟练度,还包含开发语言的实现原理。套用知乎上一位答主的话说就是:GISer要有不低于计算机专业人员对计算机的理解能力。简略点说就是要达到计算机专业科班出身的程度。 3、数学基础知识我的准则是急用现学。数学这个货色的确比拟干燥,当你不晓得这个货色有什么用时,心田会很抗拒,学起来就很吃力;当你发现要学的新技术中应用到它并且死活绕不开时,心田就不再抗拒,甚至有了浓重的趣味,再学起来会容易很多。 总结GIS二次开发走的是全栈开发路线,啥都会一些,啥都不精通,路越走越窄,工作5年后薪资上会缓缓遇到瓶颈。要冲破这种瓶颈须要逆势而上把计算机的专业知识吃透,把GIS底层原理吃透,让本人达到计算机专业开发程度,同时又精通GIS底层实现原理。这两项冲破后,你就具备了GIS底层的开发能力,会成为HR口中天天嚷着不好招的那种GIS稀缺人才。最初种一棵树最好的工夫是十年前,其次是当初! 原文地址:http://gisarmory.xyz/blog/index.html?blog=GISerRacer 欢送关注《GIS兵器库》 本文章采纳 常识共享署名-非商业性应用-雷同形式共享 4.0 国内许可协定 进行许可。欢送转载、应用、从新公布,但务必保留文章署名《GIS兵器库》(蕴含链接:  http://gisarmory.xyz/blog/),不得用于商业目标,基于本文批改后的作品务必以雷同的许可公布。

December 7, 2021 · 1 min · jiezi

关于gis:geoserver控制服务访问权限类似百度地图的key

缘起如题,想要用geoserver实现一个互联网地图那样的key许可性能,来管制地图服务的拜访权限。 最终想要的成果就是相似下图中百度地图那样,申请个key,能够设置这个key能拜访哪些地图服务资源,能够设置应用服务器ip白名单 而后把key放到地图API中,就能管制地图服务的拜访权限。 可行性剖析要应用geoserver实现上述性能,须要解决上面3个问题: 如何实现key验证拜访?如何管制key能拜访哪些地图服务?如何实现服务器ip白名单?如何实现key验证拜访geoserver公布的地图服务,默认没有进行权限管制,任何人拿到地址都能够拜访地图。 咱们想要的成果是,在拜访geoserver服务时,须要在参数中减少一个key的参数,有这个key能力拜访地图。 这个性能,geoserver是反对的 geoserver有个AuthKey的插件,反对接入内部的身份验证接口,咱们能够通过本人编写内部的身份验证接口,来本人生成key、验证key,geoserver只负责转发和获取验证后果。内部接口返回的是geoserver用户名称。 而后再设置一下geoserver的拦截器,规定哪些申请必须要进行下面的验证。 如何管制key能拜访哪些地图服务?key的拜访权限是通过geoserver用户的拜访权限来设置的,后面验证key时,曾经返回了用户名。 用户的权限通过角色管制,所以每次创立key时,须要同时创立用户和角色,并设置角色的拜访权限。 这个环节能够应用geoserver的rest管制接口解决,应用rest管制接口能够通过程序主动实现上述配置。 如何实现服务器ip白名单geoserver 作为一个服务端,它只能获取到客户端的ip,无奈获取到应用服务器的ip。 如果想要获取的应用服务器的ip,就须要前端有个内应,这个内应就是js地图api,它能够在客户端的地址栏中获取到应用服务器的ip,而后传给服务端。 具体到geoserver这边,咱们还是利用后面内部验证接口,在js地图Api中,把地址栏获取到的应用服务器ip和key拼一起,通过 AuthKey 的内部验证接口转发给本人的后盾,后盾再将ip提取进去。 地址栏ip和key的拼接,能够应用公钥、私钥模式,js地图api中应用公钥加密,后盾应用私钥解密,这样能够防止明文传输ip地址。避免他人串改ip后非法拜访地图。 这样就能实现对应用服务器ip的验证了。 流程梳理好了,当初咱们曾经实现了可行性剖析 接下来咱们梳理一下,申请key和应用key拜访地图的流程。 申请key在申请地图key的页面,输出利用名称、利用部署的服务器ip、勾选须要的地图服务,而后生成个key调用geoserver的rest管制接口,创立角色、用户、设置角色能够拜访的地图服务将key、应用服务器ip和geoserver用户进行关联并保留到数据库拜访地图开发地图利用时,把申请到的key传入本人写的js地图apijs地图api外部获取浏览器地址栏ip,这个ip就是应用服务器ip,将ip和key应用公钥加密,生成newkey,并在申请geoserver服务时将newkey作为参数传给geoservergeoserver的拦截器拦挡到申请后,将newkey提取进去,转发给咱们本人写的权限验证接口权限验证接口接管到newkey后,应用私钥解密,就能获取到key和应用服务器ip,而后去数据库比对是否有合乎这两个条件的数据,如果有就返回对应的geoserver用户名geoserver拦截器接管到验证接口返回的用户名后,查问该用户领有的角色,再比对角色的权限中是否有本次申请的地图服务。有就返回数据,没有就打回。这样一整套流程下来,就实现了用geoserver,实现相似互联网地图那样的key验证形式来管制地图的拜访权限 施行步骤接下来具体介绍一下拦截器设置和用户权限设置。 geoserver的拦截器设置一次就行。 key、用户、角色是一一对应的,所以每次新增key时,都要去通过rest接口去新建用户和角色并设置角色的地图拜访权限。 拦截器设置这一步其实就是通过界面来配置geoserver的拦截器,分两步,一是配置拜访哪些地址时进行拦挡,也就是配置拦挡规定,二是配置拦挡下来后验证key是否无效,也就是配置验证规定 具体操作为先配置验证规定,再将验证规定增加拦挡规定中 配置key验证规定按下图操作 低版本geoserver可能没有authkey性能,须要去官网下载对应版本的Key authentication插件并手动装置 点击AuthKey后,会呈现下图中的界面 “1”那里本人轻易填一个,比方就叫做uuid_authkey。 “2”那里抉择webservice。这个选项的意思是,geoserver会应用内部接口验证key是否无效,到时geoserver会通过get形式将key传给内部接口,内部接口负责验证key是否无效,如果无效就返回用户名。 “3”那里配置内部接口的调用地址,geoserver调用时,会主动将{key}换成实在的key 其它选项放弃默认就能够 我用java写了个内部接口的示意代码,来大略阐明一下外面的逻辑,其实就是依据key获取geoserver用户名 身份验证设置完当前点击保留按钮,它就会呈现在上面的列表中。 配置服务拦挡规定接下来咱们配置拦挡规定,配置界面如下图: 咱们点击最上面的 default 把咱们方才设置的身份验证规定增加到 anonymous 规定后面 这个列表从上到下是身份验证的先后顺序,anonymous 的意思是任何人能够匿名拜访,如果把咱们新增的规定放到了anonymous 的前面,就不会起作用了。default外面能拦挡wms和wfs申请,但不会拦挡wmts和tms申请,咱们须要新建一个规定,用来拦挡wmts和tms申请。 wmts和tms属于瓦片缓存,归geowebcache治理,geowebcache的网络申请地址为 gwc,所以咱们新建拦挡规定时,规定设置为/gwc/**,而后将咱们的uuid_authkey用户验证规定增加上,名称轻易填一个,比方 tile,如下图: 留神:这个页面没有保留按钮,编辑后须要返回上一个界面进行保留。增加实现后,调整 tile 规定的地位,放到 default 下面,而后保留。 这样就实现了geoserver的key验证。 用户权限设置这里间接列出须要应用的rest接口地址 名称地址增加角色http://127.0.0.1:7200/geoserv...{role}增加用户http://127.0.0.1:7200/geoserv...用户指定角色http://127.0.0.1:7200/geoserv...{role}/user/{user}设置角色拜访权限http://127.0.0.1:7200/geoserv...应用rest接口时要留神两点: ...

November 11, 2021 · 1 min · jiezi

关于gis:演讲VIDEO大放送|如何打造实景三维高效业务支撑架构

近日,间断两场备受瞩目的测绘地理信息行业大会别离在武汉和青岛这两座魅力之都圆满闭幕。大会全面展现了测绘地理信息畛域的最新成绩以及测绘天文信息技术与互联网、大数据、物联网、云计算、人工智能等新技术相结合的利用案例分享。现场行业大咖星散,顶尖的硬件设施、软件技术、系统集成和解决方案应接不暇。走在特装展区,感触到我国的测绘天文信息技术失去了全方位的利用,推动地理信息服务走向公众,一种浓浓的民族自豪感油然而生。 焱融科技 作为独立的混合云文件存储厂商有幸参展,并失去行业内专家的认可,荣获优良供应商奖。性能和大规模并发是焱融 YRCloudFile 在 GIS 三维实景建模中一个典型的利用场景,通过高性能存储作为撑持,将大幅晋升地理信息我的项目的工作效率。现场焱融科技通过图文和视频的形式展示了公司残缺的业务体系和技术实力,剖析了实景三维应用层在业余利用系统软件撑持上,尤其是在根底 IT 资源层的计算和存储方面,企业所面临的存储难题。 据大会公布的产业报告,2020年,我国天文信息产业产值为6890亿元,同比增长6.4%。我国天文信息产业“十三五”以来规模继续扩充,总产值复合增长率为13.9%,天文信息产业放弃着稳固良好的势头。 GIS基础设施背景在十四五布局公布后,实景三维中国成为 GIS 摄影测量的新暴发点,多行业多利用场景正在逐渐丰盛,包含疆土、地矿、救灾、水利、数字城市、农业、林业、电力能源等。企业在数据获取到实景三维的成绩展示,贯通测绘的外业和内业全业务流程。各个环节都须要大量的 IT 技术和设施参加其中,而空三和建模又成为实景三维业务中对 IT 资源要求最高的阶段。 目前实景三维利用层面的倒退在大量业余测绘技术人才和业余利用系统软件的撑持上,曾经比拟成熟,而作为根底的 IT 资源层的计算和存储却倒退得非常迟缓,尤其是在存储层面,业务倒退面临数据存储瓶颈的问题。 焱融科技在服务于实景三维企业客户中,总结演绎出以下常遇到问题和痛点: 存储无奈保障足够的可靠性,存储的故障造成业务停滞,耽搁工作排期;存储无奈撑持大规模并行计算集群的拜访,业务在多个存储间拷贝,耽搁大量业务解决工夫;存储对空三和建模过程中没有优化能力,造成存储“越用越慢”;存储能力无奈追上业务倒退速度,外业增长大于内业解决能力。针对以上影响业务倒退的问题,行业 IT 建设上并没有很好的技术和解决方案,只能采取“多用人,少用零碎”的人海战术解决,行业亟需一个 GIS 行业实景三维业务的业余存储来撑持,解决实景三维大量图片和碎文件的场景利用,高并发需要以及优化对接业务软件的需要,比方 CC、Smart3D、Skyline 等实景三维软件。同时,存储还须要实现高性能扩大性能,满足业务倒退需要。 基于以上,焱融科技推出了 YRCloudFile 高性能分布式文件存储,采纳 SDS 架构原理,闭源核心技术,高效的数据管理存储机制,与 GIS 的实景三维完满符合。 焱融科技让存储无忧YRCloudFile 采纳分布式架构,实现了存储高牢靠个性,节点级抗灾能力,防止业务因常见的磁盘或者节点故障造成的业务停滞;已实现一套最小存储规模撑持600台服务器(1200张 GPU)并发拜访计算规模,将泛 HPC 在 GIS 畛域利用晋升到一个新台阶;对业务应用软件针对性优化,空三阶段下的“特色点提取”和“平差”等过程存储对应用软件的响应设计,最大化适应业务软件的个性;面对外业疾速倒退,每天大量航片回流到内业的压力下,内业持续实现存储性能疾速扩大,不会造成存储的割裂,YRCloudFile 具备性能随容量同步扩大的能力,满足业务疾速扩大的要求;采纳通用X86服务器硬件架构,保障用户对于运维简化要求和备件的良好供给,使用户领有更多的把控权;全栈式网络兼容反对,对于不同项目选择不同的性能网络设备和协定适配,最大化满足业务倒退须要。截至目前,焱融科技已单干测试过的应用软件包含 CC、Smart3D、Skyline 等等。针对这些软件采取了不同的优化办法,在生产过程中晋升近1倍以上的能力,让空三、建模整体效率晋升近 50%,整体工作排期压缩近一半工夫,帮忙大量国内客户晋升生产效率,降低生产老本。 GIS 实景三维存储那些事儿,你想晓得的都在这里 https://v.qq.com/x/page/r3304... 延长浏览:一篇文章通知你 GIS 存储如何选?

October 29, 2021 · 1 min · jiezi

关于gis:微信小程序添加外部地图服务数据

先上成果: 缘起应用微信小程序做地图相干性能的时候,有个需要是须要接入本人公布的地图服务。查看微信小程序地图组件文档,发现它对地图相干的反对很少,只有一些根底性能,比方增加点、线、面、气泡和一些惯例的地图事件监听,并没有增加地图服务相干的反对。 不过有了需要,也要想方法解决呀。 图层查问既然小程序不能间接增加地图服务,那就把图层数据查出来,而后通过增加点线面形式增加到地图,具体要怎么实现呢? 首先想到的是通过图层查问接口把所有数据查出来。 然而既然数据是按图层公布的,个别数据量都比拟大,把所有数据查问进去,一次性增加过多的数据到地图,地图组件会受不了从而变的卡顿,另外微信小程序单次setData()的数据不能超过1024kB,因而这种计划就不可取了。 矢量瓦片既然一次性申请数据量太大,是不是能够分批次申请呢?于是就想到了矢量瓦片。矢量瓦片对于做GIS的人来说,大家都很相熟了,这也是目前各种GIS产品对大数据量地图展现所采纳的次要形式。然而,咱们如何让不反对增加内部图层的小程序地图组件反对矢量瓦片呢? 查看地图组件相干文档,会看到其中有个regionchange事件,该事件是在地图视线扭转,也就是拖动、缩放地图时触发,它会返回以后中心点、缩放级别、地图范畴等信息。 获取瓦片接下来就是如何依据这些参数获取到矢量瓦片了。 假如,地图切图的原点是(originX,originY),地图的瓦片大小是tileSize,地图屏幕上1像素代表的理论间隔是resolution。计算坐标点(x,y)所在的瓦片的行列号的公式是: col = floor((x0 - x)/( tileSize*resolution))row = floor((y0 - y)/( tileSize*resolution))这个公式应该不难理解,简略点说就是,先算出一个瓦片所蕴含的理论长度LtileSize,而后再算出此时屏幕上的地理坐标点离瓦片切图的起始点间的理论间隔LrealSize,而后用理论间隔除以一个瓦片的理论长度,即可得此时的瓦片行列号:LrealSize/LtileSize。 具体代码如下: getTileXY: function (lon, lat, level) { let originX = -180; //坐标系原点的x的值, let originY = 90; //坐标系原点的y的值 //依据你本人对应的切片计划改,这个就是其分辨率resolution let resolution = [1.40625, 0.703125, 0.3515625, 0.17578125, 0.087890625, 0.0439453125, 0.02197265625, 0.010986328125, 0.0054931640625, 0.00274658203125, 0.001373291015625, 0.0006866455078125, 0.0003433227539062, 0.0001716613769531, 0.0000858306884766, 0.0000429153442383, 0.0000214576721191, 0.0000107288360596, 0.0000053644180298, 0.0000026822090149, 0.0000013411045074, 0.0000006705522537, 0.0000003352761269 ] let tileSize = 256 //这个值示意的是每张切片的大小,个别都是256 let coef = resolution[level] * tileSize; let x = Math.floor((lon - originX) / coef); // 向下取整,抛弃小数局部 let y = Math.floor((originY - lat) / coef); // 向下取整,抛弃小数局部 let tmsY = Math.pow(2, (level - 1)) - y - 1; return { x: x, y: y, z: level - 1, tmsY: tmsY }},这里能够看到我返回的数据中有一个y值,还有一个tmsY,这是因为WMTS、TMS两种形式调用切片时,传入的y值是不同的,不过两者之间是有能够转换的,也就是tmsY = Math.pow(2, (level - 1)) - y - 1,WMTS用的是这里返回的y,TMS用的是这里返回 的tmsY。 ...

October 27, 2021 · 2 min · jiezi

关于gis:mapboxgl-纠偏百度地图

缘起之前分享了mapboxgl 互联网地图纠偏插件,插件过后只集成了高德地图。 文章公布后,有小伙伴在后盾留言,心愿插件也能反对百度地图。 刚好国庆假期有工夫就钻研了一下。 插件加载瓦片原理首先,插件之所以可能正确的加载互联网地图瓦片,要害是依靠经纬度和瓦片编号的互转算法。 有了经纬度和瓦片编号的互转算法,插件就能依据以后地图窗口4个角的经纬度坐标,算出须要申请的瓦片编号。 再依据瓦片编号转经纬度的算法,算出申请到的每一个瓦片在地图上摆放的经纬度地位。 这样瓦片就能正确的显示在地图上了。 而后再监听地图范畴的扭转,当范畴扭转时,反复上述步骤,更新地图瓦片。 瓦片编码方式经纬度和瓦片编号的互转算法,在不同地图中是不一样的,这取决于不同地图的瓦片编码方式。 瓦片编码方式总结下来,能够分为4大类:谷歌XYZ、TMS、QuadTree、百度XYZ。 咱们之前集成的高德地图瓦片,采纳的就是谷歌xyz编码方式,这种编码方式,瓦片的坐标原点在世界地图的左上角,西经180 º北纬85 º左右,瓦片编号规定如下图所示: 谷歌xyz编码方式的经纬度和瓦片编号互转算法是公开的,详见:Slippy map tilenames,插件之前就是用的这个。 百度地图采纳的是本人的百度XYZ形式,瓦片坐标的原点在本初子午线和赤道的交汇处,瓦片编号规定如下图所示: 网上有人钻研了这4类瓦片编码方式的,经纬度坐标与瓦片编号互转算法,并在github上分享了源码。 咱们把百度的那局部互转算法拿来,退出到咱们的纠偏插件中,这样纠偏插件就能反对百度地图了。 纠偏后成果如下: 插件降级插件这次降级,除了新增百度地图以外,顺带把平时罕用的天地图、OSM和GEOQ也加了进来。 天地图是大地2000坐标系,能够在wgs84坐标地图上间接应用,误差很小。OSM地图间接是wgs84坐标,不须要纠偏。 所以它两个在插件中间接应用 mapboxgl 的原生接口,其它地图则应用咱们写的自定义图层接口。 GeoQ地图瓦片的编码方式和高德雷同,改个瓦片申请地址就能够。 把它们都收集到一起,看成果,真是爽歪歪 最初,在 mapboxgl 中还是举荐应用矢量瓦片,展现成果会好很多,下面的栅格瓦片举荐作为补充应用。 目前网上还没有收费的矢量瓦片地图资源,这个问题能够通过本地公布OSM地图矢量瓦片的形式解决。 本地公布OSM地图矢量瓦片的形式能够参考之前写的文章 OSM地图本地公布-环境搭建、OSM地图本地公布-如何生成各省市矢量地图 插件地址mapboxgl互联网地图纠偏插件 在线示例:http://gisarmory.xyz/blog/index.html?demo=mapboxglMapCorrection4 代码地址:http://gisarmory.xyz/blog/index.html?source=mapboxglMapCorrection3 总结之前分享的mapboxgl互联网地图纠偏插件只集成了高德地图,有小伙伴留言心愿反对百度地图。插件加载互联网地图瓦片的原理是基于经纬度和瓦片编号的互转算法。因为不同地图应用的瓦片编码规定不同,所以不同地图的经纬度和瓦片编号的互转算法也会不同。网上有人分享了不同地图中,经纬度和瓦片编号的互转算法,咱们把百度地图的互转算法拿来应用,这样插件就能反对百度地图瓦片的纠偏了。本次插件降级除了减少百度地图外,还减少了天地图、OSM地图和GeoQ地图。参考资料瓦片地图原理: https://segmentfault.com/a/11...国内次要地图瓦片坐标系定义及计算原理: https://cntchen.github.io/201...Slippy map tilenames: https://wiki.openstreetmap.or...原文地址:http://gisarmory.xyz/blog/index.html?blog=mapboxglMapCorrection4 关注《GIS兵器库》, 只给你网上搜不到的GIS常识技能。 本文章采纳 常识共享署名-非商业性应用-雷同形式共享 4.0 国内许可协定 进行许可。欢送转载、应用、从新公布,但务必保留文章署名《GIS兵器库》(蕴含链接:  http://gisarmory.xyz/blog/),不得用于商业目标,基于本文批改后的作品务必以雷同的许可公布。

October 11, 2021 · 1 min · jiezi

关于gis:cad文件转为GIS图层使用

1、应用到的工具1、91卫图2、geoserver3、udig 2、装置以上工具1、91 卫土官网下载http://www.91weitu.com/2、geoserver、udig网盘下载 :geoserver懒人包B站搜寻:都昏GIS 查看相应的装置教程 3、应用步骤1、cad转四参数法实现影像与矢量叠加套合http://help.qianfansoft.net/r...(scsf).html2、

October 7, 2021 · 1 min · jiezi

关于gis:GIS常用算法

作为一个GISer,在日常WebGIS开发中,会罕用到的turf.js,这是一个天文空间剖析的JavaScript库,常常搭配各种GIS JS API应用,如leaflet、mapboxgl、openlayers等;在后盾Java开发中,也有个比拟弱小的GIS库,geotools,外面蕴含构建一个残缺的地理信息系统所须要的全副工具类;数据库端罕用是postgis扩大,须要在postgres库中引入应用。 然而在开发某一些业务零碎的时候,有些需要只须要调用某一个GIS算法,简略的几行代码即可实现,没有必要去援用一个GIS类库。 而且有些算法在这些罕用的GIS类库中没有对应接口,就比方在下文记录的这几种罕用算法中,求垂足、判断线和面的关系,在turf.js就没有对应接口。 上面文章中是我总结的一些罕用GIS算法,这里对立用JavaScript语言实现,因为JS代码绝对比拟简洁,不便了解其中算法逻辑,也不便在浏览器下预览成果。在具体利用时能够依据具体需要,翻译成Java、C#、Python等语言来应用。 文中代码大部分为之前遇到需要时在网上搜寻失去,而后本人依据具体须要做了优化批改,通过这篇文章做个总结收集,也不便后续应用时查找。 1、罕用算法以下办法中传参的点、线、面都是对应geojson格局中coordinates,不便对立调用。geojson规范参考:https://www.oschina.net/trans... 1.1、计算两经纬度点之间的间隔实用场景:测量 /*** 计算两经纬度点之间的间隔(单位:米)* @param p1 终点的坐标;[经度,纬度];例:[116.35,40.08]* @param p2 起点的坐标;[经度,纬度];例:[116.72,40.18]** @return d 返回间隔*/function getDistance(p1, p2) { var rlat1 = p1[1] * Math.PI / 180.0; var rlat2 = p2[1] * Math.PI / 180.0; var a = rlat1 - rlat2; var b = p1[0] * Math.PI / 180.0 - p2[0] * Math.PI / 180.0; var d = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(rlat1) * Math.cos(rlat2) * Math.pow(Math.sin(b / 2), 2))); d = d * 6378.137; d = Math.round(d * 10000) / 10; return d}1.2、依据已知线段以及到终点间隔,求指标点坐标实用场景:关闭管段定位问题点 ...

September 10, 2021 · 6 min · jiezi

关于gis:GIS名词

https://blog.csdn.net/ununie/...

September 4, 2021 · 1 min · jiezi

关于gis:如何使用-GeoTrellis-和-React-构建地理处理应用程序

September 3, 2021 · 0 min · jiezi

关于gis:发布-mbtiles-存储的矢量瓦片

之前咱们分享过如何 在本地公布OSM矢量瓦片地图,外面介绍了生成的矢量瓦片会寄存在 .mbtiles 文件中,而后用 tileserver-gl 软件公布。 mbtiles 是基于sqllite数据库存储地图瓦片数据的标准规范,.mbtiles文件就是实现了这个标准的sqllite数据库。最近遇到个相干的问题,我的项目上须要将这份.mbtiles格局的矢量瓦片部署到客户服务器上并公布。 之前分享过我在用的 开源GIS解决方案,外面将 postgis、geoserver、tomcat 都搞成了绿色版,并且能够通过批处理脚本将它们一键注册成零碎服务,这样就造成了一个套开源GIS的绿色版安装包,部署时会很不便。 这套安装包的整体技术架构是偏 java 的,而这次公布矢量瓦片用到的 tileserver-gl 是基于 nodejs 开发的,按下面的思路,须要将 nodejs 也搞成绿色版的,并且能够应用批处理注册成零碎服务。 因为不想把安装包搞的太大,也不想用太多的技术体系,让前期保护变得复杂,所以就想能不能在现有的技术体系下搞定 .mbtiles 公布的问题。 按这个思路,须要去钻研有没有相干的geoserver插件,或是 java 的软件或我的项目。 上面是我钻研的具体过程,不想看过程的同学能够间接跳到开端看总结。 geoserver插件先钻研了geoserver插件,还真有。 geoserver有个mbtiles的扩大插件(https://docs.geoserver.org/latest/en/user/community/mbtiles/index.html),反对对.mbtiles文件的读写。 geoserver 装置 mbtiles 插件的教程能够参考这篇:https://blog.csdn.net/dyxcome/article/details/98375453从官网下载插件,装置测试后,发现跟想的有点不一样。 geoserver装置完插件后,新建数据源的界面多了两个 mbtiles 相干的选项,如下图,下面的是公布矢量瓦片,上面的是公布栅格瓦片。 我用第二个红框,公布栅格瓦片的选项,公布了下矢量瓦片,会报错。 用第一个红框,公布矢量瓦片的选项,能够走的通,但就是过程有点波折,须要把 pbf 中的图层再挨个公布一遍。 .mbtiles 文件中存的是解决好的 pbf 文件,按说插件只须要依据申请参数,从 sqllite 数据库中查问 pbf 文件,返回给前台就 ok 了。 但 geoserver 不是这么做的,它是将 .mbtiles 文件中的 pbf 瓦片作为矢量数据源来应用,相似于读取 .mdb 文件。 能够推理出,geoserver 外部的解决形式大略是: 先将 pbf 瓦片拼起来,读取拼接后的各图层原始数据把图层原始数据公布成 geoserver 的矢量瓦片服务前台调用矢量瓦片服务时,geoserver 把数据处理成 pbf 文件返回给前台怎么说呢,这么做和把 pbf 文件间接扔给前台相比,后果是一样的,但就是感觉 geoserver 的戏太足,内耗太重大,还有就是这个发服务的操作过程也很麻烦。 ...

September 2, 2021 · 1 min · jiezi

关于gis:mapboxgl-互联网地图纠偏插件三

先说论断,论断当然是:功败垂成,喜大普奔。看效果图: 好了,接下来说一下过程 先回顾一下这个系列的 第一篇 和 第二篇 第一篇是间接改的 mapboxgl 源码,在源码外面对瓦片的地位进行纠偏,遇到的问题是,地图旋转时会有错位,还有瓦片纠偏后屏幕边缘会有空白。 第二篇是写了一个 mapboxgl 自定义图层,遇到的问题是,地图在大比例尺时,瓦片会疯狂抖动。 这两篇文章收回后,有两位大牛针对下面的问题,给出了建设性的意见。 一位是思否上的网友“undefined”(这个不是bug,是他的名称),他在看了第一篇文章后,找出了地图旋转时瓦片错位的起因,并给出了解决办法。 依照下面的思路,我从新写了一个不蕴含旋转参数的 pixelMatrix 矩阵后,错位问题解决。 解决了错位后,接下来解决屏幕边缘呈现空白的问题。 我的思路是,在计算瓦片的显示范畴时,对显示范畴进行偏移,让程序按偏移的范畴去申请瓦片,这样后续瓦片纠偏后,就不会呈现空白区域了。 在二维地图中,瓦片显示的范畴是依据屏幕 4 个角的坐标间接计算的。但 mapboxgl 是三维地图,三维地图的显示范畴是依据相机的参数来计算的,须要判断相机视椎体和瓦片的相交关系,这里还没有整明确。 所以,这个计划就又卡这儿了。 另一位网友是 mapboxgl 技术交换群里的“可乐瓶里泡枸杞”,他指出了第2篇文章中,大比例尺时地图抖动问题的起因,并给出了解决思路。 上图的博客链接中具体阐明了地图抖动的起因,大略意思是:webgl 只反对 float32 精度,而 JS 默认是采纳 float64 精度,JS 中的高精度数字向webgl 传输时会造成精度损失,这种损失带来的影响就是地图抖动,比例尺越大抖动的越厉害。 如何能防止精度的损失?博客中介绍了 deck.gl 的做法: 将经纬度坐标转墨卡托坐标这一步,放到 webgl 中来实现,目标是为了应用 GPU 计算在比例尺大于12级时,不再间接应用墨卡托坐标,而是计算墨卡托坐标和屏幕中心点的绝对地位。应用 float32 的精度保留绝对地位是齐全没有问题的,这样就躲避了精度损失的问题重写 view 和 Projection 矩阵按这个思路,我将上次写的 mapboxgl 自定义图层纠偏插件进行了革新,最终大比例尺时地图不再抖动了。 但又很快遇到了新问题:拖动地图时,瓦片和鼠标的挪动间隔不统一。 返回去看那篇博客的在线示例,也有同样的问题 既然这样,那就解决问题吧,瞅了瞅代码,总感觉上面这两行不悦目, 不除 2 了试试,哈哈,一招命中,问题解决。 至此,mapboxgl 对高德地图瓦片纠偏的问题胜利解决,我把他封装成了插件,不便大家应用。GIS兵器库中又多了一件趁手的兵器。 ...

August 16, 2021 · 1 min · jiezi

关于gis:OGC标准-WMTS服务

示例申请 https://koordinates-tiles-a.global.ssl.fastly.net/services;key=d740ea02e0c44cafb70dce31a774ca10/tiles/v4/layer=7328,style=39/EPSG:3857/5/1/19.pngxml文档 <ResourceURL format="image/png" resourceType="tile" template="https://koordinates-tiles-a.global.ssl.fastly.net/services;key=d740ea02e0c44cafb70dce31a774ca10/tiles/v4/layer=7328,{style}/{TileMatrixSet}/{TileMatrix}/{TileCol}/{TileRow}.png"/><Style isDefault="true"><ows:Title>Weighted point styles</ows:Title><ows:Identifier>style=39</ows:Identifier></Style><TileMatrixSetLink><TileMatrixSet>EPSG:3857</TileMatrixSet></TileMatrixSetLink>采纳XYZ加载形式根本只须要这几个参数...

August 4, 2021 · 1 min · jiezi

关于gis:实用工具零代码实现地理坐标系转换

1 工具获取形式扫描点击上面链接,即可获取天文坐标系转换工具的下载地址。https://mp.weixin.qq.com/s/xZ... 2 工具介绍天文坐标系转换工具(下文称该工具)是一款可能让用户在不写代码的前提下实现不同天文坐标系之间转换的工具软件,目前反对WGS-84、GCJ-02以及BAIDU-09三个坐标系之间的转换。 3 工具应用步骤利用该工具实现天文坐标系转换有以下步骤: 点击选项卡中的批量坐标系转换(下图红框标注),进入天文坐标系转换页面 输出格局正确的坐标值到输出坐标文本框(下图红框标注) 输出坐标值的正确格局是【经度】+【,】+【纬度】,例如121.123,31.123,两头的逗号是英文逗号,坐标值与坐标值之间用空行分隔 如不明确正确输出坐标格局,点击示例数据按钮(下图红框标注),能够调用格局正确的测试数据到输出坐标文本框 坐标值输出实现后,在下图红框标注的单选框中抉择正确的输出及输入坐标系,这边的输出及输入坐标系不能雷同 点击转换按钮(下图红框标注)执行天文坐标系转换 呈现下图弹窗阐明地理坐标转换计算实现,能够在输入坐标文本框(下图红框标注)中失去转换后的坐标值 4 工具下一步开发计划引入地图零碎,反对坐标拾取。下一步打算退出地图零碎,用来反对不同天文坐标系的坐标拾取,不便用户的应用。退出更多坐标系。目前工具仅反对WGS-84、GCJ-02以及BAIDU-09三个坐标系之间的转换,将来打算退出更多坐标系(包含但不限于各种立体坐标系及中央坐标系)以满足不同用户的转换需要。

August 3, 2021 · 1 min · jiezi

关于gis:GIS常用数据分类

援用出自:https://blog.csdn.net/weixin_...

July 12, 2021 · 1 min · jiezi

关于gis:mapboxgl-互联网地图纠偏插件一

之前写过一个 leaflet 互联网地图纠偏插件,援用插件后一行代码都不必写,就能解决国内互联网地图瓦片的偏移问题。 最近想对 mapboxgl 也写一个这样的插件。 起因是本人公布的OSM矢量瓦片地图精度不够高,当须要放大地图查看详细信息时,就能够拿百度、高德的栅格瓦片做个补充。而应用它们的第一步就是要先纠偏。 去钻研了 mapboxgl 的底层代码,发现很多都看不懂。于是去恶补了 webgl 的常识,再去看 mapboxgl 的源码,哈哈,万变不离其宗,GIS常识还是那些,只是计算机绘制图形的形式变了而已。 钻研后,把指标锁定在了 transform.js 文件上,这个文件次要用来解决各种坐标转换问题,包含经纬度坐标、墨卡托坐标、屏幕坐标、webgl坐标等,还负责生成瓦片的编号。 文件中的 coveringTiles 办法就是用来计算瓦片的 x、y、z 编号的,它会返回以后比例尺和可视范畴内的所有瓦片编号。 依据 x、y、z 瓦片编号申请到互联网地图瓦片后,会在 calculatePosMatrix 办法里计算瓦片显示的屏幕地位。 mapboxgl 和 leaflet 的显示原理不同,mapboxgl 是三维坐标系,应用webgl绘图,减少了一个维度后,多出了很多货色要解决,二维坐标系加载瓦片时,只须要思考瓦片的 x、y 地位,三维坐标系在此基础上还要思考歪斜和透视。 webgl 的坐标都是通过地位变换矩阵来示意的,这一点和leaflet的差异很大。 下面的 calculatePosMatrix 办法就是依据瓦片的 x、y、z 编号,计算出瓦片在 webgl 中显示的地位变换矩阵。这里别离将瓦片的平移矩阵、缩放矩阵和视图+投影矩阵进行了相乘,失去了最终的地位变换矩阵。 看这个办法时我有些纳闷,它是如何依据瓦片的 x、y、z 编号来计算地位变换矩阵的,去钻研了xyz协定后,才明确xyz坐标和经纬度坐标是有一套互转公式的,瓦片编号转经纬度时返回的坐标是瓦片左上角的经纬度。详见:https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames 对于 webgl 变换矩阵的常识能够参考这篇文章 https://www.cnblogs.com/charlee44/p/11623502.html 或 《WebGL编程指南》,我更举荐后者,因为后者讲的更零碎更容易了解。 不得不说,webgl 的地位变换矩阵计算还是有一些简单的,所以就想看看 mapboxgl 中有没有内置经纬度坐标和 webgl 坐标互转的办法,查看后发现,只有经纬度坐标、墨卡托坐标和屏幕坐标三者互转的办法,没有 webgl 的。 那就曲线救国,先将经纬度转成屏幕坐标,再本人写个办法把屏幕坐标转成 webgl 坐标。 实现思路: 依据瓦片编号和经纬度的互转公式,计算出瓦片左上角的经纬度对瓦片左上角的经纬度进行纠偏,失去 wgs84 坐标的经纬度将纠偏前、后的经纬度别离转为屏幕坐标,再将转换后的屏幕坐标相减,得出瓦片屏幕坐标的偏移量将瓦片屏幕坐标的偏移量换算成 webgl 坐标的偏移量在瓦片的平移矩阵中加上方才计算出的 webgl 坐标偏移量,实践上就能实现对瓦片的纠偏在实现过程中,将 1、2、3 步搞定当前,因为临时还没有想好怎么实现第4步,于是就先将第 3 步的后果屏幕坐标偏移量,间接加到了第 5 步的平移矩阵中,后果很让人意外。 ...

June 18, 2021 · 1 min · jiezi

关于gis:如何不改源码让maputnik支持geoserver

前段时间分享了如何让矢量瓦片配图神器maputnik反对 geoserver,文章中的解决方案是,通过批改maputnik源码,在界面上减少tms协定选项,从而让maputnik反对geoserver公布的矢量瓦片。 前两天工作时发现,不批改maputnik源码,也能让它反对geoserver矢量瓦片。 原理如下: maputnik实质上是mapboxgl style文件的编辑器,style文件是个json格局数据。mapboxgl自身是反对geoserver tms协定矢量瓦片的,在style文件中进行相干配置就能够实现。maputnik中的地图应用mapboxgl实现,不反对geoserver是因为界面上没有配置tms协定的选项,导致无奈生成蕴含tms协定配置的style文件。maputnik反对style文件的导入、导出、编辑性能,咱们能够在配置geoserver数据源后,导出style文件,在style文件中手工增加tms协定相干配置,再导回maputnik,从而让它反对geoserver矢量瓦片。具体操作办法如下: 关上maputnik,配置geoserver数据源。把style文件下载到本地。关上下载的style文件,在source中找到刚增加的geoserver数据源,手动增加tms协定选项。从新导入style文件。后续增加的geoserver图层就能失常显示了。和之前批改源码的计划比拟: 这次的计划简略灵便,普适性强,后续再遇到相似mapboxgl反对但maputnik不反对的问题,都能够应用这种形式疾速解决。批改源码的计划对于react框架不熟的同学可能比拟吃力,但如果解决了,后续应用就会很不便,一劳永逸。docker版本的maputnik,无奈批改源码,只能应用这次的计划解决。总结: style 文件是 maputnik 和 mapboxgl 连贯的惟一纽带。maputnik 实质上是一个mapboxgl style 文件的编辑器。maputnik 没有笼罩到 style 文件的所有选项,导致它不反对geoserver的矢量瓦片。maputnik 没有笼罩到的选项,能够通过导入、导出性能,手工编辑 style 文件来实现。<br/> <br/> 原文地址:http://gisarmory.xyz/blog/index.html?blog=maputnikGeoserverVectorTiles2 关注《GIS兵器库》, 第一工夫取得更多高质量GIS文章。 本文章采纳 常识共享署名-非商业性应用-雷同形式共享 4.0 国内许可协定 进行许可。欢送转载、应用、从新公布,但务必保留文章署名《GIS兵器库》(蕴含链接:  http://gisarmory.xyz/blog/),不得用于商业目标,基于本文批改后的作品务必以雷同的许可公布。

May 7, 2021 · 1 min · jiezi

关于gis:PostGIS管网连通性分析

GIS在管网数据中的很重要的一个利用方向就是”管网空间剖析“,其中包含连通性剖析、上下游剖析、爆管剖析等等。上面是我应用postgis来实现该“管网连通性剖析”的解决方案,分享给大家,以便互相学习。 应用该剖析之前确保已增加扩大postgis、pgrouting CREATE EXTENSION postgis;CREATE EXTENSION pgrouting;导入数据将数据导入到postgreSQL数据库,我是从ArcGIS间接导入的,导入形式参考https://blog.csdn.net/eternity_xyf/article/details/80168029 创立拓扑这里我用的管网数据表名为pipe 创立拓扑,生成pipe_vertices_pgr,该操作相似于ArcGIS中创立路网数据。 为pipe增加管段起始编号pgr_source、完结编号pgr_target、管段长度pgr_length三个字段,其中管段长度是用于剖析的权重值。 --增加终点idALTER TABLE postgres.pipe ADD COLUMN IF NOT EXISTS pgr_source integer;--增加起点idALTER TABLE postgres.pipe ADD COLUMN IF NOT EXISTS pgr_target integer;--增加权重值ALTER TABLE postgres.pipe ADD COLUMN IF NOT EXISTS pgr_length double precision;为pgr_source、pgr_target创立索引 --为pgr_source字段创立索引CREATE INDEX IF NOT EXISTS pgr_source_idx ON postgres.pipe("pgr_source")--为pgr_target字段创立索引CREATE INDEX IF NOT EXISTS pgr_target_idx ON postgres.pipe("pgr_target")为权重字段pgr_length赋值 --为pgr_length赋值,shape为几何类型的字段,可能为shape、the_geom,通过ArcGIS导入的时候字段为"shape",其余形式导入时个别为"the_geom"update postgres.pipe set pgr_length = public.st_length(shape)调用pgr_createTopology办法,创立拓扑,这个步骤会为pgr_source和pgr_target字段赋值,同时生成节点表pipe_vertices_pgr --为指标表创立拓扑布局,即为pgr_source和pgr_target字段赋值select public.pgr_createTopology('postgres.pipe',0.000001,'shape','objectid','pgr_source','pgr_target')计算联通性依据终点坐标、起点坐标从pipe_vertices_pgr查问最近的终点、起点标识 调用pgr_kdijkstraPath函数,查问出终点、起点联通的线。 通过这里咱们能够看出,该剖析的外围是调用了pgrouting扩大中的求最短门路的函数pgr_kdijkstraPath,该函数用的是是Dijkstra算法,通过已增加的索引pgr_source和pgr_target以及权重值pgr_length,计算出两点之间的最短门路,如果有最短门路,证实两点联通。 该剖析可用于计算给水管网、排水管网、输油管道等管网数据的两节点的连通性,当然也可用于路网的最短路径分析。 函数脚本下面为整体剖析思路,当初将上述思路整顿成函数,方便使用 创立拓扑函数:analysis_updatetopology()计算连通性函数:analysis_connect()如何应用调用analysis_updatetopology()函数,实现拓扑创立 ...

April 27, 2021 · 1 min · jiezi

关于gis:我的开源GIS解决方案之路

好久没更新了,因为我在--憋--大--招--,对,就是明天这篇。 明天跟大家分享一下我的开源GIS解决方案经验。 --额-- 思考到单聊技术解决方案你可能会很快睡着,所以我明天会把重点放在我封装地图API这个事件上,以封装地图API的经验为线索,穿插着讲一些过后用到的开源GIS架构。 文章略微有点长,如果你只是想理解一下最新的开源GIS架构,能够间接跳过后面,去看第五版和最初的总结,但我倡议你还是从第一版开始看,因为没有后面的 4 个版本就不会有第五版,只看总结就和读名言警句成果一样,看的时候感觉有情理,过后就忘了,因为不能感同身受。 缘起我始终在传统IT行业的公司工作,公司都是以做政府我的项目为主,俗称toG业务。 这种公司里,GIS在其中的利用通常为两种,一种是GIS联合公司的业务造成一个xx地理信息系统,或是xx一张图零碎,另一种是联合公司业务封装一套地图API,为公司的其它业务零碎提供地图技术撑持,相似于高德地图API、百度地图API。地图API的背地通常有一套GIS解决方案作为撑持 明天咱们就来聊一聊封装地图API这点事。 从我封装的第一个地图API版本诞生到当初,曾经过来了7年工夫,两头经验了 3 家公司,迭代了 5 个版本。5 个版本中,第 1 个版本应用的ArcGIS,前面 4 个版本次要应用的开源GIS。 第一版 2014年背景公司做环保业务,业务零碎次要用C#开发,业务零碎中波及地图的局部应用ArcGIS Flex API开发,由GIS开发人员负责。那个年代,地图还次要是用Flex开发,因为Flex在那时给人感觉是很炫酷。 随着我的项目的减少,发现很多业务性能在我的项目里是通用的,再起初发现,如果把业务性能和地图功能拆散,再把Flex编写的地图功能封装一套面向JS的接口,C#开发人员就能够本人实现地图相干的工作,不必受Flex语言的限度了。 于是咱们筹备封装一套用Felx编写的,面向C#开发人员的JS地图API。 技术架构前台应用ArcGIS Flex API开发地图功能,Flex反对和JS交互,利用这一个性将Flex开发的地图功能,封装成面向JS的接口。地图后盾应用 ArcGIS Server,空间剖析应用 GP 服务。空间数据库应用 Arc SDE。开发了一个简略的帮忙网站,提供前台JS接口的调用示例和应用阐明。经验总结地图API公布后,在做技术支持的过程中发现一个乏味的景象,对于地图API的应用,齐全不懂GIS的高级C#开发人员感觉好用,起因是能帮他们解决问题,有艰难时能够随时找咱们技术支持。 理解一点GIS的中级C#开发人员感觉不好用,他们会拿咱们的地图API和ArcGIS JS API比照,感觉后者更好用,但因为ArcGIS JS API的地图偏丑,咱们也不提供技术支持,须要他们本人去钻研,最终还是抉择用咱们的地图API。 理解一点GIS的高级C#开发人员根本不必,其中有两个共事的反馈令我印象粗浅,一个共事说:”你们本人开发的货色,本人都不必“。话中有话是,你们本人都不必的货色不会好用。但咱们的想法是,把Flex封装一套JS的地图接口是因为Flex入门有门槛,咱们GIS开发人员既然都会Flex了,而且咱们开发的地理信息系统,整个都是用Flex开发的,那必定是间接用ArcGIS Flex API会更灵便,所以不必。 还有一个共事更牛,他间接去钻研Flex,不会的就问咱们,入门后间接封装了一套地图接口本人用。咱们钻研过他封装的接口,尽管性能简略了些,但定义接口时的出发点感觉显著和咱们不一样,咱们是站在性能的角度封装,尽量保障接口的复用度高,比方增加点,增加线,缓冲等性能。他是站在用户的角度封装,比方从数据库查出来一堆数据,把这堆数据间接丢给接口,就在地图上展现进去了。总体而言,他的接口封装度更高,更贴近他的理论应用习惯,而咱们的接口更像是把ArcGIS的Flex接口翻译了一套JS的。 还留神到一个景象,常常有应用咱们接口的业务开发人员跑过来问,为什么我的地图不显示?经验的多了,发现通常有两种起因,一种是地图服务的地址不对,过后的地图服务都是用ArcGIS server公布的,ArcGIS server地图服务的rest地址是个网页,这个网页关上后,有很多级的链接地址,业务人员不晓得应该拷贝哪一级的地址,常常拷错,所以地图出不来。另一种是,增加多个地图时,地图间的坐标不统一,导致增加的地图不显示。 想想也是,地图服务和地图坐标这些常识对于不懂GIS的开发人员来说还是挺难的。 尽管第一版有这样那样的问题,但在过后还是晋升了部门的整体工作效率。不光是C#开发人员能够本人去开发地图功能了,GIS组外部也通过这种模式,把扩散在各个我的项目中的技术成绩收集了起来,并一直的积攒欠缺。 第二版 2016年背景换公司了,新公司做网安业务,有海量定位数据,GIS在其中的作用是,对定位数据进行提取、剖析、展现,从而帮忙客户解决业务问题。 公司的所有零碎必须部署在客户内网,客户的内网是无法访问互联网的,而地图应用的又是互联网地图,这就须要把互联网地图瓦片下载下来,拷贝到客户内网公布。 公司有一个GIS利用零碎,和GIS强关联的业务功会能放在这里。另外,其它部门有地图功能需要时,也会找到咱们GIS部门,这个场景和上家公司很像。 所以,二话不说,第二版地图API走起。 技术架构这一版开始应用开源GIS。GIS前台抉择了openlayers,有了第一版的教训,这一版重点解决了地图资源问题,和地图坐标问题。 解决地图资源问题。对立治理底图资源,提供多种互联网地图,包含高德地图、谷歌地图、天地图等,每种地图有个id,初始化地图时,依据id应用不同的底图。解决地图坐标问题。对外对立应用wgs84坐标,地图API外部负责将wgs84坐标转换为和底图匹配的坐标,包含gcj02坐标、bd09坐标等。GIS后盾方面,因为定位数据都寄存在大数据框架的数据库中,后盾只有互联网离线地图瓦片须要公布,所以间接应用了tomcat公布瓦片,再在openlayers中写一个加载本地瓦片的性能,这就算GIS后盾了。没有应用空间数据库,空间剖析应用ArcGIS Engine开发控制台程序,再用Java后盾调用控制台程序。接口写了具体的阐明文档和调用示例。没有做包装,间接是word文档+html示例文件。经验总结解决地图资源和坐标问题,能够大大晋升用户体验。对于地图下载器,尽管大家都有能力本人写一个进去,但真的挺不划算的,最好的解决方案就是花公司的钱去买一个许可,站在公司的角度这都没几块钱。ArcGIS Engine的版本,C#版的比较稳定,Java版的超级难用,十分不稳固,动不动就死给你看,更不要尝试去把它部署到Linux服务器,不要问我是怎么晓得的。我过后为了在linux上部署,先开发了一版java的,部署后一天解体好几次,动不动就内存溢出,基本没法用,没方法只能从新写了一版C#的部署在windows服务器上。第三版 2017年背景换公司了,新公司做管网业务,相比后面两家,业务和GIS的相关性更强一些,业务中须要对管网GIS数据进行编辑、存储、公布和利用。公司之前地图都是应用ArcGIS开发的,正在筹备转开源GIS,于是我到公司后就牵强附会的开始了第三版地图API的开发。 在开发之前,我先认真钻研了高德和百度地图API,并问了本人两个问题: 一、为什么非GIS开发人员,可能用高德、百度地图API解决问题,却用不了ArcGIS,openlayers,leaflet? 二、非GIS开发人员在用互联网地图API时遇到了哪些问题? 上面是我本人的了解: 第一个问题是因为:1、非GIS开发人员不须要本人公布地图数据,地图都是官网提供的,只管用就行。2、互联网地图API的帮忙文档和示例都是中文的。 第二个问题,我本人尝试应用后发现:1、互联网地图API的离线应用是个问题,它们都只能在线应用,如果遇到不能拜访互联网的状况,就无奈应用了,这问题在toG业务中还是挺常见的。2、互联网地图API只能用官网提供的地图坐标,不能集成其它坐标的地图资源。 从这一版起,咱们开始尝试在用户体验上对标高德、百度地图API,学习对方的长处,防止对方的问题。 技术选型GIS前台没有再持续应用openlayers,而是转向了更为笨重的leaflet,过后的思考是: leaflet很玲珑,外围代码构造简略容易了解,可塑性强,适宜拿来革新为本人的API。leaflet能够同时兼容web端和挪动端。有esri保护的leaflet插件,能更好的兼容公司之前公布的ArcGIS地图服务。GIS后盾抉择了geoserver。因为geoserver的材料比拟丰盛,能同时反对postGIS和SDE空间数据库。 GIS空间数据库抉择了 postGIS,空间剖析也次要应用 postGIS 的空间剖析函数实现。 ...

April 2, 2021 · 1 min · jiezi

关于Cesium:10秒钟搭建-Vite-Cesium-开发环境

晚期想用前端风行的形式开发 Cesium 我的项目要跟着官网这个英文教程配置 webpack。 就算是很相熟webpack至多也得折腾10分钟。 而且据说webpack降级到5还不好用了。 起初我本人配置了 rollup 环境晋升了不少,再起初看见了尤大发的 vitejs是基于rollup的,我就给其写了一个插件 vite-plugin-cesium 并配了一篇文章叫 一分钟搭建 Vite + Cesium 开发环境 。 说是1分钟,起初我本人看了一下还是挺麻烦的,还要本人搭建 vite,配插件。 所以明天又进了一步,又写了一个脚手架。当初只有在命令行里运行 yarn create cesium或者用 npx npx create-cesium 10秒钟足够创立一个新 Cesium 我的项目了。 并且蕴含了 TypeScript 和 JavaScript 两种抉择。自带 Cesium ES6 API 语法提醒,自带 dev server,保留代码实时刷新。编译速度秒杀所有形式。 喜爱请去俺的 github点个赞 https://github.com/nshen/crea... 谢谢

April 1, 2021 · 1 min · jiezi

关于gis:2021给自己立个Flag

方向一:机器学习 定个小指标(挖个坑),应用机器学习技术,依据影像地图主动提取建筑物轮廓,用开源库实现。 方向二:地图可视化 钻研 WebGL 技术,切入点 MapboxGL、Three.js、deck.gl 这个临时还没有想好该如何挖坑,就先插个旗子,遇坑填坑 以上两个方向,有阶段性成绩,或填坑心得时,会写进去和大家分享。 最初祝大家在新的一年里,写代码没有bug,牛气冲天,工资翻倍! 原文地址:http://gisarmory.xyz/blog/index.html?blog=GISer2021Flag 关注《GIS兵器库》公众号, 第一工夫取得更多高质量GIS文章。 本文章采纳 常识共享署名-非商业性应用-雷同形式共享 4.0 国内许可协定 进行许可。欢送转载、应用、从新公布,但务必保留文章署名《GIS兵器库》(蕴含链接: http://gisarmory.xyz/blog/),不得用于商业目标,基于本文批改后的作品务必以雷同的许可公布。

February 19, 2021 · 1 min · jiezi

关于gis:一个GISer的使命

GISer有本人的技术晋升门路,如果想在GIS这条路上始终走上来,请不要遗记低头看路。不同于java工程师、前端工程师等有明确的编程语言,GISer的工作更像一个全栈工程师。js、java、C#、Android、python如同都要会一些,但如同哪个都不是很精通。 这时候GISer常常会迷茫,我应该深刻学习哪个,我应该向哪个方向致力,我应该如何晋升本人。 身边有很多GIS业余的敌人,很多都不再做GIS了,有去做Java的,有去搞前端的。一个曾经转Java的敌人,在团聚时埋怨,毕业后去搞GIS就是个谬误,应该间接去搞Java。 造成这种景象的起因有很多,其中一个起因是,大家很容易用软件开发人员的规范去掂量一个GIS开发的价值,包含GISer本人也常常这样想。 GISer的价值那应该用什么规范来掂量GISer的价值呢? 咱们无妨换个角度来思考 编程语言、业余软件其实都只是个工具,要害是你能用这些工具解决什么问题 GISer的使命就是用这些工具去解决地图相干的问题 解决地图问题的难度等级,就能反馈了一个GISer能力 解决地图问题所发明的价值,就造成了一个GISer的价值 该学什么当本人不晓得该学什么的时候,无妨看看有哪些GIS问题是本人解决不了的 上面轻易列举了一些常见的地图问题,大家能够做个参考 业务零碎中有个性能,须要在地图上标记一下地位。还是下面的需要,零碎在内网部署,不能拜访互联网。客户有大量的测绘数据,须要个网页零碎展现。这些测绘数据要能在网页零碎中批改。下面的数据,还须要一个CS系统对数据进行查看、剖析。还须要一个手机端,查看数据,并能上报谬误。还须要一个大屏展现零碎,用三维GIS展现数据。三维GIS展现零碎要炫酷,要看上去向电影的那种。还是下面的需要,公司为了升高我的项目老本,决定应用开源GIS软件实现。送货的司机,用高德地图一次只能导航一个目的地,他想要一次导航多个,还要能避开早晚顶峰。通过机器学习,主动从遥感影像上提取建筑物、路线、绿地、河流等矢量数据。公司决定打造一套本人的互联网地图,对标百度地图、高德地图。。。还有一种办法就是,多去求职网站上看看,对GIS开发的技术要求,再联合薪资比照一下,你就晓得该学什么了 技术晋升门路分享一下我本人总结的GISer技术晋升门路,颗粒度比拟粗,仅供大家参考 我感觉GISer的技术晋升门路能够分为四个大的阶段 阶段一,能应用商业GIS软件去解决问题。比方ArcGIS,超图等。 阶段二,能应用开源GIS软件去解决问题这里并不是说开源GIS比商业GIS厉害,恰恰相反,开源GIS软件不像商业软件有欠缺的阐明文档,和弱小的技术支持团队,很多货色须要本人去钻研摸索。 所以开源GIS是对GISer的要求更高,须要GISer有更强的开发能力,对GIS的原理要有更深的了解。 还有就是开源GIS能让你有机会接触到GIS底层的代码,对能力晋升有很大的帮忙。 阶段三,有能力去解决开源GIS中的问题这个阶段你会发现网上曾经没有了那么多现成的答案,你开始习惯去翻看英文材料。 开源GIS的源码,也从之前天书个别,缓缓变得亲切起来,可能看懂其中的前因后果。 你开始可能解决开源GIS软件中的bug,开始可能为开源GIS贡献力量。 这阐明你开始缓缓具备了GIS底层的开发能力。 阶段四,有能力去解决GIS行业前沿问题这个阶段曾经没有太多现成的GIS材料,更多的是须要钻研计算机常识、数学知识和GIS理论知识,你要去把它们整合起来,利用这些常识和工具,去解决没有人解决过的问题。 这是很耗精力的一件事,你只能依据本人的趣味,把精力聚焦在某个方向上,比方晋升地图的展现成果,或者进步矢量地图的生产效率等,只有在某个小点上有所突破,你就会有无比的成就感。 这个阶段,你的关注点又从新回到计算机领域,不同的是这次你指标清晰,不再迷茫。 最初还想多说一句,GISer的现状通常是一半的GIS开发,一半的全栈开发,而后天天在做我的项目。 把工夫花在哪里,就会在哪里有播种,如果想始终做GIS,请在GIS开发上多花工夫。 最初,想揭示各位GISer,也包含我本人 GISer有本人的技术晋升门路,如果想在GIS这条路上始终走上来,请不要遗记低头看路。 原文地址:http://gisarmory.xyz/blog/index.html?blog=GISerMission 关注WX《GIS兵器库》, 第一工夫取得更多高质量GIS文章。 本文章采纳 常识共享署名-非商业性应用-雷同形式共享 4.0 国内许可协定 进行许可。欢送转载、应用、从新公布,但务必保留文章署名《GIS兵器库》(蕴含链接: http://gisarmory.xyz/blog/),不得用于商业目标,基于本文批改后的作品务必以雷同的许可公布。

February 2, 2021 · 1 min · jiezi

关于gis:如何创建-mapbox-精灵图

缘起后面文章介绍了如何在本地公布OSM数据,并应用 maputnik 自定义 mapbox 格局的地图款式。在应用 maputnik 配图时,如果想要应用本人的图片作为地图符号,就须要制作精灵图。 精灵图的制作工具有很多,在线网站就有一大堆,但普遍存在一个问题,maputnik 对精灵图的要求是要有精灵图和阐明精灵图中图片信息的json配置文件,而这些在线网站的工具,只能生成精灵图,没有json配置文件。 mapbox精灵图工具mapbox开源了一个精灵图制作工具 spritezero,这个工具能够生成精灵图和对应的json文件。spritezero 的输出文件是svg文件,输入文件是指定比例的精灵图和对应的json文件。 我本人在装置 spritezero 这个工具时总报错,翻看它的 issues 发现很多人都碰到了这个问题。起因是用到的一个类库太老了,我最终解决办法是另辟蹊径,找了一个它的docker库 spritezero-docker , 这个docker库里曾经把 spritezero 的环境配置好了,间接用就行。 spritezero-docker 应用办法上面的操作步骤是基于linux零碎 克隆库 docker pull dolomate/spritezero在当前目录创立 ./data/sprites/_svg 文件夹把svg文件放在 ./data/sprites/_svg 文件夹中,svg文件的名称不要太随便,名称会被写入json配置文件,后续应用时会用到。在当前目录执行命令,生成精灵图: docker run -it -e FOLDER=_svg -e THEME=sprites -v ${PWD}/data:/data dolomate/spritezero生成的精灵图会寄存在 ./data/sprites 文件夹中精灵图黑框问题查看生成的精灵图,你可能会碰上下图中的问题:只有彩色轮廓 一通排查,发现下面问题的起因是:在svg代码中,style的写法问题。style独自写不行,须要内嵌到dom元素中,如下图: 解决办法,用 AI(Adobe Illustrator) 软件导出SVG文件时,CSS属性栏抉择“款式属性”,style就会内嵌到dom元素中了。下图是导出时的正确选项,更深刻的能够参考这篇文章 在 maputnik 中应用生成的精灵图把生成的精灵图用web服务器公布进去,我用的tomcat。记得解决web服务器的跨域问题,不然调用时会报错。配置精灵图公布的门路,如下图 抉择一个symbol类型的符号,在 Image 选项的下拉框中,会间接显示精灵图中的图片名称,这个图片名称就是后面让大家起名不要太随便的SVG文件名称。 总结:在用 maputnik 配图时,如果想自定义地图符号,就要本人制作精灵图网上的精灵图制作工具,广泛只能生成精灵图,没有json配置文件,而 maputnik 须要json配置文件mapbox开源了一个精灵图制作工具 spritezero ,生成的精灵图有json配置文件spritezero 在装置时会报错,起因是用到的一个库太老了spritezero-docker 是spritezero的docker库,曾经解决了装置环境问题介绍了如何应用 spritezero-docker 生成精灵图生成精灵图时,如果呈现黑框问题,多半是因为style的写法问题。style须要内嵌到dom元素中介绍了如何在 maputnik 中应用生成的精灵图相干连贯:如何在本地公布OSM数据:http://gisarmory.xyz/blog/index.html?blog=OSMVectorTilesspritezero库github地址:https://github.com/mapbox/spritezerospritezero库装置报错的问题:https://github.com/mapbox/spritezero/issues/84spritezero-docker库github地址:https://github.com/macteo/spritezero-docker如何正确用AI导出SVG文件:https://cloud.tencent.com/developer/article/1007666原文地址:http://gisarmory.xyz/blog/index.html?blog=maputnikSprites ...

January 14, 2021 · 1 min · jiezi

关于gis:不用转换直接在地图上显示数据库中带地理坐标的数据表

1. 概述现如今,各种利用根本都采纳了数据库来存储数据,明天咱们就来讲一下如何将数据库中的带地理坐标的数据表数据在地图上间接显示进去,不必进行数据转换哟,操作简略,个别人都能学会哈。 2. 实操办法数据库个别分为一般关系型数据库、天文空间数据库。 一般关系型数据库,如MySQL、PostgreSQL、SQL Server等。 天文空间数据库,该数据库反对天文因素的存储,反对将天文空间因素(如点因素、线因素、面因素)间接作为一种类型存于数据库中,并反对空间运算操作。天文空间数据库个别是在一般关系型数据库的根底上退出空间扩大模块,如带空间扩大的MySQL数据库(Mysql Spatial extension)、带空间扩大的Oracle数据库(Oracle Spatial)、带空间扩大的PostgreSQL数据库(PostGIS)、带空间扩大的sqlite(Spatialite)等,这种扩大后的空间数据库,就是在原有的关系型数据库根底上,加载扩大模块,而后就能反对天文因素的间接存储,并反对空间操作,如查问最近的因素、缓冲区剖析、最短路径分析等。 个别罕用的地理信息软件都反对读取天文空间数据库,能够将存储的天文数据,间接显示进去,这些软件如ArcGIS、QGIS、超图等,这个就不介绍了。 然而,如何将一般关系型数据库中的地理坐标数据表数据在地图上展示进去,这个个别人还真不会,因而,本文着重介绍一般关系型数据库中存储的地理坐标数据,如何在地图上间接显示进去。 假如有一个带地理坐标数据的树木信息表,表名为tree,字段有:id, x, y, tree_type,上面以罕用的ArcGIS/QGIS软件为例来阐明如何间接显示坐标数据。 2.1 ArcGIS间接显示地理坐标数据表ArcGIS是一款功能强大的商用地理信息软件,软件失常装置后,须要购买受权能力应用,本文示例采纳ArcGIS 10.2版本。 点击菜单“File”,“Add Data”,“Add XY Data”,Look in抉择“Database Connections”,点击“Add Database Connection”。进入数据库连贯对话框,可抉择不同的数据库DB2/SQL Server/PostgreSQL等,有点遗憾,不反对MySQL。抉择要连贯的数据库类型,填写相应的参数,即可。不过,这种数据库连贯形式要求先装置相应数据库的客户端软件才能够。我这边本机没有装置这些数据库客户端软件,所以就不进行具体阐明了。以下采纳Excel中的坐标文件显示为例(可先将数据库中带坐标的表导出为CSV文件)。 点击菜单“File”,“Add Data”,“Add XY Data”,Look in抉择“Folder Connections”,左边按钮“Connect to Folder”,抉择CSV所在的目录,抉择要显示的CSV文件“tree.csv”,XY字段会自动检测并填入,若不正确能够手工抉择XY所在的字段。确定后,该数据表则作为矢量图层退出,能够像其它失常矢量图层一样显示、操作。 2.2 QGIS间接显示地理坐标数据表QGIS是一款开源的地理信息软件,性能与ArcGIS靠近,在Windows、Mac、Linux、BSD和手机上均能装置应用,软件装置容易、使用方便。 在QGIS中显示天文数据的办法为:将数据库带地理坐标的表作为虚构图层展现,并在SQL中用MakePoint函数将坐标动静生成天文因素geomettry。具体操作办法如下:第一步:将带地理坐标的图层作为数据表退出到图层中。 点击菜单“layer”, “Data Source Manager”,右边抉择“Vector”,左边“Source Type”抉择“Database”,编码Encoding抉择“UTF-8”,数据库类型“Type”抉择“MySQL”,而后点击“New”按钮,新建一个MySQL连贯,输出名称Name、主机Host、数据库Database、端口Port、认证信息如用户名、明码等,点击数据库测试按钮“Test Connection”,若参数配置正确,则会连贯胜利,否则请查看数据库连贯参数。连贯胜利后,点击“Add”按钮,抉择要退出图层的表,在我这个例子中抉择“tree”,点击“Close”敞开数据源对话框。此时,图层Layers中曾经有方才退出的数据表,该表还只是列表模式,无奈在地图上显示出坐标。 第二步:将数据表生成虚构矢量图层显示点击菜单“layer”, “Add Layer”,“Add/Edit Virtual Layer”, 点击“Import”,抉择方才的这个数据库图层确认退出,此时该数据表会退出Embeded Layers的列表中,双击这一行中的Local name,进入批改模式,将该名称批改为简略的名称如“tree_table”,便于下一步应用。而后在Query面板中,输出相应的SQL语句,如select id,make_point(x,y) as geometry, tree_type from tree_table,示意从下面的数据库中生成带天文因素geometry的虚构图层,该天文因素由数据库中的x,y列造成点天文因素。最初点击“Add”将该虚构图层退出Layers列表,此时该图层即可像失常的矢量图层显示出数据表中的坐标数据了,也可调整其符号显示等,与失常的矢量图层一样操作了。 对于不是间接辨别出的X、Y字段,能够采纳SQL函数进行拆散即可。 ...

December 27, 2020 · 1 min · jiezi

关于gis:OSM地图本地发布如何生成各省市矢量地图

1、缘起openmaptiles提供了一套OSM数据应用的残缺解决方案,在后面文章如何实现OSM地图本地公布并自定义配图中,咱们具体介绍了如何装置openmaptiles,并生成了一个阿尔巴尼亚地区的“helloworld”。参照上篇文章的内容,输出上面的命令,就能够生成中国地图。 ./quickstart.sh china 下面命令,须要急躁期待,我电脑4核8G,用了16个小时左右。最终失去了中国大陆地区,0-7级的矢量瓦片数据。openmaptiles次要是从geofabrik网站下载OSM数据,geofabrik在中国地区下载的最小颗粒度是中国大陆和台湾,没有方法按大陆地区的省,或按自定义区域进行下载。2、问题能不能按自定义区域生成地图?有哪些办法能进步处理速度?3、剖析openmaptiles生成地图分4个步骤:1、数据下载、2、数据入库、3、数据分析、4、生成矢量瓦片。问题一剖析: 前三个步骤,只能按整个中国的范畴和所有层级来解决,第4步能够通过管制范畴、层级来实现自定义区域的切图。问题二剖析: 第1步数据下载的工夫取决于网速。第2步数据入库和第3步数据分析的工夫取决于机器性能。第4步生成矢量瓦片的工夫取决于机器性能、切图范畴、切图层级。想要进步处理速度,能够针对下面的因素,隔靴搔痒。4、生成自定义地区矢量瓦片后面的./quickstart.sh china 命令蕴含1-4步,后续就不要再执行这个命令了,不然又得重来16个小时。后面曾经提到过,这个命令在第4步,默认会切整个中国范畴0-7级的地图。想要更大层级的地图,只须要另外独自执行第4步就能够。openmaptiles生成的矢量瓦片,最大到14级,设置再大也没有用,因为前三步没有对更大级别的数据进行剖析。第4步生成矢量瓦片的命令,会把上一次的瓦片革除,如果想把两次的后果放在一个文件中,比方想把中国0-7级和北京8-14级的矢量瓦片放在一个.mbtiles文件中,则须要批改配置,让程序不革除上一次的后果。上面以生成全国范畴0-7级地图+北京范畴8-14级地图为例,阐明如何来批改配置。为防止重启电脑后就各种不灵的难堪,咱们从重启电脑后开始。4.1、启动docker查看docker是否启动 docker --version如果没有启动,输出上面命令启动docker。如果有须要,后续能够本人把docker设置为开机自启动。 systemctl start docker4.2、启动postGIS容器后面的./quickstart.sh china 命令在执行过程中,下载了4个docker镜像,启动了若干个容器,工具类容器在应用实现后就销毁了,数据类和利用类的容器会保留。(镜像和容器的关系)下图红框中的容器就是存放数据的,它外面有个postGIS,咱们须要启动这个容器。进入openmaptiles文件夹启动postGIS容器 make start-db-preloaded4.3、设置不清理上次的后果关上Makefile文件,找到generate-tiles命令,下图红框的地位,就是革除上次后果文件的命令,咱们在这行后面输出#号,把它正文掉。4.4、删除默认切图范畴程序默认会用china.bbox中的参数作为切图范畴,咱们把这个文件删掉,后续在.env文件中配置。china.bbox文件在data文件夹中,删除命令: rm -f ./data/china.bbox4.5、批改切图层级和范畴关上.env文件批改切图的层级MIN_ZOOM和MAX_ZOOM批改切图的范畴BBOX,格局为:minX,minY,maxX,maxY4.6、生成瓦片输出上面命令,生成瓦片 make generate-tiles生成的后果是tiles.mbtiles文件,在data文件夹中4.7、反复操作反复4.5和4.6步骤,批改层级和范畴,就能把屡次的后果放在一个文件中。5、总结openmaptiles生成地图分4个步骤:1、数据下载、2、数据入库、3、数据分析、4、生成矢量瓦片。中国地区生成地图的最小颗粒度是中国大陆和台湾,没有方法按大陆地区的省或按自定义区域进行生成。前三个步骤,只能按整个中国的范畴来解决,第4步能够通过管制生成范畴、生成层级来实现生成自定义区域的地图。前三个步骤只须要执行一次,最初一个步骤能够屡次执行。如果想把屡次生成的矢量瓦片放在一个文件中,能够设置不革除上次生成的后果。原文地址:http://gisarmory.xyz/blog/index.html?blog=OSMOpenmaptiles 关注《GIS兵器库》公众号, 第一工夫取得更多高质量GIS文章。 本文章采纳 常识共享署名-非商业性应用-雷同形式共享 4.0 国内许可协定 进行许可。欢送转载、应用、从新公布,但务必保留文章署名《GIS兵器库》(蕴含链接:  http://gisarmory.xyz/blog/),不得用于商业目标,基于本文批改后的作品务必以雷同的许可公布。

December 22, 2020 · 1 min · jiezi

关于gis:如何实现OSM地图本地发布并自定义配图

1、缘起OpenStreetMap(简称OSM)不仅能够收费在线应用,还能够收费下载原始数据,数据格式有.osm.pbf和shp。咱们将OSM原始数据下载下来,解决成矢量瓦片,公布成服务,就能够实现OSM地图的本地公布和自定义配图。OSM对数据的组织形式,是按点、线、面来的,不是咱们常见的按路线、建筑物、河流来分图层的办法,但能够依据属性进行提取。openmaptiles提供了一套OSM数据应用的残缺解决方案,能够实现OSM数据的下载、入库、剖析、生成矢量瓦片、调整地图款式、地图预览的全套性能,并且开源。接下来咱们就来具体介绍openmaptiles开源库如何装置和疾速入门。2、筹备环境装置linux零碎(openmaptiles开源库只能在linux零碎上运行)装置docker装置Docker Compose装置git2.1、装置linux零碎我是在虚构机上安装的,虚拟机和linux零碎的装置教程参考:https://blog.csdn.net/null_of_error/article/details/108133241虚拟机版本我用的VM14,百度网盘下载地址:https://pan.baidu.com/s/1BTjByB6oTz8cTxOv_GzGWw,提取码:kshr,含许可。linux零碎我应用的是centOS7.9,阿里云官网镜像下载地址:http://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Everything-2009.iso2.2、装置docker装置教程参考:https://www.runoob.com/docker/centos-docker-install.html我用的是手动装置形式,装置步骤: 装置docker yum install -y yum-utils device-mapper-persistent-data lvm2设置国内阿里云的镜像源,会比官网的快 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo装置Docker Engine-Community yum install docker-ce docker-ce-cli containerd.io启动docker systemctl start docker测试是否装置正确 docker run hello-world2.3、装置Docker Compose装置教程参考:https://www.runoob.com/docker/docker-compose.html装置步骤: 装置docker compose curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose设置权限 chmod +x /usr/local/bin/docker-compose测试是否装置正确 docker-compose --version2.4、装置git装置教程参考:https://www.jianshu.com/p/e6e...装置步骤: 装置 yum install git测试是否装置正确 git --version3、公布地图openmaptiles开源库 github地址:https://github.com/openmaptiles/openmaptiles疾速入门文档:https://github.com/openmaptiles/openmaptiles/blob/master/QUICKSTART.md3.1、拉取代码拉取openmaptiles代码 git clone https://github.com/openmaptiles/openmaptiles.git拉取实现后,进入目录 cd openmaptiles执行make命令 make 3.2、测试网络先测试一下你电脑能不能关上这个网址:https://www.wikidata.org/,openmaptiles须要从这个网址下载poi数据,如果不能拜访,就按上面的步骤设置,让程序跳过这一步。后续想要poi的数据的,能够自行通过迷信上午解决。如何跳过下载poi数据: 应用vi关上quickstart.sh文件,vi应用办法参考:https://zhuanlan.zhihu.com/p/37704677 vi quickstart.sh找到 make import-wikidata 行输出 i 进入插入模式在 make import-wikidata 命令前输出#号,而后按 esc 键输出:wq 保留退出3.3、解决数据执行上面的疾速启动命令,程序会主动进行OSM数据的下载、入库、剖析、生成矢量瓦片的工作。默认是阿尔巴尼亚地区,生成瓦片的层级是0-7级。前面会讲如何设置地区和层级。这个命令执行工夫会略微有些长,需急躁期待。 ...

December 9, 2020 · 1 min · jiezi

关于gis:H5时代leaflet中还在用DivIcon

前段时间写了篇《leaflet如何加载10万数据》的文章,有同学反馈其中的Canvas-Markers插件不反对DivIcon。咱们明天就来聊一聊,为什么这个插件不反对DivIcon,以及如何用H5的Canvas个性,做出以前用DivIcon能力实现的 标签 和 文字标注 性能。 老规矩,先上效果图: 标签性能 文字标注性能 为什么不反对DivIconCanvas-Markers插件的创作目标是为了解决,大批量数据展现的性能问题,它通过应用H5中Canvas的绘图形式绘制Marker,晋升了展现性能。但该插件目前只反对Icon,不反对DivIcon。 之所以不反对,是因为DivIcon的实现原理是在HTML页面中增加DOM元素,并在地图平移、缩放时一直的批改DOM元素的属性,而大量增加和批改DOM元素会拉低浏览器的显示性能,呈现卡顿等景象。 如果应用Canvas-Markers后还在持续应用DivIcon,就相当于网络降级了千兆带宽当前,还在用之前的百兆路由器。这时的DivIcon就会和那个百兆路由器一样,成为整个通道中最为狭隘的中央,变成瓶颈。 如果不必DivIcon这个老路由器,有没有新路由器呢? 有!但要分状况。 平时工作中,用DivIcon通常是为了实现 标签性能 和 文字标注 性能 标签性能: 文字标注性能: 针对这两种状况,leaflet都有Canvas形式的解决方案。 标签性能上文提到,Canvas-Markers插件目前只反对Icon类型的图标,翻看它的代码会发现,其实,它用Icon也只是把Icon当成一个Object来用, 只用来传参,并没有去用Icon外部的性能。因为Icon的外部,也是创立了一个img类型的DOM元素,它和DivIcon一样,大量增加会影响浏览器的显示性能。 Canvas-Markers插件通过Icon获取图片的地址和图片的偏移地位等参数,而后用Canvas的形式绘制图片。 标签由两局部组成,背景框和文字,背景框通常是一个图片。Canvas-Markers插件曾经能够加载图片,咱们只有让它再反对文字,并能管制文字的款式和地位,就能够实现标签性能了。 关上Canvas-Markers插件的代码,在下图地位减少一个绘制文字的办法。 再在下图中的三个地位,减少下面新增办法的调用 这样就能够实现标签性能了,看成果 性能方面,最大反对10万条数据左右。 文字标注性能我在github上搜寻leaflet+text关键字,翻看了后果中的前20个代码库,找到了 LabelTextCollision 这个插件。 LabelTextCollision插件创作的目标,是为了实现的文字标注的主动避让性能,实现形式是Canvas,文字标注性能是它顺带解决的问题。 测试时,发现了它一个问题,1万条数据,在放大地图时,显示很晦涩,但放大地图时,会呈现卡顿的景象,而且地图越放大,卡顿的就越厉害。 通常在加载大数据量时,都是越放大地图越卡顿,越放大地图越晦涩。但这个插件刚好相同,这是为啥呢? 集体揣测,呈现这种问题,多半是因为没有依据屏幕显示范畴对数据做筛选造成的,不做筛选就会把屏幕显示范畴外的数据也加上。 这个插件因为它做了文字显示的避让,越放大地图,数据在屏幕上显示的就越集中,主动避让掉的文字就越多,显示的文字就越少,展现就越晦涩。 越放大地图,数据在屏幕上显示的就越扩散,主动避让的文字就越少,显示的文字就越多,这时如果没有做筛选,展现就会越来越卡顿。 看了下它的代码,证实了我的揣测,的确没有发现,对屏幕区域外显示内容进行限度的代码。 那咱们就来给它加上,在下图中的两个中央增加对屏幕显示范畴的判断,只显示以后能看到的数据。 再试一下,哈哈,搞定 测试了下,优化后,能够加载5万条数据左右。 更多场景下面列举了DivIcon常见的两种应用场景,以及如何应用Canvas形式进步展现性能的解决方案,如果你那还有DivIcon的其它应用场景,能够在下方留言,咱们一起探讨解决办法。 总结Canvas-Markers插件的目标是为了解决,大批量数据展现时的性能问题。DivIcon实现的原理是在HTML页面中增加DOM元素,大量增加和批改DOM元素会拉低浏览器展现性能。从进步展现性能的出发点思考,Canvas-Markers插件不应该去反对DivIcon。用DivIcon,通常是为了实现标签性能和文字标注性能,这两个性能都有Canvas形式的解决方案。对Canvas-Markers插件进行优化,减少文字接口,能够代替DivIcon实现标签性能。LabelTextCollision插件能够实现文字标注的主动避让性能,它是用Canvas形式实现,能够代替DivIcon实现文字标注性能。LabelTextCollision插件在地图放大时,最多只能展现1万条数据左右,优化后能够达到5万条数据左右。在线示例标签性能 http://gisarmory.xyz/blog/index.html?demo=diviconError-CanvasMarker 文字标注性能 http://gisarmory.xyz/blog/index.html?demo=diviconError-LabelTextCollision 源码标签性能 http://gisarmory.xyz/blog/index.html?source=diviconError-CanvasMarker 文字标注性能 http://gisarmory.xyz/blog/index.html?source=diviconError-LabelTextCollision 原文地址:http://gisarmory.xyz/blog/index.html?blog=diviconError 关注《GIS兵器库》公众号, 第一工夫取得更多高质量GIS文章。 本文章采纳 常识共享署名-非商业性应用-雷同形式共享 4.0 国内许可协定 进行许可。欢送转载、应用、从新公布,但务必保留文章署名《GIS兵器库》(蕴含链接:  http://gisarmory.xyz/blog/),不得用于商业目标,基于本文批改后的作品务必以雷同的许可公布。 ...

November 25, 2020 · 1 min · jiezi

关于gis:leaflet中如何通过透明度控制layerGroup的显示隐藏

最近在leaflet开发过程中,遇到地图数据须要按时序播放的需要,解决思路是将每个工夫节点的因素增加到layerGroup中,而后通过切换layerGroup的显示暗藏来实现成果。翻看leaflet的API文档,发现leaflet中没有间接管制layerGroup显示暗藏的办法,那如何来实现layerGroup的显示和暗藏呢? 通常有如下两种思路: 第一种,通过map.addLayer()、map.removeLayer()增加、移除图层组的形式来实现,当数据量较小,并且不须要频繁切换图层显示暗藏时,应用这种形式较为不便。然而,当数据量较大,或须要频繁切换图层显示暗藏时,应用这种形式则会减少对浏览器的压力,呈现卡顿景象。 第二种,遍历图层外部所有因素,通过管制因素透明度的形式,达到管制图层显示暗藏的目标。此形式能够解决在数据量较大,或须要频繁切换图层显示暗藏时,呈现卡顿的状况,成果如下: 外围代码如下: 从下面代码中咱们能够看出,因为maker因素 和 vector因素款式管制形式不同,需放在两个图层组,这样写起来感觉还是有些繁琐,而且也没有思考图层初始化时款式。 通过对leaflet源码钻研,理解到leaflet能够应用 include 形式对办法进行重写来做到批改源码。 include形式通过例子理解一下:比方leaflet源码中 Polygon.toGeoJSON() 办法不是在 Polygon.js 文件中写的,而是用 include 形式写在了GeoJSON.js文件中。Polygon类原本是没有toGeoJSON()办法的,这样就减少了这个办法。如果Polygon类中曾经有了toGeoJSON()办法,这样写会依据执行的程序,后执行的会把先加载的重写。 接下来,就采纳include形式对layerGroup增加显示暗藏办法。在这里,咱们不仅管制了layerGroup的显示暗藏,还记录了layerGroup中因素默认状态下的透明度,以保障切换到显示时款式统一。 代码如下: 为方便使用,咱们将上述代码封装成插件,只需援用这个插件,调用showLayer()、hideLayer()就能实现对 layerGroup 中所有因素的显示暗藏管制。 看应用插件后的代码是不是很清新。 总结管制layerGroup显示暗藏的形式有两种:增加、移除的形式;和遍历外部因素,管制每个因素透明度的形式。管制透明度形式效率更高,体验更好,但leaflet中没有现成办法,须要本人写代码实现。实现时须要留神,maker因素 和 vector因素款式管制形式不同。把管制透明度形式封装成插件,通过showLayer()、hideLayer()办法间接应用。在线示例在线示例 ShowHideLayerGroup.js 插件 原文地址:http://gisarmory.xyz/blog/index.html?blog=LeafletShowHideLayerGroup。 关注《GIS兵器库》公众号, 第一工夫取得更多高质量GIS文章。 本文章采纳 常识共享署名-非商业性应用-雷同形式共享 4.0 国内许可协定 进行许可。欢送转载、应用、从新公布,但务必保留文章署名《GIS兵器库》(蕴含链接: http://gisarmory.xyz/blog/),不得用于商业目标,基于本文批改后的作品务必以雷同的许可公布。

October 22, 2020 · 1 min · jiezi

Leaflet-Develop-Guide ????

Leaflet-Develop-Guide ????文档Leaflet 官方文档,Leaflet 插件集。Leaflet 中文文档,中文插件集。火星科技翻译,文档所使用的Leaflet版本是 v1.0.3。Leaflet 常用 API 结构图。Leaflet 类之间继承关系图。常用插件绘制编辑插件矢量绘图 Leaflet Draw , API 参考文档,See the demo。几何图形编辑 Leaflet Editable, API 参考文档,See the demo。地图服务资源加载插件基于leaflet加载ArcGIS服务插件 esri-leaflet。国内常用地图服务资源加载插件Leaflet.ChineseTmsProviders Provider for Chinese Tms Service,方便快捷的调用地图服务。支持的地图服务类型:TianDiTu、GaoDe、Google、Geoq、OSM。优化 marker 相关的插件提供了丰富多彩的图标 Leaflet.awesome-markers, See the demo map。强大的集聚插件 Leaflet.markercluster, See the demo map。优化的label Leaflet.label, See the demo map。优化重叠在一起的markers OverlappingMarkerSpiderfier-Leaflet, See the demo map。优化在边框上显示不在当前视野中的marker Leaflet.EdgeMarker, See the demo map。聚合插件轻量简单的热力图插件 Leaflet heat,See the demo。地理空间分析一个可运行在浏览器和 Node.js中的高级地理空间分析库 Turf.js。框架化Vue 2 components for Leaflet maps Vue2Leaflet,使用文档,See the doc。React components for Leaflet maps react-leaflet,使用文档,See the doc。持续更新中 原文地址: https://juejin.im/post/5c6fad… ...

February 28, 2019 · 1 min · jiezi

[译] 解密 Mapbox 卫星影像处理神器 Robosat

英文原文地址:https://www.openstreetmap.org…英文原文作者:daniel前言最近,Mapbox 开源了端到端的卫星影像特征提取工具 RoboSat。下面我将以来自 OpenAerialMap 的 Tanzania 区域的无人机影像 演示如何在自定义图像数据集上运行完整的RoboSat流程。目标我们的目标是通过手把手的教学,在Dar es Salaam 和 Zanzibar 附近提取建筑物轮廓。我建议手工你过一遍 Zanzibar Mapping Initiative 和 OpenAerialMap 来建立对数据集的直观先验了解。整体步骤从无人机影像提取建筑轮廓包含下面几个步骤:数据准备:创建训练数据集训练模型:分割模型提取特征后处理:将分割结果转为简单的几何格式首先,带你创建一个基于 OpenAerialMap 的无人机影像并且带有 OpenStreetMap 建筑物轮廓蒙版的数据集。接着,我将演示如何训练 RoboSat 分割模型在新的无人机影像如何提取建筑。最后,我将介绍略好将预测结果转化为简单的多边形并映射到 OpenStreetMap 上。数据准备Zanzibar Mapping Initiative 通过OpenAerialMap提供他们的无人机影像。这是一个你可以手动浏览地图。训练RoboSat 的分割模型需要同时提供对应的 Slippy Map tiles 格式的无人机影像和对应的建筑物轮廓数据集。你可以认为这些由二进制组成的蒙版是用来标记建筑物对应区域是否存在建筑。让我们开始提取 Dar es Salaam 和 Zanzibar 边界框吧。从对应的无人机图像范围中提取OSM建筑物几何图形提取作为训练数据集,因此需要在 OSM 上截取对应的区域。我有个在 GeoFabrik 工作的朋友提供了方便又先进的 提取工具 osmium-tool ,它可以帮助实现上述任务。wget –limit-rate=1M http://download.geofabrik.de/africa/tanzania-latest.osm.pbfosmium extract –bbox ‘38.9410400390625,-7.0545565715284955,39.70458984374999,-5.711646879515092’ tanzania-latest.osm.pbf –output map.osm.pbf完美! Dar es Salaam and Zanzibar 的建筑物几何图形存储在 map.osm.pbf 中。RoboSot 利用 rs extract 来从 OSM 的底图提取几何图形。rs extract –type building map.osm.pbf buildings.geojson现在我们从建筑物几何图形的 buildings.geojson 文件提取对应的 Slippy Map tiles 文件,通常设置 zoom level 在19 或者 20 是比较合理的。rs cover –zoom 20 buildings.geojson buildings.tiles基于 buildings.tiles 文件我们可以从 OAM 下载无人机影像并且将它栅格化成对应的OSM蒙版瓦片,下面是一个训练数据的预览效果:如果你自己看会发现这些蒙版其实不是完美匹配的,因为我们训练的模型基于千万个图像和蒙版,有一些噪音数据还是可以接受的。创建无人机图像瓦片最简单的方式是通过 OAM 的 API。 我们可以用 /meta 接口请求所有开放的给定区域的无人机影像。http ‘https://api.openaerialmap.org/meta?bbox=38.9410400390625,-7.0545565715284955,39.70458984374999,-5.711646879515092'JSON 数组是请求的响应,她包含了所有边界框中的无人机影像元信息。我们可以用 jq 来过滤这些网络请求响应,结合比如 通过用户名或者日期这样的过滤条件。jq ‘.results[] | select(.user.name == “ZANZIBAR MAPPING INITIATIVE”) | {user: .user.name, date: .acquisition_start, uuid: .uuid}‘它将返回一个包含对应GeoTIFF图像的 JSON 对象{ “user”: “ZANZIBAR MAPPING INITIATIVE”, “date”: “2017-06-07T00:00:00.000Z”, “uuid”: “https://oin-hotosm.s3.amazonaws.com/5ac7745591b5310010e0d49a/0/5ac7745591b5310010e0d49b.tif"}现在我们有两个选项下载 GeoTIFF 然后用 rasterio 和 rio-tiler 小工具来切割 GeoTIFF生成对应的瓦片。请求 OAM 的 API 直接获取对应的瓦片。rs download https://tiles.openaerialmap.org/5ac626e091b5310010e0d480/0/5ac626e091b5310010e0d481/{z}/{x}/{y}.png building.tiles注意: OAM 提供多个 Slippy Map 接口这两种方法都是为了实现一个目的: 生成一个包含 256x256大小的无人机影像的 Slippy Map。我们可以用提取过的建筑几何边界和瓦片文件创建对应蒙版。rs rasterize –dataset dataset-building.toml –zoom 20 –size 256 buildings.geojson buildings.tiles masks在栅格化之前我们需要创建dataset-building.toml数据集;训练与建模RoboSat 分割模型是一个全连接神经网络,为了保证模型效果,我们进行了数据集切割:80% 训练集,用于模型训练10% 验证集,用户模型效果验证10% 预留集,用户模型超参数调优我们按照上述比例对 building.tiles 文件随机洗牌到不同的 Slippy Map 文件夹下。rs subset images validation.tiles dataset/validation/imagesrs subset masks validation.tiles dataset/validation/labelsrs subset images training.tiles dataset/training/imagesrs subset masks training.tiles dataset/training/labelsrs subset images evaluation.tiles dataset/evaluation/imagesrs subset masks evaluation.tiles dataset/evaluation/labels因为前景和背景在数据集中分布不均,模型训练之前需要先计算一下每个类的分布。rs weights –dataset dataset-building.toml将权重以配置文件的形式保存起来,之后训练会用到。一切都准备好了,可以开始训练了:rs train –model model-unet.toml –dataset dataset-building.toml在训练过程中对于每个 epoch,都会将历史的训练和验证的损失以及指标保存到 checkpoint 中。我们可以在训练过程中选择在 validation 中表现最好的model存在 checkpoint 中。用保存下来的checkpoint能够预测图像中每个像素用以区分前景和背景的所属类别概率,随后这些所属类别概率可转为离散的分割蒙版。rs predict –tile_size 256 –model model-unet.toml –dataset dataset-building.toml –checkpoint checkpoint-00038-of-00050.pth images segmentation-probabilitiesrs masks segmentation-masks segmentation-probabilities这些 Slippy Map 文件夹也可以通过 HTTP 服务器的方式直接对外提供栅格瓦片服务。我们通过 rs serve 也提供按需瓦片服务,它既能有效进行后处理(瓦片边界、去噪音、矢量化,边缘简化)也可以方便地debug。如果你手工检查预测结果你需要注意,本来不存在建筑物但是模型缺圈出来的建筑物是被称为假阳性错误。假阳性错误是因为我们的数据集导致的,我们在数据集中反复采样带有建筑的例子,即使这些瓦片的背景像素不包含足够的背景(被称为负采样)也一样被用来学习勾勒建筑物轮廓。如果我们不反复输入一张图片,那么模型是很难区分出哪些是背景的。解决这个问题有两种方法:添加随机采样的背景瓦片到训练集中,重新计算类的分布权重,然后再次训练,或者使用我们训练好的模型在数据集上反复训练,然后故意在已知无建筑物的样本中进行预测。如果模型出现误判了,然后我们就调出这部分数据集,再次训练。使用所谓的 “硬负挖掘”,允许我们主动添加负样本。这个方法只在小而干净的数据集上使用。对于"硬负挖掘” 我们从不在 building.tiles 的瓦片中随机采样来训练模型。然后通过rs compare 工具创建无建筑的图像,接着进行预测。rs compare visualizations images segmentation-masks在确认真正的背景图片后,不止要在OSM上标注,而且还要找出对应的全背景的负样本到数据集中。接着,走一遍训练流程:rs weights更新配置重新训练通常,在干净的小数据集上做很多遍硬负挖掘和训练才能使得模型收敛。恭喜!你现在有一个鲁棒的模型用于预测了!在花费数小时的硬负样挖掘,我们能产出分割概率了。有趣的看到的是该模型并不完全确定建筑工地。这是因为在我们用硬样挖掘方法选择数据集时决定是否使用建筑工地决定的。最后,后处理流程是有必要的,它将分割蒙版转化为矢量化的 GeoJSON 之后用于瓦片文件生成。本文不对后处理的细节展开,因为基于小样本的训练方式比较粗糙的,RoboSat 后处理模块还在打磨中。总结本教程手把手过了一遍 RoboSat 全流程,从数据集准备、训练分割模型到预测航拍图片中的建筑物。本教程所有工具和数据都开源了。尝试一下吧! https://github.com/mapbox/rob…作为分享主义者(sharism),本人所有互联网发布的图文均遵从CC版权,转载请保留作者信息并注明作者 Harry Zhu 的 FinanceR专栏:https://segmentfault.com/blog…,如果涉及源代码请注明GitHub地址:https://github.com/harryprince。微信号: harryzhustudio商业使用请联系作者。参考资料https://www.openstreetmap.org…https://github.com/mapbox/rob… ...

February 21, 2019 · 2 min · jiezi

[原] 解密 Uber 数据团队的大规模地理数据可视化神器:Deck.gl 与 H3

背景如何大规模可视化地理数据一直都是一个业界的难点,随着2015年起 Uber 在这一领域的发力,构建了基于 Deck.gl + H3 (deckgl,h3r) 的大规模数据可视化方案。一方面,极大地满足了大规模地理数据可视化的需求。另一方面,也极大地方便了数据科学家的可视化工作。在大规模空间轨迹分析、交通流量与供需预测等领域得到广泛应用,突破了原来leaflet架构中数据量(通常不会超过10W个原始点)的瓶颈问题,实现百万点绘制无压力,并且可以结合GPU实现加速渲染。地理单元:H3随着互联网出行公司的全球化扩张,越来越多的公司涌现出对地理单元划分的需求。一方面,传统的地理单元比如 S2和geohash,在不同纬度的地区会出现地理单元单位面积差异较大的情况,这导致业务指标和模型输入的特征存在一定的分布倾斜和偏差,使用六边形地理单元可以减少指标和特征normalization的成本。另一方面,在常用的地理范围查询中,基于矩形的查询方法,存在8邻域到中心网格的距离不相等的问题,也就是说六边形网格与周围网格的距离有且仅有一个,而四边形存在两类距离,而六边形的周围邻居到中心网格的距离却是相等的,从形状上来说更加接近于圆形。所以,基于hexagon的地理单元已经成为各大厂家的首选,比如 Uber 和 Didi 的峰时定价服务。在这样的背景下 Uber 基于六边形网格的地理单元开源解决方案 H3 应运而生,它使得部署 Hexagon 方案的成本非常低,通过UDF、R pacakge等方式可以以非常低的成本大规模推广。H3 的前身其实是 DDGS(Discrete global grid systems) 中的 ISEA3H,其原理是把无限的不规则但体积相等的六棱柱从二十面体中心延伸,这样任何半径的球体都会穿过棱镜形成相等的面积cell,基于该标准使得每一个地理单元的面积大小就可以保证几乎相同。然而原生的 ISEA3H 方案在任意级别中都存在12个五边形,H3 的主要改进是通过坐标系的调整将其中的五边形都转移到水域上,这样就不影响大多数业务的开展。下面是 ISEA3H 五边形问题的示例:#Include librarieslibrary(dggridR)library(dplyr)#Construct a global grid with cells approximately 1000 miles acrossdggs <- dgconstruct(spacing=1000, metric=FALSE, resround=‘down’)#Load included test data setdata(dgquakes)#Get the corresponding grid cells for each earthquake epicenter (lat-long pair)dgquakes$cell <- dgGEO_to_SEQNUM(dggs,dgquakes$lon,dgquakes$lat)$seqnum#Converting SEQNUM to GEO gives the center coordinates of the cellscellcenters <- dgSEQNUM_to_GEO(dggs,dgquakes$cell)#Get the number of earthquakes in each cellquakecounts <- dgquakes %>% group_by(cell) %>% summarise(count=n())#Get the grid cell boundaries for cells which had quakesgrid <- dgcellstogrid(dggs,quakecounts$cell,frame=TRUE,wrapcells=TRUE)#Update the grid cells’ properties to include the number of earthquakes#in each cellgrid <- merge(grid,quakecounts,by.x=“cell”,by.y=“cell”)#Make adjustments so the output is more visually interestinggrid$count <- log(grid$count)cutoff <- quantile(grid$count,0.9)grid <- grid %>% mutate(count=ifelse(count>cutoff,cutoff,count))#Get polygons for each country of the worldcountries <- map_data(“world”)#Plot everything on a flat mapp<- ggplot() + geom_polygon(data=countries, aes(x=long, y=lat, group=group), fill=NA, color=“black”) + geom_polygon(data=grid, aes(x=long, y=lat, group=group, fill=count), alpha=0.4) + geom_path (data=grid, aes(x=long, y=lat, group=group), alpha=0.4, color=“white”) + geom_point (aes(x=cellcenters$lon_deg, y=cellcenters$lat_deg)) + scale_fill_gradient(low=“blue”, high=“red”)p转化坐标系后:#Replot on a spherical projectionp+coord_map(“ortho”, orientation = c(-38.49831, -179.9223, 0))+ xlab(’’)+ylab(’’)+ theme(axis.ticks.x=element_blank())+ theme(axis.ticks.y=element_blank())+ theme(axis.text.x=element_blank())+ theme(axis.text.y=element_blank())+ ggtitle(‘Your data could look like this’)H3 中还提供了类似 S2 的六边形压缩技术,使得数据的存储空间可以极大压缩,在处理大规模稀疏数据时将体现出优势:地理数据可视化:Deck.gl在使用 Deck.gl 之前,业界通用的解决方案通常是另一个开源的轻量级地理数据可视化框架 Leaflet。Leaflet 经过十余年的积累已经拥有足够成熟的生态,支持各式各样的插件扩展。不过随着 Leaflet 也暴露出一些新的问题,比如如何大规模渲染地理数据,支持诸如 轨迹、风向、六边形网格的可视化。好在近年来 Mapbox 和 Deck.gl 正在着手改变这一现状。下面是一个具体的例子,如何可视化Hexagon:# 初始化devtools::install_github(“crazycapivara/deckgl”)library(deckgl)# 设置 Mapbox token,过期需要免费在 Mapbox 官网申请Sys.setenv(MAPBOX_API_TOKEN = “pk.eyJ1IjoidWJlcmRhdGEiLCJhIjoiY2poczJzeGt2MGl1bTNkcm1lcXVqMXRpMyJ9.9o2DrYg8C8UWmprj-tcVpQ”)# 数据集合sample_data <- paste0( “https://raw.githubusercontent.com/", “uber-common/deck.gl-data/”, “master/website/sf-bike-parking.json”)properties <- list( pickable = TRUE, extruded = TRUE, cellSize = 200, elevationScale = 4, getPosition = JS(“data => data.COORDINATES”), getTooltip = JS(“object => object.count”))# 可视化deckgl(zoom = 11, pitch = 45) %>% add_hexagon_layer(data = sample_data, properties = properties) %>% add_mapbox_basemap(style = “mapbox://styles/mapbox/light-v9”) 除了六边形之外 Deck.gl 也支持其他常见几何图形,比如 Grid、Arc、Contour、Polygon 等等。更多信息可以见官方文档: https://crazycapivara.github….地理仪表盘:结合 ShinyDeck.gl 结合 Shiny 后,可将可视化结果输出到仪表盘上:library(mapdeck)library(shiny)library(shinydashboard)library(jsonlite)ui <- dashboardPage( dashboardHeader() , dashboardSidebar() , dashboardBody( mapdeckOutput( outputId = ‘myMap’ ), sliderInput( inputId = “longitudes” , label = “Longitudes” , min = -180 , max = 180 , value = c(-90, 90) ) , verbatimTextOutput( outputId = “observed_click” ) ))server <- function(input, output) { set_token(‘pk.eyJ1IjoidWJlcmRhdGEiLCJhIjoiY2poczJzeGt2MGl1bTNkcm1lcXVqMXRpMyJ9.9o2DrYg8C8UWmprj-tcVpQ’) ## 如果token 过期了,需要去Mapbox官网免费申请一个 origin <- capitals[capitals$country == “Australia”, ] destination <- capitals[capitals$country != “Australia”, ] origin$key <- 1L destination$key <- 1L df <- merge(origin, destination, by = ‘key’, all = T) output$myMap <- renderMapdeck({ mapdeck(style = mapdeck_style(‘dark’)) }) ## plot points & lines according to the selected longitudes df_reactive <- reactive({ if(is.null(input$longitudes)) return(NULL) lons <- input$longitudes return( df[df$lon.y >= lons[1] & df$lon.y <= lons[2], ] ) }) observeEvent({input$longitudes}, { if(is.null(input$longitudes)) return() mapdeck_update(map_id = ‘myMap’) %>% add_scatterplot( data = df_reactive() , lon = “lon.y” , lat = “lat.y” , fill_colour = “country.y” , radius = 100000 , layer_id = “myScatterLayer” ) %>% add_arc( data = df_reactive() , origin = c(“lon.x”, “lat.x”) , destination = c(“lon.y”, “lat.y”) , layer_id = “myArcLayer” , stroke_width = 4 ) }) ## observe clicking on a line and return the text observeEvent(input$myMap_arc_click, { event <- input$myMap_arc_click output$observed_click <- renderText({ jsonlite::prettify( event ) }) })}shinyApp(ui, server)参考资料Uber H3 原理分析http://strimas.com/spatial/he…https://cran.r-project.org/we...https://en.wikipedia.org/wiki...http://www.pyxisinnovation.co...Large Scale Data Visualisation with Deck.gl and Shinyhttps://uber.github.io/h3/https://eng.uber.com/shan-he/https://eng.uber.com/keplergl/[译] 解密 Uber 数据部门的数据可视化最佳实践作为分享主义者(sharism),本人所有互联网发布的图文均遵从CC版权,转载请保留作者信息并注明作者 Harry Zhu 的 FinanceR专栏:https://segmentfault.com/blog…,如果涉及源代码请注明GitHub地址:https://github.com/harryprince。微信号: harryzhustudio商业使用请联系作者。 ...

October 22, 2018 · 3 min · jiezi