iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
SideProject30

一起去遛狗系列 第 21

【一起去遛狗】Day 20 客製化 Google Map 地圖樣式

  • 分享至 

  • xImage
  •  

因為做的是寵物定位分享平台,地圖上出現太多雜訊會影響使用體驗。

Google Map API 有提供在地圖中嵌入 JSON 來客製化地圖顯示的樣式,Using embedded JSON style declarations這裡有詳細的說明。

JSON 物件

要指定特定的地圖樣式,必須將 featureType 和 elementType 以及 stylers 組成一個樣式組合。

  • 例如下列的修改是指地圖特徵(features)都變成灰色,然後將主要幹道塗上藍色,並隱藏所有的景觀標籤:

    [
      {
        "featureType": "all",
        "stylers": [
          { "color": "#C0C0C0" }
        ]
      },{
        "featureType": "road.arterial",
        "elementType": "geometry",
        "stylers": [
          { "color": "#CCFFFF" }
        ]
      },{
        "featureType": "landscape",
        "elementType": "labels",
        "stylers": [
          { "visibility": "off" }
        ]
      }
    ]
    

    yEvcq7S

  • featureType
    選擇要修改的樣式特徵(features),例如道路、公園、水域等。如果不指定特徵,則選擇所有特徵。

  • elementType
    選擇指定特徵的元素。元素是特徵的細部,例如標籤、幾何形狀。如果不指定元素,則選擇該特徵的所有元素。

  • stylers
    用於選定的特徵和元素的規則。Stylers 指示特徵的顏色、可見性和權重。可對特徵用一個或多個 styler。

可以從 Style Reference for Maps JavaScript API 查詢更多樣式用法

Create map style

不過這樣一個個修改太麻煩了,Google 也有提供 Create map style 的網站讓你直接手動調整想要的地圖樣式,也可以即時看到調整後的樣式。

UqHLXUT

右下角的 more options 可以進入更多選項跟細部的調整,也可以調整每個特徵的線條、顏色,甚至是亮度、色彩飽和度等。
0aLjuKh

調整好按 Finish 就可以拿到 JSON 檔了!
Y077ctv

來看看完整的程式碼,這邊我把 JSON 改成 JS 格式,把 key 的雙引號拿掉,然後在 GoogleMap.create 裡面加上 styles: stylesArray 就完成了~

const createMap = async () => {
  const mapRef = document.getElementById("map");
  const coordinates = await Geolocation.getCurrentPosition();
  centerCoordinates.lat = coordinates.coords.latitude;
  centerCoordinates.lng = coordinates.coords.longitude;

  const stylesArray = [
    {
      featureType: "administrative.neighborhood",
      stylers: [{ visibility: "off" }],
    },
    { featureType: "poi.attraction", stylers: [{ visibility: "off" }] },
    {
      featureType: "poi.business",
      stylers: [{ saturation: -100 }, { visibility: "off" }],
    },
    {
      featureType: "poi.government",
      elementType: "geometry",
      stylers: [{ visibility: "off" }],
    },
    { featureType: "poi.medical", stylers: [{ visibility: "off" }] },
    { featureType: "poi.place_of_worship", stylers: [{ visibility: "off" }] },
    { featureType: "poi.school", stylers: [{ visibility: "off" }] },
    { featureType: "poi.sports_complex", stylers: [{ visibility: "off" }] },
    { featureType: "road.highway", stylers: [{ visibility: "off" }] },
    {
      featureType: "road.highway",
      elementType: "geometry.lines",
      stylers: [{ visibility: "off" }],
    },
    { featureType: "transit.station", stylers: [{ visibility: "off" }] },
  ];

  const newMap = await GoogleMap.create({
    id: "my-map",
    element: mapRef,
    apiKey: import.meta.env.VITE_GOOGLE_API_KEY,
    config: {
      center: centerCoordinates,
      zoom: 16,
      disableDefaultUI: true,
      styles: stylesArray, //要加這個!
    },
  });

  const markerId = await newMap.addMarker({
    coordinate: centerCoordinates,
  });
};

最後變這樣,乾乾淨淨剩公園 XD
qYEhYnt


上一篇
【一起去遛狗】Day 19 Ionic Vue 將自己的裝置定位標示在 google map
下一篇
【一起去遛狗】Day 21 定位分享
系列文
一起去遛狗30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言