Avatar billede angelenglen Nybegynder
10. marts 2011 - 15:25 Der er 26 kommentarer og
1 løsning

Google Maps API v3 Definer område via drag & drop

Jeg er ved at lave noget i Google Maps API v3, og har brug for at kunne angive et firkantet område.

P.t. gør jeg det ved at man klikker én gang på kortet for at definere det første hjørne af det firkantede område, derefter klikker man igen for at definere det diagonalt modsatte hjørne.

Det vil jeg gerne gøre anderledes, således at jeg først klikker på en knap (<button>), derefter klikker og holder musen nede, flytter musen og slipper den når jeg har defineret det område jeg vil.

Hvis jeg p.t. klikker på kortet og holder musen nede, flytter den bare rundt på korter. Det må kortet normalt også gøre, men altså ikke mens jeg skal definere området, derfor jeg vil aktivere en slags "markerings-tilstand" ved hjælp af klik på knappen først.

Nogen der har forslag til hvordan det gøres?

Jeg har prøvet at illustrere det på følgende billede, men jeg er ikke sikker på om det forklarer det bedre?
http://www.thespirit.dk/GoogleMapsDragDrop.png
Avatar billede olebole Juniormester
10. marts 2011 - 17:11 #1
<ole>

Hvis jeg forstår spørgsmålet korrekt, har det vist intet med 'drag & drop' at gøre  :)

Du kunne oprette et div, der ligger lige ovenpå kortet (absolut positionering og z-index). Normalt skal det være gemt, men når du klikker på knappen for 'udvælgelse med musen', vises divet. Omvend skal det gemmes, når brugeren afslutter sin udvælgelse med mouseup.

På divet aftaster du så bare brugerens mousedown, -move og -up events og bruger disse til at definere det ønskede rektangel.

</mvh
</bole>
Avatar billede angelenglen Nybegynder
10. marts 2011 - 17:18 #2
Hehe ja der skal selvfølgelig ikke stå "drag & drop", det er bare min kammerat der beskriver det på den måde hele tiden, og så er jeg nok blevet lidt skadet af det ;-)

God idé med div'en over kortet, det havde jeg ikke tænkt på.
Det burde løse problemet.

Du må meget gerne lægge et svar for points :-)
Avatar billede olebole Juniormester
10. marts 2011 - 17:29 #3
Jeg kommer her efterhånden meget sjældent, så jeg samler ikke længere points. Læg selv et svar og accepter det ... men tak for tilbudet  =)
Avatar billede angelenglen Nybegynder
10. marts 2011 - 17:31 #4
Fair nok :-)
Tak for hjælpen!
Avatar billede olebole Juniormester
10. marts 2011 - 17:33 #5
PS: Læg dit kort i et relativt positioneret div. Så vil et indlejret div lægge sig korrekt med disse styles:

style="position:absolute;left:0;top:0;width:100%;height:100%;z-index:1000;display:none"


- og så "tænder" du det bare som vanligt ved at sætte display til "block"
Avatar billede olebole Juniormester
10. marts 2011 - 17:33 #6
- og selvtak  ;o)
Avatar billede angelenglen Nybegynder
10. marts 2011 - 18:31 #7
Hmm jeg var måske lige hurtig nok til at lukke :-/

Jeg har lavet et lille eksempel:
http://thespirit.dk/mapstest/

Når jeg holder musen nede et sted over kortet, og dragger til et andet sted, og slipper musen, virker det fint - den skriver koordinaterne øverst til højre.

Men hvis jeg gør det samme igen umiddelbart efter, forsøger browseren at dragge selve min div, hvilket ikke er meningen.

Hvis jeg klikker et andet sted først, fx et sted på body, så kan jeg igen udføre ét drag over kortet før fejlen opstår igen.

Jeg kan ikke lige gennemskue hvorfor, jeg har endda forsøgt at returnere true fra mine javascript funktioner, det ændrer intet.

baggrundsbilledet på div'en er blot for at det er lettere at se om div'en er block eller none, det ændrer intet ved ovenstående opførsel at fjerne baggrunden.
Avatar billede olebole Juniormester
10. marts 2011 - 18:48 #8
Prøv at returnere false i slutningen af dragStart
Avatar billede angelenglen Nybegynder
10. marts 2011 - 18:57 #9
Nice, det gjorde en god forskel :-D
Avatar billede olebole Juniormester
10. marts 2011 - 19:26 #10
Jeg har skrevet dit eksempel lidt om. Det kan godt gøres mere elegant, men nu har du noget at bygge videre på:


<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<style type="text/css">
  html { height: 100% }
  body { height: 100%; margin: 0px; padding: 0px }
  #map_canvas { height: 100% }
