Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature/webapi-mapfeatures #826

Merged
merged 43 commits into from
Mar 8, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
1c1b928
Add new MapActionsController and imageAction
KOKAProduktion Jul 14, 2021
32f1f3c
Clone WebMapController logic to MapActionsController
KOKAProduktion Jul 14, 2021
50d0c6f
Merge branch 'feature/webapi' into feature/webapi-marble-tiled-output
KOKAProduktion Jul 14, 2021
332e848
Add missing image retrieval params
KOKAProduktion Jul 14, 2021
5539560
Remove copyright note from marble output
KOKAProduktion Jul 15, 2021
c6fbabe
Disable dynamic/live features
KOKAProduktion Jul 16, 2021
9ab4234
Merge commit master into feature/webapi-marble-tiled-output
KOKAProduktion Sep 29, 2021
155b7cb
Add constrainDistance flag to showRectStreamlined
KOKAProduktion Sep 30, 2021
3d91611
Implement basic map features retrieval (draft)
KOKAProduktion Oct 4, 2021
61d3ebc
Merge remote-tracking branch 'origin/master' into feature/webapi-marb…
KOKAProduktion Oct 4, 2021
c89da64
Merge branch 'feature/webapi-marble-tiled-output' into feature/webapi…
KOKAProduktion Oct 4, 2021
0960811
Don't constrain map distance on imageAction
KOKAProduktion Oct 5, 2021
eedb5ca
Add image attributions to image response and success code
KOKAProduktion Oct 5, 2021
6b63860
Add simple OL implementation
KOKAProduktion Oct 5, 2021
34e6283
Merge remote-tracking branch 'origin/master' into feature/webapi-marb…
KOKAProduktion Oct 14, 2021
7de26a0
Complement previous commit
KOKAProduktion Oct 14, 2021
4c0939f
Merge branch 'feature/webapi-marble-tiled-output' into feature/webapi…
KOKAProduktion Oct 14, 2021
f94269f
Implement map features retrieval by rect
KOKAProduktion Oct 14, 2021
e417194
Merge remote-tracking branch 'origin/master' into feature/webapi-marb…
KOKAProduktion Oct 19, 2021
c07a658
Merge remote-tracking branch 'origin/master' into feature/webapi-mapf…
KOKAProduktion Oct 19, 2021
d7ecd79
Add detailFactor to MapActionsController calls
KOKAProduktion Oct 19, 2021
ae22eef
Extend MapActionsController::features result
KOKAProduktion Oct 19, 2021
bcd605f
Complement API contract on NDB, VOR and Markers
KOKAProduktion Oct 19, 2021
a155597
Merge remote-tracking branch 'origin/master' into feature/webapi-mapf…
KOKAProduktion Oct 29, 2021
6144c2a
Merge remote-tracking branch 'origin/master' into feature/webapi-marb…
KOKAProduktion Oct 29, 2021
762dc69
Merge remote-tracking branch 'origin/master' into feature/webapi-mapf…
KOKAProduktion Dec 13, 2021
3a615a8
Merge remote-tracking branch 'origin/master' into feature/webapi-marb…
KOKAProduktion Dec 13, 2021
b3330c5
Adapt renamed methods of MapPaintWidget
KOKAProduktion Dec 13, 2021
27cd181
Adapt renamed methods of MapPaintWidget
KOKAProduktion Dec 13, 2021
3968661
Add degree unit argument to get*ByRect conversions
KOKAProduktion Dec 13, 2021
734e132
Adapt MapQuery changes
KOKAProduktion Dec 13, 2021
9ea0429
Add map object id's to map features action result
KOKAProduktion Dec 16, 2021
54c769a
Implement beasic get map feature by id action
KOKAProduktion Dec 16, 2021
cc4ec71
Merge branch 'feature/webapi-marble-tiled-output' into feature/webapi…
KOKAProduktion Dec 16, 2021
77b3eaa
Add waypoints to map features result
KOKAProduktion Jan 3, 2022
02356fb
Add wind direction and speed to sim info response
KOKAProduktion Mar 7, 2022
a01462f
Merge remote-tracking branch 'origin/master' into feature/webapi-mapf…
KOKAProduktion Mar 7, 2022
f9bdd7b
Fix merge issues/adapt changes
KOKAProduktion Mar 7, 2022
0d902e3
Update OL build
KOKAProduktion Mar 7, 2022
87e1650
Create initial ol-map plugin
KOKAProduktion Mar 8, 2022
b4fe9b2
Implement airport quicksearch via map toolbar
KOKAProduktion Mar 8, 2022
b37d8fc
Turn off aircraft following when quicksearching an airport
KOKAProduktion Mar 8, 2022
ac5e247
Trap main UI to respect ol-map plugin active state
KOKAProduktion Mar 8, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions littlenavmap.pro
Original file line number Diff line number Diff line change
Expand Up @@ -404,6 +404,7 @@ SOURCES += \
src/webapi/abstractlnmactionscontroller.cpp \
src/webapi/actionscontrollerindex.cpp \
src/webapi/airportactionscontroller.cpp \
src/webapi/mapactionscontroller.cpp \
src/webapi/simactionscontroller.cpp \
src/webapi/uiactionscontroller.cpp \
src/webapi/webapicontroller.cpp
Expand Down Expand Up @@ -590,6 +591,7 @@ HEADERS += \
src/webapi/abstractlnmactionscontroller.h \
src/webapi/actionscontrollerindex.h \
src/webapi/airportactionscontroller.h \
src/webapi/mapactionscontroller.h \
src/webapi/simactionscontroller.h \
src/webapi/uiactionscontroller.h \
src/webapi/webapicontroller.h \
Expand Down
12 changes: 12 additions & 0 deletions src/common/abstractinfobuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,18 @@ QByteArray AbstractInfoBuilder::uiinfo(UiInfoData uiInfoData) const
return "not implemented";
}

