Cesium加载非4326/3857的wfs服务

cesium中加载wfs服务可以使用如下代码:

//wfs地址。如:https://***/geoserver/wfs?service=WFS&version=1.0.0&request=GetFeature&typeName=***&outputFormat=application/json
const url = 'https://***/geoserver/wfs?service=WFS&version=1.0.0&request=GetFeature&typeName=***&outputFormat=application/json' 
//wfs请求可以修改参数,各个参数有不同含义,如想wfs返回json而非xml,则可使用outputFormat=application/json
//request:指定要执行的操作类型,常见的操作包括DescribeFeatureType、GetFeature、Transaction等
//outputFormat:指定返回的数据格式,可以是XML、JSON、GML等。

Cesium.Resource.fetchJson(url).then(function (data) {
    let promise = Cesium.GeoJsonDataSource.load(data, {
      stroke: Cesium.Color.HOTPINK,
      // fill: Cesium.Color.PINK,
      //strokeWidth: 3,
      //markerSymbol: '?',
    })

    promise.then((dataSource) => {
      viewer.dataSources.add(dataSource)
    })
 })

但有时需要加载一个非EPSG4326的wfs服务,如EPSG:32651

首先涉及坐标转换,我们可以在epsg.io上找到proj代码,通过proj4.js这个库对坐标进行转换,示例:

import proj4 from "proj4";


const epsg32651 = '+proj=utm +zone=51 +ellps=WGS84 +datum=WGS84 +units=m +no_defs';
const epsg4326 = '+proj=longlat +datum=WGS84 +no_defs +type=crs';

proj4.defs('EPSG:32651', epsg32651);
proj4.defs('EPSG:4326', epsg4326);
const transformFunc = proj4('EPSG:32651', 'EPSG:4326').forward;
console.log(transformFunc([219555.86505479272, 3355776.015674563]))  //输出了4326的经纬度坐标

在正式使用时,可以通过新增crsNames来添加,如

Cesium.GeoJsonDataSource.crsNames['urn:ogc:def:crs:EPSG::32651'] = Cesium.GeoJsonDataSource.crsNames['EPSG:32651'] = function (coordinates) {
    const x = coordinates[0]
    const y = coordinates[1]
    const res = //转换32651的x,y坐标为经纬度,可通过proj4转换,也可通过自定义转换方法转换
    return Cesium.Cartesian3.fromDegrees(res.x, res.y, 0)
  }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容