2014-04-18 3 views
7

Ho una mappa con più cerchi che si incrociano l'un l'altro (sotto c'è un esempio con solo due ma sono almeno 100 cerchi). Quando si incrociano, l'opacità è raddoppiata, quindi quando ho un incrocio tra 5 o 6 cerchi, diventa solo un'opacità del 100%.Mappa Google sovrapposizione multipla nessuna opacità cumulativa

C'è un modo per consentire al secondo cerchio di non mostrare "sopra" il primo? In realtà non lo penso ma forse qualcuno si aspettava qualcosa del genere ...

A SINISTRA: Quello che ho ----------------------- ----------------------- DESTRA: quello che voglio Left : what i have, right : what i want

Solo nel caso in cui si vuole giocare: http://jsfiddle.net/ZWt6w/

var populationOptions = { 
     strokeWeight: 0, 
     fillColor: '#FF0000', 
     fillOpacity: 0.5, 
     map: map, 
     center: citymap[city].center, 
     radius: citymap[city].population 
    }; 
    // Add the circle for this city to the map. 
    cityCircle = new google.maps.Circle(populationOptions); 

Grazie per il vostro aiuto;)

+1

problema Interessante e domanda ben sviluppato. .. il mio solo pensiero è che potresti considerare di unire le micro geometrie in una geometria macro più ampia - in GIS chiameremmo questa a [Dissolve] (http://wiki.gis.com/wiki/index.php/Dissolve) funzione. Senza conoscere le tue tecnologie lato server è difficile orientarti in una direzione. Si potrebbe approssimare una soluzione lato client, ma penso che sarebbe un esercizio noioso. – elrobis

risposta

6

Con un poligono disegnare con più percorsi ---------- con multipli cerchi disegnati After/Before

@ David Strachan risposta risolto una grande parte della mia domanda . Ecco una parte di questa soluzione: in primo luogo è necessario utilizzare questa funzione "drawCircle" anziché l'oggetto Circolo di Google Maps API V3:

function drawCircle(point, radius, dir) 
{ 
    var d2r = Math.PI/180; // degrees to radians 
    var r2d = 180/Math.PI; // radians to degrees 
    var earthsradius = 3963; // 3963 is the radius of the earth in miles 
    var points = 32; 

    // find the raidus in lat/lon 
    var rlat = (radius/earthsradius) * r2d; 
    var rlng = rlat/Math.cos(point.lat() * d2r); 

    var extp = new Array(); 
    if (dir==1) {var start=0;var end=points+1} // one extra here makes sure we connect the 
    else{var start=points+1;var end=0} 
    for (var i=start; (dir==1 ? i < end : i > end); i=i+dir) 
    { 
     var theta = Math.PI * (i/(points/2)); 
     ey = point.lng() + (rlng * Math.cos(theta)); // center a + radius x * cos(theta) 
     ex = point.lat() + (rlat * Math.sin(theta)); // center b + radius y * sin(theta) 
     extp.push(new google.maps.LatLng(ex, ey)); 
    } 
    return extp; 
} 

Questa funzione restituisce i percorsi, in modo da poter usare per buid una matrice di percorsi wich che si intende utilizzare dopo per costruire un unico oggetto poligono:

var polys = [] ; 
$(xml).find("trkpt").each(function() { // Parsing every points of my track 
    var p = new google.maps.LatLng($(this).attr("lat"), $(this).attr("lon")); 
    points.push(p); 
    if ((i++ % 10) == 0) // Only display a circle every 10 points 
    { 
     polys.push(drawCircle(p,radius/1609.344,1)) ; // Radius value is in meters for me, so i divide to make it in miles 
    } 
}); 


peanutcircle = new google.maps.Polygon({ 
    paths: polys, 
    strokeOpacity: 0, 
    strokeWeight: 0, 
    fillColor: color, 
    fillOpacity: 0.35, 
}); 
peanutcircle.setMap(map); 

E questo è tutto, hai disegnato un complesso, ma singolo poligono, probabilmente più facile da usare.

L'unico problema per me è che gli indicatori di controllo contenute in questo singolo poligono (con funzione di google containsLocation e github.com/tparkin/Google-Maps-Point-in-Polygon) non funziona bene, così ho dovuto continuare a utilizzare i miei cerchi multipli per controllare se i marcatori sono nella mia zona.

Grazie a @david strachan per la sua risposta.

+0

questa soluzione è buona ma ho scoperto che il poligono non si allinea esattamente sui cerchi quindi ci sono alcune aree che saranno viste come all'interno la regione, ma in realtà non sono all'interno della regione. Qualche idea su come aggirare questo? – ninjacoder

+0

Pensi che sia dovuto al fatto che il cerchio non è esattamente rotondo? Se è così forse puoi rendere ogni poligono più preciso modificando var points = 32 a 64 in drawCircle? –

+0

ci sono problemi di prestazioni per l'approccio rispetto al disegno del cerchio quando si aggiungono regolarmente cerchi? sembra che questo richiederà ripetutamente l'aggiunta all'elenco dei percorsi e la chiamata a setPath sul tuo oggetto poligono, oppure esiste un modo più efficiente per farlo? – Michael

7

Utilizzando Polygon class è possibile ottenere l'opacità di sovrapposizione per essere s ingle.

enter image description here

var peanut = new google.maps.Polygon({ 
       paths: [drawCircle(citymap['chicago'].center, citymap['chicago'].population/3000, 1),//division by 3000 to suit 
         drawCircle(citymap['losangeles'].center,citymap['losangeles'].population/3000, 1)], 
       strokeColor: "#ff0000", 
       strokeOpacity: 0.35, 
       strokeWeight: 0, 
       fillColor: "#FF0000", 
       fillOpacity: 0.35 
    }); 
    peanut.setMap(map); 
+0

Funziona perfettamente;) L'unica cosa è che, dopo aver disegnato cerchi, controllo se ci sono molti punti al loro interno.Con la mia versione precedente, più cerchi, dovevo semplicemente usare "circle.contains (LatLng)" e ho restituito 200 risultati: con poligono, ho provato la funzione google containsLocation e https://github.com/tparkin/Google-Maps-Point -in-Polygon, entrambi hanno restituito 100 risultati. Userò il tuo trucco da mostrare e cerchi regolari per controllare i punti. Sto postando una risposta completa, grazie mille :) –