QByteArray AbstractInfoBuilder::features(MapFeaturesData mapFeaturesData) const
{
Q_UNUSED(mapFeaturesData);
return "not implemented";
}

QByteArray AbstractInfoBuilder::feature(MapFeaturesData mapFeaturesData) const
{
Q_UNUSED(mapFeaturesData);
return "not implemented";
}


QString AbstractInfoBuilder::getHeadingsStringByMagVar(float heading, float magvar) const {

Expand Down
16 changes: 16 additions & 0 deletions src/common/abstractinfobuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ namespace InfoBuilderTypes {
struct AirportInfoData;
struct SimConnectInfoData;
struct UiInfoData;
struct MapFeaturesData;
}
namespace atools {
namespace sql {
Expand All @@ -39,6 +40,7 @@ using atools::geo::Pos;
using InfoBuilderTypes::AirportInfoData;
using InfoBuilderTypes::SimConnectInfoData;
using InfoBuilderTypes::UiInfoData;
using InfoBuilderTypes::MapFeaturesData;

/**
* Generic interface for LNM-specific views.
Expand Down Expand Up @@ -68,6 +70,20 @@ class AbstractInfoBuilder : public QObject
*/
virtual QByteArray airport(AirportInfoData airportInfoData) const;

/**
* Creates a description for the provided feature list.
*
* @param airportInfoData
*/
virtual QByteArray features(MapFeaturesData mapFeaturesData) const;

/**
* Creates a description for the provided map object.
*
* @param airportInfoData
*/
virtual QByteArray feature(MapFeaturesData mapFeaturesData) const;

/**
* Creates a description for the provided simconnect data.
*
Expand Down
13 changes: 13 additions & 0 deletions src/common/infobuildertypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ namespace InfoBuilderTypes {
*/
struct SimConnectInfoData{
const SimConnectData* data;
const float windSpeed;
const float windDir;
};

/**
Expand All @@ -84,6 +86,17 @@ namespace InfoBuilderTypes {
const qreal distanceWeb;
};

/**
* @brief Data container for map features data
*/
struct MapFeaturesData{
const QList<map::MapAirport> airports;
const QList<map::MapNdb> ndbs;
const QList<map::MapVor> vors;
const QList<map::MapMarker> markers;
const QList<map::MapWaypoint> waypoints;
};

}

#endif // INFOBUILDERTYPES_H
222 changes: 222 additions & 0 deletions src/common/jsoninfobuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,8 @@ QByteArray JsonInfoBuilder::siminfo(SimConnectInfoData simconnectInfoData) const
{ "ground_altitude", data.getUserAircraft().getGroundAltitudeFt() },
{ "altitude_above_ground", data.getUserAircraft().getAltitudeAboveGroundFt() },
{ "heading", data.getUserAircraft().getHeadingDegMag() },
{ "wind_direction", simconnectInfoData.windDir },
{ "wind_speed", simconnectInfoData.windSpeed },
};

}else{
Expand Down Expand Up @@ -331,3 +333,223 @@ QByteArray JsonInfoBuilder::uiinfo(UiInfoData uiInfoData) const
return json.dump().data();
}

