头文件:
#ifndef _COORDCOVERT_H
#define _COORDCOVERT_H
#include "stdlib.h"
//WGS-84椭球体参数
const double a=6378137.0//长半轴
const double flattening=1/298.257223563//扁率
const double delta=0.0000001
typedef struct tagCRDCARTESIAN{
double x
double y
double z
}CRDCARTESIAN
typedef CRDCARTESIAN *PCRDCARTESIAN
//笛卡尔坐标系
typedef struct tagCRDGEODETIC{
double longitude
double latitude
double height
}CRDGEODETIC
typedef CRDGEODETIC *PCRDGEODETIC
//大地坐标系
typedef struct tagCRDTOPOCENTRIC{
double northing
double easting
double upping
}CRDTOPOCENTRIC
typedef CRDTOPOCENTRIC *PCRDTOPOCENTRIC
//站心地平坐标系(线坐标形式)
typedef struct tagCRDTOPOCENTRICPOLAR{
double range
double azimuth
double elevation
}CRDTOPOCENTRICPOLAR
typedef CRDTOPOCENTRICPOLAR *PCRDTOPOCENTRICPOLAR
//站心地平坐标系(极坐标形式)
//由笛卡尔坐标转换为大地坐标
void CartesianToGeodetic (PCRDGEODETIC pcg, PCRDCARTESIAN pcc,
double dSemiMajorAxis, double dFlattening)
//pcg:指向所转换出的大地坐标的指针;
//pcc:指向待转换的笛卡尔坐标的指针;
//dSemiMajorAxis:参考椭球的长半轴;
//dFlattening:参考椭球的扁率。
//由大地坐标转换为笛卡尔坐标
void GeodeticToCartesian (PCRDCARTESIAN pcc, PCRDGEODETIC pcg,
double dSemiMajorAxis, double dFlattening)
//pcc:指向所转换出的笛卡尔坐标的指针;
//pcg:指向待转换的大地坐标的指针;
//dSemiMajorAxis:参考椭球的长半轴;
//dFlattening:参考椭球的扁率。
//由笛卡尔坐标转换为站心地平坐标
void CartesianToTopocentric (PCRDTOPOCENTRIC pct,
PCRDCARTESIAN pcc,
PCRDCARTESIAN pccCenter,
double dSemiMajorAxis,
double dFlattening)
//pct:指向所转换出的站心地平坐标的指针;
//pcc:指向待转换的笛卡尔坐标的指针;
//pccCenter:指向站心的笛卡尔坐标的指针;尺野
//dSemiMajorAxis:参考椭球的长半轴;
//dFlattening:参考椭球的扁率。
//由站心地平直角坐标转换为站心地平极坐标
void TopocentricToTopocentricPolar (PCRDTOPOCENTRICPOLAR pctp,
PCRDTOPOCENTRIC pct)
//pctp:指向所转换出的站心地平极坐标的指针;
//pct:指向待转换的站心地平坐标的指针;
//由站心地平极坐标转换为站心地平直角坐标
void TopocentricPolarToTopocentric (PCRDTOPOCENTRIC pct,PCRDTOPOCENTRICPOLAR pctp)
//pct:指向所段型转换的站心地平坐标的指针;
//pctp:指向待转换的站心地平极坐标的指针;
#endif
源文件:
#include "CoordCovert.h"
#include "math.h"
void CartesianToGeodetic (PCRDGEODETIC pcg, PCRDCARTESIAN pcc,
double dSemiMajorAxis, double dFlattening)
{
double e2//第一偏心率的平方
e2=2*dFlattening-dFlattening*dFlattening
pcg->longitude=atan(pcc->y/pcc->x)
double W,N,N1=0,B,B1
B1=atan(pcc->z/sqrt(pcc->x*pcc->x+pcc->y*pcc->y))
while(1)
{
W=sqrt(1-e2*sin(B1)*sin(B1))
N1=dSemiMajorAxis/W
B=atan((pcc->z+N1*e2*sin(B1))/sqrt(pcc->x*pcc->x+pcc->y*pcc->y))
if(fabs(B-B1)<delta)
break
else
B1=B
}
pcg->latitude=B
N=dSemiMajorAxis/sqrt(1-e2*sin(pcg->latitude)*sin(pcg->latitude))
pcg->height=sqrt(pcc->x*pcc->x+pcc->y*pcc->y)/cos(B)-N
}
//由大地坐标转换为笛卡尔坐标
void GeodeticToCartesian (PCRDCARTESIAN pcc, PCRDGEODETIC pcg,
double dSemiMajorAxis, double dFlattening)
{
double e2//第一偏心率的平方
double N//卯酉圈半径
e2=2*dFlattening-dFlattening*dFlattening
N=dSemiMajorAxis/sqrt(1-e2*sin(pcg->latitude)*sin(pcg->latitude))
pcc->x=(N+pcg->height)*cos(pcg->latitude)*cos(pcg->longitude)
pcc->y=(N+pcg->height)*cos(pcg->latitude)*sin(pcg->longitude)
pcc->z=(N*(1-e2)+pcg->height)*sin(pcg->latitude)
}
//由笛卡尔坐标转换为站心地平坐标
void CartesianToTopocentric (PCRDTOPOCENTRIC pct,
PCRDCARTESIAN pcc,
PCRDCARTESIAN pccCenter,
double dSemiMajorAxis,
double dFlattening)
{
double dx,dy,dz
dx=pcc->x-pccCenter->x
dy=pcc->y-pccCenter->y
dz=pcc->z-pccCenter->z
PCRDGEODETIC pd
pd=(PCRDGEODETIC)malloc(sizeof(CRDGEODETIC))
CartesianToGeodetic (pd,pccCenter,dSemiMajorAxis,dFlattening)
pct->northing=-sin(pd->latitude)*cos(pd->longitude)*dx
-sin(pd->latitude)*sin(pd->longitude)*dy
+cos(pd->latitude)*dz
pct->easting=-sin(pd->longitude)*dx
+cos(pd->longitude)*dy
pct->upping=cos(pd->latitude)*cos(pd->longitude)*dx
+cos(pd->latitude)*sin(pd->longitude)*dy
+sin(pd->latitude)*dz
free(pd)
}
//由站心地平直角坐标转换为站心地平极坐标
void TopocentricToTopocentricPolar (PCRDTOPOCENTRICPOLAR pctp,
PCRDTOPOCENTRIC pct)
{
pctp->range=sqrt(pct->northing*pct->northing+pct->easting*pct->easting+pct->upping*pct->upping)
pctp->azimuth=atan(pct->easting/pct->northing)
pctp->elevation=asin(pct->upping/pctp->range)
}
//由站心地平极坐标转换为站心地平直角坐标
void TopocentricPolarToTopocentric (PCRDTOPOCENTRIC pct,
PCRDTOPOCENTRICPOLAR pctp)
{
pct->northing=pctp->range*cos(pctp->elevation)*cos(pctp->azimuth)
pct->easting=pctp->range*cos(pctp->elevation)*sin(pctp->azimuth)
pct->upping=pctp->range*sin(pctp->elevation)
}
为方便快速测试斗桥 Cesium Demo使用,添加了一些演示demo并且提供了webpack打包的示例。目前整理了20个demo,后面会对demo进行讲解。
详情源码连接:
Cesium 50个实例集合,讲解、分析(内附源码)
示例概要说明:
1.Draw.js 动态绘制 点、线、面
2.Scanning.js 一个简单的扫描功能
3.Spline.js 样条插值
4.HeightProperty.js 一个类似淹没分析的效果
5.VectorTile.js 矢量切片加载
6.Ellipsoids.js 圆特效
7.Sensor.js 传感器,可设置角度,位置等空液猛
8.PolylineArrow.js 动态线效果
9.VolumesCZML.js 加载czml文件 支持传感器等动画特效
10.VolumesApi.js VolumesApi 调用效果
11.Fly.js 绕点飞行
12.Radar.js 气象雷达动态图埋态
13.VisibleAnalysis.js 通视分析
14.EagleEye.js 鹰眼地图
15.Measure.js 测量
16.Translucency.js 地球半透明,可做地下管线、矿山项目
17.Interior.js 地球内部,结合VectorTile.js会出很牛的效果
18.3dtiles加载
19.可视域分析_3DTiles
20.站心坐标转WGS84
*** 作说明:
1.npm初始化第三方库
npm install
2.在根目录创建文件夹,文件夹名称为“ThirdParty” 。
3.将根目录下“node_modules\cesium\Build\Cesium”拷贝到“ThirdParty” 下。
4.编译
npm run build
5.运行
npm run start
注:可以不要“2”、“3”步骤的,只是为了初学者能更快的找到源码位置。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)