暂时未有相关云产品技术能力~
行政区划数据,在现在的展示系统中,使用的频次越来越多,省级、市级、县级等,显示行政区划的范围,或者显示城市的行政中心点,体现地理信息。特别是这次疫情爆发以后,各个网站的疫情数据统计,都用到了行政区划数据。行政数据要体现准确性,先按照国家的标准来,一般省、市、区(县)的行政区划数据变化比较小,特别是区划范围变化也比较小,行政区划编码也有对应的设置,可以参照国家统计局和民政局的数据。国家统计局行政区划数据地址:前边隔几年更新一次,近年更新频次高,行政区的名称和编码都有,最低能够到社区或村级别。http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/民政局的行政区划数据地址:能够看到县级及以上的行政区划编码,县级以下的编码主要是体现的变化,不过民政局的更新频率比较高。http://www.mca.gov.cn/article/sj/xzqh/1980/ 在使用行政区划的之前,首先对照这些进行确认,省、市级别至少是变化少的,在一个市用县级的行政区划数据时,还需要根据当地的实际情况,因为当地有一些管理区或者功能区也算县级别的数据,这也需要计算的。高德等互联网地图上,可以根据地图开发的API,获取到省、市、县的行政区划范围数据,不过,都有一定的精简,有些地方也有一些误差。乡镇级别的数据,就需要从互联网上搜索下载了,下载后要比对统计局的乡镇名称是否能对上,不同的年份,数据还是有变化的。使用过某些地图下载器,虽说也能够下载乡镇的区划数据,但是发现有一些地区是混和型的数据,有些是之前年限的数据,特别是比较发达的城市里,这个变化一般都没有响应到,这个在使用中要进行注意。乡镇比较准确的数据,一般都在当地的单位中,最好能够能进行协调,没有矢量的图层数据,至少要个对照图能进行勾画都可以。参考文章:http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/http://www.mca.gov.cn/article/sj/xzqh/1980/https://lbs.amap.com/
“OpenGIS的说明书中定义了两个表述空间对象的标准方式:一个是WKT(the Well-Known Text)形式,另一个是WKB(the Well-Known Binary)形式。这两种形式都包括对象的类型信息和形成对象的坐标信息。” 下面是用字符来描述要素的空间对象的例子: POINT(0 0) LINESTRING(0 0,1 1,1 2) POLYGON ((90 0,4 0,4 4,0 4,0 0),(1 1 ,2 1, 2 2, 1 2, 1 1))GeoJSON是一种对各种地理数据结构进行编码的格式,基于Javascript对象表示法的地理空间信息数据交换格式。GeoJSON对象可以表示几何、特征或者特征集合。GeoJSON中的坐标表现如下: "geometry": { "type": "Point", "coordinates": [102.0, 0.5] } "geometry": { "type": "LineString", "coordinates": [[102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]] } 一般在地图的客户端支持按照GeoJSON的形式进行图层加载,在后端的数据库处理中,一般是支持WKT格式的坐标返回,所以,需要在中间有一个转换过程,当然在新版的PostGIS中,可以直接返回GeoJSON数据。mapbox 开放js类库,可以将两者的坐标形式进行转换。github地址:https://github.com/mapbox/wellknownwkt和geojson坐标格式: const { parse, stringify } = require('wellknown'); let _feature = parse('POINT(1 2)'); let _stringdata = stringify(_feature); 这是nodejs的方式,其他的使用在github上也有对应说明。 参考文章:GeoJSON说明:https://baike.baidu.com/item/GeoJson/12011566?fr=aladdin WKT说明:https://baike.baidu.com/item/wkt%20ewkt/4299879?fr=aladdin github类库:https://github.com/mapbox/wellknown
GeoJSON是一种对各种地理数据结构进行编码的格式,基于Javascript对象表示法的地理空间信息数据交换格式。GeoJSON对象可以表示几何、特征或者特征集合。GeoJSON支持下面几何类型:点、线、面、多点、多线、多面和几何集合。GeoJSON里的特征包含一个几何对象和其他属性,特征集合表示一系列特征。GeoJSON就是一种json文件的扩展,地图数据展示,传输到网页前端的时候,越来越多的使用GeoJSON数据,各类地图能够直接使用GeoJSON文件进行解析展示。对于点状的数据,坐标量较少,传输的数据量还可以,但是对于线状和面状数据,涉及到的坐标信息比较多,一个线或者面的geometry,在多的情况下,能达到几百、几千个,这样从服务器传输到客户端的数据,就有几兆或者几十兆,下载时间加长,就会影响客户端的体验度。数据抽吸(smooth) 在数据精度要求不高的情况,可以对空间矢量进行抽吸,Arcmap、QGIS上都有对应的功能,这个操作是减少空间矢量的点数据,尽量保证空间上的轮廓,这个也能够减少空间数据的数据量。 QGIS的数据抽吸功能服务端数据压缩(gzip、deflate) 这个是在服务器端,在数据传输的时候,提前对数据进行压缩,在返回到客户端的数据上,添加对应的数据压缩头,ex:Content-Encodin:gzip,一般的浏览器接收此数据头,能够进行数据的解析。 nodejs数据压缩简单代码 zlib.gzip(_jsondata, (err, bufferdata) => { if (err) throw err; fs.writeFile('china.province.json.gz', bufferdata, (err1) => { if (err1) throw err1; }); }); 测试压缩5M的GeoJSON数据,压缩完2M左右。 减少无用属性信息 GeoJSON中能够存储对象的对应属性信息,在地图不必要绘制的,可以删除掉,这样能够减少数据量。
在选中Cesium的模型对象时,需要高亮的效果,通过给模型的表面或者周边设置高亮颜色,达到突出显示模型的效果。在Entity实体查找或者点击Entity时,获得对象,通过修改Entity中model的颜色,在模型的表面覆盖一层颜色,具体的效果如下图:将模型高亮成红色,使用Cesium的颜色类,顺序是R\G\B\A,A是透明度,范围是0-1,所以,在使用0-255范围的颜色值时,中间需要有个值的换算。entity.model.color = new Cesium.Color(1.0, 0, 0, 1.0);将模型设置非高亮,可以将模型颜色设置为空,或者设置为白色:entity.model.color = null; 或者entity.model.color = new Cesium.Color(1.0, 1.0, 1.0, 1.0);这样设置的时候,虽然透明度设置是不透明,但是还能看到模型,这样在模型比较小或者模型颜色比较深的时候,高亮效果不明显。这时,可以设置模型的colorBlendMode为replace模式,这样就将模型都替换成颜色了。entity.model.colorBlendMode = Cesium.ColorBlendMode.REPLACE; 效果如下图:如果觉得这种替换效果不好,可以在模型周边设置轮廓线:entity.model.silhouetteColor = new Cesium.Color(1.0, 0, 0, 1.0);entity.model.silhouetteSize = 2.0;效果如下图:
CZML是一种用来描述动态场景的JSON架构的语言,主要用于Cesium在浏览器中的展示。通过制作CZML文件,在Cesium进行数据的批量加载,省去单独循环一个一个加载对象的方式。下边是一个简单的模型CZML文件的配置:CZML是数组形式的JSON文件,首先有一个根节点,里边是id、name和version,修改的时候,只需要设置名称就行。 下边每个对象是一个模型的参数配置: id必须是唯一的,name可以有相同的,properties里边可以加一些自定义的属性数据,position是模型的位置信息,orientation是模型的转角信息(heading、pitch、roll),model是模型的路径,比例等参数配置。其中orientation需要根据模型坐标和转角进行计算,算出来一个4个元素的数组,代码如下: let position = Cesium.Cartesian3.fromDegrees(evdata.x, evdata.y, evdata.height); let heading = Cesium.Math.toRadians(evdata.heading); let pitch = evdata.pitch; let roll = 0; let hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll); let orentation = Cesium.Transforms.headingPitchRollQuaternion(position, hpr); //模型的czml样式文件 [ { "id": "document", "name": "name", "version": "1.0" }, { "id": "uid1", "name": "uid", "properties": { "status": "use" }, "position": { "cartographicDegrees": [ 116.119, 39.1112, 1.01 ] }, "orientation": { "unitQuaternion": [0,0,0,0] }, "model": { "gltf": "模型路径", "scale": 1.0, "minimumPixelSize": 16 } }]
maputnik是一个开源、可视化的web版mapbox地图样式编辑器,类似于百度、高德地图的地图样式编辑器。github地址:https://github.com/maputnik/editor 客户端可配置样式地图参见文章:GIS开发:客户端控制的地图样式使用vector tiles技术发布的数据,可以在maputnik的界面上进行数据连接,选择加载其中的图层,进行每个图层的样式配置。提供了一个在线的地址,因为是国外的,还是建议下载源码,自己搭建进行配置。 https://maputnik.github.io/editor 英文界面,具体信息也可以看懂。添加数据源,可以是自己发布的数据地址,也可以是在线的mapbox地址,不过mapbox的地址需要token。数据源添加完成后,是添加图层数据,数据源是可以包含多个图层数据的,按照数据源的id添加进来。数据源和图层的id是需要都唯一的,不能有相同的,要不然会报错。在style settings里加入基础图片和字体的配置地址,需要用mapbox的,要添加mapbox的token。在样式配置完后,可以以json数据的形式,将样式保存下来,mapbox gl使用时,只要配置style为这个json文件。
费劲巴拉的想弄个cesium和二维地图的联动,先是按照原来的思路,通过二维地图的缩放范围坐标,计算cesium的观看视角和观看范围,在根据二维地图的中心点坐标,设置cesium的camera坐标一致,再实现二维地图移动时,移动三维地图。后来发现,cesium的camera中,setview函数支持定位到一个范围,设置个rectangle的范围就行,把二维地图的缩放范围,赋予到里边即可,二维地图现在也能水平旋转了,同时在cesium中,也可以进行同步旋转,不过,二维地图控制cesium的时候,最好还是保持从上到下垂直俯视,这样计算起来简便一些,同步效果也比较好。在cesium控制二维地图同步的时候,因为在cesium中,可以保持倾斜的视角,所以,在二维地图中的范围就不那么精确了,特别是当倾斜角pitch比较小的时候,那看的范围就很大,通过cesium中camera的computeViewRectangle计算观看的范围,同步到二维地图的范围。测试的时候,在cesium中,离地图很近的情况,保持倾斜角pitch在10度左右,二维地图同步的范围就很大了图片,再加上cesium里的旋转,二维地图也得跟着旋转,这样同步起来的范围就误差比较大了。
Cesium开发,加单个模型,要转换成gltf格式或者glb格式,glb是gltf的压缩格式,官方提供了各种模型格式转换的工具,但是,一实际操作起来还是有些问题的。从网上下载个小模型,或者谁随便拿来一个模型,转换的时候,有时没贴图,有时压根转换不出来,后来看到cesium上一篇为模型制作者写的文章,网址如下:https://cesium.com/blog/2014/12/15/gltf-tips-for-artists/ 开始从3dmax导出dae格式的模型,用官方的COLLADA2GLTF转换,一直不成功,贴图的中文路径名称、丢失贴图和结构性问题都有报出,转换都不能生成正常的结果,后来,偶尔发现,win10里自带个3d builder还能打开gltf,不过压缩转换了一下glb,cesium打不开。3dmax也有自己转换gltf和glb的工具,绕了一大圈,3dmax直接导出的模型,就能够进行使用了,转换的gltf,会分为bin和贴图文件,转换glb文件,就都压缩在一起了,当然后期也可以安装一个nodejs版的gltf-pipeline,可以转换glb格式,并且能够进行模型的draco压缩。关于draco压缩参见下列网址:https://github.com/google/draco,使用这种压缩,可以减少glb模型的大小,方便网络传输,但是前端还是需要相应的代码进行解压。3dmax也能够导出fbx格式的模型文件,有开源的fbx转换glb的工具,也能够进行转换,这个成功率会好点。装个开源的模型工具blender,支持dae、obj、fbx等格式文件,能够导出gltf和glb文件,这个只有模型导入进去,看着没问题,就能够导出gltf和glb。对于lod,可以搜索参见msft_lod的内容,blender上还有开源的一个生成msft_lod的插件,可以在github上搜索到。模型太大的情况,还是需要转成3dtile,要不系统加载速度慢,操作的时候也会卡顿,可以使用lab或者fme等工具转换,倾斜模型cc能转换。
vectortile 矢量切片数据,参见文章,GIS开发:推荐mapbox gl js,GIS开发:客户端控制的地图样式,是mapbox 提出的数据格式,并实现客户端调整地图的样式。在cesium开发中,也有一位大神,写了一个可以动态将json或shp数据切割成矢量切片,并且在cesium上进行动态渲染加载。在github上的地址是:https://github.com/MikesWei/CesiumVectorTile 简介:Cesium VectorTileImageryProvider支持小数据量的geojson、shape文件 矢量 动态切片,实现贴地 。简要说明,因为是在客户端通过js实现将矢量数据,geojson或者shp切片,所以数据量不是太大,要不然切起来比较慢。网上也能搜到cesium直接加载 mapbox发布的切片数据,不过源码类的比较少,相比较mapbox,加载效率还是要差一些,笔者从网上下载了个源码,试了一下,加载到高级别的时候,内存快速的上升,显示的速度也比较慢。可能是cesium的渲染机制,文字或者道路一些信息,渲染的不太清晰。百度搜索到的一个,加载mapbox切片的文章:https://blog.csdn.net/caozl1132/article/details/88106984这个源码下载的积分还是挺高的、
在二维地图的开发中,实现类似于百度、高德地图那样加载简体的模型,使用mapbox gl是一个比较好的解决方案。https://docs.mapbox.com/mapbox-gl-js/api/类似于国内的地图,在开发时,需要先以开发者的身份,申请token,才能调用官网的数据服务等其他接口。当然,库是JavaScript的,意味着可以将源码都下载下来,并搭建自己的服务方式,在网上可以搜到详细的解决方案,主要是发布图标数据和字体数据信息,字体数据mapbox也发布了对应的生成工具。功能方面,mapbox gl可以加载地图切片数据,通过设置,不止可以加载官方的数据,也能加载天地图等在线地图切片数据,下载的切片数据,发布之后也能够进行发布使用;gl说明这个是mapbox基于webgl做的扩展,webgl在大数据方面的展示,还是具有相当高的优势,同样在传统的地图技术上,渲染几千个点,速度就相应的减慢,而通过webgl技术实现的mapbox gl,同时加载几万个点,也不会显示出来性能降低;热力图、聚合图等常用的大数据功能,在api都有相应的集成,设置相应的数据,就能够很方便的实现对应功能;vector tiles 技术在mapbox的底图使用中,能够根据客户端设置的样式,动态改变底图的效果;api中结合threejs,能够加入简单的三维模型数据。所以,在gis开发中,如果对于三维模型的需求不是很高,同时还要达到一个三维底图的效果,数据量还要支持很高的情况下,推荐Mapbox gl的解决方案。
首先是有在二维地图上的一个风场效果,通过canvas进行的绘制,例如leaflet开源地图上就能够根据数据生成风场的效果图。最近mapbox里的大神分享了如何在cesium上实现风场的效果,并在github上进行了开源,开源地址:https://github.com/RaymanNg/3D-Wind-Field预览效果:https://raymanng.github.io/3D-Wind-Field/demo/技术说明英文博客:https://cesium.com/blog/2019/04/29/gpu-powered-wind/有气象的风场数据,可以根据示例的代码进行实现。在GPU上使用webgl的技术进行绘制,要比使用js代码直接在canvas上绘制提升的效率高很多,渲染的速度,粒子数也多。
GeoNetwork是一个开源的GIS数据共享服务软件,软件的地址是:https://geonetwork-opensource.org/,在github上有源代码,是以java语言编写的,其中还集成了数据服务的发布。通过系统上传gis数据,并进行发布共享,查看数据的详细信息,在地图上预览数据的效果,发布标准的wms、wmts等服务。分析统计地图数据,查询数据等等。支持多种系统界面语言,目前还没有中文的支持,不过可以通过修改代码进行添加。网站提供了打包好的程序,可以直接进行下载部署使用,如果需要修改代码,从github下载代码进行修改编译。
python的pandas dataframe可以将csv数据,或者格式化的数据(excel)等,直接转换成dataframe,一个类似表格的数据,这样在数据处理中,能够根据设定好的函数,快速的进行数据分析、处理。C#的datatable也是将数据转换成表格的形式,这个常用的是在C#操作数据库中,直接读取数据到datatable,当然,可以将csv数据导入到数据库中,再通过连接数据库,获得对应的datatable。下边主要还是介绍一下,如何用代码读取一个csv数据,转换成datatable进行处理,详细见代码://设置csv数据的分隔符 string[] separators = new string[] { " " }; string _dataLine = string.Empty; //新建datatable DataTable _ndt = new DataTable(); //打开文件 using (FileStream fs = new FileStream(_filepath, FileMode.Open, System.IO.FileAccess.Read)) { //读取csv数据,这里注意的是设置数据的编码,要不然读出来会乱码 using (StreamReader sr = new StreamReader(fs, System.Text.Encoding.UTF8)) { //第一行是表头数据,将分割成一个列名 _dataLine = sr.ReadLine(); var _columnArr = _dataLine.Split(separators, StringSplitOptions.RemoveEmptyEntries); foreach(var _evarr in _columnArr ) { _ndt.Columns.Add(new DataColumn(_evarr.Trim(' '))); } //在添加行数据,直接添加到datatable中 while ((_dataLine = sr.ReadLine()) != null) { _columnArr = _dataLine.Split(separators, StringSplitOptions.RemoveEmptyEntries); _ndt.Rows.Add(_columnArr); } sr.Close(); sr.Dispose(); } fs.Close(); fs.Dispose(); }Linq在datatable中也能够进行使用,这样就能很方便的取出对应的数据,比如取某一列的数据:var _selrow = _ndt.AsEnumerable().Select(p => p["列名"]);从而使用Linq的语法,可以判断最大最小值,或者取出符合名称的字符串等方法,对于行数据也能进行对应的操作分析。Linq在数据分析操作中,也能够实现很多,当然python是开源类库和平台方面支持都比较多。
在地图开发中,有时会用到画曲线,一般的地图API中,都会提供画曲线的方法,或者提供相应的图例。下边简单的介绍一下,如何在地图上根据点的位置,画一条贝塞尔曲线。贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋,我们在绘图工具上看到的钢笔工具就是来做这种矢量曲线的。贝塞尔曲线是计算机图形学中相当重要的参数曲线,在一些比较成熟的位图软件中也有贝塞尔曲线工具,如PhotoShop等。--来自百科在地图上画的时候,小范围画的时候,经纬度坐标或者平面坐标系的方式差不多,大范围的时候,尽量要将经纬度转换成长度单位(例如米制)来进行画,因为算法的时候,计算的都是根据相应的距离。贝塞尔的算法,在github上可以搜索到很多,根据自己的开发语言选择其中的一类即可。简单的js示例:https://github.com/Aaaaaaaty/bezierMaker.js在画曲线的时候,最少需要3个点才能进行勾画,传入3个以上点的坐标,即可生成曲线效果。本身这个算法开源的就很多,在地图上画的时候,只是涉及到经纬度,是弧度制的单位,画起来会有相应的顾虑,理解其中的原理,直接传入距离类型的坐标,就能画出以上这种曲线的效果。注:在三维的球面地图上画曲线的时候,要把高度的值也作为一个因素传入进去,要不然画的效果达不到。
使用qgis加载插件,能够下载osm在线的数据。有个开源的工具,hot export tool ,可以在网页上下载osm的数据,网址是:https://export.hotosm.org/en/v3/exports/new/describe。首先要在网站上注册个用户,之后才能进行下载,用邮箱注册,在数据下载完成后,还会有邮件提示数据下载完成。分三步填写下载步骤:填写下载的描述,只有Name是必填项,这个根据自己的需要起名称;支持多种格式的数据导出:支持多种数据类型的下载,可以下载一种类型,或者多种类型;在地图上是选择多边形下载,还是box区域下载;配置完成后,就能够进行数据下载了。完成后,就能够将数据的压缩包下载下来了。
esri在有一个wpf的二维地图,在2.3版本之前是免费的,后来可能是esri觉得这个有用,后期又集成到runtime中进行了收费。最基础的dll名称是ESRI.ArcGIS.Client,还有其他的一些dll。完全是基于是wpf弄的,不像是sharpmap那种是集成的winform类型的控件,所以集成起来还是挺方便的。可以加载在线的切片地图,如谷歌、高德的切片,2.2版本还能加载本地的切片数据,支持经纬度坐标系的切片,也支持墨卡托的坐标系切片。可以加载wms等地图服务,支持半透明的叠加方式,按照wpf的属性设置即可。可以在地图上勾画图标等注记信息,点、线、面数据都支持。支持常用的地图拖拽、缩放和测量等操作。可以在地图上弹出标注等详细信息的气泡。对于一些项目上的简单应用,还是能够满足要求的。
nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是稳定、占有内存少,并发能力强。--来自百科在GIS开发中,要发布一些常用的图片、模型文件等数据,以便在网络上使用,通常在skyline中, 配合sfs或者sgs,将这些数据发布在IIS上,其他的java开发中,将数据发布在tomcat上,Cesium的数据发布中,类型就比较多了,比如影像切片、地形切片、3dtile数据,都需要进行发布,以上的数据类型,图片、文件数据或json数据,都可以以http的协议进行发布。nginx本身的体积也很小,下载下来的安装包大小也就在1.4M左右,而且解压就可以进行使用,具体的使用步骤可以去网上进行搜索。下边以一些在gis中使用的数据为例,简单列举一下,如何发布这些数据。nginx的配置都是以文本形式的,在nginx的目录中,有一个conf的目录,包含着nginx的配置文件。在nginx.conf中,添加配置,发布文件在系统中所在的目录,添加一个虚拟目录的发布,datapath为nginx访问的http url中的虚拟路径名称,root为系统中文件的目录。location /datapath { root E:/data; autoindex on; autoindex_exact_size off; } 类似Cesium的数据发布,还要考虑跨域的问题,所以在nginx的配置里,还需要添加上跨域的设置,在最上端加上跨域设置的响应头,保证nginx里的发布都能跨域。一些不常用文件类型,还要设置mimetype,例如cesium的.b3dm,.gltf、.terrain等,这个配置在mime.types文件中,打开能看到现有的配置,添加按照格式添加即可。例如 application/octet-stream b3dm; application/octet-stream gltf; application/octet-stream glb; application/octet-stream terrain;发布完成后,即可按照ip和端口访问数据了,访问速度还是相当可以的。
现在常用的高德地图、百度地图、腾讯地图等,都有开放的API,个人用户就能申请进行开发,通过生成开发的key,调用这些地图的API服务,当然,个人用户每天的API请求次数是有限,一般对于简单的数据查询还是够用的,通过这种方式,我们还是能根据API累积一定的常用地图数据。高德地图的每天请求数量限制,一般都是开发上千次的请求,当然每次的数据量也是做限制了。举例一个常用的POI搜索的网络服务,可以根据一些常用关键字,调用API服务,批量搜索出来poi信息,关键是包括地图的坐标信息,这个能够让我们在地图上进行显示。各个地图平台注册用户是必不可少的步骤,因为这样才能获得请求API的key,这个在API是必填的。高德地图的搜索POI的API网址:https://lbs.amap.com/api/webservice/guide/api/search。里边有详细的请求参数网址配置,返回结果的字段说明。请求参数:返回结果:请求返回可以使用json格式。以上搜索POI使用的是http的请求方式,这在java、C#、python等开发语言上都能进行支持。坐标的问题,高德地图、腾讯返回的坐标是火星坐标,百度地图返回的百度坐标的,网上有这些坐标的转换代码,或者常用的地图下载工具也能进行转换,需要在正常的经纬度展示的数据,要提前进行转换。
在早期GIS开发中,空间数据库的使用比较少,一般都是使用Arcgis Engine进行GIS空间分析等功能的开发,或者通过Spatial Database Engine(sde)空间数据引擎调用数据库的数据进行功能开发,开源方面,gdal使用的也比较多。随着技术的发展,现在好多数据库的都支持空间数据扩展,不管是关系型数据库,还是NoSQL数据库,常见的有Oracle数据库的空间,SQL Server2008版本以后也加入了空间扩展,MySQL有空间扩展,Postgresql专门的扩展Postgis,文件型的Sqlite也能通过各种开发语言,实现空间数据的扩展(Spatialite),NoSQL中的mongodb、couchbase同样也能够实现空间数据的相关操作。对比于操作shapefile等文件类型的空间数据,空间数据库在存储、开发、效率上有相当不错的优势。开发一个GIS的分析功能,使用文件类型的空间数据,需要使用开发语言,将数据读取一遍,逐个进行分析,查验结果,而在空间数据库中,简单的只需要一个sql语句,就能将结果获取出来,这在代码的编写数量可能就减少不少工作量,数据库引擎一般都经过相当的优化,在分析过程的效率对比自己读取也会有相当的提高,而且有些空间数据库还能提供一些类似于路径分析的高级分析,这也能提高GIS应用开发的效率。数据存储更新方面,文件数据的修改,一般都需要通过专门的工具进行修改,更新数据也就相当于对于整个文件修改,在数据库中的数据,存储更新,也可能通过几个sql语句就能够进行修改,不同的数据库,可将空间数据表的坐标信息导出成wkt、wkb等通用格式,方便数据的迁移,而且wkt、wkb格式在各类地图引擎中,都有可用的api直接解析成平台的坐标信息。数据的共享,目前各类gis发布软件,能够支持连接数据库的数据,进行共享发布,再通过开发的业务数据服务,支持BS\CS客户端的数据访问。
mbtiles是一个sqlite的数据库,用来按照一定组织格式格式存储切片地图数据,常用在单机、移动端的地图包中,在地图数据的发布,对比直接的切片文件数据,具有存储统一,便于移动拷贝。在通过互联网下载的数据,转换成mbtiles后,发现数据不够,又需要重新下载,下载的时候,还需要将前边的数据再下载一遍,对于高级别的切片,下载时间还是挺慢的。mbtiles本身就是一个sqlite数据库,这个可以通过java、C#等开发语言进行开发,所以,可以通过开发,将两个或者多个mbtiles数据进行合并。下图是mbtiles文件的表结构:metadata是切片的一些常用信息,map是切片的索引信息,images是具体的存储切片文件数据,是以二进制信息将图片存储到数据库中。在mbtiles的合并中,metadata中的bounds信息,需要根据各个mbtiles的文件,取最大的范围,或者根据几个mbtiles计算最大范围,要是范围不够,发布后数据也不能访问全面。合并时,要对比map中的索引信息,根据zoom_level、tile_column、tile_row组合进行判断,如存在的数据,就不需要写入了,不存在的数据,首先将以上信息写入到表中,在生成tile_id的guid,在images表中,以生成的guid和切片的图片,组合写入到表中,这样就达到数据合并的效果。
二维地图的底图一般都是用切片(瓦片),一般都是将大的影像数据,通过工具,切成地图切片,以文件的形式存放,或者是存放到数据库中,Arcgis Server或Geoserver也可将影像数据,实时的按照范围,切成地图切片,返回到客户端进行显示。切片数据可以直接按照目录发布,也可发布成tms、wmts服务,开源的二维地图引擎leaflet、openlayers等,或商用的高德、百度地图引擎,都能直接利用api进行读取显示。下边分享一款开源的地图切片类库,使用python语言进行调用,使用方法比较简单,地图的切片效率也比较高。开源类库的网址是:https://github.com/tehamalab/gdal2tiles开发的时候,需要先安装python的gdal类库,可通过conda或者pip进行安装,接着需要安装gdal2tiles的类库,通过pip install gdal2tiles进行安装。调用的方式比较简单,其中需要配置一些参数,具体可参见网站上的说明。调用代码:import gdal2tiles #设置需要切图的级别,设置恢复模式,显示生成切片的输出 options = {'zoom': (11, 12), 'resume': True,'verbose':True} gdal2tiles.generate_tiles('输入的影像文件', '输出的切片文件夹', **options)生成的切片是按照目录进行组织:文件夹中,有3个网页文件,可直接在浏览器中,打开进行数据预览。
在Cesium上根据点,可以显示出热力图,在网上有开源的代码,具体的参考网址如下:https://github.com/danwild/CesiumHeatmap使用方式如下:function testLoc(){ //设定热力图的四至范围 let bounds = { west: 116.13833844, east: 116.13956899, south: 37.43582929, north: 37.43706916 }; // i初始化热力图 let heatMap = CesiumHeatmap.create( viewer, // your cesium viewer bounds, // bounds for heatmap layer { // heatmap.js options go here maxOpacity: 0.75 } ); // 设置一些随机的效果,这个可根据实际数据进行开发 let data = [{ "x": 116.1383442264, "y": 37.4360048372, "value": 76 }, { "x": 116.1384363011, "y": 37.4360298848, "value": 63 }, { "x": 116.138368102, "y": 37.4358360603, "value": 1 }, { "x": 116.1385627739, "y": 37.4358799123, "value": 21 }, { "x": 116.1385138501, "y": 37.4359327669, "value": 28 }, { "x": 116.1385031219, "y": 37.4359730105, "value": 41 }, { "x": 116.1384127393, "y": 37.435928255, "value": 75 }, { "x": 116.1384551116, "y": 37.4359450132, "value": 3 }, { "x": 116.1384927196, "y": 37.4359158649, "value": 45 }, { "x": 116.1384938639, "y": 37.4358498311, "value": 45 }, { "x": 116.1385183299, "y": 37.4360213794, "value": 93 }, { "x": 116.1384007925, "y": 37.4359860133, "value": 46 }, { "x": 116.1383604844, "y": 37.4358298672, "value": 54 }, { "x": 116.13851025, "y": 37.4359098303, "value": 39 }, { "x": 116.1383874733, "y": 37.4358511035, "value": 34 }, { "x": 116.1384981796, "y": 37.4359355403, "value": 81 }, { "x": 116.1384504107, "y": 37.4360332348, "value": 39 }, { "x": 116.1385582664, "y": 37.4359788335, "value": 20 }, { "x": 116.1383967364, "y": 37.4360581999, "value": 35 }, { "x": 116.1383839615, "y": 37.436016316, "value": 47 }, { "x": 116.1384082712, "y": 37.4358423338, "value": 36 }, { "x": 116.1385092651, "y": 37.4358577623, "value": 69 }, { "x": 116.138360356, "y": 37.436046789, "value": 90 }, { "x": 116.138471893, "y": 37.4359184292, "value": 88 }, { "x": 116.1385605689, "y": 37.4360271359, "value": 81 }, { "x": 116.1383585714, "y": 37.4359362476, "value": 32 }, { "x": 116.1384939114, "y": 37.4358844253, "value": 67 }, { "x": 116.138466724, "y": 37.436019121, "value": 17 }, { "x": 116.1385504355, "y": 37.4360614056, "value": 49 }, { "x": 116.1383883832, "y": 37.4358733544, "value": 82 }, { "x": 116.1385670669, "y": 37.4359650236, "value": 25 }, { "x": 116.1383416534, "y": 37.4359310876, "value": 82 }, { "x": 116.138525285, "y": 37.4359394661, "value": 66 }, { "x": 116.1385487719, "y": 37.4360137656, "value": 73 }, { "x": 116.1385496029, "y": 37.4359187277, "value": 73 }, { "x": 116.1383989222, "y": 37.4358556562, "value": 61 }, { "x": 116.1385499424, "y": 37.4359149305, "value": 67 }, { "x": 116.138404523, "y": 37.4359563326, "value": 90 }, { "x": 116.1383883675, "y": 37.4359794855, "value": 78 }, { "x": 116.1383967187, "y": 37.435891185, "value": 15 }, { "x": 116.1384610005, "y": 37.4359044797, "value": 15 }, { "x": 116.1384688489, "y": 37.4360396127, "value": 91 }, { "x": 116.1384431875, "y": 37.4360684409, "value": 8 }, { "x": 116.1385411067, "y": 37.4360645847, "value": 42 }, { "x": 116.1385237178, "y": 37.4358843181, "value": 31 }, { "x": 116.1384406464, "y": 37.4360003831, "value": 51 }, { "x": 116.1384679169, "y": 37.4359950456, "value": 96 }, { "x": 116.1384194314, "y": 37.4358419739, "value": 22 }, { "x": 116.1385049792, "y": 37.4359574813, "value": 44 }, { "x": 116.1384097378, "y": 37.4358598672, "value": 82 }, { "x": 116.1384993219, "y": 37.4360352975, "value": 84 }, { "x": 116.1383640499, "y": 37.4359839518, "value": 81 }]; //设置最大最小值 let valueMin = 0; let valueMax = 100; // 将数据添加到热力图 heatMap.setWGS84Data(valueMin, valueMax, data); //定位到热力图的位置 viewer.zoomTo(viewer.entities); } 热力图效果:
在Geoserver的wfs查询中,支持CQL的数据查询过滤,但是常用的OGC的查询中,是以post的形式,通过传递一个xml文件的格式,返回查询数据的结果。这在arcgis server,sfs server中都能够进行支持的,因为这些服务都支持OGC的标准查询。CQL使用类似文本语法的格式,具有很高的可读性和适用性。这里分享一个使用GeoTools将CQL转换为OGC过滤查询的代码样例,具体的英文网址在原文链接中。GeoTools是一个开源的java版gis工具集,里边有许多gis方面的相关方法,可在网上直接下载编译好的jar包进行使用。转换代码如下:import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import org.geotools.filter.text.cql2.CQL; import org.geotools.filter.text.cql2.CQLException; import org.opengis.filter.Filter; public class CQLToOGC { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String line; org.geotools.xml.Configuration configuration = new org.geotools.filter.v1_0.OGCConfiguration(); org.geotools.xml.Encoder encoder = new org.geotools.xml.Encoder( configuration); encoder.setIndenting(true); while (!(line = reader.readLine()).isEmpty()) { try { Filter filter = CQL.toFilter(line); // System.out.println("\t" + filter); encoder.encode(filter, org.geotools.filter.v1_0.OGC.Filter, System.out); } catch (CQLException e) { e.printStackTrace(); } } }}转换的结果:CQL样式prop = 23转换结果:<?xml version="1.0" encoding="UTF-8"?><ogc:Filter xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml"> <ogc:PropertyIsEqualTo><ogc:PropertyName>prop</ogc:PropertyName> <ogc:Literal>23</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter>空间查询转换的效果:CQL语句:INTERSECTS(SP_GEOMETRY, POLYGON ((142578.64599609 252217.79003906, 73781.897460938 141983.61767578, 287078.38037109 146764.85888672, 142578.64599609 252217.79003906))) 转换结果:<?xml version="1.0" encoding="UTF-8"?><ogc:Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml"> <ogc:Intersects> <ogc:PropertyName>SP_GEOMETRY</ogc:PropertyName> <gml:Polygon> <gml:outerBoundaryIs> <gml:LinearRing> <gml:coordinates>142578.64599609,252217.79003906 73781.897460938,141983.61767578 287078.38037109,146764.85888672 142578.64599609,252217.79003906</gml:coordinates> </gml:LinearRing> </gml:outerBoundaryIs> </gml:Polygon> </ogc:Intersects></ogc:Filter>
CQL(Common Query Language) 是一个由OGC创建的查询语言,用在Catalogue Web服务上,不同于基于xml过滤的查询方式,CQL使用类似文本语法的格式,具有很高的可读性和适用性。 CQL有一些限制,比如不能过滤id查询,查询的时候,需要指明一个属性才能进行比较操作。 基于以上原因, GeoServer提供了一个CQL的扩展语言,叫ECQL,ECQL移除了CQL中的一些限制,提供了类似SQL的比较方便的语言。GeoServer支持在wms和wfs的请求中,使用CQL和ECQL,同时在sld(动态样式设置)也能进行设置。这就表示,在请求Geoserver的wfs和wms服务时,可进行过滤请求,返回过滤的数据结果;以下为一个wms的请求,在添加过滤请求时,只需要在后边添加对应的参数:http://localhost:8080/geoserver/wms?request=GetFeatureInfo&service=WMS&version=1.1.1&layers=topp%3Astates&styles=&srs=EPSG%3A4326&format=image%2Fpng&bbox=-145.151041%2C21.73192%2C-57.154894%2C58.961059&width=780&height=330&query_layers=topp%3Astates&info_format=text%2Fhtml&feature_count=50&x=353&y=145&exceptions=application%2Fvnd.ogc.se_xml//过滤所拼接的字符串&cql_filter=INTERSECTS(the_geom,%20POINT%20(-74.817265%2040.5296504))下边是一个wfs的请求,也是根据参数在后边过滤字段, 只需要在后边添加对应的参数:http://example.com/geoserver/wfs? service=wfs& version=2.0.0& request=GetFeature& typeNames=namespace:featuretypecql_filter=INTERSECTS(the_geom,%20POINT%20(-74.817265%2040.5296504))根据以上的过滤,就能控制地图上显示的数据信息,或者查询的信息,查询的时候需要根据服务进行请求,具体的详细参数,可以参考http://docs.geoserver.org/latest/en/user/filter/syntax.html
mbtiles是一个sqlite的数据库,用来按照一定组织格式格式存储切片地图数据,常用在单机、移动端的地图包中,在地图数据的发布,对比直接的切片文件数据,具有存储统一,便于移动拷贝。Geoserver通过扩展插件,直接发布mbtiles的切片数据库,将数据发布成wms、wmts等服务。安装mbtiles的插件时,要保证先安装对应Geoserver WPS扩展,这在Geoserver的extension中可以看到。之后下载对应版本的mbtiles模块插件,放在Geoserver安装的WEB-INF/lib目录中,插件安装完成后,重启Geoserver,就可以在Geoserver的数据源中,看到mbtiles的数据源配置。添加一个新的Geoserver数据源:数据源名称必须填写URL必须填写,如果是绝对路径,url的格式是 file:C:\Data\landbase.mbtiles,如果放在Geoserver的数据目录中,可以按照相对路径进行填写file:data/landbase.mbtiles 。wmts访问数据的方式及url,这在常用的二维、三维地图都有访问接口,具体请查看相应API:http://localhost:8977/geoserver/gwc/service/wmts 注意:在使用wms访问发布的mbtiles数据时,在缩放等级比较高,范围比较大的情况下,Geoserver不会返回数据,应该是内部有处理切片数量的显示。
Cesium支持加载单个三维模型,常用的模型格式为:gltf,glb,这些模型都可以从3dmax、obj等三维模型的格式转换过来,Cesium的官方网站也列举了加载单个三维模型的方式,根据详细的代码列举一下。详细的代码在Cesium示例:3D Models.html页面中样例的模型文件在:SampleData的文件夹中以下是加载模型的详细代码://位置信息,x、y、高度信息 var position = Cesium.Cartesian3.fromDegrees(-123.0744619, 44.0503706, height); //模型的三个方向转角,在三维立体空间中的三个转角方向,可以参见上图 //的小飞机示意图(其中direction对应heading ,tilt对应pitch) var heading = Cesium.Math.toRadians(135); var pitch = 0; var roll = 0; var hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll); //要根据位置和设置的转角信息做一个转换 var orientation = Cesium.Transforms.headingPitchRollQuaternion(position, hpr); //单个对象一般都放在实体中,添加一个实体对象 var entity = viewer.entities.add({ //设置位置和转向信息 name : url, position : position, orientation : orientation, model : { //模型的路径 uri : url, //模型的比例 scale:1.0, //最小的像素尺寸 minimumPixelSize : 128, //最大显示比例 maximumScale : 20000 } }); 模型的加载效果,代码使用时,去掉注释信息:
GeoServer 是 OpenGIS Web 服务器规范的 J2EE 实现,利用 GeoServer 可以方便的发布地图数据,允许用户对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间地理信息。GeoServer是社区开源项目,可以直接通过社区网站下载。使用Geoserver可以代替Arcgis Server等商业的数据发布软件,并且按照OGC的标准发布,能够兼容大部分的客户端软件访问。Geoserver的发布结构可以参照本公众号的文章《Geoserver系列:数据发布结构》。Geoserver可以将矢量图层,发布成栅格图层,通过设置sld(geoserver的样式文件),能够将图层显示成热力图的效果。sld设置参考网址为:http://docs.geoserver.org/latest/en/user/styling/sld/extensions/rendering-transform.html首先要有一个具有 权重的矢量图层,根据矢量图层中的字段,确定热力图的影响范围,后边主要内容就是设置sld的样式,参考网址上有一个sld的样式,下边列举一下关键参数:设置权重属性的字段,图层中必须有指示这个的字段:radiusPixels等字段可设置成固定值,也可根据图层中属性设置;//删除标志的设置,这里是热力图效果的设置,包括颜色和属性影响范围<Geometry> <ogc:PropertyName>the_geom</ogc:PropertyName></Geometry> <Opacity>0.6</Opacity> <ColorMap type="ramp" > <ColorMapEntry color="#FFFFFF" quantity="0" label="nodata" opacity="0"/> <ColorMapEntry color="#FFFFFF" quantity="0.02" label="nodata" opacity="0"/> <ColorMapEntry color="#4444FF" quantity=".1" label="nodata"/> <ColorMapEntry color="#FF0000" quantity=".5" label="values" /> <ColorMapEntry color="#FFFF00" quantity="1.0" label="values" /> </ColorMap> </RasterSymbolizer> 
在Cesium地图系统开发中,后台出图的范围,在经纬度中是一个不规则的polygon,出来的图片形状也不是规则的,要在地图上贴上这张图,图片显示的范围也要契合到实际地图位置。图片效果:查找Cesium的接口,首先想到的是,用其中的polygon,按照经纬的范围,画一个polygon,再将图片做为材质material贴进去,不过代码写上后,发现的贴图在polygon中变形了,也没有贴到相应的地图位置。经过测试,最后发现可以用Cesium的Rectangle实体对象,通过计算出不规则多边形四至范围的左上角坐标和右下角坐标,再将图片材质贴上去,地图上的位置还对上了。具体的代码如下://添加一个rectangle的实体 viewer.entities.add({ name: '不规则贴图', rectangle: { //设置rectangle的四个坐标范围 coordinates: Cesium.Rectangle.fromDegrees(-92.0, 30.0, -76.0, 40.0), //设置图片为材质 material: 'data/wind_500_2018030616_True.png', //图片显示样式类型,有地形,模型或者两者,此效果可以达到贴图是沿 //地图弧面的 classificationType : Cesium.ClassificationType.TERRAIN }添加完成后,效果是贴地的,形状是长方形,但是空白地方显示是黑色,要在材质里单独设置一下,把材质属性改成如下:黑色没有了material: new Cesium.ImageMaterialProperty({ image:'data/wind_500_2018030616_True.png', transparent:true })//顺便设置个高度属性,可以离开地面显示height:70000完成后效果图:
GeoServer 是 OpenGIS Web 服务器规范的 J2EE 实现,利用 GeoServer 可以方便的发布地图数据,允许用户对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间地理信息。GeoServer是社区开源项目,可以直接通过社区网站下载。使用Geoserver可以代替Arcgis Server等商业的数据发布软件,并且按照OGC的标准发布,能够兼容大部分的客户端软件访问。Geoserver支持的服务有wmts,wms,wcs,wfs。在平常的概念中,Geoserver只是发布数据,供客户端进行调用,客户端调用Geoserver中的方法显示信息,其实不然,Geoserver也提供了不少的内置服务接口,可以设置参数进行查询,这和Arcgis Server有同样的原理,这些Server中都集成开发了不少服务,而且Arcgis Server在客户端做了相当多的工作,可以使用JavaScript的api能够调用,在Geoserver中,我们也可以根据url的请求,进行这些服务的调用,这需要熟悉常用客户端web请求的调用。下边根据一个简单的wfs请求来说明,比如我们在Geoserver中发布了一个shp数据的服务,不止要在地图中看到数据,还要能请求到其中的数据信息。http://localhost:8977/geoserver/wfs?service=wfs&version=2.0.0&propertyName=cat&request=GetFeature&typeNames=sf:archsites&outputFormat=application/json这就是一个请求wfs的服务,返回图层指定属性信息和坐标信息:service=wfs&version=2.0.0&request=GetFeature是固定的参数;typeNames=sf:archsites是Geoserver发布的图层名称,Geoserver读取图层名称一般要加工作区的前缀;propertyName=cat可以控制返回的属性,多个属性中间用逗号隔开;outputFormat=application/json返回数据的类型,可指定json,xml等部分返回数据效果:在系统的开发中,可以根据规则拼接以上的url,通过web请求,返回json数据进行处理,这样有些服务就不需要单独进行开发了,而且在Geoserver的手册中,有其他不同种类的服务请求,可以根据需求进行查找。Geoserver doc:http://docs.geoserver.org/stable/en/user/services/wfs/index.html
Leaflet是适用于桌面端和移动端交互地图的开源JavaScript类库。JS库的大小经过压缩后有38k左右,拥有开发者需要的全部地图功能。 Leaflet保持着简单、性能和实用性的设计思想。可以在所有主要的桌面和移动端平台上高效的运转,可以扩展插件,它有一个漂亮、易用和文档清晰的API,有一个简单、易读的源代码Leaflet可以通过加载GeoJSON数据,批量加载点、线、面数据,并转化为相应的特征对象,实现数据显示,弹出数据信息管理。下边通过一个GeoJSON加载点数据,显示为图标进行说明://循环遍历每一个feature,绑定弹出气泡和提示信息 function onEachFeature(feature, layer) { if(feature.properties && feature.properties.name) { layer.bindTooltip(feature.properties.name); layer.bindPopup(feature.properties.address); } } //设置图标样式 var baseballIcon = L.icon({ iconUrl: 'img/leaflet/school_icon.png', iconSize: [24, 27], iconAnchor: [12, 27], popupAnchor: [0, -28], tooltipAnchor: [0, -20] }); //加载json数据 $.getJSON('sampledata/ta_school_point.json', function(data) { //通过geojson创建图层 schoollayer = L.geoJSON(data, { onEachFeature: onEachFeature, //循环设置图标样式 pointToLayer: function(feature, latlng) { return L.marker(latlng, { icon: baseballIcon }); } }); //添加到地图,并定位 schoollayer.addTo(map); map.fitBounds(schoollayer.getBounds()); });
PostGIS是目前使用非常广泛的开源数据库Postgresql的空间扩展插件,使用PostGIS插件,可以很方便的在数据库中对空间数据进行组织、管理,同时PostGIS还有很多自带的空间处理、分析函数,能够很容易的在数据库中,完成数据图层的处理,目前很多开源、商业软件,都能支持直接连接带PostGIS空间扩展的Postgresql数据库,对数据库中数据进行编辑、修改等,并且能够直接发布其中的空间图层数据。Postgresql的连接工具,有开源的pgadmin,收费Navicat,请自行进行安装,配置好了连接,能执行sql语句即可。下边列举一些常用的sql查询语句:使用Navicat打开查询的界面,输入sql语句,postgresql加上了空间扩展,查询时,需要写一些现成的空间函数,sql语句在各个客户端都能进行执行,sql语句的知识,可以从网上查询学习;打开sql语句的查询界面;将图层的空间信息,查询出常用的wkt字符串,使用的函数是st_astext(空间字段),有关wkt的知识参见:https://en.wikipedia.org/wiki/Well-known_text;将查询图层中空间信息的中心点,并转换成wkt字符串,使用的函数是st_centroid(空间字段),查询出路的结果也可以进行导出;查询数据表中线图层的长度,使用的函数是st_length(空间字段),查询出来的结果单位为米;postgis的参照函数网址为:http://postgis.net/docs/manual-2.4/,上边列举了所有的函数,使用数据库,便于批量处理图层数据,并且能进行常用的空间分析操作。
ostGIS是目前使用非常广泛的开源数据库Postgresql的空间扩展插件,使用PostGIS插件,可以很方便的在数据库中对空间数据进行组织、管理,同时PostGIS还有很多自带的空间处理、分析函数,能够很容易的在数据库中,完成数据图层的处理,目前很多开源、商业软件,都能支持直接连接带PostGIS空间扩展的Postgresql数据库,对数据库中数据进行编辑、修改等,并且能够直接发布其中的空间图层数据。下边列举一下,如何使用开源软件qgis工具连接带扩展的Postgresql数据库,如何将shp文件数据导入到数据库中,如何将数据库中的空间图层直接加载到qgis上进行查看,如何将数据库中的数据导出成shp等空间数据文件。postgresql+postgis如何进行安装,如何创建一个带空间扩展的数据库,请在网上自行搜索,本文不进行介绍了。打开qgis的界面,在左侧的postgis上点击右键,新建一个数据库连接,在数据库的连接界面,添加postgresql的连接参数,完成后,测试一下数据库连接即可。添加postgresql的连接数据库连接成功后,假如数据库中存在空间数据图层,每个表格作为一个数据图层,拖拽其中的每个图层到qgis界面中,可以查看数据的详细情况,在图层上点击右键,即可导出图层。查看数据库中的图层数据查看图层另存为矢量图层
3dtiles是Cesium的批量模型加载格式,3dtiles的文件目录中包含若干.json文件和.b3dm模型文件,使用IIS等web服务器就可以进行发布,而且skyline的te7.0.2直接加载网络版的3dtiles,这为数据发布带来多样化。3dtiles模型目录结构:3dtiles使用IIS发布的过程为:1、在IIS新建一个虚拟目录,名称按照自己要求起,物理路径选择3dtiles所放的文件夹,设置允许目录浏览;2、.json的文件,IIS能够进行网络发布识别,而.b3dm的模型文件,IIS不能进行网络发布识别,所以要设置一下MIME类型,添加一个后缀为.b3dm,MIME类型为application/octet-stream的项;3、3dtiles模型在Cesium中的调用是使用js调用,有时会出现跨域问题,在IIS中要设置“HTTP 响应标头”,允许跨域进行访问,在其中添加 \名称:Access-Control-Allow-Headers 值:content-type \ 名称:Access-Control-Allow-Methods 值:GET,POST,PUT,DELETE,OPTIONS \ 名称:Access-Control-Allow-Origin 值:* \ ,以上三项键值对。这样通过发布的网址,就可以进行3dtiles模型的访问了。
2023年08月
2023年07月
2023年06月
2023年05月
2023年04月