機能が重複するリーフレットのポップアップを処理しますか?


8

LeafletとJavaScriptは初めてです。

現在、私は人々がオンラインでアクセスしてダウンロードできる古い地形図のための図書館所蔵の空間インデックスを作成しようとしています。機能のソースはGeoJSONファイルです。

サンプルマップ

問題は、学校の図書館に何年にもわたって同じ地図の複数のタイプがあることですが、地図をクリックすると、ポップアップが1つしか表示されません。複数のマップを循環するオプションが欲しいのですが、問題への取り組み方がわかりません。

ローカルの専門用語で、重なり合うポリゴンを循環するための特別な用語はありますか、またはこの問題に対するより強力なアプローチはありますか?

回答:


10

1つのオプションは、Mapboxを介して利用できるポリ(leaflet.pip)のリーフレットポイントを使用することです:https ://www.mapbox.com/mapbox.js/example/v1.0.0/point-in-polygon/ または、リーフレットプラグイン:https : //github.com/mapbox/leaflet-pip

ここでフィドル:http : //jsfiddle.net/TnX96/136/は、これがどのように機能するかを正確に示します。または、以下のコードを参照してください。

HTMLには必ずPIPライブラリを含めてください。

<script src='https://api.tiles.mapbox.com/mapbox.js/plugins/leaflet-pip/v0.0.2/leaflet-pip.js'></script>

JavaScript:

var map = new L.Map('map', {center: new L.LatLng(51, -100), zoom: 4});
var osm = new L.TileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png');
var ggl = new L.Google();
var ggl2 = new L.Google('TERRAIN');
map.addLayer(osm);
map.addControl(new L.Control.Layers( {'Street Maps':osm, 'Satellite':ggl, 'Terrain':ggl2}, {}));

function handleClick(e) {
    var html = '';
        var match = leafletPip.pointInLayer(
            // the clicked point
            e.latlng,
            // this layer
            streets,
            // whether to stop at first match
            false);
        if (match.length) {
            for (var i = 0; i < match.length; i++) { 
                html += "<br>"+"_____"+
                        "<br><b>" + match[i].feature.properties.title + ", " + match[i].feature.properties.subtitle + ":</b>" + 
                        "<br>Scale: " + match[i].feature.properties.Scale + 
                        "<br>Year Published: " + match[i].feature.properties.year + 
                        "<br><br><b>URL for map:</b> <a>" + match[i].feature.properties.location2 + "</a>"+
                        "<br><b>URL for cropped, georeferenced map:</b> <a>"+ match[i].feature.properties.location1 + "</a>"+
                        "<br><b>URL for KML:</b> <a>" + match[i].feature.properties.location3 +"</a>"

            }
        }
    if (html) {
        map.openPopup(html, e.latlng);
    }
}

var streets = new L.geoJson(histMap)
    .on('click', handleClick)
    .addTo(map);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.