質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Leaflet

Leafletは、Web上で地図を作成するためのJavaScriptライブラリ。人気のあるJavaScript地図ライブラリのうちの一つでオープンソースです。軽量でインタラクティブな地図を手軽に表示することができます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

3529閲覧

Leafletにてマーカーをグループ化するとbindPopupが同一の内容になってしまう

southern_flavor

総合スコア70

Leaflet

Leafletは、Web上で地図を作成するためのJavaScriptライブラリ。人気のあるJavaScript地図ライブラリのうちの一つでオープンソースです。軽量でインタラクティブな地図を手軽に表示することができます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/09/30 10:55

編集2021/09/30 11:33

前提・実現したいこと

Leafletで複数マーカー付きの地図を作っています。

WP REST APIで生成したGeoJsonをfetchで読み込み、
複数のマーカーを表示させ、クリックするとポップアップが表示される仕組みにしたいです。
初期表示の座標はsetviewで指定するのではなく、map.fitBounds(iconGroup.getBounds())で自動的にマーカーが設定されている範囲の真ん中にしています。

発生している問題・エラーメッセージ

自動的にマーカーが設定されている範囲の真ん中にするために、L.featureGroup()でグループ化していますが、下記、javascriptのソースコードの通り、

return iconGroup.addLayer(L.marker(latlng, { icon: iconChange }).bindPopup(feature.properties.popup));

で指定したら取得した配列の一番最後のものしか出力されてしまいます。

下記、geojsonを例にするとすべてが北海道と表示されてしまいます。

該当のソースコード

html

1<div id="mapid"></div>

javascript

1 window.onload = function () { 2 var map = L.map('mapid'); 3 var url = {geojson_url}; 4 L.tileLayer('https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png', { 5 maxZoom: 18, 6 attribution: "<a href='https://maps.gsi.go.jp/development/ichiran.html' target='_blank'>地理院タイル</a>" 7 }).addTo(map); 8 fetch(url).then((response) => { 9 return response.json(); 10 }).then((data) => { 11 iconGroup = L.featureGroup(); 12 data.forEach((datum) => { 13 L.geoJson(datum, { 14 pointToLayer: (feature, latlng) => { 15 var iconChange = L.icon({ 16 iconUrl: 'src/' + feature.properties.iconName + '.png', 17 iconRetinaUrl: 'src/' + feature.properties.iconName2x + '.png', 18 iconSize: [25, 41] 19 }); 20 return iconGroup.addLayer(L.marker(latlng, { 21 icon: iconChange 22 }).bindPopup(feature.properties.popup)); 23 }, 24 onEachFeature: (feature, layer) => { 25 layer.bindPopup(feature.properties.popup); 26 }, 27 }).addTo(map) 28 }); 29 iconGroup.addTo(map); 30 map.fitBounds(iconGroup.getBounds()); 31 }).catch(() => { 32 document.getElementById('mapid').innerHTML = 'データを読み込めませんでした。'; 33 }); 34 }

GeoJson

1[ 2 { 3 "type": "FeatureCollection", 4 "features": [ 5 { 6 "type": "Feature", 7 "properties": { 8 "popup": "東京", 9 "iconName": "marker-icon1", 10 "iconName2x": "marker-icon1-2x", 11 "id": tokyo 12 }, 13 "geometry": { 14 "type": "Point", 15 "coordinates": [ 16 "139.6007816", 17 "35.6681625" 18 ] 19 } 20 } 21 ] 22 }, 23 { 24 "type": "FeatureCollection", 25 "features": [ 26 { 27 "type": "Feature", 28 "properties": { 29 "popup": "北海道", 30 "iconName": "marker-icon1", 31 "iconName2x": "marker-icon1-2x", 32 "id": hokkaido 33 }, 34 "geometry": { 35 "type": "Point", 36 "coordinates": [ 37 "140.3324856", 38 "43.4171273" 39 ] 40 } 41 } 42 ] 43 } 44]

試したこと

onEachFeatureを消すと一応は理想的な形になりますが
新たな問題が発生します。
その問題とは、マーカーをクリックするとポップアップの表示が
クリックしてから一瞬は出現するけどすぐ消えてしまうみたいな形です。

解決策について、よければ、ご教授いただけたら幸いです。

補足情報(FW/ツールのバージョンなど)

Leaflet 1.7.1

参考サイト

https://leafletjs.com/reference-1.7.1.html
https://www.achiachi.net/blog/leaflet/autocenter

追記です。
###試したことに記載がありました、
「その問題とは、マーカーをクリックするとポップアップの表示が
クリックしてから一瞬は出現するけどすぐ消えてしまうみたいな形で」
ですが、これはスマートフォンのブラウザで発生しました。
PCでは問題ないです。
こちらで確認したデバイスやブラウザは、
iOS14.7.1のsafari  14.1.2、Chrome 94.04606.52
となります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

一応は解決しました。

今回の問題は、
上記に提示したjavascriptのソースコード内にonEachFeatureの表記を消すことで解消されますが、
マーカーに対してクリックが反応しにくいという新たな問題がありました。
これはマーカーのクリック範囲が狭くなっており、マーカー画像の上のほうをクリックすると通常通り、反応し、ポップアップが表示されます。
デバイスとか関係なく、もともとそうなっていたようで・・・。

これを解消するために少し無理やりな感じもしますが、CSSで、
.leaflet-popup-tip-containerに対して、
pointer-events: none;となっていたところを、
pointer-events: auto;にすることにしたら解消しました。

投稿2021/09/30 12:17

southern_flavor

総合スコア70

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問