[Google Maps API] Opvragen van alle overlays op de map

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 23-05 15:21

NMe

Quia Ego Sic Dico.

Topicstarter
Dit topic even deels ter bevestiging omdat ik bang ben dat ik het antwoord al weet en deels om toch even te dubbelchecken of ik niet ergens overheen gelezen heb. :P

De situatie is als volgt: ik heb een map waarop ik de gebruiker wil kunnen laten tekenen. Er worden markers van verschillende types op gezet, en polygon-overlays die verschillende soorten terrein aangeven. De markers van elk type hebben elk hun eigen icon, en de polygons van elk verschillend type hebben elk hun eigen kleur. So far, so good, dat werkt allemaal prima.

Nu is het echter zo dat de data die ingetekend wordt op de map met een druk op de knop ook opgeslagen moet kunnen worden in een database. Waar ik naar op zoek ben is een functie in de Google Maps API die me alle overlays teruggeeft die op de map aanwezig zijn. Tot mijn verbazing kan ik er echter niets over terugvinden in de reference of in de Google Search. Ik begin het vermoeden te krijgen dat die functie inderdaad niet bestaat en ik dus iets anders moet verzinnen.

Nu heb ik dus bedacht dat ik een array bij kan houden waarin ik gewoon alle overlays opsla (markers en polygons, elk in hun eigen objectje met een type). Vervolgens kan ik die arrays natuurlijk wel middels AJAX naar de server sturen als er op de save-knop gedrukt wordt.

Met dat laatste voorzie ik echter één probleem, namelijk het feit dat ik markers en (delen van) polygons ook kan verwijderen van de map, en bovendien zijn alle polygons na het plaatsen nog steeds editable. Dat betekent dat ik analoog daaraan ook bij elke verwijder- of updateactie het hele array moet doorlopen om te kijken waar de verwijderde of gewijzigde point precies zat. Voordat ik daaraan begin wil ik toch wel even verdomd zeker zijn dat wat ik wil écht niet mogelijk is in de Google Maps API. :+

Dus, heeft iemand enig idee hoe ik dit aan kan pakken? :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Zowel in v2 als in v3 van de API kun je niet (gedocumenteerd) bij alle overlays; in v1 kon dit wel, maar die is niet meer bruikbaar. Je zou mapstraction kunnen gebruiken, die houdt dit wel voor je bij als ik zo kijk, en dan kun je gelijk ook andere maps gebruiken.

Ben je trouwens niet iets aan het maken dat al lang bestaat? ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 23-05 15:21

NMe

Quia Ego Sic Dico.

Topicstarter
pedorus schreef op maandag 22 maart 2010 @ 18:22:
Zowel in v2 als in v3 van de API kun je niet (gedocumenteerd) bij alle overlays; in v1 kon dit wel, maar die is niet meer bruikbaar. Je zou mapstraction kunnen gebruiken, die houdt dit wel voor je bij als ik zo kijk, en dan kun je gelijk ook andere maps gebruiken.
Google Maps is een redelijke prerequisite aangezien er nog wat andere applicaties (niet-webbased) omheen gaan hangen en uiteindelijk komt Google Earth en het KML-formaat er nog bij kijken, dus dat laatste is niet zo belangrijk. :+ Ik zal toch even naar Mapstraction kijken maar ik zou liever niet nóg een framework erbij nemen; dan kan ik net zo goed gewoon zelf "even" alle punten tracken. Kost wat meer devtijd misschien maar scheelt aardig wat in de performance lijkt me. :)
Ben je trouwens niet iets aan het maken dat al lang bestaat? ;)
Wat ik aan het maken ben is vrij specifiek toegespitst op onze klant en zonder daar al te veel over te kunnen zeggen weet ik zeker dat ik hier met een standaardoplossing niet uit ga komen. :+

edit:
@hieronder: :D

True though, heb vanmiddag zo'n 2½ uur besteed aan dit uitvinden. :P Oh, en aan het waarom achter het niet werken van een dblclick event op mijn polygon (waar ik ook nog steeds niet uit ben :X ) maar da's minder belangrijk op het moment. :+

edit:
Wat ik aan het schrijven ben is trouwens grotendeels gebaseerd op deze code. Ik heb d'r behoorlijk in zitten snijden en spul erbij plakken maar dat was in elk geval mijn uitgangspunt. :P