+0

drawCircle non è definito – Michael

0

Ho un problema simile, ma i miei overlay sono antiruggine a forma di irrigazione. I ellips nel seguente esempio sono solo per dimostrare il problema, ma i raster reali sono forme di qualsiasi forma ma aventi tutti lo stesso colore:

<!DOCTYPE html><html><head> 
<title>Multi-Raster</title> 
<style type="text/css">html { height: 100% }body { height: 100%}</style> 
<script language="javascript" type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script><script type="text/javascript"> 
var map; 
function initialize() { 
var coord = new google.maps.LatLng(45.4931831359863,-73.6133499145508); 
var myOptions = {zoom: 10,center: coord, mapTypeId: google.maps.MapTypeId.ROADMAP}; 
map = new google.maps.Map(document.getElementById("map_canvas"),myOptions); 
var boundaries1 = new google.maps.LatLngBounds(new google.maps.LatLng(44.59386,-74.89627), new google.maps.LatLng(46.39251,-72.33043)); 
rmap1 =new google.maps.GroundOverlay("scrap.png", boundaries1); 
rmap1.setMap(map); 
rmap2 =new google.maps.GroundOverlay("scrap2.png", boundaries1); 
rmap2.setMap(map); 
} 
function showcov(m,v){if(v.checked) {m.setOpacity(0);m.setMap(map); }else {m.setMap(null);m.setOpacity(100);}} 
</script></head> 
<body onload="initialize()"> 
<div id="map_canvas" style="width:100%;height:100%"></div> 
</form></td></tr></table></div></body></html> 

raster1 raster2