javascript - 传单地图的属性评估/分析
问题描述
目前,我正在努力在传单地图上组合我的标记和多边形的属性。在我的地图中,我有巴伐利亚政府区,以区名称作为属性。我有 70 个标记来显示这些地区一些山脉的位置,这些点来自我制作的 csv 表。
我现在想做的是,每个点都应该被分配到它所在的相应区域的属性。这样标记弹出窗口也显示了该地区的名称。我不知道最简单的方法是什么?所以我考虑过在多边形函数中使用草皮点,但我不知道如何开始。
带有标记和多边形的地图。
我想做的第二件事是突出最高的山峰。第二列中数字最多的山。山高。
我的桌子是这样的:(山名;山高;面积;风景;纬度;经度)
Bergname;Berghoehe;Landkreis;Gebirge_Landschaft;纬度;经度
Hesselberg;689;Ansbach;Wörnitztal_Fränkische Alb;49.06861780;10.52610990
Dürrenberg;656; 魏森堡-贡岑豪森;哈嫩卡姆;49.01647480;10.76511290
...
我希望有人可以在这里帮助我,将不胜感激:)
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<title>Leaflet Map"</title>
<!-- leaflet.css, leaflet.js, turf.js von externer Quelle einbinden -->
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.4.0/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.4.0/dist/leaflet.js"></script> <!-- Load Leaflet code library-->
<script src='https://cdnjs.cloudflare.com/ajax/libs/leaflet-omnivore/0.3.4/leaflet-omnivore.min.js'></script> <!-- Load Omnivore to convert CSV to GeoJSON format -->
<script src="http://code.jquery.com/jquery-3.5.1.min.js"></script><!-- Load jQuery and PapaParse to read data from a CSV file -->
<script src="https://cdn.jsdelivr.net/npm/papaparse@5.3.0/papaparse.min.js"></script>
<script src='https://unpkg.com/@turf/turf/turf.min.js'></script>
<script src='https://unpkg.com/shpjs@latest/dist/shp.js'></script>
</head>
<body>
<div id='Karte' style='height: 800px; width: 100%;'></div>
<script type='text/javascript'>
var Karte = L.map('Karte').setView([48.896465, 10.996526], 7);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
'attribution': 'Kartendaten © <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> Mitwirkende',
'useCache': true
}).addTo(Karte);
//Leaflet Erweiterung für shp file https://github.com/calvinmetcalf/shapefile-js
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-40454900-1', 'calvinmetcalf.github.io');
ga('send', 'pageview');
var geo = L.geoJson({features:[]},{onEachFeature:function popUp(f,l){
var out = [];
if (f.properties){
for(var key in f.properties){
out.push(key+": "+f.properties[key]);
}
l.bindPopup(out.join("<br />"));
}
}}).addTo(Karte);
var base = './Regierungsbezirke_by.zip';
shp(base).then(function(data){
geo.addData(data);
})
//Papaparse Erweiterung für CSV Tabelle
$.get('./turf.csv', function(csvString) {
// Use PapaParse to convert string to array of objects
var data = Papa.parse(csvString, {header: true, dynamicTyping: true}).data;
// For each row in data, create a marker and add it to the map
// For each row, columns `Latitude`, `Longitude`, and `Title` are required
for (var i in data) {
var row = data[i]
var marker = L.marker([row.Latitude, row.Longitude], {
opacity: 1
}).bindPopup(row.Bergname + '; ' + row.Berghoehe + '; ' + row.Landkreis + '; ' + row.Gebirge_Landschaft + '; ' + row.Latitude + '; ' + row.Longitude)
marker.addTo(Karte)
}
});
var searchWithin = turf.polygon([[
</script>
</body>
</html>
解决方案
您可以使用turf.booleanContains(district.toGeoJSON(16), marker.toGeoJSON(16))
检查标记是否在该区域中,然后添加弹出窗口。
将您的标记添加到 FeatureGroup 以便稍后在循环中获取它
var fg = L.featureGroup().addTo(Karte);
//Papaparse Erweiterung für CSV Tabelle
$.get('./turf.csv', function(csvString) {
// Use PapaParse to convert string to array of objects
var data = Papa.parse(csvString, {
header: true,
dynamicTyping: true
}).data;
// For each row in data, create a marker and add it to the map
// For each row, columns `Latitude`, `Longitude`, and `Title` are required
for (var i in data) {
var row = data[i]
var marker = L.marker([row.Latitude, row.Longitude], {
opacity: 1
});
marker._mountainData = row;
marker.addTo(fg)
});
然后遍历所有区:
fg.eachLayer((layer) => {
var districts = geo.getLayers();
districts.forEach((district) => {
if (turf.booleanContains(district.toGeoJSON(16), layer.toGeoJSON(16))) {
var row = layer._mountainData;
layer.bindPopup(district.feature.properties.YOUR_DISTRICT_NAME_PROPERTY + ";" + row.Bergname + '; ' + row.Berghoehe + '; ' + row.Landkreis + '; ' + row.Gebirge_Landschaft + '; ' + row.Latitude + '; ' + row.Longitude)
return;
}
})
推荐阅读
- javascript - 我无法将请求正文添加到我的输出中
- php - 如何在 Symfony 4 中将数据库连接“localhost”更改为“127.0.0.1”?
- python - 在 python pandas 中加速 read_csv
- c++ - Knight 的巡回递归只填满了 60 个方格
- java - 为什么 XSD 模式和 WSDL 模式之间存在差异?
- http - HTTP 反向 shell 比 TCP 反向 shell 有什么好处?
- string - 使用 Excel-VBA 从字符串中提取 5 位数字
- typescript - 如何使用打字稿计算离子两次之间的差异?
- azure - Visual Studio Services 是否为 Web 应用程序的 CI/CD 提供完整的工作流?
- cloud-foundry - 在 vSphere 上安装 BOSH Director 失败