ハウツー クリックでポップアップを出すには
マーカーをクリックしたときに情報をポップアップで表示します。
コード
Marker を置き、クリックイベントで InfoWindow を開きます。
import "maplibre-gl/dist/maplibre-gl.css";
import "@geolonia/maps-core/css";
import { geolonia } from "@geolonia/maps-suite";
const map = new geolonia.maps.Map(document.getElementById("map"), {
apiKey: "YOUR-API-KEY",
center: { lat: 35.681236, lng: 139.767125 },
zoom: 15,
});
const marker = new geolonia.maps.Marker({
position: { lat: 35.681236, lng: 139.767125 },
map,
title: "東京駅",
});
const infoWindow = new geolonia.maps.InfoWindow({
content: "<strong>東京駅</strong><br>JR・地下鉄各線",
});
marker.addListener("click", () => infoWindow.open(map, marker));InfoWindow:contentに HTML を渡して作り、open(map, marker)でマーカーの位置に開きます。引数はこの順番の2つ(地図、アンカー)です。- マーカーを複数作って、それぞれにリスナーを付ければ、複数の点で個別のポップアップが出せます。
Marker コンポーネントの子要素が、そのままポップアップの内容になります。
import "maplibre-gl/dist/maplibre-gl.css";
import "@geolonia/maps-core/css";
import { createRoot } from "react-dom/client";
import { Map, Marker } from "@geolonia/maps-react";
createRoot(document.getElementById("root")).render(
<Map
apiKey="YOUR-API-KEY"
center={[139.767125, 35.681236]}
zoom={15}
containerStyle={{ width: "100%", height: "100vh" }}
>
<Marker lat={35.681236} lng={139.767125} color="#e4402f">
<strong>東京駅</strong>
<p style={{ margin: 0 }}>JR・地下鉄各線</p>
</Marker>
</Map>,
);lat/lng:マーカーを立てる場所。個別の props で渡します(Mapのcenterは[経度, 緯度]の配列なので混同に注意)。- 子要素:クリックしたときに開くポップアップの中身。JSX なので React コンポーネントも書けます。
- embed と違い、
Markerを複数並べてそれぞれにポップアップを付けられます(マーカーを複数置くにはを参照)。
画像つきのポップアップを複数置く
ポップアップの中身は HTML なので、<img> を書けば写真やサムネイルが入ります。ここでは3つの地点それぞれに、名前・説明・画像を載せたポップアップを付けます。
ひとつだけ注意があります。ポップアップの最大幅は既定で 240px です。原寸のまま画像を入れると枠からはみ出すので、画像側で幅を決めてください(下の例では width: 100% を効かせています)。
一覧をループして、Marker と InfoWindow を地点ごとに作ります。
import "maplibre-gl/dist/maplibre-gl.css";
import "@geolonia/maps-core/css";
import { geolonia } from "@geolonia/maps-suite";
const spots = [
{ name: "東京駅", note: "JR・地下鉄各線", lng: 139.767125, lat: 35.681236 },
{ name: "新宿駅", note: "JR・私鉄・地下鉄各線", lng: 139.700258, lat: 35.690921 },
{ name: "渋谷駅", note: "JR・私鉄・地下鉄各線", lng: 139.701636, lat: 35.658034 },
];
const map = new geolonia.maps.Map(document.getElementById("map"), {
apiKey: "YOUR-API-KEY",
center: { lat: 35.68, lng: 139.75 },
zoom: 11,
});
// InfoWindow は幅のオプションを持たないので、画像の幅は style 属性で決めます
const IMG_STYLE = "width: 100%; display: block; margin-top: 6px";
for (const spot of spots) {
const marker = new geolonia.maps.Marker({
position: { lat: spot.lat, lng: spot.lng },
map,
title: spot.name,
});
const infoWindow = new geolonia.maps.InfoWindow({
content: `
<strong>${spot.name}</strong><br>${spot.note}
<img src="/geolonia-icon.png" alt="${spot.name}" style="${IMG_STYLE}">
`,
});
marker.addListener("click", () => infoWindow.open(map, marker));
}content:HTML 文字列を渡します。InfoWindowに幅のオプションはないので、画像の幅はstyle属性で指定します。- 地点ごとに
InfoWindowを作る書き方なので、複数のポップアップが同時に開きます。常に1つだけ開いた状態にしたいときは、InfoWindowを1つ作ってsetContent()で中身を差し替えてください。open()は開く前に自分を閉じるので、前のポップアップは自動的に閉じます。
Marker の子要素に <img> を並べるだけです。
import "maplibre-gl/dist/maplibre-gl.css";
import "@geolonia/maps-core/css";
import { createRoot } from "react-dom/client";
import { Map, Marker } from "@geolonia/maps-react";
const spots = [
{ name: "東京駅", note: "JR・地下鉄各線", lng: 139.767125, lat: 35.681236 },
{ name: "新宿駅", note: "JR・私鉄・地下鉄各線", lng: 139.700258, lat: 35.690921 },
{ name: "渋谷駅", note: "JR・私鉄・地下鉄各線", lng: 139.701636, lat: 35.658034 },
];
createRoot(document.getElementById("root")).render(
<Map
apiKey="YOUR-API-KEY"
center={[139.75, 35.68]}
zoom={11}
containerStyle={{ width: "100%", height: "100vh" }}
>
{spots.map((spot) => (
<Marker key={spot.name} lat={spot.lat} lng={spot.lng} color="#e4402f">
<strong>{spot.name}</strong>
<p style={{ margin: "2px 0 0" }}>{spot.note}</p>
<img
src="/geolonia-icon.png"
alt={spot.name}
style={{ width: "100%", display: "block", marginTop: 6 }}
/>
</Marker>
))}
</Map>,
);- 子要素:ふつうの JSX なので、
<img>もコンポーネントも置けます。画像の幅はstyleで指定します。 key:配列から作るときは忘れずに付けます。
上の例の src は、このサイトに置いたサンプル画像(/geolonia-icon.png)を指しています。自分のサイトの画像に差し替えるときは、ルートからの絶対パス(/img/tokyo-station.jpg)か絶対 URL(https://example.com/tokyo-station.jpg)で書いてください。ポップアップの HTML はページのどこからでも同じ文字列として使われるので、相対パスにするとページによって解決先が変わります。
結果
上のコードは、それぞれのタブの下でそのまま動いています。マーカーをクリックするとポップアップが開きます。画像つきの例では、3つのマーカーそれぞれに画像入りのポップアップが開きます。
うまくいかないとき
- マーカーが出ない → 属性だけで書いているときは
data-marker="off"が付いていないか確認。中心のマーカーを消すと、ポップアップも開かなくなります。 - ポップアップが空 →
divの子要素が空になっていないか確認。空白文字だけではポップアップは開きません。 - クリックしても何も出ない →
divタグの閉じ忘れに注意。<div class="geolonia" ...>内容</div>と正しく閉じてください。 - 画像がはみ出す・切れる → ポップアップの最大幅は既定で 240px です。画像に
width: 100%を効かせてください。 - 画像が出ない →
srcのパスを確認。相対パスはページの場所によって解決先が変わるので、絶対パスか絶対 URL で書きます。