5#include <rapidjson/document.h>
6#include <rapidjson/stringbuffer.h>
7#include <rapidjson/writer.h>
11inline std::string withPoiHoverStyle(
const std::string& style) {
12 rapidjson::Document document;
13 document.Parse(style.c_str());
14 if (document.HasParseError() || !document.IsObject() ||
15 !document.HasMember(
"sources") || !document[
"sources"].IsObject() ||
16 !document.HasMember(
"layers") || !document[
"layers"].IsArray())
17 throw std::runtime_error(
"map style has invalid sources or layers");
18 if (!document[
"sources"].HasMember(
"poi-results"))
return style;
19 rapidjson::Document additions;
21 "source":{"type":"geojson","data":{"type":"FeatureCollection","features":[]}},
22 "glow":{"id":"poi-hover-glow","type":"circle","source":"poi-hover","minzoom":7,
23 "paint":{"circle-radius":["interpolate",["linear"],["zoom"],7,12,11,16,15,19],
24 "circle-color":"#fff3a6","circle-opacity":0.3,"circle-blur":0.8}},
25 "label":{"id":"poi-hover-label","type":"symbol","source":"poi-hover","minzoom":9,
26 "layout":{"text-field":"{name}","text-font":["KlokanTech Noto Sans CJK Regular"],
27 "text-size":["interpolate",["linear"],["zoom"],9,10,13,12,16,14],
28 "text-offset":[0,1.15],"text-anchor":"top",
29 "text-allow-overlap":true,"text-ignore-placement":true},
30 "paint":{"text-color":"#fffbd9","text-halo-color":"#101820",
31 "text-halo-width":2,"text-halo-blur":0}}
33 auto& allocator = document.GetAllocator();
34 if (!document[
"sources"].HasMember(
"poi-hover")) {
35 rapidjson::Value source;
36 source.CopyFrom(additions[
"source"], allocator);
37 document[
"sources"].AddMember(
"poi-hover", source, allocator);
39 bool hasGlow =
false, hasLabel =
false;
40 for (
const auto& layer : document[
"layers"].GetArray()) {
41 if (!layer.IsObject() || !layer.HasMember(
"id") || !layer[
"id"].IsString())
continue;
42 const std::string
id = layer[
"id"].GetString();
43 hasGlow |=
id ==
"poi-hover-glow";
44 hasLabel |=
id ==
"poi-hover-label";
46 rapidjson::Value layers(rapidjson::kArrayType);
47 for (
const auto& layer : document[
"layers"].GetArray()) {
48 if (!hasGlow && layer.IsObject() && layer.HasMember(
"id") && layer[
"id"].IsString() &&
49 std::string(layer[
"id"].GetString()) ==
"poi-results-badge") {
50 rapidjson::Value glow;
51 glow.CopyFrom(additions[
"glow"], allocator);
52 layers.PushBack(glow, allocator);
55 rapidjson::Value copy;
56 copy.CopyFrom(layer, allocator);
57 layers.PushBack(copy, allocator);
60 rapidjson::Value glow;
61 glow.CopyFrom(additions[
"glow"], allocator);
62 layers.PushBack(glow, allocator);
65 rapidjson::Value label;
66 label.CopyFrom(additions[
"label"], allocator);
67 layers.PushBack(label, allocator);
69 document[
"layers"] = std::move(layers);
70 rapidjson::StringBuffer buffer;
71 rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
72 document.Accept(writer);
73 return buffer.GetString();