6 votos

Google maps kml y polígono eventclick error

Tengo un mapa de google polígono archivo kml que yo soy de carga en un mapa de google. Cuando hago clic en el polígono, se me dibuja una línea desde ese polígono a los lugares en el mapa. Para ello estoy utilizando el código:

//Add KML layer
var fregLayer = new G.KmlLayer(
      'http://dl.dropbox.com/freg4.kml',
      {  suppressInfoWindows: true, 
         map: map
    });

 // Add listener to kml layer
 google.maps.event.addListener(fregLayer, 'click', function(kmlEvent) {


//parse click event
var text = kmlEvent.featureData.name;

//make polylines using my function 'make'
 make(text);   

   });

Sin embargo, después de hacer clic en un polígono de la capa kml pierde 'focus' y ya no puedo clic en cualquiera de los otros polígonos para generar otras líneas. Leyendo acerca de este problema, se sugiere hacer la polilínea no se puede hacer clic que he intentado utilizar clickable:false en las opciones. También probé google.maps.kmlEvent.stopPropagation(); sin embargo ninguna de estas opciones, se solucionó el problema.


## Programa Completo ##

   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
<style>
html,body {
    margin: 0px;
    width: 100%;
    height: 100%;
}
</style>

<title>Connectivity</title>

<!-- External js -->
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script src="http://maps.google.com/maps/api/js?sensor=false"></script>

<!-- Local js -->
<script src="http://dl.dropbox.com/u/169746/latlong.js"></script>
<script type="text/javascript">


var G = google.maps;    // Shortened
var zoom = 9;
var centerPoint = getCoordinates(5);
var container;
var sliderValue = 100;
var map;
var markersArray = [];
var line = [];

// Read coordinates from Lat/Long *.js file
function getCoordinates(x){
    var LatLng = new google.maps.LatLng(identifier[x][2], identifier[x][1]);    
    return LatLng;
}

// relate click events to polygons
function attachMessage(marker, number) {            
        google.maps.event.addListener(marker, 'click', function(){  make(number) } );   
}

//makes connections from the chosen polygon, to all other polygons
function make(index){

    // clear all other overlays and delete
    clearOverlays()
    deleteOverlays()

        // loop through array index 
        for (var i = 0; i < connections[index].length; i++) {
        makeConnections(index, i, i, connections[index][i]);        
        }
}


//makes a connection between two polygons
function makeConnections(a,b,lineIndex, opacity){ 

        // get points
        var points = [
            getCoordinates(a),
            getCoordinates(b)
            ]

        opacity = Math.log(opacity)/18      

        //make line
        line[lineIndex] = new google.maps.Polyline({
          path: points,
          map: map,          
          strokeColor: "#FF0000",
          strokeWeight: 1,
          strokeOpacity:opacity
        });                 

 }


 // Removes the polylines from the map
 function clearOverlays() {

    for (i in line) {
        line[i].setMap(null);
      } 
}

 // Shows any overlays currently in the array
 function showOverlays(){
    for (i in line) {
        line[i].setMap(map);
    }
 }  


// Delete all overlays
function deleteOverlays() {
  if (line) {
    for (i in line) {
      line[i].setMap(null);
    }
    line.length = 0;
  }
}


function load() {

    container = document.getElementById('mapDiv');

    var myOptions = {
        zoom: zoom,
        center: centerPoint,
        mapTypeId: G.MapTypeId.ROADMAP
    }

    map = new G.Map(container, myOptions);  

    //Add KML layer
    var fregLayer = new G.KmlLayer(
      'http://dl.dropbox.com/u/169746/freg4.kml',
      {  suppressInfoWindows: true, 
         map: map
          });


    // Add listener to kml layer
    G.event.addListener(fregLayer, 'click', function(kmlEvent) {
    //clearOverlays()
    var text = kmlEvent.featureData.name;

    //get index of string 
    text = 'X' + text   
    var index = ID.indexOf(text);   

    //Pass index to function to make links
    make(index);    
    //G.kmlEvent.stopPropagation();  

    //alert(G.kmlEvent.getCurrentTarget());

    });

}

window.onload = load;

</script>
</head>
<body >
<center>
<table cellspacing="0" cellpadding="2">
<tr>
    <td valign="top">
        <div id="top" style="width: 800px; height: 30px;"></div>
    </td>
</tr>
<tr>
    <td valign="top">
        <div id="mapDiv" style="width: 800px; height: 450px;"></div>
    </td>
</tr>
</table>
</center>
</body>
</html>

