GIS基础应用技术分享

26 阅读9分钟

GIS基础应用技术分享****

一、GIS数据构成****

1、地图数据:包括地形图,交通图,水系图等基础地理信息,如高德路网图,中国地形图等。

image.png

               图1-中国地形图

2、遥感数据:通过卫星,无人机等遥感设备获取的影响数据。如天地图和地块管理系统中展示的高清地图

image.png

        图2-卫星遥感影像与无人机影像

3、属性数据:描述地理实体特征的文字和数字信息。例如一个地块的类型和面积。

image.png

          图3-地理元素与其属性表

4、元数据:描述地理数据的内容、质量、来源等信息的数据。例如数据的坐标系,数据的层级设置,遥感影像的分辨率等。

二、数据类型****

1、矢量数据:由点、线、多边形等集合对象组成,用于表示地理实体的空间位置信息和属性信息。一般以shape文件或geojson文件的形式保存。

    扩展内容:

a. shape文件主要由三个文件构成:.shp,.shx,.dbf。

❏ .shp文件存储的是几何要素的空间信息,即坐标数据,他描述了地理要素的形状和位置。

❏ .shx文件存储的是关于.shp文件的索引信息,记录了空间数据再.shp文件中的存储方式,以及XY坐标的输入点位置与数量,从而加快搜索效率。

❏ .dbf文件以数据表的格式存储每一个几何体的属性数据。

b. shape文件的其他可选文件:.prj,.sbn,.sbx, .shp.xml

❏ .prj文件用于保存地理坐标系统与投影信息,确保数据的地理参考正确。

❏ .sbn和.sbx文件作为空间索引,加速空间数据的读取与处理 。

❏ .shp.xml文件以XML格式保存元数据,包括创建时间等信息

2、栅格数据:由像素或网格组成的二维矩阵,每个像素或网格表示地理实体的一种属性值。一般以tif、tiff或图片格式的文件保存。

3、高程模型:表示地球表面高程的离散点或网格的集合,一般以dem格式的文件保存。

4、地理正摄影像:经过集合纠正和色彩校正的无人机或卫星遥感影像。

三、webGIS简介****

1、定义与特征

a. 定义:webGIS是建立在web技术上的一种特殊环境下的地理信息系统,是IT技术应用与GIS开发的产物。

b. 特征:

      是一种浏览器/服务器结构

      通过互联网实现空间数据的分享和互操作

       是目前分布最广,普及最快的GIS应用。

2、关键技术

(1)空间数据库技术:webGIS的核心技术,提供高效的空间信息存储,检索和管理功能,支持复杂的空间查询与分析。常用的空间数据库有PostGIS,Oracle等。

(2)地图切片技术:地图切片技术是将地图分成多个小块,然后对每个小块进行渲染和存储。地图切片技术可以快速的加载和显示地图,实现地图的平移和缩放功能。

     扩展内容: 我们常用的wmts图层和xyz图层就是地图切片技术的应用

(3)矢量地图渲染技术:支持使用矢量数据(点,线,多边形)来渲染地图,支持动态数据更新和实时渲染,使地图表达更精细且丰富。

(4)空间分析技术:webGIS的重要功能之一,用于对地理空间数据的分析和处理。提供常用的如缓冲分析,叠加分析,网络分析等空间分析功能。

(5)地图交互技术:通过提供丰富的交互接口和工具使用户能够与地图交互。常用的地图交互技术有openlayers、leaflet;三维地图交互技术:cesuim.js,Three.js等。

3、webGIS开发平台与工具

1、常见的开发工具:

(1)ArcGIS Sever:优点:功能强大,特别是空间分析和数据可视化方面尤其方便;缺点:收费服务,不开源

(2)GeoServer:开源,支持灵活的地图样式和各种地图服务的发布;

(3)MapServer:优点:开源服务,支持灵活的空间分析和数据可视化;缺点:美国系统,不支持国产化

(4)QGIS Server:基于Qt和C开发的GIS服务,优点:支持基础的空间分析和数据可视化;缺点:用户群体较小,社区生态不完善

总结:目前国内主流的WebGIS开发框架一般是GeoServer+openlayers+postgis和cesuim+geoserver+postgis。这套框架的优点是,开源,支持多种数据源,可扩展性较强。

四、webGIS应用****

1、openlayers框架API简介

(1)OpenLayers官方网址:openlayers.org

(2)Api关系导图

image.png

(3)常用API导图 kdocs.cn/l/clktdVWcX…

image.png

