谷歌地图 API V3-多个标记在完全相同的地点

这个有点卡住了。我通过 JSON 检索地理坐标列表,并将它们弹出到谷歌地图上。所有的工作都很好,除了当我有两个或两个以上的标记在同一个地方的实例。API 只显示一个标记-顶部的那个。我认为这很公平,但是我想找到一种方法来展示它们。

我已经搜索谷歌,找到了一些解决方案,但他们大多似乎是为 V2的 API 或只是不那么伟大。理想情况下,我想要一个解决方案,你点击一些类型的群标记,然后显示标记集群周围的现场,他们都在。

有人遇到过这个问题或类似的问题,愿意分享一下解决方案吗?

166029 次浏览

查看 V3版本的 标记群集-这个库集群附近的点到一个组标记。单击集群时,映射会放大。我可以想象当你放大的时候,你仍然会有同样的问题,在同一个地方的标记。

对于在同一建筑物中有多个服务的情况,你可以稍微偏移标记,(比如说0.001度) ,从实际点的半径。这也应该产生一个很好的视觉效果。

如果这些标记位于同一栋楼里就无法抵消它们。您可能需要像下面这样修改 markercluster er.js:

  1. 在 MarkerClusterer 类中添加一个原型 click 方法,如下所示——我们将在后面的 map initialize ()函数中重写这个方法:

    MarkerClusterer.prototype.onClick = function() {
    return true;
    };
    
  2. In the ClusterIcon class, add the following code AFTER the clusterclick trigger:

    // Trigger the clusterclick event.
    google.maps.event.trigger(markerClusterer, 'clusterclick', this.cluster_);
    
    
    var zoom = this.map_.getZoom();
    var maxZoom = markerClusterer.getMaxZoom();
    // if we have reached the maxZoom and there is more than 1 marker in this cluster
    // use our onClick method to popup a list of options
    if (zoom >= maxZoom && this.cluster_.markers_.length > 1) {
    return markerClusterer.onClickZoom(this);
    }
    
  3. Then, in your initialize() function where you initialize the map and declare your MarkerClusterer object:

    markerCluster = new MarkerClusterer(map, markers);
    // onClickZoom OVERRIDE
    markerCluster.onClickZoom = function() { return multiChoice(markerCluster); }
    

    其中 multiChoice ()是用来弹出 InfoWindow 的(尚未编写)函数,其中包含要从中选择的选项列表。请注意,markerClusterer 对象被传递给函数,因为您将需要它来确定该集群中有多少个标记。例如:

    function multiChoice(mc) {
    var cluster = mc.clusters_;
    // if more than 1 point shares the same lat/long
    // the size of the cluster array will be 1 AND
    // the number of markers in the cluster will be > 1
    // REMEMBER: maxZoom was already reached and we can't zoom in anymore
    if (cluster.length == 1 && cluster[0].markers_.length > 1)
    {
    var markers = cluster[0].markers_;
    for (var i=0; i < markers.length; i++)
    {
    // you'll probably want to generate your list of options here...
    }
    
    
    return false;
    }
    
    
    return true;
    }
    

@ Ignatius 最佳答案,更新到 MarkerClusterPlus 的2.0.7版本。

  1. 在 MarkerClusterer 类中添加一个原型 click 方法,如下所示——我们将在后面的 map initialize ()函数中重写这个方法:

    // BEGIN MODIFICATION (around line 715)
    MarkerClusterer.prototype.onClick = function() {
    return true;
    };
    // END MODIFICATION
    
  2. In the ClusterIcon class, add the following code AFTER the click/clusterclick trigger:

    // EXISTING CODE (around line 143)
    google.maps.event.trigger(mc, "click", cClusterIcon.cluster_);
    google.maps.event.trigger(mc, "clusterclick", cClusterIcon.cluster_); // deprecated name
    
    
    // BEGIN MODIFICATION
    var zoom = mc.getMap().getZoom();
    // Trying to pull this dynamically made the more zoomed in clusters not render
    // when then kind of made this useless. -NNC @ BNB
    // var maxZoom = mc.getMaxZoom();
    var maxZoom = 15;
    // if we have reached the maxZoom and there is more than 1 marker in this cluster
    // use our onClick method to popup a list of options
    if (zoom >= maxZoom && cClusterIcon.cluster_.markers_.length > 1) {
    return mc.onClick(cClusterIcon);
    }
    // END MODIFICATION
    
  3. Then, in your initialize() function where you initialize the map and declare your MarkerClusterer object:

    markerCluster = new MarkerClusterer(map, markers);
    // onClick OVERRIDE
    markerCluster.onClick = function(clickedClusterIcon) {
    return multiChoice(clickedClusterIcon.cluster_);
    }
    

    其中 multiChoice ()是用来弹出 InfoWindow 的(尚未编写)函数,其中包含要从中选择的选项列表。请注意,markerClusterer 对象被传递给函数,因为您将需要它来确定该集群中有多少个标记。例如:

    function multiChoice(clickedCluster) {
    if (clickedCluster.getMarkers().length > 1)
    {
    // var markers = clickedCluster.getMarkers();
    // do something creative!
    return false;
    }
    return true;
    };
    

