diff --git a/plugins/layer-farms-find.user.js b/plugins/layer-farms-find.user.js new file mode 100644 index 00000000..bd9ea9d5 --- /dev/null +++ b/plugins/layer-farms-find.user.js @@ -0,0 +1,329 @@ +// ==UserScript== +// @id iitc-plugin-farms@949 +// @name IITC plugin: Show farms by level +// @category Info +// @version 1.2.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://www.ingress.com/intel* +// @include http://www.ingress.com/intel* +// @match https://www.ingress.com/intel* +// @match http://www.ingress.com/intel* +// @grant none +// ==/UserScript== + +//CHANGELOG +/* +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@@ + + +// 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 (getPortalLevel(otherPortal.options.details) >= 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
"; + for (i = 1; i < 9; i++) + { + if (countArray[i] != null) + popupMsg += "Level " + i + ": " + countArray[i] + "
"; + } + + 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() { + $("