plot actual flight path and datapoints from ACARS table

This commit is contained in:
Nabeel Shahzad
2017-12-26 15:26:12 -06:00
parent a931435b42
commit 4f6b8e8e23
5 changed files with 118 additions and 26 deletions
+6
View File
@@ -90,6 +90,12 @@ class Pirep extends BaseModel
/** /**
* Foreign Keys * Foreign Keys
*/ */
public function acars()
{
return $this->hasMany('App\Models\Acars', 'pirep_id');
}
public function aircraft() public function aircraft()
{ {
return $this->belongsTo('App\Models\Aircraft', 'aircraft_id'); return $this->belongsTo('App\Models\Aircraft', 'aircraft_id');
+46 -6
View File
@@ -2,6 +2,7 @@
namespace App\Services; namespace App\Services;
use App\Models\Acars;
use Log; use Log;
use \GeoJson\Geometry\Point; use \GeoJson\Geometry\Point;
@@ -13,6 +14,7 @@ use \League\Geotools\Geotools;
use \League\Geotools\Coordinate\Coordinate; use \League\Geotools\Coordinate\Coordinate;
use App\Models\Flight; use App\Models\Flight;
use App\Models\Pirep;
use App\Repositories\NavdataRepository; use App\Repositories\NavdataRepository;
/** /**
@@ -137,6 +139,44 @@ class GeoService extends BaseService
return $coords; return $coords;
} }
/**
* Read an array/relationship of ACARS model points
* @param Pirep $pirep
* @return array
*/
protected function getFeatureFromAcars(Pirep $pirep)
{
$route_line = [];
$route_points = [];
$route_line[] = [$pirep->dpt_airport->lon, $pirep->dpt_airport->lat];
/**
* @var $point \App\Models\Acars
*/
foreach ($pirep->acars as $point)
{
$route_line[] = [$point->lon, $point->lat];
$route_points[] = new Feature(
new Point([$point->lon, $point->lat]), [
'name' => $point->altitude,
'popup' => 'GS: ' . $point->gs . '<br />Alt: ' . $point->altitude,
]);
}
# Arrival
$route_line[] = [$pirep->arr_airport->lon, $pirep->arr_airport->lat];
# Convert to a feature
$route_line = new Feature(new LineString($route_line), [], 1);
return [
'line' => new FeatureCollection([$route_line]),
'points' => new FeatureCollection($route_points)
];
}
/** /**
* Return a FeatureCollection GeoJSON object * Return a FeatureCollection GeoJSON object
* @param Flight $flight * @param Flight $flight
@@ -202,7 +242,7 @@ class GeoService extends BaseService
* @param Pirep $pirep * @param Pirep $pirep
* @return array * @return array
*/ */
public function pirepGeoJson($pirep) public function pirepGeoJson(Pirep $pirep)
{ {
$route_points = []; $route_points = [];
$planned_rte_coords = []; $planned_rte_coords = [];
@@ -216,9 +256,6 @@ class GeoService extends BaseService
] ]
); );
// TODO: Add markers for the start/end airports
// TODO: Check if there's data in the ACARS table
if (!empty($pirep->route)) { if (!empty($pirep->route)) {
$all_route_points = $this->getCoordsFromRoute( $all_route_points = $this->getCoordsFromRoute(
$pirep->dpt_airport->icao, $pirep->dpt_airport->icao,
@@ -249,15 +286,18 @@ class GeoService extends BaseService
$route_points = new FeatureCollection($route_points); $route_points = new FeatureCollection($route_points);
$planned_route_line = new LineString($planned_rte_coords); $planned_route_line = new LineString($planned_rte_coords);
$planned_route = new FeatureCollection([ $planned_route = new FeatureCollection([
new Feature($planned_route_line, [], 1) new Feature($planned_route_line, [], 1)
]); ]);
$actual_route = $this->getFeatureFromAcars($pirep);
return [ return [
'actual_route' => false,
'route_points' => $route_points, 'route_points' => $route_points,
'planned_route_line' => $planned_route, 'planned_route_line' => $planned_route,
'actual_route_line' => $actual_route['line'],
'actual_route_points' => $actual_route['points'],
]; ];
} }
+61 -19
View File
@@ -1,4 +1,4 @@
const phpvms= (function() { const phpvms = (function() {
const draw_base_map = (opts) => { const draw_base_map = (opts) => {
@@ -75,6 +75,17 @@ const phpvms= (function() {
layer.bindPopup(popup_html); layer.bindPopup(popup_html);
}; };
const pointToLayer = function (feature, latlng) {
return L.circleMarker(latlng, {
radius: 12,
fillColor: "#ff7800",
color: "#000",
weight: 1,
opacity: 1,
fillOpacity: 0.8
});
};
return { return {
/** /**
@@ -86,6 +97,7 @@ const phpvms= (function() {
opts = _.defaults(opts, { opts = _.defaults(opts, {
route_points: null, route_points: null,
planned_route_line: null, // [ {name, lat, lon}, {name, lat, lon} ]; planned_route_line: null, // [ {name, lat, lon}, {name, lat, lon} ];
actual_route_points: null,
actual_route_line: null, actual_route_line: null,
center: [], center: [],
render_elem: 'map', render_elem: 'map',
@@ -98,48 +110,78 @@ const phpvms= (function() {
let map = draw_base_map(opts); let map = draw_base_map(opts);
if(opts.geodesic) { //if(opts.geodesic) {
let geodesicLayer = L.geodesic([], { let geodesicLayer = L.geodesic([], {
weight: 7, weight: 7,
opacity: 0.5, opacity: 0.9,
color: '#ff33ee', color: '#36b123',
steps: 50, steps: 50,
wrap: false, wrap: false,
}).addTo(map); }).addTo(map);
geodesicLayer.geoJson(opts.planned_route_line); geodesicLayer.geoJson(opts.planned_route_line);
map.fitBounds(geodesicLayer.getBounds()); map.fitBounds(geodesicLayer.getBounds());
} else {
if(opts.actual_route_line !== null) {
let geodesicLayer = L.geodesic([], {
weight: 7,
opacity: 0.9,
color: '#172aea',
steps: 50,
wrap: false,
}).addTo(map);
geodesicLayer.geoJson(opts.actual_route_line);
map.fitBounds(geodesicLayer.getBounds());
}
/*} else {
let route = L.geoJSON(opts.planned_route_line, { let route = L.geoJSON(opts.planned_route_line, {
"color": "#ff7800", "color": "#ff7800",
"weight": 5, "weight": 7,
"opacity": 0.65 "opacity": 0.9
}); });
route.addTo(map); route.addTo(map);
map.fitBounds(route.getBounds()); map.fitBounds(route.getBounds());
}
if(opts.actual_route_line !== null) {
let route = L.geoJSON(opts.actual_route_line, {
"color": "#36b123",
"weight": 7,
"opacity": 0.9
});
route.addTo(map);
map.fitBounds(route.getBounds());
}
}*/
// Draw the route points after // Draw the route points after
if (opts.route_points !== null) { if (opts.route_points !== null) {
console.log(opts.route_points); console.log(opts.route_points);
let route_points = L.geoJSON(opts.route_points, { let route_points = L.geoJSON(opts.route_points, {
onEachFeature: onFeaturePointClick, onEachFeature: onFeaturePointClick,
pointToLayer: pointToLayer,
style: { style: {
"color": "#1bff00", "color": "#36b123",
"weight": 5,
"opacity": 0.65,
},
});
route_points.addTo(map);
}
if(opts.actual_route_points !== null) {
let route_points = L.geoJSON(opts.actual_route_points, {
onEachFeature: onFeaturePointClick,
pointToLayer: pointToLayer,
style: {
"color": "#172aea",
"weight": 5, "weight": 5,
"opacity": 0.65, "opacity": 0.65,
}, },
pointToLayer: function (feature, latlng) {
return L.circleMarker(latlng, {
radius: 12,
fillColor: "#ff7800",
color: "#000",
weight: 1,
opacity: 1,
fillOpacity: 0.8
});
}
}); });
route_points.addTo(map); route_points.addTo(map);
@@ -1,6 +1,6 @@
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<h3 class="description">map</h3> <h3 class="description">flight map</h3>
</div> </div>
<div class="col-12"> <div class="col-12">
<div class="box-body"> <div class="box-body">
@@ -14,6 +14,8 @@
phpvms.render_route_map({ phpvms.render_route_map({
route_points: {!! json_encode($map_features['route_points']) !!}, route_points: {!! json_encode($map_features['route_points']) !!},
planned_route_line: {!! json_encode($map_features['planned_route_line']); !!}, planned_route_line: {!! json_encode($map_features['planned_route_line']); !!},
actual_route_line: {!! json_encode($map_features['actual_route_line']); !!},
actual_route_points: {!! json_encode($map_features['actual_route_points']); !!},
}); });
</script> </script>
@endsection @endsection
@@ -68,6 +68,7 @@
</div> </div>
</div> </div>
@if(count($pirep->fields) > 0)
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<h3 class="description">fields</h3> <h3 class="description">fields</h3>
@@ -89,6 +90,7 @@
</table> </table>
</div> </div>
</div> </div>
@endif
@include('layouts.default.pireps.map') @include('layouts.default.pireps.map')
@endsection @endsection