</style>
<script type="text/javascript"
    src="http://maps.google.com/maps/api/js?sensor=false">
</script>
<script type="text/javascript">
  function initialize() {
    var latlng = new google.maps.LatLng(-34.397, 150.644);
    var myOptions = {
      zoom: 8,
      center: latlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var map = new google.maps.Map(document.getElementById("map_canvas"),
        myOptions);
  }

function getPos(elm) {
    for(var zx=zy=0;elm!=null;zx+=elm.offsetLeft,zy+=elm.offsetTop,elm=elm.offsetParent);
    return {x:zx,y:zy}
}

var coordX1 = "";
var coordX2 = "";
var coordY1 = "";
var coordY2 = "";
var oRect = null;
var bDragEnabeld = false;
function toggle() {
    if (!oRect) oRect = document.getElementById("rect");
    var css = document.getElementById('overlay').style;
    var css2 = oRect.style;
    if (css.display == 'block') {
        css.display = 'none';
        css2.display = 'none';
    } else {
        css.display = 'block';
    }
}
function dragStart(event) {
    if (!oRect) oRect = document.getElementById("rect");
    var oPos = getPos(oRect.parentNode);
    var css = oRect.style;
    coordX1 = event.clientX-oPos.x;
    coordY1 = event.clientY-oPos.y;
    css.left = coordX1+"px";
    css.top = coordY1+"px";
    css.width = 0;
    css.height = 0;
    css.display = "block";
    bDragEnabeld = true;
    event.returnValue = false;
}
function dragMove(event) {
    if (!bDragEnabeld) return;
    var oPos = getPos(oRect.parentNode);
    var x = event.clientX-oPos.x;
    var y = event.clientY-oPos.y;
    var css = oRect.style;
    if (x<coordX1) {
        css.width = (coordX1-x)+"px";
        css.left = x+"px";
    } else {
        css.width = (x-coordX1)+"px";
        css.left = coordX1+"px";
    }
   
    if (y<coordY1) {
        css.height = (coordY1-y)+"px";
        css.top = y+"px";
    } else {
        css.height = (y-coordY1)+"px";
        css.top = coordY1+"px";
    }
    event.returnValue = false;
}
function dragEnd(e) {
    e = e ? e : event;
    var oPos = getPos(oRect.parentNode);
    coordX2 = e.clientX-oPos.x;
    coordY2 = e.clientY-oPos.y;
    document.getElementById('res').innerHTML = "Drag start: "+coordX1+","+coordY1+"\n | Drag end: "+coordX2+","+coordY2;
    bDragEnabeld = false;
}
document.onmouseup = dragEnd;
 
</script>
</head>
<body onload="initialize()">
    <table border="1" cellpadding="0" cellspacing="0">
        <tr>
            <td align="right">
                Mouse coordinates:
            </td>
            <td>
                <div id="res">Drag start: 0,0 | Drag end: 0,0</div>
            </td>
        </tr>
        <tr>
            <td>
                <div id="container" style="position:relative; width:640px; height:480px; z-index:100">
                    <div id="map_canvas" style="position:absolute;left:0;top:0;width:640px;height:480px;z-index:500;display:block;"></div>
                    <div id="overlay"    style="position:absolute;left:0;top:0;width:640px;height:480px;z-index:1000;display:block;opacity:0.5;filter:alpha(opacity=50); background-image:url(bg.png);" onmousedown="dragStart(event);" onmousemove="dragMove(event);"></div>
                    <div id="rect" style="position:absolute;left:0;top:0;display:none;border:1px dashed red;z-index:999"></div>
                </div>
            </td>
            <td>
                <button type="button" onclick="toggle()">ToggleOverlay</button>
            </td>
        </tr>
    </table>
</body>
</html>


Avatar billede olebole Juniormester
10. marts 2011 - 19:29 #11
Jeg fik vist lavet en sdavøfajl i begyndelsenm af scriptet. Det gør egentlig ikke noget, da jeg har copy/pasted den i resten af dokumentet - men for en ordens skyld, så sdavøs bDragEnabeld altså bDragEnabled  *D
Avatar billede olebole Juniormester
10. marts 2011 - 19:35 #12
- og da det vel også skal virke i andet end IE, må vi hellere stoppe eventen der også:


function dragStart(event) {
    if (!oRect) oRect = document.getElementById("rect");
    var oPos = getPos(oRect.parentNode);
    var css = oRect.style;
    coordX1 = event.clientX-oPos.x;
    coordY1 = event.clientY-oPos.y;
    css.left = coordX1+"px";
    css.top = coordY1+"px";
    css.width = 0;
    css.height = 0;
    css.display = "block";
    bDragEnabeld = true;
    if (event.preventDefault) event.preventDefault();
    event.returnValue = false;
}

Avatar billede olebole Juniormester
10. marts 2011 - 19:40 #13
PS: funktionen getPos returnerer et objekt med x- og y-værdi (left og top) for det HTMLElement, der medsendes som argument.

event.clientX og event.clientY afspejler x- og y-værdien i forhold til body elementet. Kortets container ligger dog ikke nødvendigvis i 0,0, så du må nødvendigvis kende dennes position for at kunne beregne lokale x- og y-værdier udfra event værdierne
Avatar billede angelenglen Nybegynder
10. marts 2011 - 21:21 #14
Jeg stødte i mellemtiden på et script Google har lavet, der tillader zoom ved at holde shift-tasten nede, og så dragge på kortet.

Jeg pillede lidt ved scriptet, og fik det til at virke både som jeg ønskede (med klik på knap først) og med shift-tasten som en ekstra bonus.

Mit opdaterede resultat kan nu ses her:
http://thespirit.dk/mapstest/

Det virker ganske tilfredsstillende.

At den p.t. gemmer værdierne for de fundne koordinater i input-felter er blot for at lette fejlfinding og let at illustrere at det virker.
Senere bliver det ændret så det passer bedre til resten af mine scripts selvfølgelig :-)
Avatar billede olebole Juniormester
10. marts 2011 - 21:32 #15
Klik på det gule advarselsikon nederst til venstre i IE (går udfra, det er der, du tester) og husk at klikke fluebenet til i boksen "Vis altid denne meddelelse ...". Det er meget vigtigt, når du roder med JavaScript. I Firefox skal du altid have fejlkonsollen åben  ;o)
Avatar billede angelenglen Nybegynder
10. marts 2011 - 21:41 #16
testede den i både IE, Firefox og Chrome, den virker alle steder.

