#javascript #google-maps-api-3 #polygon
Вопрос:
Поэтому в настоящее время я пытаюсь подсчитать и отследить количество маркеров, размещенных в созданном полигоне на моей карте, просматривая массив маркеров и используя функцию containsLocation (), однако всякий раз, когда я пытаюсь вывести количество маркеров, ничего не происходит. Любая помощь была бы очень признательна.
var map;
var area = "Update Polygon to show area";
var vertices = [];
var poly;
var markers = [];
var markerCnt = 0;
document.getElementById("myLog").innerHTML = area; //"Update Polygon to show area";
function createMap () {
var x = 42.886,
y = -78.878,
diff = 0.0033;
var choices = {
center: { lat: x, lng: y },
mapTypeId: 'satellite',
disableDefaultUI: true,
zoom: 16
};
map = new google.maps.Map(document.getElementById('map'), choices);
var polygonCoordinates = [
{ lat: x - diff, lng: y - diff },
{ lat: x diff, lng: y - diff },
{ lat: x diff, lng: y diff },
{ lat: x - diff, lng: y diff },
];
let polygon = new google.maps.Polygon({
map: map,
paths: polygonCoordinates,
clickable: false,
strokeColor: 'red',
fillColor: 'red',
fillOpacity: 0.4,
draggable: true,
editable: true
});
document.getElementById("markerCnt").innerHTML = "# of nodes inside highlighted area: " markerCnt;
google.maps.event.addListener(polygon.getPath(), 'set_at', function() {
PolyArray(polygon.getPath());
area = google.maps.geometry.spherical.computeArea(polygon.getPath());
console.log("Area inside highlighted area: " area " meters squared");
document.getElementById("myLog").innerHTML = "Area inside highlighted area: " area " meters squared";
});
google.maps.event.addListener(polygon.getPath(), 'insert_at', function() {
PolyArray(polygon.getPath());
area = google.maps.geometry.spherical.computeArea(polygon.getPath());
console.log("Area inside highlighted area: " area " meters squared");
document.getElementById("myLog").innerHTML = "Area inside highlighted area: " area " meters squared";
});
map.addListener("click", (event) => {
addMarker(event.latLng);
});
document.getElementById("clear-markers").addEventListener("click", clearMarkers);
document.getElementById("polygon-move").addEventListener("click", function(){
polygon.setOptions({clickable: true});
});
document.getElementById("polygon-stay").addEventListener("click", function(){
polygon.setOptions({clickable: false});
});
for (var i = 0; i < markers.length; i ) {
if (google.maps.geometry.poly.containsLocation(markers[i].getPosition(), polygon)) {
markerCnt ;
}
document.getElementById("markerCnt").innerHTML = "# of nodes inside highlighted area: " markerCnt;
}
}
function addMarker(position) {
const marker = new google.maps.Marker({
position,
map,
});
markers.push(marker);
}
function setMapOnAll(map) {
for (let i = 0; i < markers.length; i ) {
markers[i].setMap(map);
}
}
function clearMarkers() {
setMapOnAll(null);
markers = [];
}
function PolyArray (array) {
vertices = [];
for (var i = 0; i < array.getLength(); i ) {
vertices.push({
lat: array.getAt(i).lat(),
lng: array.getAt(i).lng()
});
}
console.log(vertices);
}
<!DOCTYPE html>
<html>
<head>
<title>Map</title>
<script src="https://polyfill.io/v3/polyfill.min.js?features=default"></script>
<meta name="viewport" content="initial-scale=1.0">
<meta charset="utf-8">
<style>
div#map{
height:500px;
}
</style>
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="col">
<h1 class="display-4">5G Map</h1>
</div>
</div>
<div class="row">
<div class="col">
<div id="floating-panel">
<input id="clear-markers" type="button" value="Clear Markers On Map" />
<div id="map"></div>
<div id="floating-panel-2">
<input id="polygon-move" type="button" value="Make Polygon Movable" />
<input id="polygon-stay" type="button" value="Make Polygon Stationary to Add Markers" />
<div id="myLog"></div>
<div id="markerCnt"></div>
</div>
</div>
</div>
</div>
</div>
<script src="script.js"></script>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qkamp;callback=createMapamp;libraries=geometry" async defer></script>
</body>
</html>
Ответ №1:
- для опубликованного примера сделайте полигон глобальным.
- сделайте код, который подсчитывает маркеры, функцией, вызывайте его всякий раз, когда происходит что-то, что может изменить количество маркеров (добавление маркера, редактирование пути полигона и т. Д.).
- очистите отображаемое количество маркеров при удалении маркеров.
рабочий фрагмент кода:
var map;
var area = "Update Polygon to show area";
var vertices = [];
let polygon;
var markers = [];
var markerCnt = 0;
document.getElementById("myLog").innerHTML = area; //"Update Polygon to show area";
function createMap () {
var x = 42.886,
y = -78.878,
diff = 0.0033;
var choices = {
center: { lat: x, lng: y },
mapTypeId: 'satellite',
disableDefaultUI: true,
zoom: 16
};
map = new google.maps.Map(document.getElementById('map'), choices);
var polygonCoordinates = [
{ lat: x - diff, lng: y - diff },
{ lat: x diff, lng: y - diff },
{ lat: x diff, lng: y diff },
{ lat: x - diff, lng: y diff },
];
polygon = new google.maps.Polygon({
map: map,
paths: polygonCoordinates,
clickable: false,
strokeColor: 'red',
fillColor: 'red',
fillOpacity: 0.4,
draggable: true,
editable: true
});
google.maps.event.addListener(polygon.getPath(), 'set_at', function() {
PolyArray(polygon.getPath());
area = google.maps.geometry.spherical.computeArea(polygon.getPath());
console.log("Area inside highlighted area: " area " meters squared");
document.getElementById("myLog").innerHTML = "Area inside highlighted area: " area " meters squared";
countMarkersInPolygon();
});
google.maps.event.addListener(polygon.getPath(), 'insert_at', function() {
PolyArray(polygon.getPath());
area = google.maps.geometry.spherical.computeArea(polygon.getPath());
console.log("Area inside highlighted area: " area " meters squared");
document.getElementById("myLog").innerHTML = "Area inside highlighted area: " area " meters squared";
countMarkersInPolygon();
});
map.addListener("click", (event) => {
addMarker(event.latLng);
});
document.getElementById("clear-markers").addEventListener("click", clearMarkers);
document.getElementById("polygon-move").addEventListener("click", function(){
polygon.setOptions({clickable: true});
});
document.getElementById("polygon-stay").addEventListener("click", function(){
polygon.setOptions({clickable: false});
});
}
function addMarker(position) {
const marker = new google.maps.Marker({
position,
map,
});
markers.push(marker);
countMarkersInPolygon();
}
function setMapOnAll(map) {
for (let i = 0; i < markers.length; i ) {
markers[i].setMap(map);
}
}
function clearMarkers() {
setMapOnAll(null);
markers = [];
document.getElementById("markerCnt").innerHTML = "# of nodes inside highlighted area: 0";
}
function PolyArray (array) {
vertices = [];
for (var i = 0; i < array.getLength(); i ) {
vertices.push({
lat: array.getAt(i).lat(),
lng: array.getAt(i).lng()
});
}
console.log(vertices);
}
function countMarkersInPolygon() {
// count markers
var markerCnt = 0;
for (var i = 0; i < markers.length; i ) {
if (google.maps.geometry.poly.containsLocation(markers[i].getPosition(), polygon)) {
markerCnt ;
}
}
document.getElementById("markerCnt").innerHTML = "# of nodes inside highlighted area: " markerCnt;
}
html, body {
height: 100%;
width: 100%;
margin: 0;
padding: 0;
}
#map {
height: 80%;
}
<!DOCTYPE html>
<html>
<head>
<title>Map</title>
<script src="https://polyfill.io/v3/polyfill.min.js?features=default"></script>
<meta name="viewport" content="initial-scale=1.0">
<meta charset="utf-8">
</head>
<body>
<div class="container-fluid" style="height:100%">
<div class="row">
<div class="col">
<h1 class="display-4">5G Map</h1>
</div>
</div>
<div class="row" style="height:80%">
<div class="col" style="height:100%">
<div id="floating-panel" style="height:100%">
<input id="clear-markers" type="button" value="Clear Markers On Map" />
<div id="map"></div>
<div id="floating-panel-2">
<input id="polygon-move" type="button" value="Make Polygon Movable" />
<input id="polygon-stay" type="button" value="Make Polygon Stationary to Add Markers" />
<div id="myLog"></div>
<div id="markerCnt"></div>
</div>
</div>
</div>
</div>
</div>
<script src="script.js"></script>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qkamp;callback=createMapamp;libraries=geometry" async defer></script>
</body>
</html>