Преобразование массива стилей Google Maps в строку стилей Google Static Maps
Я создал инструмент, который позволяет людям применять стиль карты JSON к карте Google, и теперь я хочу добавить поддержку Google Static API Карт.
Используя следующий массив стилей:
"[{"stylers":[]},{"featureType":"water","stylers":[{"color":"#d2dce6"}]},{"featureType":"administrative.country","elementType":"geometry","stylers":[{"weight":1},{"color":"#d5858f"}]},{"featureType":"administrative.country","elementType":"labels.text.fill","stylers":[{"color":"#555555"}]},{"featureType":"administrative","elementType":"geometry.stroke","stylers":[{"visibility":"off"}]},{"featureType":"administrative.country","stylers":[{"visibility":"on"}]},{"featureType":"road.highway","stylers":[{"saturation":-100},{"lightness":40},{"visibility":"simplified"}]},{"featureType":"road.arterial","stylers":[{"saturation":-100},{"lightness":40},{"visibility":"simplified"}]},{"featureType":"road.local","stylers":[{"saturation":-100},{"visibility":"simplified"}]},{"featureType":"landscape","elementType":"all","stylers":[{"hue":"#FFFFFF"},{"saturation":-100},{"lightness":100}]},{"featureType":"landscape.natural","elementType":"geometry","stylers":[{"saturation":-100}]},{"featureType":"landscape.man_made","elementType":"geometry.fill","stylers":[{"visibility":"simplified"},{"saturation":-100}]},{"featureType":"poi.park","elementType":"geometry","stylers":[{"saturation":-100},{"lightness":60}]},{"featureType":"poi","elementType":"geometry","stylers":[{"hue":"#FFFFFF"},{"saturation":-100},{"lightness":100},{"visibility":"off"}]}]"
(Дополнительная документация по формату)
Мне нужно в конечном итоге преобразовать это в строку с URL-адресами в формате: style=feature:featureArgument|element:elementArgument|rule1:rule1Argument|rule2:rule2Argument
(Дополнительная документация)
До сих пор я написал этот JavaScript, чтобы попытаться преобразовать вещи, но он не работает должным образом:
function get_static_style(styles) {
var result = '';
styles.forEach(function(v, i, a){
if (v.stylers.length > 0) { // Needs to have a style rule to be valid.
result += (v.hasOwnProperty('featureType') ? 'feature:' + v.featureType : 'feature:all') + '|';
result += (v.hasOwnProperty('elementType') ? 'element:' + v.elementType : 'element:all') + '|';
v.stylers.forEach(function(val, i, a){
var propertyname = Object.keys(val)[0];
var propertyval = new String(val[propertyname]).replace('#', '0x');
result += propertyname + ':' + propertyval + '|';
});
}
});
console.log(result);
return encodeURIComponent(result);
}
Увы, этот код выводит следующее:
![Output]()
(Щелкните правой кнопкой мыши и выберите "URL-адрес копии", чтобы увидеть полный путь, который я использую, - это прямо из API статических изображений)
... Когда вместо этого он должен выглядеть так:
![London with style]()
Любые идеи? Спасибо!
Ответы
Ответ 1
Каждый отдельный стиль должен быть снабжен отдельным style
-параметром:
function get_static_style(styles) {
var result = [];
styles.forEach(function(v, i, a){
var style='';
if (v.stylers.length > 0) { // Needs to have a style rule to be valid.
style += (v.hasOwnProperty('featureType') ? 'feature:' + v.featureType : 'feature:all') + '|';
style += (v.hasOwnProperty('elementType') ? 'element:' + v.elementType : 'element:all') + '|';
v.stylers.forEach(function(val, i, a){
var propertyname = Object.keys(val)[0];
var propertyval = val[propertyname].toString().replace('#', '0x');
style += propertyname + ':' + propertyval + '|';
});
}
result.push('style='+encodeURIComponent(style))
});
return result.join('&');
}
посмотреть результат
Ответ 2
Выбранный ответ не сработал у меня.
Но только потому, что у меня было несколько объектов без параметров styler
.
Мне пришлось изменить его так:
function get_static_style(styles) {
var result = [];
styles.forEach(function(v, i, a){
var style='';
if( v.stylers ) { // only if there is a styler object
if (v.stylers.length > 0) { // Needs to have a style rule to be valid.
style += (v.hasOwnProperty('featureType') ? 'feature:' + v.featureType : 'feature:all') + '|';
style += (v.hasOwnProperty('elementType') ? 'element:' + v.elementType : 'element:all') + '|';
v.stylers.forEach(function(val, i, a){
var propertyname = Object.keys(val)[0];
var propertyval = val[propertyname].toString().replace('#', '0x');
// changed "new String()" based on: http://stackoverflow.com/a/5821991/1121532
style += propertyname + ':' + propertyval + '|';
});
}
}
result.push('style='+encodeURIComponent(style));
});
return result.join('&');
}
увидеть его в действии по адресу: http://jsfiddle.net/ZnGpb/1/
p.s: JSHint
Ответ 3
Это метод PHP, который делает то же самое
public function mapStylesUrlArgs($mapStyleJson)
{
$params = [];
foreach (json_decode($mapStyleJson, true) as $style) {
$styleString = '';
if (isset($style['stylers']) && count($style['stylers']) > 0) {
$styleString .= (isset($style['featureType']) ? ('feature:' . $style['featureType']) : 'feature:all') . '|';
$styleString .= (isset($style['elementType']) ? ('element:' . $style['elementType']) : 'element:all') . '|';
foreach ($style['stylers'] as $styler) {
$propertyname = array_keys($styler)[0];
$propertyval = str_replace('#', '0x', $styler[$propertyname]);
$styleString .= $propertyname . ':' . $propertyval . '|';
}
}
$styleString = substr($styleString, 0, strlen($styleString) - 1);
$params[] = 'style=' . $styleString;
}
return implode("&", $params);
}
src: https://gist.github.com/WouterDS/5942b891cdad4fc90f40
Ответ 4
Я создал эту функцию nodejs для всех разработчиков Android.
Сохраните код ниже как flatten-mapstyle.js
anyware.
Выполнить, используя: node flatten-mapstyle.js /path/to/your/style/style_json.json
В urlencode используется флаг -e
, т.е. node flatten-mapstyle.js style_json.json -e
const fs = require('fs');
const {promisify} = require('util');
const args = process.argv.slice(2)
const filename = args[0]
const encode = args[1]
const exists = promisify(fs.exists);
const readFile = promisify(fs.readFile);
async function main() {
try {
if (filename == undefined || await !exists(filename)) {
throw {
'error': `file ${filename} does not exist`
}
}
let json = await readFile(filename, 'utf8');
console.log("=========COPY BELOW========")
console.log(getStaticStyle(JSON.parse(json)))
console.log("=========END OF COPY========")
} catch (e) {
console.error(e);
}
}
main();
function getStaticStyle(styles) {
var result = [];
styles.forEach(function(v, i, a) {
var style = '';
if (v.stylers) { // only if there is a styler object
if (v.stylers.length > 0) { // Needs to have a style rule to be valid.
style += (v.hasOwnProperty('featureType') ? 'feature:' + v.featureType : 'feature:all') + '|';
style += (v.hasOwnProperty('elementType') ? 'element:' + v.elementType : 'element:all') + '|';
v.stylers.forEach(function(val, i, a) {
var propertyname = Object.keys(val)[0];
var propertyval = val[propertyname].toString().replace('#', '0x');
style += propertyname + ':' + propertyval + '|';
});
}
}
result.push('style=' + (encode == "-e" ? encodeURIComponent(style) : style));
});
return result.join('&');
}