QByteArray JsonInfoBuilder::features(MapFeaturesData mapFeaturesData) const
{

MapFeaturesData data = mapFeaturesData;

JSON json;

json = {
{ "airports", JSON::object() },
{ "ndbs", JSON::object() },
{ "vors", JSON::object() },
{ "markers", JSON::object() },
{ "waypoints", JSON::object() },
};

json["airports"].push_back({ "count", data.airports.count() });
json["airports"].push_back({ "result", JSON::array() });

json["ndbs"].push_back({ "count", data.ndbs.count() });
json["ndbs"].push_back({ "result", JSON::array() });

json["vors"].push_back({ "count", data.vors.count() });
json["vors"].push_back({ "result", JSON::array() });

json["markers"].push_back({ "count", data.markers.count() });
json["markers"].push_back({ "result", JSON::array() });

json["waypoints"].push_back({ "count", data.waypoints.count() });
json["waypoints"].push_back({ "result", JSON::array() });



for(int i = 0; i < data.airports.count(); ++i){

map::MapAirport airport = data.airports[i];

json["airports"]["result"][i]["object_id"] = airport.id;
json["airports"]["result"][i]["type_id"] = map::AIRPORT;
json["airports"]["result"][i]["ident"] = qUtf8Printable(airport.ident);
json["airports"]["result"][i]["name"] = qUtf8Printable(airport.name);
json["airports"]["result"][i]["position"] = coordinatesToJSON(getCoordinates(airport.position));
json["airports"]["result"][i]["elevation"] = airport.getPosition().getAltitude();

// JSON airportJson;

// airportJson = {
// { "ident", qUtf8Printable(airport.ident) },
// { "name", qUtf8Printable(airport.name)},
// { "position", coordinatesToJSON(getCoordinates(airport.position))},
// { "elevation", airport.getPosition().getAltitude() },
// };

// json["airports"]["result"].push_back(airportJson);
}

for(int i = 0; i < data.ndbs.count(); ++i){

map::MapNdb ndb = data.ndbs[i];

json["ndbs"]["result"][i]["object_id"] = ndb.id;
json["ndbs"]["result"][i]["type_id"] = map::NDB;
json["ndbs"]["result"][i]["ident"] = qUtf8Printable(ndb.ident);
json["ndbs"]["result"][i]["name"] = qUtf8Printable(ndb.name);
json["ndbs"]["result"][i]["position"] = coordinatesToJSON(getCoordinates(ndb.position));
json["ndbs"]["result"][i]["elevation"] = ndb.getPosition().getAltitude();

}

for(int i = 0; i < data.vors.count(); ++i){

map::MapVor vor = data.vors[i];

json["vors"]["result"][i]["object_id"] = vor.id;
json["vors"]["result"][i]["type_id"] = map::VOR;
json["vors"]["result"][i]["ident"] = qUtf8Printable(vor.ident);
json["vors"]["result"][i]["name"] = qUtf8Printable(vor.name);
json["vors"]["result"][i]["position"] = coordinatesToJSON(getCoordinates(vor.position));
json["vors"]["result"][i]["elevation"] = vor.getPosition().getAltitude();

}

for(int i = 0; i < data.markers.count(); ++i){

map::MapMarker marker = data.markers[i];

json["markers"]["result"][i]["object_id"] = marker.id;
json["markers"]["result"][i]["type_id"] = map::MARKER;
json["markers"]["result"][i]["ident"] = qUtf8Printable(marker.ident);
json["markers"]["result"][i]["type"] = qUtf8Printable(marker.type);
json["markers"]["result"][i]["position"] = coordinatesToJSON(getCoordinates(marker.position));
json["markers"]["result"][i]["elevation"] = marker.getPosition().getAltitude();

}

for(int i = 0; i < data.waypoints.count(); ++i){

map::MapWaypoint waypoint = data.waypoints[i];

json["waypoints"]["result"][i]["object_id"] = waypoint.id;
json["waypoints"]["result"][i]["type_id"] = map::WAYPOINT;
json["waypoints"]["result"][i]["ident"] = qUtf8Printable(waypoint.ident);
json["waypoints"]["result"][i]["type"] = qUtf8Printable(waypoint.type);
json["waypoints"]["result"][i]["position"] = coordinatesToJSON(getCoordinates(waypoint.position));
json["waypoints"]["result"][i]["elevation"] = waypoint.getPosition().getAltitude();

}

return json.dump().data();

}