10voto

Swinders Puntos 1042

Has probado a quitar el oyente (removeListener) de la capa?

También parece que el clickable: falsa opción no estaba funcionando correctamente y de que fue un error en la API:

http://groups.google.com/group/google-maps-js-api-v3/browse_thread/thread/6e4c134059159e75

Lo que se conoce en la Google API v3 página de cambios http://code.google.com/p/gmaps-api-issues/wiki/JavascriptMapsAPIv3Changelog - "hacer Clic en un archivo KML de superposición ya no lanza un mapa de evento click"

Como se señaló anteriormente cambiar el z-index de la capa de línea (he probado en FireBug) a -1 permite continuar haciendo clic en el mapa, sin embargo, las líneas son sólo semi-visible por una capa de polígono.

alt text

8voto

Joe Fontana Puntos 703

Tal vez pruebe a establecer el zIndex de la polilínea en PolylineOptions a algunos elevado número.

2voto

Daniel Broekman Puntos 1951

Cómo sobre la adición de la polilínea antes de agregar su capa kml? He modificado uno de los ejemplos de google para hacer lo que creo que está describiendo (pero con líneas en el .kml en lugar de polígonos). Intente esto:

<!DOCTYPE html>
<html>
<head>
<title></title>
<link href="http://code.google.com/apis/maps/documentation/javascript/examples/default.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript">
  var globals = {};
  function initialize() {
    // create the map
    var chicago = new google.maps.LatLng(41.875696,-87.624207);
    var myOptions = {
      zoom: 11,
      center: chicago,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    globals.map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

    // create the polyline over lay first so it doesn't block the kml layer click events
    var polyOptions = {
      clickable: false,
      strokeColor: '#000000',
      strokeOpacity: 1.0,
      strokeWeight: 3
    }
    globals.poly = new google.maps.Polyline(polyOptions);
    globals.poly.setMap(globals.map);

    // add the kml layer
    globals.ctaLayer = new google.maps.KmlLayer('http://gmaps-samples.googlecode.com/svn/trunk/ggeoxml/cta.kml');
    globals.ctaLayer.setMap(globals.map);
    // listen for clicks on the kml layer
    globals.kml_listener = connect_listener(); 
    console.log('end of init');
  }

  function create_line(feature_name, firstPoint) {
    console.log('create line: ', feature_name);
    globals.poly.setPath(new google.maps.MVCArray());
    var path = globals.poly.getPath();
    path.push(firstPoint);

    // Add a listener for the click event
    globals.map_listener = google.maps.event.addListener(globals.map, 'click', addLatLng);
    console.log('connected map listener');
  }

  function addLatLng(event) {
    google.maps.event.removeListener(globals.map_listener);
    console.log('disconnected map listener');

    var path = globals.poly.getPath();
    path.push(event.latLng);

    // after adding our point to the path, reconnect the event listener
    globals.kml_listener = connect_listener();
  }

  function connect_listener() {
    return google.maps.event.addListener(globals.ctaLayer, 'click', kml_click_handler);
  }

  function kml_click_handler(kmlEvent) {
    console.log('kml click handler', kmlEvent);
    // remove event listener on the kml layer
    google.maps.event.removeListener(globals.kml_listener);
    var text = kmlEvent.featureData.name;
    create_line(text, kmlEvent.latLng);
  }

</script>
</head>
<body onload="initialize()">
  <div id="map_canvas"></div>
</body>
</html>

0voto

pmlarocque Puntos 1521

el Error fue corregido probar con este código

         function initialize() {
            geocoder = new google.maps.Geocoder();       
            var latlng = new google.maps.LatLng(4.672738,-74.081669);
            var myOptions = {
                zoom: 12,
                center: latlng,
                draggableCursor:'crosshair',
                mapTypeId: google.maps.MapTypeId.ROADMAP
            };
            map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

            var myLayerOptions ={
                preserveViewport: true,
                suppressInfoWindows: true,
                clickable: false
            };

            var Layer1 = new google.maps.KmlLayer('http://www.google.com/maps/ms?ie=UTF8&hl=en&msa=0&msid=217143284309487038939.0004b269c55cbc3a4b5fe&output=kml',myLayerOptions);
            Layer1.setMap(map);


            var polyOptions = {
                strokeColor: '#000000',
                strokeOpacity: 1.0,
                strokeWeight: 3
            }
            poly = new google.maps.Polyline(polyOptions);
            poly.setMap(map);
            google.maps.event.addListener(map, 'click', addLatLng);               
        }

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X