From 7a010df9560e8807b9be938bb5ff7360e8e730a6 Mon Sep 17 00:00:00 2001 From: Asheem Mamoowala Date: Thu, 20 Apr 2017 12:39:51 -0700 Subject: [core] Add ImageSource support to style parsers --- include/mbgl/style/conversion/coordinate.hpp | 37 +++++++++++++++++++++ include/mbgl/style/conversion/source.hpp | 48 ++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 include/mbgl/style/conversion/coordinate.hpp (limited to 'include/mbgl/style/conversion') diff --git a/include/mbgl/style/conversion/coordinate.hpp b/include/mbgl/style/conversion/coordinate.hpp new file mode 100644 index 0000000000..0adbb9a7ee --- /dev/null +++ b/include/mbgl/style/conversion/coordinate.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace style { +namespace conversion { + +template<> +struct Converter> { +public: + template + optional> operator() (const V& value, Error& error) const { + if (!isArray(value) || arrayLength(value) < 2 ) { + error = { "coordinate array must contain numeric longtitude and latitude values" }; + return {}; + } + //Style spec uses GeoJSON convention for specifying coordinates + optional latitude = toNumber(arrayMember(value, 1)); + optional longitude = toNumber(arrayMember(value, 0)); + + if (!latitude || !longitude) { + error = { "coordinate array must contain numeric longtitude and latitude values" }; + return {}; + } + if (*latitude < -90 || *latitude > 90 ){ + error = { "coordinate latitude must be between -90 and 90" }; + return {}; + } + return { std::make_unique(*latitude, *longitude) }; + } +}; + +} // namespace conversion +} // namespace style +} // namespace mbgl diff --git a/include/mbgl/style/conversion/source.hpp b/include/mbgl/style/conversion/source.hpp index dc7cdc0d42..e121e36955 100644 --- a/include/mbgl/style/conversion/source.hpp +++ b/include/mbgl/style/conversion/source.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include #include @@ -8,6 +9,8 @@ #include #include #include +#include +#include namespace mbgl { namespace style { @@ -16,6 +19,7 @@ namespace conversion { template <> struct Converter> { public: + template optional> operator()(const V& value, Error& error, const std::string& id) const { if (!isObject(value)) { @@ -41,6 +45,8 @@ public: return convertVectorSource(id, value, error); } else if (*type == "geojson") { return convertGeoJSONSource(id, value, error); + } else if (*type == "image") { + return convertImageSource(id, value, error); } else { error = { "invalid source type" }; return {}; @@ -136,6 +142,48 @@ private: return { std::move(result) }; } + + template + optional> convertImageSource(const std::string& id, + const V& value, + Error& error) const { + auto urlValue = objectMember(value, "url"); + if (!urlValue) { + error = { "Image source must have a url value" }; + return {}; + } + + auto urlString = toString(*urlValue); + if (!urlString) { + error = { "Image url must be a URL string" }; + return {}; + } + + auto coordinatesValue = objectMember(value, "coordinates"); + if (!coordinatesValue) { + error = { "Image source must have a coordinates values" }; + return {}; + } + + if (!isArray(*coordinatesValue) || arrayLength(*coordinatesValue) != 4) { + error = { "Image coordinates must be an array of four longitude latitude pairs" }; + return {}; + } + + std::vector coordinates; + coordinates.reserve(4); + for( std::size_t i=0; i < arrayLength(*coordinatesValue); i++) { + auto latLng = conversion::convert(arrayMember(*coordinatesValue,i), error); + if (!latLng) { + return {}; + } + coordinates.push_back(*latLng); + } + auto result = std::make_unique(id, coordinates); + result->setURL(*urlString); + + return { std::move(result) }; + } }; } // namespace conversion -- cgit v1.2.1