QByteArray JsonInfoBuilder::feature(MapFeaturesData mapFeaturesData) const
{

MapFeaturesData data = mapFeaturesData;

JSON json;

json = {
{ "airports", JSON::object() },
{ "ndbs", JSON::object() },
{ "vors", JSON::object() },
{ "markers", JSON::object() },
{ "waypoints", JSON::object() },
};

json["airports"].push_back({ "count", data.airports.count() });
json["airports"].push_back({ "result", JSON::array() });

json["ndbs"].push_back({ "count", data.ndbs.count() });
json["ndbs"].push_back({ "result", JSON::array() });

json["vors"].push_back({ "count", data.vors.count() });
json["vors"].push_back({ "result", JSON::array() });

json["markers"].push_back({ "count", data.markers.count() });
json["markers"].push_back({ "result", JSON::array() });

json["waypoints"].push_back({ "count", data.waypoints.count() });
json["waypoints"].push_back({ "result", JSON::array() });

for(int i = 0; i < data.airports.count(); ++i){

map::MapAirport airport = data.airports[i];

json["airports"]["result"][i]["object_id"] = airport.id;
json["airports"]["result"][i]["type_id"] = map::AIRPORT;
json["airports"]["result"][i]["ident"] = qUtf8Printable(airport.ident);
json["airports"]["result"][i]["name"] = qUtf8Printable(airport.name);
json["airports"]["result"][i]["position"] = coordinatesToJSON(getCoordinates(airport.position));
json["airports"]["result"][i]["elevation"] = airport.getPosition().getAltitude();

// JSON airportJson;

// airportJson = {
// { "ident", qUtf8Printable(airport.ident) },
// { "name", qUtf8Printable(airport.name)},
// { "position", coordinatesToJSON(getCoordinates(airport.position))},
// { "elevation", airport.getPosition().getAltitude() },
// };

// json["airports"]["result"].push_back(airportJson);
}

for(int i = 0; i < data.ndbs.count(); ++i){

map::MapNdb ndb = data.ndbs[i];

json["ndbs"]["result"][i]["object_id"] = ndb.id;
json["ndbs"]["result"][i]["type_id"] = map::NDB;
json["ndbs"]["result"][i]["ident"] = qUtf8Printable(ndb.ident);
json["ndbs"]["result"][i]["name"] = qUtf8Printable(ndb.name);
json["ndbs"]["result"][i]["position"] = coordinatesToJSON(getCoordinates(ndb.position));
json["ndbs"]["result"][i]["elevation"] = ndb.getPosition().getAltitude();

}

for(int i = 0; i < data.vors.count(); ++i){

map::MapVor vor = data.vors[i];

json["vors"]["result"][i]["object_id"] = vor.id;
json["vors"]["result"][i]["type_id"] = map::VOR;
json["vors"]["result"][i]["ident"] = qUtf8Printable(vor.ident);
json["vors"]["result"][i]["name"] = qUtf8Printable(vor.name);
json["vors"]["result"][i]["position"] = coordinatesToJSON(getCoordinates(vor.position));
json["vors"]["result"][i]["elevation"] = vor.getPosition().getAltitude();

}

for(int i = 0; i < data.markers.count(); ++i){

map::MapMarker marker = data.markers[i];

json["markers"]["result"][i]["object_id"] = marker.id;
json["markers"]["result"][i]["type_id"] = map::MARKER;
json["markers"]["result"][i]["ident"] = qUtf8Printable(marker.ident);
json["markers"]["result"][i]["type"] = qUtf8Printable(marker.type);
json["markers"]["result"][i]["position"] = coordinatesToJSON(getCoordinates(marker.position));
json["markers"]["result"][i]["elevation"] = marker.getPosition().getAltitude();

}

for(int i = 0; i < data.waypoints.count(); ++i){

map::MapWaypoint waypoint = data.waypoints[i];

json["waypoints"]["result"][i]["object_id"] = waypoint.id;
json["waypoints"]["result"][i]["type_id"] = map::WAYPOINT;
json["waypoints"]["result"][i]["ident"] = qUtf8Printable(waypoint.ident);
json["waypoints"]["result"][i]["type"] = qUtf8Printable(waypoint.type);
json["waypoints"]["result"][i]["position"] = coordinatesToJSON(getCoordinates(waypoint.position));
json["waypoints"]["result"][i]["elevation"] = waypoint.getPosition().getAltitude();

}

return json.dump().data();

}

