Merge branch 'master' of https://github.com/parabola949/ingress-intel-total-conversion into parabola949-master
This commit is contained in:
		
							
								
								
									
										329
									
								
								plugins/layer-farms-find.user.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										329
									
								
								plugins/layer-farms-find.user.js
									
									
									
									
									
										Normal file
									
								
							| @@ -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<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.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(); | ||||
|     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(); | ||||
| 	$('#dashboard').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); | ||||
| }; | ||||
|  | ||||
| @@PLUGINEND@@ | ||||
		Reference in New Issue
	
	Block a user