Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [google maps] odcztytywanie kliniętego obszaru
Forum PHP.pl > Forum > Po stronie przeglądarki
waldemi
Witam
Potrzebuję zrobić w Google Maps następującą rzecz: na mapie zdefiniowanie są jakieś obszary (Polygone), które nie zachodzą na siebie. Współrzędne wierzchołków zapisane są w bazie danych, każdy z obszarów ma swój identyfikator. Teraz potrzebuję zrobić coś takiego że po kliknięciu na mapę skrypt odczyta współrzędne klikniętego miejsca a następnie z bazy odczyta ID obszaru na którym klinięto.
Czy jest to do zrobienia? Kiedyś widziałem coś takiego na jakiejś stronie ale teraz nie umiem tego znaleźć.
lukasz1985
Tak, to możliwe, pod warunkiem, że każdy obszar na mapie ma odpowiednie id do tego w bazie.


http://jsfiddle.net/5j4WN/1/

Mega_88
Cytat(waldemi @ 15.10.2012, 18:53:15 ) *
Kiedyś widziałem coś takiego na jakiejś stronie ale teraz nie umiem tego znaleźć.


Zobacz tutaj, przykład pierwszy: http://gmapsapi.com/poradnik/106_zdarzenia.html?tag=apiv3
waldemi
Cytat(Mega_88 @ 16.10.2012, 09:25:51 ) *

Tak, znam to bo z tego kursu się uczyłem. Umiem pobrać współrzędne klikniętego punktu. Chodzi o to żeby przeszukać bazę danych i sprawdzić na którym obszarze się one znajdują (po załadowaniu mapy żadne obszary nie są wyświetlane), następnie ID tego obszaru ma być przekazane do dalszej "obróbki" a obszar ma być wyświetlony na mapie.
lukasz1985
To jest droga naokoło, jeśli chcesz przetwarzać punkt i obszar po stronie serwera. Do tego służy GMaps Api.
Można zrobić tak, że przy załadowaniu strony wczytywane są wierzchołki przez JSON do JS i na ich podstawie wyświetlane są przezroczyste obszary (alpha:0), każdy obszar ma już przypisane ID, pobrane również z bazy.

Po kliknięciu w obszar, jego alpha zmienia się na 1 - obszar się pojawia na mapie
lub jeśli po kliknięciu potrzebne jest zapytanie na serwer - wysyłane są dane przez Ajax np z numerem ID, po stronie serwera wykonuje się skrypt i w momencie wykonania, po otrzymaniu odpowiedzi z serwera, klientowi zostaje wyświetlony ten obszar - dopiero po otrzymaniu odpowiedzi serera, alpha obszaru zmienia się na 1.

Jeśli interesuje Cię dalsza pomoc, proszę o dookreślenie jakie operacje mają być wykonywane.
waldemi
Tak, to by było właśnie to. Niestety nie znam GMaps API na tyle żeby to samemu rozpracować. Możesz podać jakieś przykłady? Jakiś przykładowy skrypt?
lukasz1985
Najprostsze rozwiązanie jakie widzę, to tak, że serwer wyrzuca obszary oraz ich id przy starcie strony.
Przechwytuje jest JavaScript. Najlepiej wszystko zrobić w formacie JSON.

Napisałem prostą klasę, która może wiele sprostować:

cały kod i demo znajduje się na jsfiddle: http://jsfiddle.net/GDM64/

Obsługa zdarzeń znajduje się w kodzie, można tam dopisać co się ma stać dalej po kliknięciu, jeśli chcesz użyć AJAX.

Myślę, że obszar powinien być wyświetlany od razu po kliknięciu, a nie dopiero po otrzymaniu odpowiedzi z serwera, ponieważ zwłoka może zaskoczyć użytkownika.