2、openlayers常用API示例

(1)wmts图层的加载

  resolutions[z] = width / (256 * Math.pow(2, z));  
  matrixIds[z] = z;  
}  
});  
  
const myCurrentFarmLand = new ol.layer.Tile({  
  source: new ol.source.WMTS({  
    url: "/app/api/proxy/map/farmLandMap",  
    layer: 'farm:f_farm_land_view',  
    matrixSet: "EPSG:4326",  
    format: "image/png",  
    projection: new ol.proj.Projection({ // 投影坐标系  
      code: "EPSG:4326", // 32648  
      units: "degrees", // m  
      axisOrientation: "neu"  
    }),  
    tileGrid: new ol.tilegrid.WMTS({ // 投影坐标系配置  
      tileSize: [256, 256],  
      extent: [-180.0, -90.0, 180.0, 90.0],  
      origin: [-180.0, 90.0], // 原点 左上角  
      resolutions: resolutions, // 分辨率数组  
      matrixIds: matrixIds // 矩阵id 瓦片坐标系z维度各个层级的标识  
    }),  
    style: 'if_farm_diff_color',  
    wrapX: true  
  })  
myCurrentFarmLand.setZIndex(3); // 设置图层显示层级,值越大越在上面  
map.addLayer(myCurrentFarmLand);  

(2)wms图层的加载

   source: new ol.source.TileWMS({\
     url: "/cdszlyManager/farmLandApp/layer/landnotCurrentFarm=true",\
     cacheSize:0,\
     params: {\
       'FORMAT': "image/png",\
       'VERSION': '1.3.0',\
       tiled: true,\
       STYLES: '',\
       LAYERS: 'farm:f\_farm\_land\_view',\
     }\
   })\
});\
otherLandLayer.setZIndex(3);\
map.addLayer(otherLandLayer);

(3)矢量图层加载与矢量元素加载

  source: new ol.source.Vector(),\
  zIndex:6\
});\
let polygonFeature = new ol.Feature({\
  geometry: new ol.geom.Polygon(\
    \[item.mapPoints] // 面的坐标\
    ),\
});\
polygonFeature.item = item\
  polygonFeature.setStyle(\
    new ol.style.Style({\
      stroke: new ol.style.Stroke({\
        width: 3,\
        color: \[255, 0, 0, 1]\
      }),\
      fill: new ol.style.Fill({\
        color: \[0, 0, 255, 0.2]\
      })\
    })\
  );\

landLayer.getSource().addFeature(polygonFeature);

3、Cesium框架简介

(1)Cesium官方地址:cesium.xin/cesium/cn/D…

mars3d服务Api地址: mars3d.cn/api.html

(2)API关系:

image.png

(3)常用Api关系  kdocs.cn/l/cl0fBmdMD…

image.png

几何类清单

image.png

4、mars3d常用Api示例

官方Api教程地址:mars3d.cn/example.htm…

(1)加载wmts图层

     扩展内容:

       子域名替换符的作用:通过使用子域名,可以增加向服务器发送数据请求的并发量,从而提高地图加载速度。这是因为浏览器对同一个域名服务的并发请求数量有限制,而通过Nginx服务部署多个子域名,可以加大向服务器发送数据请求的并发量,从而达到提升加载速度的目的。

       使用方式:在地图请求接口中增加"{s}"符号作为子域名替换符,以全球大屏(global.screen.jsydf.cn/)地块图层加载为例:将原来的"global.screen.jsydf.cn/jsyApi/api/…

"global2.screen.jsydf.cn/jsyApi/api/…"

转存失败,建议直接上传图片文件 

  const mapUrl = params.url\
  const options = {\
    id: params.id ? params.id : "",\
    url: mapUrl,\
    layer: params.layer ? params.layer : "",\
    style: params.style ? params.style : "",\
    subdomains: '12345', // 子域名替换符 {s}\
    getCapabilities: params.getCapabilities ? params.getCapabilities : false,\
    format: "image/png",\
    tileMatrixSetID: params.tileMatrixSetID,\
    crs: params.crs ? params.crs : mars3d.CRS.EPSG4326,\
    tileMatrixLabels: params.tileMatrixLabels,\
    zIndex:1000\
  }\
  wmtsLayer = new mars3d.layer.WmtsLayer(options)\
  map.addLayer(wmtsLayer)\
}

 

