编辑2-尝试合并@ghybs插件。不起作用,但这是一种尝试。
//define clustering layer
var parentGroup = L.markerClusterGroup().addTo(map);
var overlays = {};
for (var i = 1; i <= 5; i += 1) {
overlays['Group ' + i] = L.featureGroup.subGroup(
parentGroup,
getArrayOfMarkers()
).addTo(map);
}
L.control.layers(null, overlays, {
collapsed: false,
}).addTo(map);
//creates markers and popups for each json dataset
function getArrayOfMarkers(){
var result = [];
for ( var i = 0; i < markers.length; ++i )
{
var popup = '<br/><b>Sample Name:</b> '+ markers[i]["Sample Name"] +
'<br/><b>Location Description:</b> ' + markers[i]["Location Description"] +
'<br/><b>Date Taken:</b> ' + markers[i]["Date"] +
'<br/><b>Classification:</b> ' + markers[i]["Classification"]
result.push(L.marker( [markers[i].Lattitude, markers[i].Longitude], {icon: icons[markers[i]["Classification"]]})
.bindPopup( popup ));
return result;
}
}
编辑-以前标记为重复并指向此线程:
Using several Marker Cluster Groups displays overlapping Clusters
哪个很棒!那就是我要找的东西。但是我仍然迷失于如何将其与多个动态创建的图标结合在一起。 (在其他主题中未讨论过。)我在这个部门的技能很少。
我已经设法根据来自json的值创建自定义标记图标。但这将所有标记合并到了一层。我想基于标记类型实现图层控制,但是我不确定如何使它与聚类插件一起使用。
layercontrol可以与群集一起使用吗?
图层控制示例:
https://leafletjs.com/examples/layers-control/
http://jsfiddle.net/ve2huzxw/55/
可能实施的地方吗?
var m = L.marker( [markers[i].Lattitude, markers[i].Longitude], {icon: icons[markers[i]["Classification"]]})
.bindPopup( popup );
所需的结束状态将是地图上的图层控制图标,该图标可让您显示四个图层的任意组合。 [来源,空白,背景,未知]
我将继续尝试使工作正常,但这是希望这里的人看到一个简单的解决方案。
HTML
<!DOCTYPE html>
<html>
<head>
<title>Sample Locations</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.5.1/dist/leaflet.css"
integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ=="
crossorigin=""/>
<link rel="stylesheet" type="text/css" href="https://unpkg.com/leaflet.markercluster@1.4.1/dist/MarkerCluster.css" />
<link rel="stylesheet" type="text/css" href="https://unpkg.com/leaflet.markercluster@1.4.1/dist/MarkerCluster.Default.css" />
<script charset="utf8" src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://unpkg.com/leaflet@1.5.1/dist/leaflet.js"
integrity="sha512-GffPMF3RvMeYyc1LWMHtK8EbPv0iNZ8/oTtHPx9/cc2ILxQ+u905qIwdpULaqDkyBKgOaB57QTMg7ztg8Jm2Og=="
crossorigin=""></script>
<script type='text/javascript' src='https://unpkg.com/leaflet.markercluster@1.4.1/dist/leaflet.markercluster.js'></script>
<!-- Load Esri Leaflet from CDN -->
<script src="https://unpkg.com/esri-leaflet@2.2.4/dist/esri-leaflet.js"
integrity="sha512-tyPum7h2h36X52O2gz+Pe8z/3l+Y9S1yEUscbVs5r5aEY5dFmP1WWRY/WLLElnFHa+k1JBQZSCDGwEAnm2IxAQ=="
crossorigin=""></script>
<body>
<style>
body { margin:0; padding:0; }
#map { position: absolute; top:0; bottom:0; right:0; left:0; }
</style>
<style>
#basemaps-wrapper {
position: absolute;
top: 10px;
right: 10px;
z-index: 400;
background: white;
padding: 10px;
}
#basemaps {
margin-bottom: 5px;
}
</style>
<div id="map"></div>
<div id="basemaps-wrapper" class="leaflet-bar">
<select name="basemaps" id="basemaps" onChange="changeBasemap(basemaps)">
<option value="Topographic">Topographic</option>
<option value="Streets">Streets</option>
<option value="NationalGeographic">National Geographic</option>
<option value="Oceans">Oceans</option>
<option value="Imagery">Imagery</option>
<option value="ImageryClarity" selected>Imagery (Clarity)</option>
<option value="ImageryFirefly">Imagery (Firefly)</option>
<option value="Gray">Gray</option>
<option value="DarkGray">Dark Gray</option>
<option value="ShadedRelief">Shaded Relief</option>
<option value="Physical">Physical</option>
</select>
</div>
</head>
<script type='text/javascript' src='JS/maptest.js'></script>
</body>
</html>
jQuery
// Define site URL
var myURL = jQuery( 'script[src$="JS/maptest.js"]' ).attr( 'src' ).replace( 'JS/maptest.js', '' );
//define icon image locations
var Sourceiconurl = myURL + 'images/source.png',
Blankiconurl = myURL + 'images/blank.png',
Unknowniconurl = myURL + 'images/unknown.png',
Backgroundiconurl = myURL + 'images/background.png';
//initialize variable
var markers;
//pull data from json
jQuery.ajax({
url: myURL + "map_json.php",
type: "JSON",
async: false,
success: function(data){
markers = jQuery.parseJSON(data);
jQuery(markers).each(function( index, element ) {
});
}
});
//initialize map
var map = L.map( 'map', {
center: [39.8333333, -98.585522],
minZoom: 1,
zoom: 4
});
//create esri layers and selector
var layer = L.esri.basemapLayer('Imagery').addTo(map);
var layerLabels = L.esri.basemapLayer('ImageryLabels');
map.addLayer(layerLabels);
function setBasemap(basemap) {
if (layer) {
map.removeLayer(layer);
}
layer = L.esri.basemapLayer(basemap);
map.addLayer(layer);
if (layerLabels) {
map.removeLayer(layerLabels);
}
if (basemap === 'ShadedRelief'
|| basemap === 'Oceans'
|| basemap === 'Gray'
|| basemap === 'DarkGray'
|| basemap === 'Terrain'
) {
layerLabels = L.esri.basemapLayer(basemap + 'Labels');
map.addLayer(layerLabels);
} else if (basemap.includes('Imagery')) {
layerLabels = L.esri.basemapLayer('ImageryLabels');
map.addLayer(layerLabels);
}
}
function changeBasemap(basemaps){
var basemap = basemaps.value;
setBasemap(basemap);
}
//create legend (need to figure out how to format)
var legend = L.control({position: 'bottomright'});
legend.onAdd = function (map) {
var div = L.DomUtil.create('div', 'legend'),
grades = ["Source", "Blank", "Background", "Unknown"],
labels = [Sourceiconurl,Blankiconurl,Backgroundiconurl,Unknowniconurl];
// loop through names and assign labels
for (var i = 0; i < grades.length; i++) {
div.innerHTML +=
grades[i] + (" <img src="+ labels[i] +" height='50' width='50'>") +'<br>';
}
return div;
};
legend.addTo(map);
//define base icon features
var MapIcon = L.Icon.extend({
options: {
iconSize: [40, 55],
iconAnchor: [20, 35],
popupAnchor: [2, -10]
}
});
//define custom icons
var Source = new MapIcon({iconUrl: Sourceiconurl}),
Blank = new MapIcon({iconUrl: Blankiconurl}),
Unknown = new MapIcon({iconUrl: Unknowniconurl}),
Background = new MapIcon({iconUrl: Backgroundiconurl});
//allows function to read json field and assign to icon url
var icons = {
"Source": Source,
"Blank": Blank,
"Unknown": Unknown,
"Background": Background};
//define clustering layer
var markerClusters = L.markerClusterGroup({});
//creates markers and popups for each json dataset
for ( var i = 0; i < markers.length; ++i )
{
var popup = '<br/><b>Sample Name:</b> '+ markers[i]["Sample Name"] +
'<br/><b>Location Description:</b> ' + markers[i]["Location Description"] +
'<br/><b>Date Taken:</b> ' + markers[i]["Date"] +
'<br/><b>Classification:</b> ' + markers[i]["Classification"]
var m = L.marker( [markers[i].Lattitude, markers[i].Longitude], {icon: icons[markers[i]["Classification"]]})
.bindPopup( popup );
markerClusters.addLayer( m );
}
map.addLayer( markerClusters );
JSON
[
{
"Sample Name": "7411-2",
"Date": "2017-09-05",
"Lattitude": "40.3126",
"Longitude": "-94.0277",
"Location Description": "Lake 1",
"Classification": "Unknown",
"Empty": "1"
},
{
"Sample Name": "7411-1",
"Date": "2017-09-05",
"Lattitude": "40.5999",
"Longitude": "-93.7661",
"Location Description": "Lake 2",
"Classification": "Source",
"Empty": "1"
},
{
"Sample Name": "7406-3",
"Date": "2017-07-31",
"Lattitude": "39.4076",
"Longitude": "-94.5555",
"Location Description": "Lake 3",
"Classification": "Blank",
"Empty": "1"
},
{
"Sample Name": "7406-3",
"Date": "2017-07-31",
"Lattitude": "39.4076",
"Longitude": "-94.5555",
"Location Description": "Lake 3",
"Classification": "Background",
"Empty": "1"
}
]
图标
You can use any 4 .png icon files in place of the ones I have listed.