Kodu po stronie serwera nie pisałem lecz jeśli będziesz go potrzebował, mogę coś napisać.



  1. <!DOCTYPE html>
  2. <head>
  3. <title>Google Maps JavaScript API v3 Example: Map Simple</title>
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
  5. <meta charset="utf-8">
  6. html, body, #map_canvas {
  7. margin: 0;
  8. padding: 0;
  9. height: 100%;
  10. }
  11. </style>
  12. <script src="https://maps.googleapis.com/maps/api/js?sensor=false"></script>
  13.  
  14.  
  15. function Obszary () {
  16.  
  17. // zmienna 'self' trzymająca referencje do instancji - widoczna w całym kodzie klasy
  18. var self = this;
  19.  
  20. var ukryty = {
  21. strokeOpacity: 0,
  22. fillOpacity: 0
  23. }
  24. var widoczny = {
  25. strokeOpacity: 0.5,
  26. fillOpacity: 0.5
  27. }
  28. //// tablica obszarów, do której będą dodawane instancje google.maps.Polygon
  29. this.obszary = []
  30. // funkcja odpowiadająca za ukrycie obszarow na mapie
  31. this.ukryjObszary = function () {
  32. var iter = 0;
  33. for (iter = 0; iter < this.obszary.length; iter++) {
  34. var obszar = this.obszary[iter];
  35. obszar.setOptions(ukryty)
  36.  
  37. }
  38. }
  39.  
  40. // funkcja odpowiadająca za podświetlenie obszaru
  41. this.podswietlObszar = function (obszar) {
  42. obszar.setOptions(widoczny)
  43. }
  44. // funkcja zawierająca kod wykonywany po kliknięciu w obszar, przyjmuje kliknięty
  45. // obszar za argument
  46. this.klikniecie = function (obszar) {
  47. this.ukryjObszary()
  48. this.podswietlObszar(obszar);
  49.  
  50. var id = obszar.id
  51. console.log(obszar.id)
  52.  
  53. }
  54. // funkcja odpowiadająca za dodanie obszaru do mapy w stanie ukrytym oraz przypisanie zdarzenia
  55. // wywoływanego podczas kliknięcia w obszar
  56. this.dodajObszar = function (wierzcholki, id) {
  57. var alpha = 0;
  58. var color = "#ffffff";
  59. var nowyObszar = new google.maps.Polygon({
  60. paths: wierzcholki,
  61. strokeColor: color,
  62. fillColor: color,
  63. strokeOpacity: alpha,
  64. fillOpacity: alpha
  65. })
  66. nowyObszar.id = id;
  67. nowyObszar.setMap(map)
  68.  
  69.  
  70. google.maps.event.addListener(nowyObszar, 'click', function (event) {
  71. self.klikniecie(nowyObszar);
  72. })
  73. this.obszary.push(nowyObszar)
  74. }
  75. }
  76.  
  77. var map;
  78. function initialize() {
  79. var mapOptions = {
  80. zoom: 8,
  81. center: new google.maps.LatLng(-32.23052345157306, 153.43452734375),
  82. mapTypeId: google.maps.MapTypeId.ROADMAP
  83. };
  84. map = new google.maps.Map(document.getElementById('map_canvas'),mapOptions);
  85.  
  86.  
  87.  
  88.  
  89. obszary = new Obszary();
  90.  
  91.  
  92. // Dodanie kwadratowych obszarów do mapy w celach demonstracyjnych
  93. // W rzeczywistości, jeśli dane mają pochodzić z bazy danych to najlepiej
  94. // dodać je przez np w PHP: json_encode() i przechwycić w javascript przez
  95. // JSON.parse() - przy pomocy jakiejś biblioteki lub po prostu biblioteki JSON
  96. // [url="https://github.com/douglascrockford/JSON-js"]https://github.com/douglascrockford/JSON-js[/url]
  97.  
  98. var iter;
  99. for (iter = 0; iter < 7; iter++) {
  100. var iterIter
  101. for (iterIter = 0; iterIter < 5; iterIter++) {
  102. var x = iter
  103. var y = iterIter
  104. var id = iter * iterIter;
  105.  
  106. var wierzcholki = [
  107. new google.maps.LatLng(-34 + y, 150 + x),
  108. new google.maps.LatLng(-35 + y, 150 + x),
  109. new google.maps.LatLng(-35 + y, 151 + x),
  110. new google.maps.LatLng(-34 + y, 151 + x),
  111. new google.maps.LatLng(-34 + y, 150 + x),
  112. ];
  113.  
  114. obszary.dodajObszar(wierzcholki, id)
  115. }
  116.  
  117. }
  118.  
  119.  
  120. // Construct the polygon
  121. // Note that we don't specify an array or arrays, but instead just
  122. // a simple array of LatLngs in the paths property
  123. // bermudaTriangle = new google.maps.Polygon({
  124. // paths: triangleCoords,
  125. // strokeColor: "#FF0000",
  126. // strokeOpacity: 0.0,
  127. // strokeWeight: 2,
  128. // fillColor: "#FF0000",
  129. // fillOpacity: 0.1
  130. //
  131. // });
  132. //
  133. // bermudaTriangle.setMap(map);
  134. }
  135. google.maps.event.addDomListener(window, 'load', initialize);
  136. </script>
  137. </head>
  138. <body>
  139. <div id="map_canvas"></div>
  140. </body>
  141. </html>
waldemi
Wielkie dzięki, chyba właśnie o to mi chodziło. Spróbuję to teraz dopasować do swojej strony.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.