(2)加载wms图层

   const mapUrl = params.url\
    const options:any = {\
      url: mapUrl,\
      layer: params.layer ? params.layer : "",\
      style: params.style ? params.style : "",\
      crs: params.crs ? params.crs : mars3d.CRS.EPSG4326,\
      subdomains: '12345',\
      getCapabilities: false,\
      parameters: params.parameters ? params.parameters : {\
        transparent: true,\
        format: "image/png",\
      },\
      enablePickFeatures: false,//是否点击发起getFeatureInfo请求\
      zIndex:100000\
    }\
  wmslayer = new mars3d.layer.WmsLayer(options)\
  map.addLayer(wmslayer)\
}

 

(3)加载xyz图层

    url: “kaijiangTiles/{z}/{x}/{y}.png”,\
    zIndex:10,\
  })\
  map.addLayer(cbdRsLayer)

(4)加载矢量图层

扩展内容:

Primitive和entity的优缺点:

● Primitive的优点‌:

● 高性能‌:当绘制大量Primitive时,可以通过合并为单个Geometry来提高效率,减轻CPU负担,并更好地利用GPU。这种合并操作由Web worker线程执行,保持UI的响应性‌。

● 灵活性‌:Geometry与Appearance解耦,允许两者分别进行修改,提供低级别的访问,便于编写GLSL顶点、片段着色器,以及使用自定义的渲染状态‌。

● 加载效率‌:由于更接近WebGL底层,没有Entity的各种附加属性,因此在加载时效率更高‌。

●  Primitive的缺点‌:

● 开发难度高‌:需要编写更多的代码,并且对图形编程有更深刻的理解,尤其是OpenGL知识。这要求开发者对图形编程和OpenGL有较为深入的了解‌12。

● 适用性有限‌:对于组合几何形状,Primitive对静态数据有效,但对于动态数据则不一定有效‌。

●  Entity的优点‌:

● 易用性‌:Entity是对Primitive的封装,使得使用者可以专注于数据的呈现,而不用纠结于底层的实现机制。它提供了便捷的接口进行几何体的绘制,并且可以与其他组件集成,如事件处理、拾取和相机控制等‌。

● 集成能力‌:Entity可以与其他组件集成,提供了更高层次的抽象,相对降低了开发难度‌。

●  Entity的缺点‌:

● 性能相对较低‌:因为涉及更多的自动处理,性能不如Primitive高,因为Primitive使用GPU硬件加速‌。

● 自定义可视化效果困难‌:虽然Entity方便于实际可视化的操作,但不利用自定义可视化效果‌。

       由于我们地图上使用的矢量图层都是简单的颜色渲染和图标渲染,这里对大量点、线、面的渲染推荐使用Primitive的方式去渲染点、线、面图层,提高渲染效率。

       有时间的同事也可以研究一下合并面渲染(PolygonCombine)、合并线渲染(PolylineCombine)。合并渲染效率更快,但是对需要动态变化样式的元素使用不一定有效。适用于不会发生变化的大量静态数据。

// 创建矢量数据图层\
cameraLayer = new mars3d.layer.GraphicLayer({})\
map.addLayer(cameraLayer) // 添加一个层

// 点\
const graphic = new mars3d.graphic.BillboardPrimitive({\
    position:mapPointsWkt.coordinates,\
    eventParent:false,\
    style: {\
      image: icon,\
      scale: 1,\
      horizontalOrigin: Cesium.HorizontalOrigin.CENTER, // 图标相对位置 x方向\
      verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // 图标相对位置 y方向\
      clampToGround:true, // 贴地\
      // 高亮时的样式(默认为鼠标移入,也可以指定type:'click'单击高亮),构造后也可以openHighlight、closeHighlight方法来手动调用\
      highlight: {\
        scale: 1.5,\
      }\
    },\
    attr:item\
})\
cameraLayer.addGraphic(graphic)

// 线\
const graphic = new mars3d.graphic.PolylinePrimitive({\
   positions: options.positions,\
   style: {\
     color: "#00ffff",\
     depthFail: true,\
     width: 2,\
     materialType: mars3d.MaterialType.LineFlow,\
     clampToGround:true,\
   }\
 })\
townLayer.addGraphic(graphic)

// 面\
const polygonGraphic = new mars3d.graphic.PolygonPrimitive({\
  positions: options.positions,\
  style: {\
    fill: true,\
    color: "rgba(15,249,3,0.1)",\
    outlineColor: "#0FF903",\
    outlineWidth: 4,\
    outlineOpacity: 0.8,\
    clampToGround: true,\
  },\
  attr: options.attr\
})\
farmLandsLayer.addGraphic(polygonGraphic)