ingress-intel-total-conversion/plugins/layer-farms-find.user.js

355 lines
12 KiB
JavaScript

// ==UserScript==
// @id iitc-plugin-farms@949
// @name IITC plugin: Show farms by level
// @category Info
// @version 1.4.1.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
// @downloadURL @@DOWNLOADURL@@
// @description [@@BUILDNAME@@-@@BUILDDATE@@] Find farms by minimum level.
// @include https://*.ingress.com/intel*
// @include http://*.ingress.com/intel*
// @match https://*.ingress.com/intel*
// @match http://*.ingress.com/intel*
// @include https://*.ingress.com/mission/*
// @include http://*.ingress.com/mission/*
// @match https://*.ingress.com/mission/*
// @match http://*.ingress.com/mission/*
// @grant none
// ==/UserScript==
//CHANGELOG
/*
v1.3.0
Added mobile support
v1.2.1
Fixed dropdown location overlap
v1.2.0
Circle is sent to back on mouseover
Clicking on circle displays portal counts for farm (including portals of level lower than farm)
v1.1.2
Fixed the portal counts (shown in console)
v1.1.1
Changed circle stroke weight and opacity, making it easier to see when zoomed out.
v1.1.0
Changed radius function and center function -
Center is now the midpoint of the max and min long and lat coords
Radius is distance from center to furthest portal (i.e., now the circle will be limited to portals in the farm)
*/
@@PLUGINSTART@@
// PLUGIN START ////////////////////////////////////////////////////////
// use own namespace for plugin
window.plugin.farmFind = function() {};
window.plugin.farmFind.getNearbyPortalCount = function(portal){
var circle = new google.maps.Circle();
var center = new google.maps.LatLng(portal.getLatLng().lat, portal.getLatLng().lng);
circle.setCenter(center);
circle.setRadius(window.plugin.farmFind.Radius);
var nearby8Portals = 0;
$.each(window.portals, function(i, otherPortal) {
var thisPortal = new google.maps.LatLng(otherPortal.getLatLng().lat, otherPortal.getLatLng().lng);
if (circle.getBounds().contains(thisPortal))
if (otherPortal.options.level >= window.plugin.farmFind.minLevel) nearby8Portals++;
});
//console.log(nearby8Portals);
return nearby8Portals;
};
window.plugin.farmFind.checkPortals = function(){
possibleFarmPortals = [];
window.plugin.farmFind.levelLayerGroup.clearLayers();
//console.log(window.portals.length);
$.each(window.portals, function(i, portal) {
if (window.plugin.farmFind.getNearbyPortalCount(portal) > window.plugin.farmFind.minNearby)
{
//console.log("Farm identified");
possibleFarmPortals.push(portal);
}
});
console.log("Farm Portals: " + possibleFarmPortals.length);
var farms = [];
for (i = 0; i< possibleFarmPortals.length;i++)
{
//console.log("Checking portal " + i);
var thisPortal = possibleFarmPortals[i];
var alreadyInFarm = false;
for (x = 0; x< farms.length;x++)
{
//console.log(alreadyInFarm);
if (thisPortal in farms[x]) alreadyInFarm = true;
}
//console.log("Portal " + i + " already in farm: " + alreadyInFarm);
if (!alreadyInFarm)
{
var portalsInFarm = [];
var circle = new google.maps.Circle();
var center = new google.maps.LatLng(thisPortal.getLatLng().lat, thisPortal.getLatLng().lng);
circle.setCenter(center);
circle.setRadius(window.plugin.farmFind.Radius);
portalsInFarm.push(thisPortal);
for (p = 0; p< possibleFarmPortals.length;p++)
{
//console.log("Checking distance from portal " + p);
var portalLoc = new google.maps.LatLng(possibleFarmPortals[p].getLatLng().lat, possibleFarmPortals[p].getLatLng().lng);
var farmIndex = 0;
if (circle.getBounds().contains(portalLoc) && possibleFarmPortals[p] != thisPortal)
{
var alreadyInAnotherFarm = false;
for (x = 0; x< farms.length;x++)
{
//console.log(alreadyInFarm);
for (o = 0; o< farms[x].length; o++)
{
if (possibleFarmPortals[p] == farms[x][o])
{
//console.log("Portal " + p + " in farm " + (x+1) + " at index " + o);
alreadyInAnotherFarm = true;
farmIndex = x;
}
}
}
//console.log("Already in another farm: " + alreadyInAnotherFarm);
if (alreadyInAnotherFarm == false)
{
//console.log("Farm " + (farms.length + 1) + " adding portal " + p);
portalsInFarm.push(possibleFarmPortals[p]);
}
else
{
//hmmm... portal is in range, but portal is in another farm, so let's extend this farm
for(prt = 0; prt < portalsInFarm.length; prt++)
{
farms[farmIndex].push(portalsInFarm[prt]);
}
//console.log("Farm " + (farmIndex + 1) + " now has " + farms[farmIndex].length + " portals");
p = 6000;
}
}
}
if (!alreadyInAnotherFarm)
{
farms.push(portalsInFarm);
//console.log("Farm " + (farms.length) + ": " + portalsInFarm.length + " portals");
};
}
}
//console.log(farms.length);
for (i = 0; i < farms.length; i++)
{
farms[i] = findUnique(farms[i]);
console.log("Farm " + (i+1) + ": " + farms[i].length + " portals");
}
//console.log(farms);
window.plugin.farmFind.drawnItems = new L.FeatureGroup();
for (farm = 0; farm < farms.length; farm++)
{
window.plugin.farmFind.drawCircle(farms[farm]);
}
};
findUnique = function(farm) {
var unique = [];
for(p = 0; p < farm.length; p++)
{
//console.log(farm[p].options.guid);
var found = false;
for (u = 0; u < unique.length; u++)
{
//console.log(unique[u].options.guid);
if (farm[p].options.guid == unique[u].options.guid)
found = true;
}
if (!found)
unique.push(farm[p]);
}
return unique;
}
window.plugin.farmFind.drawCircle = function(farm)
{
var latArray = [];
var lngArray = [];
var countArray = [];
//console.log("Find Center");
for (p = 0; p < farm.length; p++)
{
latArray.push(farm[p].getLatLng().lat);
lngArray.push(farm[p].getLatLng().lng);
var level = Math.floor(farm[p].options.level);
if (countArray[level] == null)
countArray[level] = 0;
countArray[level]++;
}
console.log(countArray);
var popupMsg = "Portal Count<br>";
for (i = 1; i < 9; i++)
{
if (countArray[i] != null)
popupMsg += "Level " + i + ": " + countArray[i] + "<br>";
}
var north = Math.max.apply(null, lngArray);
var south = Math.min.apply(null, lngArray);
var east = Math.max.apply(null, latArray);
var west = Math.min.apply(null, latArray);
var center = new google.maps.LatLng(((east + west) / 2), ((north + south) / 2));
//console.log(center);
//console.log("Find Radius");
var radius = 0;
for (p = 0; p < farm.length; p++)
{
var temp = center.distanceFrom(farm[p].getLatLng());
if (temp > radius)
radius = temp;
}
//console.log(radius);
//((20 - map._zoom) * 1000) / map._zoom
var latlng = new L.LatLng(center.lat(), center.lng());
//console.log("latlng: " + latlng);
var optCircle = {color:'red',opacity:0.7,fill:true,fillColor:'red',fillOpacity:0.7,weight:15,clickable:true};
var circle = new L.Circle(latlng, radius, optCircle);
circle.bindPopup(popupMsg);
circle.on('mouseover', function(e) {
circle.bringToBack();
});
circle.on('click', function(e) {
circle.bringToBack();
});
//console.log("circle: " + circle);
circle.addTo(window.plugin.farmFind.levelLayerGroup);
};
google.maps.LatLng.prototype.distanceFrom = function(newLatLng) {
// setup our variables
var lat1 = this.lat();
var radianLat1 = lat1 * ( Math.PI / 180 );
var lng1 = this.lng();
var radianLng1 = lng1 * ( Math.PI / 180 );
var lat2 = newLatLng.lat;
var radianLat2 = lat2 * ( Math.PI / 180 );
var lng2 = newLatLng.lng;
var radianLng2 = lng2 * ( Math.PI / 180 );
// sort out the radius, MILES or KM?
var earth_radius = 6378.1; // (km = 6378.1) OR (miles = 3959) - radius of the earth
// sort our the differences
var diffLat = ( radianLat1 - radianLat2 );
var diffLng = ( radianLng1 - radianLng2 );
// put on a wave (hey the earth is round after all)
var sinLat = Math.sin( diffLat / 2 );
var sinLng = Math.sin( diffLng / 2 );
// maths - borrowed from http://www.opensourceconnections.com/wp-content/uploads/2009/02/clientsidehaversinecalculation.html
var a = Math.pow(sinLat, 2.0) + Math.cos(radianLat1) * Math.cos(radianLat2) * Math.pow(sinLng, 2.0);
// work out the distance
var distance = earth_radius * 2 * Math.asin(Math.min(1, Math.sqrt(a)));
// return the distance
return distance * 1000;
};
window.plugin.farmFind.setupCSS = function() {
$('<style>').prop('type', 'text/css').html(''
+ '#farm_level_select {'
+ ' position: absolute;'
+ ' top: 5px;'
+ ' left:180px;'
+ ' z-index: 2500;'
+ ' font-size:11px;'
+ ' font-family: "coda",arial,helvetica,sans-serif;'
+ ' background-color:#0E3C46;'
+ ' color:#ffce00;'
+ '}\n').appendTo('head');
};
window.plugin.farmFind.setupSmartCSS = function() {
$('<style>').prop('type', 'text/css').html(''
+ '#farm_level_select {'
+ ' top: 0px !important;'
+ ' right: 0px;'
+ ' left: auto !important;'
+ ' margin-right: 0;'
+ '}\n').appendTo('head');
};
window.plugin.farmFind.changeLevel = function()
{
var myselect = document.getElementById("farm_level_select");
var level = myselect.options[myselect.selectedIndex].value;
window.plugin.farmFind.minLevel = level;
var button = document.getElementById("findFarmClick");
button.title = 'Check portals in view for L' + window.plugin.farmFind.minLevel + ' farms';
button.innerHTML = 'L' + window.plugin.farmFind.minLevel + ' Farms';
};
var setup = function() {
window.plugin.farmFind.minLevel = 7;
window.plugin.farmFind.minNearby = 5;
window.plugin.farmFind.setupCSS();
if (window.isSmartphone()) {
window.plugin.farmFind.setupSmartCSS();
}
window.plugin.farmFind.Radius = 500;
$('#toolbox').append(' <a onclick="window.plugin.farmFind.checkPortals()" id="findFarmClick" title="Check portals in view for L' + window.plugin.farmFind.minLevel + ' farms">L' + window.plugin.farmFind.minLevel + ' Farms</a>');
possibleFarmPortals = [];
window.plugin.farmFind.levelLayerGroup = new L.LayerGroup();
$('body').append('<select onchange="window.plugin.farmFind.changeLevel()" id="farm_level_select"><option value=1>Farm level 1</option><option value=2>Farm level 2</option><option value=3>Farm level 3</option><option value=4>Farm level 4</option><option value=5>Farm level 5</option><option value=6>Farm level 6</option><option value=7>Farm level 7</option><option value=8>Farm level 8</option></select>');
var myselect = document.getElementById("farm_level_select");
myselect.options.selectedIndex = 6;
window.addLayerGroup('Farms', window.plugin.farmFind.levelLayerGroup, true);
};
// PLUGIN END //////////////////////////////////////////////////////////
@@PLUGINEND@@