Ja, den melder godt nok nogle fejl, men det er ikke unormalt når man bruger kode der tager højde for alle browsere, hvilket googles script gør.
De fejl den melder, var også til stede inden jeg pillede ved scriptet, og jeg har ikke sat mig nok ind i Googles script til at kunne gennemskue hvordan fejlen evt. kan fjernes.
Avatar billede olebole Juniormester
10. marts 2011 - 21:48 #17
Undskyld, med med al respekt, så er "Ja, den melder godt nok nogle fejl, men det er ikke unormalt når man bruger kode der tager højde for alle browsere, hvilket googles script gør." noget frygtelig vrøvl.

Det er kun dårlig kode, der smider JavaScript fejl. Det er udelukkende et spørgsmål om sjusk og/eller manglende faglig viden hos den, der skriver koden, hvis den smider fejl. Du kan kalde det forskel på en god møbelsnedker og en sløjdelev.

Gad vide, hvad du ville sige til lægen, der siger: "Jaja, det kan da godt være, den sprøjter i alle retninger - men det er meget normalt, når vi både skal kunne operere mænd og kvinder for urinvejslidelser"?  *D
Avatar billede olebole Juniormester
10. marts 2011 - 21:50 #18
- og nej, scriptet virker netop ikke alle steder. Jeg skal klikke på JS-fejlen i IE, hvergang den popper op. Så virker det ikke  ;o)
Avatar billede angelenglen Nybegynder
10. marts 2011 - 22:21 #19
Er "Vis altid denne meddelelse ..." aktiveret som standard i IE?
Avatar billede olebole Juniormester
11. marts 2011 - 00:12 #20
Kun hos udviklere. Der er alt andet utænkeligt  =)

Men det er sådan set ikke så interessant. Man skriver naturligvis bare koden, så den ikke fejler. Ellers er den jo også et helvede at vedligeholde og/eller opdatere.

Den kode, jeg skrev ovenfor fejler ikke, så det er ikke Google's skyld, din kode fejler. De har således ikke problemer med at skrive X-browser kode, som ikke fejler  :)
Avatar billede angelenglen Nybegynder
11. marts 2011 - 00:45 #21
Det er Googles script, og scriptet fejler.
Hvorledes er det ikke googles fejl?

*alle* har problemer med at skrive X-browser kode, som ikke fejler.
Nogle klarer det bedre end andre, men alle har problemer med det, i større eller mindre grad.

Anyway jeg har fixed det så det ikke giver fejl i hverken IE eller Chrome, og i Firefox giver den kun warnings der åbenbart er umulige at få bugt med.
Avatar billede angelenglen Nybegynder
11. marts 2011 - 00:47 #22
Ps. Jeg tror du har misset at jeg nu bruger Googles "KeyDragZoom for V3" script.
Det er dét script der forsagede fejlene.
Avatar billede olebole Juniormester
11. marts 2011 - 04:20 #23
*LoL* Hvordan hænger dette:
    "Det er Googles script, og scriptet fejler.
    Hvorledes er det ikke googles fejl?"

