Włączam Mapy Google do mojej aplikacji MVC 4. Dość proste do zrobienia. Mam jednak pytanie dotyczące najlepszego sposobu dynamicznego dodawania wielu markerów. Moi użytkownicy będą szukać listy przedmiotów na sprzedaż, poprzez wywołanie metody działania na kontrolerze i chcę móc pokazać im elementy i lokalizację każdego z nich na mapie. Nie jestem pewien, jak lub najlepiej, aby dynamicznie dodawać znaczniki do mapy, która jest wszystkim JavaScriptem w kliencie. Zasadniczo chciałbym móc przesłać klientowi wszystkie informacje o znacznikach z kodu serwera MVC, ale nie jestem pewien, czy można to zrobić, czy nie.MVC 4 i Google Maps API v3
Odpowiedz
w (http://docs.angularjs.org/api/ng $ http). projekt, nad którym teraz pracuję, tak to sobie radzimy:
Niech główny ViewModel będzie nazywać się FooViewModel
.
ViewModels:
public class FooViewModel
{
// Your search results:
public IEnumerable<FooWithLocationViewModel> Foos { get; set; }
// Properties for your search filter:
public decimal? MaxPrice { get; set; }
public CityEnum? City { get; set; }
...
}
public class FooWithLocationViewModel
{
public string Name { get; set; }
public decimal Price { get; set; }
...
public double Latidude { get; set; }
public double Longitude { get; set; }
...
}
W widoku, jest <div>
dla każdego FooWithLocationViewModel
. Będziemy wykorzystywać data-*
cechy, które są ważne w HTML5:
Widok:
@model FooViewModel
...
@foreach(FooWithLocationViewModel foo in Model.Foos)
{
<div class="foo" data-latitude="@(foo.Latitude)"
data-longitude="@(foo.Longitude)">
<span>@foo.Name</span>
<span>@foo.Price</span>
...
</div>
}
<div id="map-canvas"></div>
Teraz nadszedł czas na JavaScripcie, jestem przy założeniu, że używasz JQuery:
Inicjowanie mapę , dodając znaczniki i przechowywanie ich w markers
tablicy:
function initialize() {
var foos = $(".foo");
var markers = new Array();
var mapOptions = {
...
}};
var mapCanvas = document.getElementById('map-canvas');
if (mapCanvas != null) {
map = new google.maps.Map(mapCanvas, mapOptions);
$.each(foos, function (key, value) {
markers[key] = new google.maps.Marker({
map: map,
draggable: false,
animation: google.maps.Animation.DROP,
position: new google.maps.LatLng(
Number($(value).attr("data-latitude")),
Number($(value).attr("data-longitude")
));
});
google.maps.event.addListener(markers[key], 'click', function() {
// If you need this...
});
});
}
}
Co jest dobre na temat tego podejścia jest, wszystko odbywa się w fu nunch, który inicjuje twoją Mapę Google. Zatem twój skrypt nie musi być osadzony w twoim Widoku. Używamy podejścia przyjaznego HTML5. I to jest proste.
To jest dobra odpowiedź! Chodziło mi o pomysł, ale my ulepszyliśmy moje pomysły, używając danych - jako mechanizmu dostarczania, po prostu zrzuciłem fragment kodu JavaScript, ale jest to o wiele bardziej dopracowane. – rtpHarry
@rtpHarry, dziękuję. Mam nadzieję, że pomaga innym. – mostruash
jako łagodne rozszerzenie, jeśli chcesz podać klasę lub identyfikator jakiegoś opisu, do SPANÓW możesz ponownie użyć tych informacji, jeśli chcesz wygenerować zawartość znacznika. Neater niż osadzanie JS lub tablic. – stefancarlton
Skorzystaj z internetowego interfejsu API i obsłużyj je wszystkie asynchronicznie. Przekaż obiekt JSON z powrotem do klienta, przeanalizuj informacje, usuń stare znaczniki i dodaj nowe.
EDIT po swoim komentarzu:
Jeśli po niektóre z czego próbowałem i nie udało się dostać do pracy to możemy pomóc w problemach używasz do. Jeśli dopiero zaczynasz:
http://www.asp.net/web-api - Wielka tutoriale na temat korzystania z API Web http://angularjs.org/ - Sprawdź kątowa dla żądania GET i wiążący wyniki z UI
Dziękuję. Ale za 150 punktów rep, szukam trochę więcej niż to. – Hosea146
Chciałbym zaproponować podejście do tego wymogu:
w wyszukiwarce kliknięcia przycisku - czy to żądanie POST (lub AJAX POST), wysłać żądanie do serwera.
Wykonaj wyszukiwanie na serwerze "akcja wyszukiwania()".
Istnieją dwie obowiązki działania search() - 1. Pokaż wynik wyszukiwania. 2. Pokaż odpowiednie znaczniki na mapie
Wyniki wyszukiwania będą danymi i reprezentacją, czy to "div"/"table/tr/td".Ta reprezentacja jest generowana na serwerze bez użycia zasobów klienta i czasu przetwarzania po stronie klienta. Tak więc "SearchView" może zwrócić zarówno dane, jak i reprezentację.
Kolejna odpowiedzialność polega na wyświetlaniu znaczników odpowiadających każdemu wynikowi wyszukiwania. Jest to całkowicie odpowiedzialność klienta. Więc trzymajmy to oddzielnie od pierwszej odpowiedzialności. Korzystając z biblioteki serializacji JSON wstrzyknij zserializowaną tablicę jsonów 'markers' w 'SearchView' zamiast mieszania jej z wynikiem wyszukiwania. Jedynym czasem, w którym możesz chcieć, aby szczegóły znaczników ściśle powiązać z każdym wynikiem wyszukiwania, jest podkreślenie znaczników po kliknięciu poszczególnych wyników wyszukiwania. Przykład użycia może początkowo przedstawiać wszystkie wyniki wyszukiwania i pokazywać wszystkie znaczniki. Następnie, gdy użytkownik klika/zatrzymuje się (biorąc pod uwagę, że nie jest on przeznaczony dla urządzeń przenośnych, ponieważ nie może tam pracować zawijanie), indywidualny wynik wyszukiwania można zmienić położenie znacznika lub dodać etykietę lub więcej informacji do wybranego wyniku wyszukiwania.
Możesz również chcieć mieć skrypt w osobnym pliku, aby uniknąć ładowania go przy każdej akcji wyszukiwania. A z SearchView możesz po prostu wywołać funkcję "InitializeMap()" JS, przekazując ją znacznikom serializowanym JSON i początkowej pozycji mapy.
Korzystanie z JSON byłoby lepszym podejściem i zapewnia przyszłą elastyczność w celu łatwej konwersji aplikacji na AJAX. Ponadto jest szybszy niż analizowanie kodu HTML za pomocą Jquery w celu uzyskania szczegółów znacznika.
function InitializeMap(initialMapPosition,markers){ var latlng = new google.maps.LatLng(initialMapPosition.latitude,initialMapPosition.longitude); var options = { zoom: 15, center: latlng, mapTypeId: google.maps.MapTypeId.ROADMAP // this could be as per your requirement. }; var map = new google.maps.Map($('#map-canvas')[0], options); // Place markers on map for(i = 0; i < markers.length; i++) { var latLng = new google.maps.LatLng(markers[i].lat, markers[i].lng); var marker = new google.maps.Marker({ position: latLng, map: map }); }
}
Wyjaśnienie dotyczące punktu 7: Analizowanie HTML (wykonywane po stronie klienta) jest niczym w porównaniu do wyświetlania kontrolki Google Map, w sensie obliczeniowym. Więc to absolutnie nie jest ciężarem. – mostruash
Uzgodniono szybkość (zależy to jednak od liczby wyników wyszukiwania). Ale dla przyszłych zmian byłoby zdecydowanie dobrą opcją posiadania obiektu JSON. –
Oto moje myśli na ten temat.
Niedawno zrobiłem projekt, który był pojedynczą stroną, opartą na AJAX aplikacją sieciową (wiem, że nie szukasz rozwiązania opartego na AJAX, ale zostań ze mną).
Zintegrowałem mapy Google w tej aplikacji, które służyły do pokazania lokalizacji różnych podmiotów.
Gdy użytkownik czegoś szukał, zamiast wykonywać Geo-Coding w przeglądarce (co było bardzo powolne), wysłałem żądanie do serwera. Na serwerze tekst przychodzący był kodowany geo (za pomocą Google API), a wynik był buforowany w lokalnej bazie danych do późniejszego wykorzystania. Jeśli ta sama prośba pojawiła się ponownie, pobieram Geo-kordinaty z DB i odsyłaję je do klienta.
Typ zwrotu był całkiem prosty. tj
public class Marker
{
public double Lat{set;get;}
public double Lon{set;get;}
public string Title{set;get;}
}
Na kliencie, chciałbym po prostu iteracyjne nad listą i wykreślić znaczniki na mapie (kreślenia znaczników jest szybszy niż zainteresowanie Geo-kodowanie).
Teraz to samo można zrobić w poście. Wszystko co musisz zrobić, to w initialize wywołania funkcji
var markers = @Html.Action("GetMarkers")
ten wypełni markery var z listą wszystkich znaczników, które można następnie iteracyjne.
Pamiętaj, rodzaj powrotu GetMarkers
jest
public JsonResult GetMarkers()
{
...
// returns List<Markers>
}
- 1. Znacznik Google Maps API v3 z etykietą
- 2. google maps api v3 bez płynnego przeciągania
- 3. Google Maps api v3 tools: zniekształcenia wizualne?
- 4. Google Maps API V3 wyłącz płynne powiększanie
- 5. Google Maps Api v3 - getBounds jest niezdefiniowany
- 6. Google Maps API v3 Wydanie Firefoksa
- 7. Google Maps API v3: Menedżer rysunków
- 8. Google maps api v3 DrawingManager żadna praca
- 9. Google Maps API V3 Szary obszar
- 10. Dojazd odległość w Google Maps API v3
- 11. Usuwanie znacznika w Google Maps API v3
- 12. Google maps API V3 method fitBounds()
- 13. Google Maps v3 OverlayView.getProjection()
- 14. Google Maps API V3 Infobox jQuery fadeIn i Fadeout
- 15. Google Maps API v3 marker drop i odbić animacja
- 16. Google Maps Api v3 niestandardowe InfoWindow - błąd "google is defined"
- 17. Google Maps v3 Direction Icons
- 18. zombie.js i Google Maps API
- 19. Skokowy znacznik w Google Maps v3
- 20. Google Maps Api w warstwach
- 21. google maps api v3 jak pozycjonować najbliższy dystans
- 22. AngularJS: mapuj za pomocą Google Maps API v3 w zakładce
- 23. Google Maps API v3 - Jak konwertować .getBounds() na współrzędne pikseli?
- 24. Google Maps API v3: Markery nie są usuwane
- 25. łamaną przystawki do drogi przy użyciu Google Maps API v3
- 26. Google Maps Api V3 - Stylizacja krajów lub miast
- 27. Błędy Google Maps API V3 po uaktualnieniu wtyczki WP
- 28. Google Maps v3 API mouseover z wielokątów. Nie działa
- 29. Uzyskaj nieosłonięte krawędzie map w Google Maps API V3
- 30. Jak zmienić MapTypeid w Google Maps API v3?
gdy użytkownik kliknie przycisk wyszukiwania, jest mapa Jedyną rzeczą, która jest aktualizowana? Czy wyniki wyszukiwania są również wyświetlane jako tekst, a zatem są również aktualizowane? – mostruash
Wyniki wyszukiwania również zostały zaktualizowane. – Hosea146
Jeszcze jedno pytanie.Czy oznacza to, że wyniki dynamiczne są aktualizowane asynchronicznie z żądaniami AJAX do Twoich działań? – mostruash