2 changes: 2 additions & 0 deletions src/common/jsoninfobuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ class JsonInfoBuilder : public AbstractInfoBuilder
QByteArray airport(AirportInfoData airportInfoData) const override;
QByteArray siminfo(SimConnectInfoData simConnectInfoData) const override;
QByteArray uiinfo(UiInfoData uiInfoData) const override;
QByteArray features(MapFeaturesData mapFeaturesData) const override;
QByteArray feature(MapFeaturesData mapFeaturesData) const override;

private:
JSON coordinatesToJSON(QMap<QString,float> map) const;
Expand Down
10 changes: 6 additions & 4 deletions src/mapgui/mappaintwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -776,7 +776,7 @@ void MapPaintWidget::showPosInternal(const atools::geo::Pos& pos, float distance
setDistanceToMap(distanceKm, allowAdjust);
}

void MapPaintWidget::showRectStreamlined(const atools::geo::Rect& rect)
void MapPaintWidget::showRectStreamlined(const atools::geo::Rect& rect, bool constrainDistance)
{
if(rect.isPoint(POS_IS_POINT_EPSILON_DEG))
showPosNotAdjusted(rect.getTopLeft(), 0.f);
Expand All @@ -796,10 +796,12 @@ void MapPaintWidget::showRectStreamlined(const atools::geo::Rect& rect)
// Center on rectangle
centerRectOnMap(rect);

float distanceKm = atools::geo::nmToKm(Unit::rev(OptionData::instance().getMapZoomShowMenu(), Unit::distNmF));
if(constrainDistance){
float distanceKm = atools::geo::nmToKm(Unit::rev(OptionData::instance().getMapZoomShowMenu(), Unit::distNmF));

if(distance() < distanceKm)
setDistanceToMap(distanceKm);
if(distance() < distanceKm)
setDistanceToMap(distanceKm);
}
}
}

Expand Down
Loading