2010-08-23 15 views
16

Nie mam doświadczenia w pracy z Google Maps, ale chciałbym umieścić w mojej aplikacji internetowej mapę "Wybierz swój okręg". Moja aplikacja działa tylko w Kalifornii, więc potrzebuje tylko obsługi jednego stanu, ale nie mogę znaleźć łatwego sposobu na to (bez ręcznego rysowania wieloboków nakładających się na wszystkie linie okręgów).Mapy Google z nałożoną powiatami?

Założę się, że z łatwością znajdę przykłady interfejsów "Wybierz swój okręg" w Google, ale jedyne, co znalazłem, to - http://maps.huge.info/county.htm - i jestem skłonny do uderzania w ich API aby wyciągnąć geometrię dla całego stanu, jeśli nie mogę znaleźć lepszej opcji.

Czy ktoś ma jakieś doświadczenie lub wgląd, aby ułatwić sobie to zadanie?

Odpowiedz

14

Google Fusion Tables teraz łączy się z State, County, and Congressional District data dla całych Stanów Zjednoczonych.

Pole geometrii tabeli fuzji zawiera element wielobok dla danego obiektu. Granice państwowe (a także w mniejszym stopniu powiaty) w niektórych miejscach wyglądają trochę nisko, ale może być wystarczająco dobre dla ciebie i powinno być stosunkowo łatwe do uchwycenia.

30

Interfejs API serwisu Mapy Google nie udostępnia regionów powiatowych ani żadnych innych wstępnie zdefiniowanych granic państw lub krajów. Dlatego głównym problemem jest uzyskanie danych wieloboków.

Wielokąt na Google Maps API jest definiowana poprzez skonstruowanie tablicę LatLng obiektów (zakładając że używasz API v3):

var bermudaTriangleCoords = [ 
    new google.maps.LatLng(25.774252, -80.190262), 
    new google.maps.LatLng(18.466465, -66.118292), 
    new google.maps.LatLng(32.321384, -64.757370), 
    new google.maps.LatLng(25.774252, -80.190262) 
];  

Następnie należałoby użyć tej tablicy skonstruować Polygon obiektu:

var bermudaTriangle = new google.maps.Polygon({ 
    paths: bermudaTriangleCoords, 
    strokeColor: '#FF0000', 
    strokeOpacity: 0.8, 
    strokeWeight: 2, 
    fillColor: '#FF0000', 
    fillOpacity: 0.35 
}); 

I wreszcie pokazać go na mapie za pomocą metody setMap():

bermudaTriangle.setMap(map); // Assuming map is your google.maps.Map object 

Jeśli zachować odniesienie do obiektu Polygon, można też ukrywać, przekazując null metody setMap():

bermudaTriangle.setMap(null); 

Dlatego można rozważyć budowę obiektu JavaScript o nazwie nieruchomości dla każdego powiatu. Umożliwi to pobranie obiektów wieloboków z nazwy powiatów w O(1) (stały czas), bez konieczności przechodzenia przez całą kolekcję. Rozważmy następujący przykład:

// Let's start with an empty object: 
var counties = {  
}; 

// Now let's add a county polygon: 
counties['Alameda'] = new google.maps.Polygon({ 
    paths: [ 
    // This is not real data: 
    new google.maps.LatLng(25.774252, -80.190262), 
    new google.maps.LatLng(18.466465, -66.118292), 
    new google.maps.LatLng(32.321384, -64.757370), 
    new google.maps.LatLng(25.774252, -80.190262) 
    // ... 
    ], 
    strokeColor: '#FF0000', 
    strokeOpacity: 0.8, 
    strokeWeight: 2, 
    fillColor: '#FF0000", 
    fillOpacity: 0.3' 
}); 

// Next county: 
counties['Alpine'] = new google.maps.Polygon({ 
    // Same stuff 
}); 

// And so on... 

Przedmiotem counties będzie nasz magazyn danych. Gdy użytkownik szuka „El Dorado” można po prostu pokazać wielokąt następująco:

counties['El Dorado'].setMap(map); 

Jeśli zachować odniesienie do wcześniej przeszukiwanego powiatu, można również zadzwonić setMap(null) ukryć poprzednią wieloboku:

var userInput = 'El Dorado'; 
var latestSearch = null; 

// Check if the county exists in our data store: 
if (counties.hasOwnProperty(userInput)) { 
    // It does - So hide the previous polygon if there was one: 
    if (latestSearch) { 
    latestSearch.setMap(null); 
    } 
    // Show the polygon for the searched county: 
    latestSearch = counties[userInput].setMap(map); 
} 
else { 
    alert('Error: The ' + userInput + ' county was not found'); 
} 

Mam nadzieję, że to pozwoli ci iść w dobrym kierunku.