超理的回答的基础上,我实现了一个函数,给定一个坐标完全相同的位置列表(具有 lnglat属性的对象) ,将它们从原来的位置移开一点(在适当的位置修改对象)。然后它们围绕中心点形成一个漂亮的圆。

我发现,对于我所在的纬度(北纬52度)来说,0.0003度的圆半径效果最好,而且当转换成公里时,你必须弥补经纬度之间的差异。你可以找到你的纬度 给你的近似转换。

var correctLocList = function (loclist) {
var lng_radius = 0.0003,         // degrees of longitude separation
lat_to_lng = 111.23 / 71.7,  // lat to long proportion in Warsaw
angle = 0.5,                 // starting angle, in radians
loclen = loclist.length,
step = 2 * Math.PI / loclen,
i,
loc,
lat_radius = lng_radius / lat_to_lng;
for (i = 0; i < loclen; ++i) {
loc = loclist[i];
loc.lng = loc.lng + (Math.cos(angle) * lng_radius);
loc.lat = loc.lat + (Math.sin(angle) * lat_radius);
angle += step;
}
};

看看 重叠标记蜘蛛
有一个演示页面,但他们没有显示标记完全在同一点,只有一些非常接近。

但是在 http://www.ejw.de/ejw-vor-ort/上可以看到一个现实生活中的例子,标记位于完全相同的位置(向下滚动查看地图,点击一些标记可以看到蜘蛛效应)。

这似乎是解决你问题的完美方案。

看看这个 https://github.com/plank/MarkerClusterer

这是修改后的 MarkerCluster,当多个标记位于同一位置时,它将在集群标记中拥有一个 infoWindow。

你可以在这里看到它是如何工作的: http://culturedays.ca/en/2013-activities

展开上面给出的答案,只需确保在初始化 map 对象时设置 maxZoom 选项。

更新以使用 MarkerClusterPlus。

  google.maps.event.trigger(mc, "click", cClusterIcon.cluster_);
google.maps.event.trigger(mc, "clusterclick", cClusterIcon.cluster_); // deprecated name


// BEGIN MODIFICATION
var zoom = mc.getMap().getZoom();
// Trying to pull this dynamically made the more zoomed in clusters not render
// when then kind of made this useless. -NNC @ BNB
// var maxZoom = mc.getMaxZoom();
var maxZoom = 15;
// if we have reached the maxZoom and there is more than 1 marker in this cluster
// use our onClick method to popup a list of options
if (zoom >= maxZoom && cClusterIcon.cluster_.markers_.length > 1) {
var markers = cClusterIcon.cluster_.markers_;
var a = 360.0 / markers.length;
for (var i=0; i < markers.length; i++)
{
var pos = markers[i].getPosition();
var newLat = pos.lat() + -.00004 * Math.cos((+a*i) / 180 * Math.PI);  // x
var newLng = pos.lng() + -.00004 * Math.sin((+a*i) / 180 * Math.PI);  // Y
var finalLatLng = new google.maps.LatLng(newLat,newLng);
markers[i].setPosition(finalLatLng);
markers[i].setMap(cClusterIcon.cluster_.map_);
}
cClusterIcon.hide();
return ;
}
// END MODIFICATION

我把它和 jQuery 一起使用,它完成了这项工作:

var map;
var markers = [];
var infoWindow;


function initialize() {
var center = new google.maps.LatLng(-29.6833300, 152.9333300);


var mapOptions = {
zoom: 5,
center: center,
panControl: false,
zoomControl: false,
mapTypeControl: false,
scaleControl: false,
streetViewControl: false,
overviewMapControl: false,
mapTypeId: google.maps.MapTypeId.ROADMAP
}




map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);


