Jak zaciemnić dane podczas korzystania z Map Google?


9

Pracowałem nad mapą Google (v3 interfejsu API), która wykreśla około 120 znaczników (lub wkrótce) - patrz http://www.mediwales.com/mapping . Jeśli przeglądasz źródło, dane mapy są dla wszystkich do zobaczenia, czy można to ukryć?

Nie martwię się o kod generujący mapę, tylko dane. Dane są pobierane z cms Wordpress.

Oto kod, który generuje to wszystko:

<script type="text/javascript"> 
(function() { 

window.onload = function() { 
 var mc;
// Creating an object literal containing the properties we want to pass to the map 
var options = { 
zoom: 10, 
center: new google.maps.LatLng(52.40, -3.61), 
mapTypeId: google.maps.MapTypeId.ROADMAP 
}; 

// Creating the map 
var map = new google.maps.Map(document.getElementById('map'), options); 

// Creating a LatLngBounds object 
var bounds = new google.maps.LatLngBounds(); 

// Creating an array that will contain the addresses 
var places = []; 

// Creating a variable that will hold the InfoWindow object 
var infowindow; 
mc = new MarkerClusterer(map);
<?php
$pages = get_pages(array('child_of' => $post->ID, 'sort_column' => 'menu_order'));
$popup_content = array();
foreach($pages as $post)
    {
    setup_postdata($post);
    $fields = get_fields(); 
    $popup_content[] = '<p>'.$fields->company_name.'</p><img src="'.$fields->company_logo.'" /><br /><br /><a href="'.get_page_link($post->ID).'">View profile</a>';
    $comma = ", ";
    $full_address = "{$fields->address_line_1}{$comma}{$fields->address_line_2}{$comma}{$fields->address_line_3}{$comma}{$fields->post_code}";
    $address[] = $full_address;
    }
wp_reset_query();
echo 'var popup_content = ' . json_encode($popup_content) . ';';
echo 'var address = ' . json_encode($address) . ';';
?>

var geocoder = new google.maps.Geocoder(); 

var markers = [];

// Adding a LatLng object for each city  
for (var i = 0; i < address.length; i++) { 
    (function(i) { 
        geocoder.geocode( {'address': address[i]}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                places[i] = results[0].geometry.location;

                // Adding the markers 
                var marker = new google.maps.Marker({position: places[i], map: map});
                markers.push(marker);
                mc.addMarker(marker);

                // Creating the event listener. It now has access to the values of i and marker as they were during its creation
                google.maps.event.addListener(marker, 'click', function() {
                    // Check to see if we already have an InfoWindow
                    if (!infowindow) {
                        infowindow = new google.maps.InfoWindow();
                    }

                    // Setting the content of the InfoWindow
                    infowindow.setContent(popup_content[i]);

                    // Tying the InfoWindow to the marker 
                    infowindow.open(map, marker);
                });

                // Extending the bounds object with each LatLng 
                bounds.extend(places[i]); 

                // Adjusting the map to new bounding box 
                map.fitBounds(bounds) 
            } else { 
            alert("Geocode was not successful for the following reason: " + status); 
            }

        });

    })(i);

} 
var markerCluster = new MarkerClusterer(map, markers); 
} 
})
(); 
</script>

Jakie dane masz na myśli? popup_contenti address?
Sasa Ivetic

@SasaIvetic Oba, jeśli to możliwe.
Rob

Odpowiedzi:


7

Możesz przechowywać swoje dane w bazie danych ( Fusion Tables to szybkie rozwiązanie).

Mapy Google mają samouczek, który pokazuje, jak to zrobić za pomocą MySQL (ale może to być dowolna baza danych) http://code.google.com/apis/maps/articles/phpsqlajax_v3.html

Możesz uzyskać tak bezpieczne i zaciemnione, jak chcesz, korzystając z zaplecza bazy danych.

Wygląda na to, że geokodujesz swoje dane w locie - będziesz mieć do 1000 żądań dziennie na adres IP.

Bardziej wydajne byłoby geokodowanie, a następnie aktualizacja bazy danych w czasie zbliżonym do rzeczywistego.


1
Świetna propozycja dla stołów Fusion! Tabele Fusion mają limit geokodowania, choć nie mogę go teraz przypomnieć, ale jest DUŻO wyższy niż limit API. Jedyną wadą jest to, że musisz zsynchronizować dane WordPress z tabelą Fusion (lub alternatywnie użyć danych z Tabeli Fusion na swojej stronie Wordpress).
Sasa Ivetic,

To świetny pomysł. Limity API ostatnio się zmieniły. Podaję szczegóły jako osobną odpowiedź dla przestrzeni, ale @Mapperz dał PRAWDZIWĄ odpowiedź, chcę tylko upewnić się, że mój nie jest postrzegany jako naśladowca!
Ellie Kesselman,

@Mapperz To zdecydowanie kierunek, w którym chcę zmierzać ... gdybym tylko wiedział! Myślę, że prawdopodobnie potrzebuję kilku przykładów kodu ... Dodam nagrodę.
Rob

4

Nie będziesz w stanie ukryć zawartości popup_contenti addressprzed użytkownikiem, po prostu dlatego, że wszystko, co jest wysyłane na stronę internetową, jest wyraźnie widoczne dla użytkownika końcowego. Zamiast zrzucać to wszystko podczas ładowania, możesz wykonać żądanie asynchroniczne po kliknięciu mapy. W swojej clickfunkcji obsługi chciałbyś złożyć żądanie ze strony PHP dla popup_content [i] i otworzyć infoWindow po zakończeniu żądania (alternatywnie, otwórz okno infoWindow z ładowaniem ... tekstu, a następnie zaktualizuj tekst) . Możesz obsługiwać adresy w podobny sposób.

Uwaga: to rozwiązanie nadal NIE ukrywa treści przed użytkownikiem, po prostu opóźnia ładowanie, dzięki czemu wszystkie dane nie są natychmiast obecne. Będzie to również miało negatywny wpływ na Twoją wydajność.

Jako kolejną opcję możesz w jakiś sposób zaciemnić dane. Możesz również wyprowadzić dane do osobnego pliku JavaScript podczas ładowania, w ten sposób nie jest on natychmiast widoczny, gdy użytkownik kliknie opcję Wyświetl źródło. Ponownie dane nie są w rzeczywistości ukryte przed użytkownikiem; jest po prostu usuwany z pola widzenia.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.