[ Voor 18% gewijzigd door NMe op 22-03-2010 18:39 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 08:16

MueR

Admin Tweakers Discord

is niet lief

pedorus schreef op maandag 22 maart 2010 @ 18:22:
Ben je trouwens niet iets aan het maken dat al lang bestaat? ;)
Dat hoop ik toch niet :P Met aan zekerheid grenzende waarschijnlijkheid kan ik wel zeggen dat het niet bestaat. He searched teh entire internetz ;)

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
NMe schreef op maandag 22 maart 2010 @ 18:31:
Kost wat meer devtijd misschien maar scheelt aardig wat in de performance lijkt me. :)
Dat verschil zal niet heel erg meetbaar zijn denk ik, maar dat hangt nogal af van de gebruikers. :) In ieder geval heb je bij zo'n extra laagje ook weer kans op extra bugs/ontbrekende functionaliteiten/andere problemen natuurlijk.
Oh, en aan het waarom achter het niet werken van een dblclick event op mijn polygon (waar ik ook nog steeds niet uit ben :X ) maar da's minder belangrijk op het moment. :+
Je hebt vast dit al gevonden dan: ook hier is geen gedocumenteerde methode voor... Dat is ook een beetje mijn ervaring met de API: nogal wat ontbrekende kleinere functionaliteit (bijvoorbeeld icoontjes op de kaart voor bezienswaardigheden en bushaltes die je niet klikbaar kan maken, en ook niet weg kan halen :X ).

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • UltimateB
  • Registratie: April 2003
  • Niet online

UltimateB

Pomdiedom

Inderdaad de enige manier om dit te regelen is het zelf bijhouden van de markers, polygonen en polylijnen.

Je kan het verwijderen natuurlijk ook iets anders aanpakken. Je houdt een array bij met alle objecten op hangt dan listeners aan de objecten als ze zijn gewijzigd. Dan kan je ze bijboorbeeld een dirty flag geven en op basis daarvan er doorheen loopen en de wijzigingen ophalen.

Zelf heb ik voor de verschillende types een getSql methode gemaakt. Deze maakt van de latlng of polygon dan een string die MySQL begrijpt (WKT).

Bijvoorbeeld:
JavaScript:
1
2
3
GMarker.prototype.getSql = function(){
  return "POINT(" + this.getLatLng().lng() + " " + this.getLatLng().lat() + ")";
}


Bijhouden bijvoorbeeld doen door:
GMarker:
http://code.google.com/ap...ence.html#GMarker.dragend - Andere locatie
http://code.google.com/ap...GMarker.visibilitychanged - Verborgen
http://code.google.com/ap...rence.html#GMarker.remove - Verwijderd

GPolygon:
http://code.google.com/ap...nce.html#GPolygon.endline
http://code.google.com/ap...ence.html#GPolygon.remove

Om te weten waar de marker/polygon/polyline naar refereerd sla ik meestal bij het aanmaken van het object de id van het object op in zichtzelf, erg handig als je dingen wilt doen met updaten e.d.
JavaScript:
1
aMapObjects[0]._iId = 1;



Edit:

Nog een tip, de geometry controls van de utility library. Die gebruik ik als basis voor de functionaliteit in ons CMS.

https://gmaps-utility-lib...ntrols/examples/test.html

[ Voor 7% gewijzigd door UltimateB op 22-03-2010 20:40 ]

"True skill is when luck becomes a habit"
SWIS


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 23-05 15:21

NMe

Quia Ego Sic Dico.

Topicstarter
pedorus schreef op maandag 22 maart 2010 @ 20:12:
[...]

Dat verschil zal niet heel erg meetbaar zijn denk ik, maar dat hangt nogal af van de gebruikers. :) In ieder geval heb je bij zo'n extra laagje ook weer kans op extra bugs/ontbrekende functionaliteiten/andere problemen natuurlijk.
Mwah, de applicatie waar het om gaat moet redelijk complexe dingen kunnen weergeven en er geldt dat hoe gedetailleerder het tekenen op de map gedaan wordt, hoe beter de losse applicaties die de data gebruiken worden. In beide gevallen wordt het trager naarmate er meer punten op de map staan, maar dat is dus ook de reden dat ik liever niet overmatig ga bloaten. Ik heb al Mootools en de Google API included, daar wil ik het liever bij houden. :+
Je hebt vast dit al gevonden dan: ook hier is geen gedocumenteerde methode voor...
Die had ik inderdaad gevonden alleen had dat niets met dat probleem te maken. ;) De issue die ik had was dat ik een marker wilde plaatsen op een polygon en dat de maps API het click event niet doorstuurt naar de volgende node in the DOM. Simpele kwestie van een click event maken op de polygon en onder bepaalde condities de click-event van de marker aanroepen. Werkt als een zonnetje inmiddels. :+