$.getJSON('jsonbackend.php', function(data) {
infoWindow = new google.maps.InfoWindow();


$.each(data, function(key, val) {
if(val['LATITUDE']!='' && val['LONGITUDE']!='')
{
// Set the coordonates of the new point
var latLng = new google.maps.LatLng(val['LATITUDE'],val['LONGITUDE']);


//Check Markers array for duplicate position and offset a little
if(markers.length != 0) {
for (i=0; i < markers.length; i++) {
var existingMarker = markers[i];
var pos = existingMarker.getPosition();
if (latLng.equals(pos)) {
var a = 360.0 / markers.length;
var newLat = pos.lat() + -.00004 * Math.cos((+a*i) / 180 * Math.PI);  //x
var newLng = pos.lng() + -.00004 * Math.sin((+a*i) / 180 * Math.PI);  //Y
var latLng = new google.maps.LatLng(newLat,newLng);
}
}
}


// Initialize the new marker
var marker = new google.maps.Marker({map: map, position: latLng, title: val['TITLE']});


// The HTML that is shown in the window of each item (when the icon it's clicked)
var html = "<div id='iwcontent'><h3>"+val['TITLE']+"</h3>"+
"<strong>Address: </strong>"+val['ADDRESS']+", "+val['SUBURB']+", "+val['STATE']+", "+val['POSTCODE']+"<br>"+
"</div>";


// Binds the infoWindow to the point
bindInfoWindow(marker, map, infoWindow, html);


// Add the marker to the array
markers.push(marker);
}
});


// Make a cluster with the markers from the array
var markerCluster = new MarkerClusterer(map, markers, { zoomOnClick: true, maxZoom: 15, gridSize: 20 });
});
}


function markerOpen(markerid) {
map.setZoom(22);
map.panTo(markers[markerid].getPosition());
google.maps.event.trigger(markers[markerid],'click');
switchView('map');
}


google.maps.event.addDomListener(window, 'load', initialize);

扩展上面的答案,当你得到加入的字符串,而不是加/减位置(例如“37.12340.0.00069”) ,将原来的经度/经度转换为浮点数,例如使用 parseFloat () ,然后加或减更正。

当用户放大到最大时,给定偏移量会使标记变得远离。所以我找到了一个办法。这可能不是一个正确的方式,但它工作得很好。

// This code is in swift
for loop markers
{
//create marker
let mapMarker = GMSMarker()
mapMarker.groundAnchor = CGPosition(0.5, 0.5)
mapMarker.position = //set the CLLocation
//instead of setting marker.icon set the iconView
let image:UIIMage = UIIMage:init(named:"filename")
let imageView:UIImageView = UIImageView.init(frame:rect(0,0, ((image.width/2 * markerIndex) + image.width), image.height))
imageView.contentMode = .Right
imageView.image = image
mapMarker.iconView = imageView
mapMarker.map = mapView
}

设置标记的 zIndex,这样您将看到您想在顶部看到的标记图标,否则它将使标记像自动交换一样具有动画效果。当用户点击标记处理 zIndex 时,使用 zIndexSwap 将标记置于顶部。

上面的答案更加优雅,但是我发现了一个快速而又肮脏的方法,实际上真的非常非常好用。你可以在 Www.buildinglit.com上看到它的运作

我所做的就是向 genxml.php 页面的纬度和经度添加一个随机偏移量,这样每次使用标记创建映射时,它都会返回略有不同的偏移量结果。这听起来像一个黑客,但在现实中,你只需要标记移动一个随机方向的轻微推动,让他们可以在地图上点击,如果他们是重叠的。它实际上工作得很好,我会说比爬行器方法更好,因为谁想要处理这种复杂性,并让它们到处弹出。您只是希望能够选择标记。随机轻推就行了。

下面是在 php _ genxml. php 中创建 while 语句迭代节点的示例

