0 参考效果
效果展示:GIS动态扩散模型-演示版 (simu.cool)
1 背景
随着航空运输市场的急剧增长,由机场噪声引起的问题日益突出。解决噪声问题的关键是要优质地量化评估飞机噪声强度及其影响程度,最普遍的量化方式就是绘制噪声等值线图。目前,国际民航组织(ICAO) 、美国联邦航空局 (FAA) 、 欧洲民航议会 (ECAC) 、美 国汽车工程师学会 (SAE) 等权威机构颁 布的关于航空器或机场噪声的标准或法规中,如SAE 1845和ECAC.CEAC DOC 29等,在机场噪声等值线绘制方法中,首先要对飞机的剖面航迹进行计算。另外,FAR36部、ICAO附件16以及CCAR36部对于飞机噪声标准的审定标准也越发严格。在进行噪声适航审定时,飞机的噪声级别与飞机的飞行航迹有着直接的关系,适航 规章规定的基准航迹的计算是飞机噪声合 格审定中一个重要的环节。
2 飞行动力参数的计算
每台发动机产生的推力是每段航段 需要最后确定的5个参数(高度、速度、 功率、倾斜角、推力)之一。净推力F 代 表发动机总推力水平,对于空气动力学和 声学计算,净推力必须修正到海平面上的 标准大气压下,此时的推力称为修正净推 力。
当已知推力设置或推力参数时,就 可以计算出净推力。对于涡轮喷气和涡轮风扇发动机,修正净推力可以通过以 下公式计算得出。
Fn/δ=E+F·Vc+Ga·h+Gb·h²+H·T (1)
其中,δ—机身周围大气压力与标准 大气压力的比值;
Fn/δ—单台发动机的修正净推力 (lbf);
Vc—校准空速 (kt)
T—机身周围的大气温度(℃)。
E、F、Ga、Gg、H—在某一推力设 置下(如起飞,爬升或进近),大气温 度低于发动机临界温度时的发动机推力 常量或变量,在ANP数据库中获取,单 位分别为lbs/ft、1b/ft、lb/f²和1b/℃。
真实空速Vt,可以通过校准空速Vc 得到:
Vt=Vc/√o (2)
其 中 ,V,— 真空速(kt) V—校准空速(kt);
o—某一高度的空气密度与海平面 空气密度之比值。
3 参考文献
具体请参考:
《基于ANP数据库的飞机起飞仿真研究_孙卫涛》
《基于ANP数据库的飞机起飞剖面航迹的计算研究_闫国华》
4 部分Java代码
4.1 请求参数
package com.planet.engine.flight.params;
import lombok.Data;
/**
* 剖面服务,请求参数
*/
@Data
public class FlightParam {
/**
* ACFT_ID
*/
private String flightId;
/**
* 跑道长度,和起飞重量对应
*/
private Integer weight;
/**
* 飞行路线id
*/
private Integer pathId;
}
4.2 响应参数
package com.planet.engine.flight.params;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import org.locationtech.jts.geom.LineString;
import java.io.Serializable;
/**
* 起飞过程分段
*
* @author zhang
* @description DepartureProfileLine
* @date 2024-07-19
*/
@Data
public class DepartureProfileLine implements Serializable {
private static final long serialVersionUID = 1L;
/**
* acft_id
*/
private String acftId;
/**
* step_number
*/
private Integer stepNumber;
/**
* step_type
*/
private String stepType;
/**
* flap_id
*/
private String flapId;
/**
* (ft)
* start_altitude
*/
private double startAltitude;
/**
* (ft)
* start_altitude
*/
private double endAltitude;
/**
* (ft)
* 片段距离
*/
private double segLength;
/**
* (kt)
* start_cas
*/
// @JsonIgnore
private double vc1;
/**
* (kt)
* end_cas
*/
// @JsonIgnore
private double vc2;
/**
* (kt)
*/
private double vt1;
/**
* (kt)
*/
private double vt2;
/**
* (ft)
* track distance
*/
private double trackDistance;
/**
* 单台发动机的修正净推力,lbf
*/
private double startPowerSetting;
/**
* 单台发动机的修正净推力,lbf
*/
private double endPowerSetting;
/**
* 爬升角度(弧度),radian
*/
private double gamma;
/**
* 片段航线
*/
@JsonIgnore
private LineString segLine;
/**
* 片段航线-geojson
*/
private String geojsonSegLine;
}
4.3 客户端渲染代码
// 标绘飞行路线线段
// startMarkerSegFlight(osmb, profileSegLines, colorBuiding, colorLanduse) {
startMarkerSegFlight(profileSegLines, colorBuiding, colorLanduse) {
var array = [];
for (let i = 0; i < profileSegLines.length; i++) {
// 绘制轨迹线
let geoData = profileSegLines[i];
let geojsonGeo = JSON.parse(geoData.geojsonSegLine);
let feature = {
type: "Feature",
properties: { height: 500, roofColor: colorBuiding },
geometry: {},
};
feature.geometry = geojsonGeo;
feature.properties.height = (geoData.startAltitude + geoData.endAltitude) / 2;
array.push(feature);
let acftId = geoData.acftId;
let heightAvg = (geoData.startAltitude + geoData.endAltitude) / 2;
let gamma = geoData.gamma;
if (gamma == undefined) {
gamma = 3;
}
let stepType = geoData.stepType;
let startAltitude = geoData.startAltitude;
let endAltitude = geoData.endAltitude;
let segLength = geoData.segLength;
let trackDistance = geoData.trackDistance;
let vt1 = geoData.vt1;
let vt2 = geoData.vt2;
let startPowerSetting = geoData.startPowerSetting;
let endPowerSetting = geoData.endPowerSetting;
array.push(geojsonGeo.coordinates);
L.geoJSON(feature, {
style: function (item) {
let geojsonMarkerOptions = {
clickable: true,
color: colorBuiding,
weight: 6,
opacity: 1,
fill: true,
zIndexOffset: 1000
};
return geojsonMarkerOptions;
},
filter: function (item) {
return true;
},
}).bindPopup(function (layer) {
return "<div>航迹分段</br>飞机型号:" + acftId + "</br>航迹阶段:" + stepType +
"</br>爬升角度:" + gamma.toFixed(2) + " deg" +
"</br>初始高度:" + startAltitude.toFixed(0) + " ft</br>结束高度:" + endAltitude.toFixed(0) + " ft" +
"</br>飞过距离:" + segLength.toFixed(2) + " ft</br>累计距离:" + trackDistance.toFixed(2) + " ft" +
"</br>初始速度:" + vt1.toFixed(2) + " kt</br>末点速度:" + vt2.toFixed(2) + " kt" +
"</br>初始推力:" + startPowerSetting.toFixed(2) + " lb/eng</br>末点推力:" + endPowerSetting.toFixed(2) + " lb/eng" +
"</div>";
}).addTo(this.options.markerPlRenderlayerGroup);
}
},
// 标绘飞行路线和方向
startMarkerVectorFlight(geojsonFeatures) {
let array = [];
for (let i = 0; i < geojsonFeatures.length; i++) {
let geoData = geojsonFeatures[i];
let geojsonFeature = JSON.parse(geoData.geojsonKeyPt);
let temp = [];
temp.push(geojsonFeature.coordinates[1]);
temp.push(geojsonFeature.coordinates[0]);
array.push(temp);
}
//3.绘制图案
// var pathPattern = L.polylineDecorator([[36.15, 120.38], [36.14, 120.39], [36.13, 120.42], [36.11, 120.44], [36.09, 120.49]], {
var pathPattern = L.polylineDecorator(array, {
//添加模式
patterns: [
{
//模式符号的偏移位置
offset: 0,
//模式符号的重复间隔
repeat: 10,
//符号实例
symbol: L.Symbol.dash({
//符号大小
pixelSize: 5,
//符号样式
pathOptions: {
//颜色
color: 'yellow',
//线宽
weight: 2,
//透明度
opacity: 1
}
})
},
{
//模式符号的偏移位置
offset: '0%',
//模式符号的重复间隔
repeat: '20%',
//符号实例
symbol: L.Symbol.marker({
//是否允许旋转
rotate: true,
//标记显示样式
markerOptions: {
//图标
icon: L.icon({
//图标地址
iconUrl: './img/icon_plane.png',
//图标位置
iconAnchor: [16, 16]
})
}
})
}
]
}).addTo(this.options.markerPlRenderlayerGroup);
},