Wat ik bedoelde was dat ik een polygon wil kunnen verwijderen als ik erop dubbelklik, maar het dblclick-event lijkt niet geregistreerd te zijn voor polygons. Wat best vreemd is, aangezien het bij markers prima werkt. :o

edit:
Oh, ik zie dat er onderaan de pagina inderdaad nog meer staat over dat probleem. :D Die oplossing is wel ranzig trouwens. :X Maar goed, als het werkt hoor je mij niet klagen.
UltimateB schreef op maandag 22 maart 2010 @ 20:24:
Om te weten waar de marker/polygon/polyline naar refereerd sla ik meestal bij het aanmaken van het object de id van het object op in zichtzelf, erg handig als je dingen wilt doen met updaten e.d.
JavaScript:
1
aMapObjects[0]._iId = 1;
Da's wel een hele goeie tip trouwens, dat maakt het benaderen van de zooi een stuk eenvoudiger. Thanks. :)

[ Voor 12% gewijzigd door NMe op 22-03-2010 21:32 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • UltimateB
  • Registratie: April 2003
  • Niet online

UltimateB

Pomdiedom

Dubbelklik is niet zo heel moeilijk te simuleren tho, lekker met een setTImeout aan de slag om te kijken of een klik binnen een bepaalde tijd na de eerste is geweest.

"True skill is when luck becomes a habit"
SWIS


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
UltimateB schreef op maandag 22 maart 2010 @ 21:59:
Dubbelklik is niet zo heel moeilijk te simuleren tho, lekker met een setTImeout aan de slag om te kijken of een klik binnen een bepaalde tijd na de eerste is geweest.
Dat is inderdaad precies wat er in die thread besproken wordt. ;) Het probleem is enkel dat de lengte van de timeout eigenlijk een systeeminstelling zou moeten zijn, en niet een vaste waarde. Een 100% workaround is het dus nooit. Ik zou niet 300ms, maar 500ms (standaard windows) aanhouden, zoals hier (gelinkt vanaf bug/debat over click/dbclick-gedrag van GMap2 - dat event zou je trouwens misschien ook kunnen gebruiken (ongetest). Hoewel, daar staat weer 'The overlay argument is always set to null.' - handig :X).

[ Voor 12% gewijzigd door pedorus op 22-03-2010 22:31 ]

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 23-05 15:21

NMe

Quia Ego Sic Dico.

Topicstarter
pedorus schreef op maandag 22 maart 2010 @ 22:23:
[...]

zou je trouwens misschien ook kunnen gebruiken (ongetest)?).
Ik bedenk net dat ik eventueel een doubleclick op de map kan zetten en voor elke poly (die ik nu toch moet opslaan) kan checken of dat punt binnen die polyline valt met een contains(). Dat is netter in code dan de dubbelklik-simulatie. Aan de andere kant zal het ook wel een heel stuk trager zijn, zeker als er veel polygons zijn. Ik ga er nog even over bomen. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Kans zit er in dat dat dus niet kan: "Notice that this event will not be fired if the double click was on a marker or other clickable overlay."

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 23-05 15:21

NMe

Quia Ego Sic Dico.

Topicstarter
pedorus schreef op maandag 22 maart 2010 @ 22:35:
Kans zit er in dat dat dus niet kan: "Notice that this event will not be fired if the double click was on a marker or other clickable overlay."
Je kan clickable op off zetten en dan zou dat niet mogen gebeuren. Nog een andere optie is overigens om niet te verwijderen op een dubbelklik maar daadwerkelijk eerst op een knop "verwijderen" klikken en op basis daarvan de click-event anders te maken. Is misschien zelfs wel handiger wat workflow betreft. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 23-05 15:21

NMe

Quia Ego Sic Dico.

Topicstarter
Ik heb het inmiddels geheel werkend geïmplementeerd met behulp van een schaduwarray elk voor de markers, polygons en polylines (al gebruik ik die laatste nog niet :P ) en ben dermate opgeschoten dat ik netjes alles via AJAX kan opslaan en weer uitlezen, ook na diverse edits, deletes en vertex-inserts; 't was een bijzonder productief dagje. :+

Nou alleen nog mijn PHP-implementatie van encoded polylines werkend krijgen en dan ben ik happy met het aanmaken van nieuwe maps en het uitlezen van bestaande, daarna hoef ik alleen edits nog maar werkend te krijgen, wat lichtelijk spannend gaat zijn. :Y)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1