while ($row = @mysql_fetch_assoc($result)){ $offset = rand(0,1000)/10000000;
$offset2 = rand(0, 1000)/10000000;
$node = $dom->createElement("marker");
$newnode = $parnode->appendChild($node);
$newnode->setAttribute("name", $row['name']);
$newnode->setAttribute("address", $row['address']);
$newnode->setAttribute("lat", $row['lat'] + $offset);
$newnode->setAttribute("lng", $row['lng'] + $offset2);
$newnode->setAttribute("distance", $row['distance']);
$newnode->setAttribute("type", $row['type']);
$newnode->setAttribute("date", $row['date']);
$newnode->setAttribute("service", $row['service']);
$newnode->setAttribute("cost", $row['cost']);
$newnode->setAttribute("company", $company);

注意 lat 和 long 下面有 + 偏移量。从以上两个变量。我必须随机除以0,1000除以10000000,才能得到一个小数,这个小数随机地小到几乎不能移动标记。你可以随意修改这个变量,从而得到一个更适合你需要的变量。

我喜欢简单的解决方案,所以这是我的。 您可以像这样简单地观看事件,而不需要修改 lib,因为修改 lib 会使维护变得更加困难

google.maps.event.addListener(mc, "clusterclick", onClusterClick);

然后你就可以继续了

function onClusterClick(cluster){
var ms = cluster.getMarkers();

我,即,使用引导程序显示一个带有列表的面板。我觉得这比在“拥挤”的地方爬蜘蛛舒服多了。(如果您正在使用一个集群,那么一旦您使用了蜘蛛,您最终可能会遇到冲突)。 你也可以看看那里的变焦。

顺便说一句。我刚刚发现了传单,它似乎工作得更好,集群和蜘蛛工作非常流畅 < a href = “ http://leaf. github.io/Leaflet.markercluster/example/mark-cluster-realworld.10000.html”rel = “ nofollow”> http://leaflet.github.io/leaflet.markercluster/example/marker-clustering-realworld.10000.html 而且是开源的。

这更像是一个“快速而肮脏”的权宜之计,就像 Matthew Fox 建议的那样,这次使用的是 JavaScript。

在 JavaScript 中,通过向 例如:。例如:。添加一个小的随机偏移量,可以对所有位置的纬度和长度进行偏移

myLocation[i].Latitude+ = (Math.random() / 25000)

(我发现除以 25000就可以得到足够的分隔,但是并不能明显地将标记从准确的位置移开,例如一个特定的地址)

这可以很好地抵消它们之间的影响,但是只有在你近距离放大之后。当放大时,仍然不清楚该位置是否有多个选项。

如何摆脱它. 。 [斯威夫特]

    var clusterArray = [String]()
var pinOffSet : Double = 0
var pinLat = yourLat
var pinLong = yourLong
var location = pinLat + pinLong

一个新的标记即将被创建? 检查 clusterArray并操纵它的偏移量

 if(!clusterArray.contains(location)){
clusterArray.append(location)
} else {


pinOffSet += 1
let offWithIt = 0.00025 // reasonable offset with zoomLvl(14-16)
switch pinOffSet {
case 1 : pinLong = pinLong + offWithIt ; pinLat = pinLat + offWithIt
case 2 : pinLong = pinLong + offWithIt ; pinLat = pinLat - offWithIt
case 3 : pinLong = pinLong - offWithIt ; pinLat = pinLat - offWithIt
case 4 : pinLong = pinLong - offWithIt ; pinLat = pinLat + offWithIt
default : print(1)
}




}

结果

enter image description here

为了补充 Matthew Fox 的狡猾的天才答案,我在设置标记对象时为每个 lat 和 lng 添加了一个小的随机偏移量。例如:

new LatLng(getLat()+getMarkerOffset(), getLng()+getMarkerOffset()),


private static double getMarkerOffset(){
//add tiny random offset to keep markers from dropping on top of themselves
double offset =Math.random()/4000;
boolean isEven = ((int)(offset *400000)) %2 ==0;
if (isEven) return  offset;
else        return -offset;
}

添加到上述答案,但提供了一个可供选择的快速解决方案在 php 和 wordpress。对于这个示例,我通过 ACF 存储位置字段,并循环通过贴子来获取数据。

我发现将 lat/lng 存储在一个数组中并检查该数组的值以查看循环是否匹配,然后我们可以用我们想要移动 pips 的数量更新该数组中的值。

//This is the value to shift the pips by. I found this worked best with markerClusterer
$add_to_latlng = 0.00003;


while ($query->have_posts()) {
$query->the_post();
$meta = get_post_meta(get_the_ID(), "postcode", true); //uses an acf field to store location
$lat = $meta["lat"];
$lng = $meta["lng"];


if(in_array($meta["lat"],$lat_checker)){ //check if this meta matches
        

//if matches then update the array to a new value (current value + shift value)
// This is using the lng value for a horizontal line of pips, use lat for vertical, or both for a diagonal
if(isset($latlng_storer[$meta["lng"]])){
$latlng_storer[$meta["lng"]] = $latlng_storer[$meta["lng"]] + $add_to_latlng;
$lng = $latlng_storer[$meta["lng"]];
} else {
$latlng_storer[$meta["lng"]] = $meta["lng"];
$lng = $latlng_storer[$meta["lng"]];
}


} else {
$lat_checker[] = $meta["lat"]; //just for simple checking of data
$latlng_storer[$meta["lat"]] = floatval($meta["lat"]);
$latlng_storer[$meta["lng"]] =  floatval($meta["lng"]);
}


$entry[] = [
"lat" => $lat,
"lng" => $lng,
//...Add all the other post data here and use this array for the pips
];
} // end query

获取这些位置之后,json 对 $entry 变量进行编码,并在 JS 中使用它。

let locations = <?=json_encode($entry)?>;

我知道这是一个相当特殊的情况,但我希望这有助于沿线的人!

我使用了 markercluster erplus,对我来说这个很有用:

//Code
google.maps.event.addListener(cMarkerClusterer, "clusterclick", function (c) {
var markers = c.getMarkers();
            

//Check Markers array for duplicate position and offset a little
if (markers .length > 1) {
//Check if all markers are in the same position (with 4 significant digits)
if (markers .every((val, index, arr) => (val.getPosition().lat().toFixed(4) == arr[0].getPosition().lat().toFixed(4)) && (val.getPosition().lng().toFixed(4) == arr[0].getPosition().lng().toFixed(4)))) { /
//Don't modify first element
for (i = 1; i < markers.length; i++) {
var existingMarker = markers[i];
var pos = existingMarker.getPosition();
var quot = 360.0 / markers.length;
var newLat = pos.lat() + -.00008 * Math.cos(+quot * i); //+ -.00008 * Math.cos((+quot * i) / 180 * Math.PI);  //x
var newLng = pos.lng() + -.00008 * Math.sin(+quot * i);  //+ -.0008 * Math.sin((+quot * i) / 180 * Math.PI);  //Y
existingMarker.setPosition(new google.maps.LatLng(newLat, newLng));
}
let cZoom = map.getZoom();
map.setZoom(cZoom-1);
map.setZoom(cZoom+1);
}
}
});

我使用这个 http://leaflet.github.io/Leaflet.markercluster/和完美的工作为我。补充完整的解决方案。

<html lang="en">
<head>
<script src="https://code.jquery.com/jquery-3.2.1.js" integrity="sha256-DZAnKJ/6XZ9si04Hgrsxu/8s717jcIzLy3oi35EouyE=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.0.3/leaflet.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet.markercluster/1.0.4/leaflet.markercluster.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.0.3/leaflet.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet.markercluster/1.0.4/MarkerCluster.Default.css" />
</head>
<body>
<div id="map"></div>


<script>
var addressData = [
{id: 9, name: "Ankita", title: "Manager", latitude: "33.1128019", longitude: "-96.6958939"},
{id: 1, name: "Aarti", title: "CEO", latitude: "33.1128019", longitude: "-96.6958939"},
{id: 2, name: "Payal", title: "Employee", latitude: "33.0460488", longitude: "-96.9983386"}];


var addressPoints = [];
for (i = 0; i < addressData.length; i++) {
var marker = {
latitude: addressData[i].latitude,
longitude: addressData[i].longitude,
coverage: addressData[i]
};
addressPoints.push(marker);
}
var map = L.map('map').setView(["32.9602172", "-96.7036844"], 5);
var basemap = L.tileLayer('http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png', {attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> &copy; <a href="http://cartodb.com/attributions">CartoDB</a>', subdomains: 'abcd'});
basemap.addTo(map);
        

var markers = L.markerClusterGroup();
for (var i = 0; i < addressPoints.length; i++) {
// var icon1 = "app/common_assest/images/pin/redPin.png"; // set ehere you own marker pin whatever you want to set
var currentMarker = addressPoints[i];
console.log(currentMarker);
var contentString = '<div class="mapinfoWindowContent">' +
'<div class="mapInfoTitle">Name: ' + currentMarker.coverage.name + '</div>' +
'<div class="mapInfoSubText">Licence: ' + currentMarker.coverage.title + '</div>' +
'</div>';
// var myIcon = L.icon({// set ehere you own marker pin whatever you want to set
// iconUrl: icon1,
//  iconRetinaUrl: icon1,
//                });
var marker = L.marker(new L.LatLng(currentMarker['latitude'], currentMarker['longitude']), {
title: currentMarker.coverage.name
});
marker.bindPopup(contentString);
markers.addLayer(marker);
}
markers.addTo(map);
</script>
</body>

希望对你有所帮助。

我使用的解决方案非常简单,只需结合使用 @ googlemap/markercluster库和 Maps JavaScriptAPI 即可。

然后你只需要在地图上用你的记号笔填写一行:

new MarkerClusterer({ map, markers });

所有信息都可以在这里找到 Https://developers.google.com/maps/documentation/javascript/marker-clustering

我正在使用 Android 的地图集群,下面是我正在使用的库:

implementation 'com.google.android.gms:play-services-places:16.0.0'   

implementation 'com.google.android.gms:play-services-maps:16.0.0'

implementation 'com.google.android.gms:play-services-location:16.0.0'

implementation 'com.google.maps.android:android-maps-utils:2.0.1'

我遇到的问题是,如果两个项目具有完全相同的纬度和纵向点,集群标记不会分开。我的解决办法是扫描我的项目数组,如果两个位置匹配,我移动他们的位置略有不同。这是我的密码:

字段变量:

private ArrayList<Tool> esTools;

当你完成了工具数组列表的初始化,在你的解析方法中,调用:

loopThroughToolsListAndFixOnesThatHaveSameGeoPoint_FixStackingIssue();

奇迹发生的地方:

private void loopThroughToolsListAndFixOnesThatHaveSameGeoPoint_FixStackingIssue() {
DecimalFormat decimalFormatTool = new DecimalFormat("000.0000");
decimalFormatTool.setRoundingMode(RoundingMode.DOWN);


for(int backPointer=0; backPointer <= (esTools.size()-1); backPointer++){
Map<String, Double> compareA = esTools.get(backPointer).getUserChosenGeopoint();
Double compareA_Latitude = compareA.get("_latitude");
compareA_Latitude= Double.valueOf(decimalFormatTool.format(compareA_Latitude));
Double compareA_Longitude = compareA.get("_longitude");
compareA_Longitude= Double.valueOf(decimalFormatTool.format(compareA_Longitude));
System.out.println("compareA_Lat= "+ compareA_Latitude+ ", compareA_Long= "+ compareA_Longitude);
for(int frontPointer=0; frontPointer <= (esTools.size()-1); frontPointer++){
if(backPointer==frontPointer){
continue;
}
Map<String, Double> compareB = esTools.get(frontPointer).getUserChosenGeopoint();
Double compareB_Latitude = compareB.get("_latitude");
compareB_Latitude= Double.valueOf(decimalFormatTool.format(compareB_Latitude));
Double compareB_Longitude = compareB.get("_longitude");
compareB_Longitude= Double.valueOf(decimalFormatTool.format(compareB_Longitude));


if((compareB_Latitude.equals(compareA_Latitude)) && (compareB_Longitude.equals(compareA_Longitude))) {
System.out.println("these tools match");


Random randomGen = new Random();
Double randomNumLat  = randomGen.nextDouble() * 0.00015;
int addOrSubtractLatitude= ( randomGen.nextBoolean() ? 1 : -1 );
randomNumLat = randomNumLat*addOrSubtractLatitude;


Double randomNumLong = randomGen.nextDouble() * 0.00015;
int addOrSubtractLongitude= ( randomGen.nextBoolean() ? 1 : -1 );
randomNumLong = randomNumLong*addOrSubtractLongitude;
System.out.println("Adding Random Latitude="+ randomNumLat + ", Longitude= "+ randomNumLong);


System.out.println("\n");
Map<String, Double> latitudeLongitude = new HashMap<>();
latitudeLongitude.put("_latitude", (compareB_Latitude+ randomNumLat));
latitudeLongitude.put("_longitude", (compareB_Longitude+ randomNumLong));
esTools.get(frontPointer).setUserChosenGeopoint(latitudeLongitude);


}
}
}
}

因此,上面的方法所做的就是扫描我的 ArrayList,看看是否有任何两个工具有匹配点。如果拉特朗点匹配,移动一点。