forked from organicmaps/organicmaps
Merge pull request #4270 from bykoianko/master-passing-to-client-delta-altitude
Passing min and max route altitude.
This commit is contained in:
commit
3dea79943c
6 changed files with 76 additions and 9 deletions
|
@ -895,18 +895,37 @@ Java_com_mapswithme_maps_Framework_nativeGetRouteFollowingInfo(JNIEnv * env, jcl
|
|||
}
|
||||
|
||||
JNIEXPORT jintArray JNICALL
|
||||
Java_com_mapswithme_maps_Framework_nativeGenerateRouteAltitudeChartBits(JNIEnv * env, jclass, jint width, jint height)
|
||||
Java_com_mapswithme_maps_Framework_nativeGenerateRouteAltitudeChartBits(JNIEnv * env, jclass, jint width, jint height, jobject routeAltitudeLimits)
|
||||
{
|
||||
::Framework * fr = frm();
|
||||
ASSERT(fr, ());
|
||||
|
||||
vector<uint8_t> imageRGBAData;
|
||||
if (!fr->GenerateRouteAltitudeChart(width, height, imageRGBAData))
|
||||
int32_t minRouteAltitude = 0;
|
||||
int32_t maxRouteAltitude = 0;
|
||||
measurement_utils::Units units = measurement_utils::Units::Metric;
|
||||
if (!fr->GenerateRouteAltitudeChart(width, height, imageRGBAData, minRouteAltitude, maxRouteAltitude, units))
|
||||
{
|
||||
LOG(LWARNING, ("Can't generate route altitude image."));
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Passing route limits.
|
||||
jclass const routeAltitudeLimitsClass = env->GetObjectClass(routeAltitudeLimits);
|
||||
ASSERT(routeAltitudeLimitsClass, ());
|
||||
|
||||
static jfieldID const minRouteAltitudeField = env->GetFieldID(routeAltitudeLimitsClass, "minRouteAltitude", "I");
|
||||
ASSERT(minRouteAltitudeField, ());
|
||||
env->SetIntField(routeAltitudeLimits, minRouteAltitudeField, minRouteAltitude);
|
||||
|
||||
static jfieldID const maxRouteAltitudeField = env->GetFieldID(routeAltitudeLimitsClass, "maxRouteAltitude", "I");
|
||||
ASSERT(maxRouteAltitudeField, ());
|
||||
env->SetIntField(routeAltitudeLimits, maxRouteAltitudeField, maxRouteAltitude);
|
||||
|
||||
static jfieldID const isMetricUnitsField = env->GetFieldID(routeAltitudeLimitsClass, "isMetricUnits", "Z");
|
||||
ASSERT(isMetricUnitsField, ());
|
||||
env->SetBooleanField(routeAltitudeLimits, isMetricUnitsField, units == measurement_utils::Units::Metric);
|
||||
|
||||
size_t const imageRGBADataSize = imageRGBAData.size();
|
||||
ASSERT_NOT_EQUAL(imageRGBADataSize, 0, ("GenerateRouteAltitudeChart returns true but the vector with altitude image bits is empty."));
|
||||
|
||||
|
|
|
@ -61,6 +61,13 @@ public class Framework
|
|||
public boolean buildings;
|
||||
}
|
||||
|
||||
public static class RouteAltitudeLimits
|
||||
{
|
||||
public int minRouteAltitude;
|
||||
public int maxRouteAltitude;
|
||||
public boolean isMetricUnits;
|
||||
}
|
||||
|
||||
// this class is just bridge between Java and C++ worlds, we must not create it
|
||||
private Framework() {}
|
||||
|
||||
|
@ -81,7 +88,8 @@ public class Framework
|
|||
if (width <= 0 || height <= 0)
|
||||
return null;
|
||||
|
||||
final int[] altitudeChartBits = Framework.nativeGenerateRouteAltitudeChartBits(width, height);
|
||||
RouteAltitudeLimits routeAltitudeLimits = new RouteAltitudeLimits();
|
||||
final int[] altitudeChartBits = Framework.nativeGenerateRouteAltitudeChartBits(width, height, routeAltitudeLimits);
|
||||
if (altitudeChartBits == null)
|
||||
return null;
|
||||
|
||||
|
@ -165,7 +173,7 @@ public class Framework
|
|||
public static native RoutingInfo nativeGetRouteFollowingInfo();
|
||||
|
||||
@Nullable
|
||||
public static native final int[] nativeGenerateRouteAltitudeChartBits(int width, int height);
|
||||
public static native final int[] nativeGenerateRouteAltitudeChartBits(int width, int height, RouteAltitudeLimits routeAltitudeLimits);
|
||||
|
||||
// When an end user is going to a turn he gets sound turn instructions.
|
||||
// If C++ part wants the client to pronounce an instruction nativeGenerateTurnNotifications returns
|
||||
|
|
|
@ -288,8 +288,14 @@ bool isMarkerPoint(MWMRoutePoint const & point) { return point.IsValid() && !poi
|
|||
if (!imageData)
|
||||
{
|
||||
vector<uint8_t> imageRGBAData;
|
||||
if (!GetFramework().GenerateRouteAltitudeChart(width, height, imageRGBAData))
|
||||
int32_t minRouteAltitude = 0;
|
||||
int32_t maxRouteAltitude = 0;
|
||||
measurement_utils::Units units = measurement_utils::Units::Metric;
|
||||
if (!GetFramework().GenerateRouteAltitudeChart(width, height, imageRGBAData,
|
||||
minRouteAltitude, maxRouteAltitude, units))
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (imageRGBAData.empty())
|
||||
return;
|
||||
imageData = [NSData dataWithBytes:imageRGBAData.data() length:imageRGBAData.size()];
|
||||
|
|
|
@ -2988,7 +2988,9 @@ bool Framework::OriginalFeatureHasDefaultName(FeatureID const & fid) const
|
|||
bool Framework::HasRouteAltitude() const { return m_routingSession.HasRouteAltitude(); }
|
||||
|
||||
bool Framework::GenerateRouteAltitudeChart(uint32_t width, uint32_t height,
|
||||
vector<uint8_t> & imageRGBAData) const
|
||||
vector<uint8_t> & imageRGBAData,
|
||||
int32_t & minRouteAltitude, int32_t & maxRouteAltitude,
|
||||
measurement_utils::Units & altitudeUnits) const
|
||||
{
|
||||
feature::TAltitudes altitudes;
|
||||
vector<double> segDistance;
|
||||
|
@ -2997,6 +2999,29 @@ bool Framework::GenerateRouteAltitudeChart(uint32_t width, uint32_t height,
|
|||
return false;
|
||||
segDistance.insert(segDistance.begin(), 0.0);
|
||||
|
||||
return maps::GenerateChart(width, height, segDistance, altitudes,
|
||||
GetMapStyle(), imageRGBAData);
|
||||
if (altitudes.empty())
|
||||
return false;
|
||||
|
||||
if (!maps::GenerateChart(width, height, segDistance, altitudes, GetMapStyle(), imageRGBAData))
|
||||
return false;
|
||||
|
||||
auto const minMaxIt = minmax_element(altitudes.cbegin(), altitudes.cend());
|
||||
feature::TAltitude const minRouteAltitudeM = *minMaxIt.first;
|
||||
feature::TAltitude const maxRouteAltitudeM = *minMaxIt.second;
|
||||
|
||||
if (!settings::Get(settings::kMeasurementUnits, altitudeUnits))
|
||||
altitudeUnits = measurement_utils::Units::Metric;
|
||||
|
||||
switch (altitudeUnits)
|
||||
{
|
||||
case measurement_utils::Units::Imperial:
|
||||
minRouteAltitude = measurement_utils::MetersToFeet(minRouteAltitudeM);
|
||||
maxRouteAltitude = measurement_utils::MetersToFeet(maxRouteAltitudeM);
|
||||
break;
|
||||
case measurement_utils::Units::Metric:
|
||||
minRouteAltitude = minRouteAltitudeM;
|
||||
maxRouteAltitude = maxRouteAltitudeM;
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -729,13 +729,21 @@ public:
|
|||
/// false otherwise.
|
||||
bool HasRouteAltitude() const;
|
||||
/// \brief Generates 4 bytes per point image (RGBA) and put the data to |imageRGBAData|.
|
||||
/// \param width is width of chart shall be generated in pixels.
|
||||
/// \param height is height of chart shall be generated in pixels.
|
||||
/// \param imageRGBAData is bits of result image in RGBA.
|
||||
/// \param minRouteAltitude is min altitude along the route in altitudeUnits.
|
||||
/// \param maxRouteAltitude is max altitude along the route in altitudeUnits.
|
||||
/// \param altitudeUnits is units (meters or feet) which is used to pass min and max altitudes.
|
||||
/// \returns If there is valid route info and the chart was generated returns true
|
||||
/// and false otherwise. If the method returns true it is guaranteed that the size of
|
||||
/// |imageRGBAData| is not zero.
|
||||
/// \note If HasRouteAltitude() method returns true, GenerateRouteAltitudeChart(...)
|
||||
/// could return false if route was deleted or rebuilt between the calls.
|
||||
bool GenerateRouteAltitudeChart(uint32_t width, uint32_t height,
|
||||
vector<uint8_t> & imageRGBAData) const;
|
||||
vector<uint8_t> & imageRGBAData,
|
||||
int32_t & minRouteAltitude, int32_t & maxRouteAltitude,
|
||||
measurement_utils::Units & altitudeUnits) const;
|
||||
|
||||
public:
|
||||
/// @name Editor interface.
|
||||
|
|
|
@ -25,6 +25,7 @@ using std::max;
|
|||
using std::max_element;
|
||||
using std::min;
|
||||
using std::min_element;
|
||||
using std::minmax_element;
|
||||
using std::next_permutation;
|
||||
using std::none_of;
|
||||
using std::nth_element;
|
||||
|
|
Loading…
Add table
Reference in a new issue