- sammen med:
    "Anyway jeg har fixed det så det ikke giver fejl i hverken IE eller Chrome"?

Det var vel nærmere din implementering af Google's script, der gav fejl. Du har næppe rettet Google's kode ... eller?  =)

Nu ved jeg ikke, hvem du har arbejdet sammen med, men der, hvor jeg har arbejdet, har folk generelt ikke haft problemer med at skrive X-browser kode.

I sjældne og helt specielle tilfælde, hvor en browsers opførsel kommer bag på een og erfaringen ikke slår til, kan der være lidt drillerier - som dog sjældent tager ret lang tid at knække.

Derfra og til en opgivende holdning som:
    "Det virker ganske tilfredsstillende [...] Ja, den melder godt nok nogle fejl, men det er ikke unormalt når man bruger kode der tager højde for alle browsere"

- er der godt nok langt! Det er i hvertfald ikke en 'luksus', man kan tillade sig som professionel
Avatar billede angelenglen Nybegynder
11. marts 2011 - 07:48 #24
Det var vel nærmere din implementering af Google's script, der gav fejl. Du har næppe rettet Google's kode ... eller?  =)

Det har jeg faktisk.
Scriptet kommer som en .js-fil, og fejlbeskeden sagde tydeligt hvilken linje der fejlede.
Det hjalp lidt med at rette fejlen.
Det er ikke alt Google laver der kører som en cloud-baseret tjeneste et sted derude, meget af det kører lokalt og er frit tilgængeligt.
Dette script kommer herfra:
http://google-maps-utility-library-v3.googlecode.com/svn/tags/keydragzoom/2.0.1/examples/dragzoom.html
Som du kan se, fejler det også dér, på Googles egen hostede løsning.

Jeg har ikke på noget tidspunkt sagt at dette skulle bruges professionelt.
Hvis det skulle bruges professionelt ville min holdning være helt anderledes, så ville jeg heller ikke nøjes med kun at teste i tre browsere.

Vedr. x-browser kode, så bare det at man skal tænke over det, viser at der er et problem dér.
Men jeg kan høre vi har forskellige opfattelser af hvad ordet problem kan betyde, så det vil jeg ikke komme nærmere ind på.
Men alene dét at man bør teste i flere browsere, vidner om at det er en almindelig, ofte forekommende og udbredt problemstilling.
Avatar billede olebole Juniormester
11. marts 2011 - 12:24 #25
Har man lavet skjulte fejl, bør man naturligvis rette dem, inden arbejdet kan kaldes færdigt. Det er ikke noget, du har problemer med at forklare din PC-forhandler, automekaniker eller læge - så det bør du også selv leve op til.

Spørgsmålet, der står tilbage, er, hvorfor i alverden du dog koder web ...?!??!!! Hvis det er noget, man nyder, er det da tåbeligt at snuppe alle skarpe hjørner for at blive hurtigst muligt færdig.

Det ville du aldrig overveje, hvis du sad foran en rigtig lækker middag - og du dyrker forhåbentlig heller ikke sex for at blive lynhurtigt færdig og kunne lægge dig til at sove.

Måske, du skulle overveje at dyrke rygcrawl eller orkideer i stedet for  =)
Avatar billede angelenglen Nybegynder
11. marts 2011 - 13:23 #26
Jeg syntes det er lidt groft de ting du beskylder mig for, uden at vide noget som helst om min baggrund.
Dette var til et hyggeprojekt, der skal bruges én gang, af 5 brugere.
Derfor kan jeg godt, i dette ene tilfælde, leve med mindre, ikke-generende fejl.
Avatar billede olebole Juniormester
11. marts 2011 - 13:45 #27
Åh Herregud! Hvad er det da, du mener, jeg "beskylder" dig for?

Jeg tillader mig blot at undre mig, hvergang jeg oplever folk, der bruger deres (fri)tid på noget, de helst vil have overstået så hurtigt og let som overhovedet muligt.

Der er mange muligheder for at fylde sit liv med forskellige, interessante gøremål, så det burde være muligt at finde et "hyggeprojekt", man kan nyde og hygge sig med.

Lad os i det mindste glæde os over, at folk er forskellige - og at der helt åbenlyst findes meget forskellige opfattelser af begrebet "livsnydelse"  ;o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Stærk sagsbehandler til støtte for Kapacitetsmanager og egen portefølje

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Nye kolleger søges til IT Stab i Forsvaret

Digitaliseringsstyrelsen

Systemforvalter til borger.dk

Capgemini Danmark A/S

IGNITE Graduate Program 2026