2012-03-18 11 views
6

Próbuję połączyć perl i Javascript, aby zmapować adres IP lokalizacji z lat/Long na Mapę Google przy użyciu interfejsu Google Maps API v3. Co ja dostaję z powrotem jest w marker, dostaję błąd: Uncaught Error: Invalid value for property <position>: 43.073052,-89.40123Niepoprawna wartość dla usługi <position>

Mój kod to:

#!/usr/bin/perl -w 
    use CGI qw(:standard); 
    use CGI::Carp qw/fatalsToBrowser warningsToBrowser/; 
    use CGI::Session ('-ip_match'); 
    use SOAP::Lite; 
    use lib '/home/schreiber/perl5/lib/perl5'; 
    use JSON qw(encode_json); 

    $session = CGI::Session->load(); 
    $q = new CGI; 
    my $soap = SOAP::Lite 
     -> uri('http://v1.fraudlabs.com/') 
     -> proxy('http://v1.fraudlabs.com/ip2locationwebservice.asmx') 
     -> on_action(sub { join "/", "http://v1.fraudlabs.com", $_[1] }); 

    $license = "<removed>"; 

    #if($session->is_expired) { 
    # print $q->header(-cache_control=>"no-cache, no-store, must-revalidate"); 
    # print "Your session has expired. Please login again."; 
    # print "<br/><a href=\"../login.html\">Login</a>"; 
    #} elsif($session->is_empty) { 
    # print $q->header(-cache_control=>"no-cache, no-store, must-revalidate"); 
    # print "You have not logged in"; 
    #} else { 
     print $q->header(-cache_control=>"no-cache, no-store, must-revalidate"); 

     open (IPF, "/home/access_log"); 
     @incomingarray=<IPF>; 

     $i = 0; 
     foreach $pair(@incomingarray) { 
     ($ip, $rest) = split(/ - - /, $pair); 
     $incomingarray[$i] = $ip; 

     chomp $ip; 
     $i++; 
     } 

     close (IPF); 

     my %hash = map { $_, 1 } @incomingarray; 
     my @distinctIP = keys %hash; 

     $j = 0; 
     my @iplocation; 
     foreach (@distinctIP) { 
     my $method = SOAP::Data->name('IP2Location')->attr({xmlns => 
     'http://v1.fraudlabs.com/' }); 

     my @params = SOAP::Data->name('inputdata' => \SOAP::Data->value(
     SOAP::Data->name(IP=>$_), 
     SOAP::Data->name(LICENSE=>$license) 
     )); 

     my $result = $soap->call($method => @params); 
     $lat = $result->valueof('//LATITUDE'); 
     $long = $result->valueof('//LONGITUDE'); 

     push(@iplocation, "$lat,$long"); 
     } 

     my $json = encode_json(\@iplocation); 

    # print "Content-Type: text/html\n\n"; 
     print '<html> 
     <head> 
     <script type="text/javascript"> 
      function initialize() { 
      var myOptions = { 
       zoom: 8, 
       center: new google.maps.LatLng(44.49, -91.30), 
       mapTypeId: google.maps.MapTypeId.ROADMAP 
      }; 

      var map = new google.maps.Map(document.getElementById(\'map_canvas\'), 
       myOptions); 

      var coord_data = new Array(); 
      coord_data = '.$json.'; 

      var marker; 
      for (var i = 1; i < coord_data.length; i++) { 
       console.log(coord_data[i]); 
     var marker = new google.maps.Marker({ 
     position: new google.maps.LatLng(coord_data[i]), 
     map:map 
     }); 

       marker.setMap(map); 
      } 
      } 

      function loadScript() { 
      var script = document.createElement(\'script\'); 
      script.type = \'text/javascript\'; 
      script.src = \'//maps.googleapis.com/maps/api/js?sensor=false&callback=initialize\'; 
      document.body.appendChild(script); 
      } 

      window.onload = loadScript; 
     </script> 
     </head> 

     <body> 
     <div id="map_canvas" style="width: 100%; height: 100%"></div> 
     </body> 
     </html> 
     '; 
    #} 

Każda pomoc będzie bardzo mile widziane.

Odpowiedz

10

Problem polega na tym, że po przypisaniu pozycji tutaj -

marker = new google.maps.Marker({ 
    position:coord_data[i], 
    map:map 
}); 

- dajesz mu surowego obiektu JSON, ale spodziewa obiekt google.maps.LatLng. Będziemy chcieli, aby przypisać go jak this--

position: new google.maps.LatLng(coord_data[i].lon,coord_data[i].lat) 

Zobacz tutaj również kilka dobrych próbek użytkowania GMaps API: https://developers.google.com/maps/documentation/javascript/v2/examples/

+0

Dziękuję. Nie daje mi już błędu, ale nie dodaje też znacznika do mapy. Jakieś pomysły? – Kruug

+0

Myślę, że to tylko kwestia sprawdzenia składni teraz (podejrzewam, że problem to tylko składnia JavaScript). Nie mogę powiedzieć dokładnie, co się dzieje, ponieważ nie mówię płynnie w Perlu. Jako test skopiowałem Twój HTML do pliku tekstowego i załadowałem go do Chrome, testując Firebug. Działał z markerem po zmianie 2 linii kodu: coord_data = [{lat: 44,49, lng: -91}]; pozycja: new google.maps.LatLng (coord_data [i] .lat, coord_data [i] .lng), – McGarnagle

Powiązane problemy