Avatar billede ingeman Seniormester
28. maj 2007 - 12:47 Der er 4 kommentarer og
1 løsning

Tilføj kasse som består af latitude + longitude kordinater.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml">
  <head>
<meta name="Generator" content="Stone's WebWriter 4">
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>

    <style type="text/css">
    v\:* {
      behavior:url(#default#VML);
    }
    </style>

    <title>GM API: shape getter</title>
    <script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAH6gR4TcjkaLPaO9hB6_0ARR5bH6Db6o3HJBIWNvtad6FfROENBTBM7JExw3X4y5hxQkoDeJMrpeISQ"
    type="text/javascript"></script>
    <script type="text/javascript">
    //<![CDATA[

/* (c) 2007 Witold Rugowski http://nhw.pl

v0.1 - 2007-02-09 - Initial release, tested in FF, some quirks in IE
v0.2 - 2007-03-27 - Improved release - drag&drop, changed icon
v0.3 - 2007-05-15 - Fixed blocked drag&drop
*/
var points = new Array()
var markers = new Array()
var map
var line = undefined
var vertex = true


var new_icon = new GIcon()
new_icon.image = "http://nhw.pl/tmp/cross.png"
new_icon.size = new GSize(16,16)
new_icon.iconAnchor = new GPoint(8,9)
new_icon.infoWindowAnchor = new GPoint(7,7)

var opt
opt = {}

opt.icon = new_icon
opt.draggable = true
opt.clickable = false
opt.dragCrossMove = true


var geocoder = new GClientGeocoder();

function showAddress(address) {
  geocoder.getLatLng(
    address,
    function(point) {
      if (!point) {
        alert(address + " not found");
      } else {
     
     
     
     
        map.setCenter(point, 06);
      }
    }
  );
}

function load() {
  if (GBrowserIsCompatible()) {
    map = new GMap2(document.getElementById("map"));
    map.setCenter(new GLatLng(52.2419, 21.01), 4);
    map.addControl(new GLargeMapControl())
    map.addControl(new GMapTypeControl())

    GEvent.addListener(map, "click", function (marker, point) {
      if (!vertex)    //dont add new points in Polygon mode
        return
      if (!marker) {
     
        new_marker = new GMarker(point,opt)
        map.addOverlay( new_marker )
        markers.push(new_marker)
        GEvent.addListener(new_marker,'dragend', function(){
          points[markers.indexOf(this)] = this.getPoint()
          reDraw()
          asArray()
        })
       
         
      }
      points.push(point)
      asArray()
      reDraw()
    }
    )
  }
}

function clearPoints() {
  points= new Array()
  markers= new Array
  map.clearOverlays()
  document.getElementById("output").innerHTML = ""
  line = undefined
  vertex = true
}

function toArray() {
  html = "var points = new Array()<br/>"
  for (i=0; i<points.length; i++) {
    html = html + 'points['+i+'] = [' + points[i].lat() +
            ', ' + points[i].lng() + ']<br/>'
       
  }
  return html
}

function toGLatLng() {
  html = "[<br/>"
  for (i=0; i<points.length; i++) {
    html = html + ' new GLatLng(' + points[i].lat() +
            ',' + points[i].lng() + ')'
    if (i <points.length-1)
      html = html +',<br/>'
    else
      html = html + '<br/>]<br/>'
       
  }
  return html
}

function asArray() {
  document.getElementById("output").innerHTML = toArray()
}

function asGLatLng() {
  document.getElementById("output").innerHTML = toGLatLng()
}

function reDraw() {
  if (vertex) {
    if (line) {
      map.removeOverlay(line)
    }
    line = new GPolyline( points )
    map.addOverlay(line)
  } else {
    map.clearOverlays()
    map.addOverlay(new GPolygon(points,'#000000',2,1,'#FF0000',.5))
  }
}

function delLast() {
  points.pop()
  map.removeOverlay(markers.pop())
  reDraw()
}

function reShape() {
  map.clearOverlays()
  vertex = !vertex
 
  if (vertex)
    for (i=0;i<markers.length;i++)
      map.addOverlay(markers[i])
 
  reDraw()
}
    //]]>
    </script>
  </head>
  <body onload="load()" onunload="GUnload()">
    <div style="float:right;width:290px;">

<p style="font-size:0.8em; font-family:verdana,serif">(c) 2007 Witold Rugowski (NetManiac). <a href="http://nhw.pl/">Read more on my
blog</a>
</p>
<form action="#" onsubmit="showAddress(this.address.value); return false">
      <p>
        <input type="text" size="40" name="address" value=""></input>
        <input type="submit" value="Find!"></input>
      </p>
</form>

    <input type="button" onclick="clearPoints();" value="Clear"/>
    <input type="button" onclick="delLast();" value="Delete last"/>
    <input type="button" onclick="asArray();" value="As Array"/>
    <input type="button" onclick="asGLatLng();" value="As GLatLng"/>
    <input type="button" onclick="reShape();" value="Vertexes/Polygon"/>

   
    <div id="output" style="font-size:9px;font-face:Courier"></div></div>
    <div id="map" style="width: 650px; height: 700px"></div>
    <div style="width:600px;padding:10px;font-size:0.9em">

<p>
Find Your area, click to mark vertexes. Test shape with
<em>Vertex/Polygon</em> switch. When are You ready get output as array of
arrays with lat and lng values or as array of ready to use in GM API powered
applications GLatLng objects (<em>AsArray</em> and <em>As GLatLng</em>
buttons). Use drag&amp;drop to rearrange vertexes.

</p>

<p>

<strong>Remarks:</strong><br/> It tends to become slow when You add more
than 20 points.<br/>
You may be interested in made by me <a href="states.html">shapes of 50 US states</a>.

</p> </div>

<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-385614-1";
urchinTracker();
</script>

</body>
</html>

---------------------
Der skal tilføjes til ovennævnte en kasse udfra latitude longitude kordionater - det vand (lyseblå) som er indenfor kordinaterne skal ændre farve til mørkeblå.
Avatar billede crazysnap Seniormester
28. maj 2007 - 23:26 #1
Hej ingeman,


Din problemstilling er ikke helt klar. Der er forskellige repræsentationer of longitude/latitude koordinater, så hvor kommer de fra i din problemstilling?


- Er det koordinater brugeren taster ind som f.eks. ("49 30 16 E", "123 15 10 N") eller måske i decimal (49.504443, 123.25277)?  --> (lon, lat)

- Eller skal brugeren klikke på kortet for at få lon/lat koordinater?

- Hvor mange koordinater skal kassen udgøres af?
    1) To koordinater som udgør en min og max værdi for kassen?
    2) Kassen skal udregnes ud fra en mængde af punkter?
    3) Eller skal kassen bare have en fast højde og bredde og placeres udfra en enkelt lon/lat koordinat (f.eks. i centrum af kassen)


Mvh.

- Snap :)
Avatar billede ingeman Seniormester
29. maj 2007 - 17:43 #2
hej,
det er decimal værdier - du kan prøve at klikke på kortet.
1) nej
2) ja
3) Nej

mvh

Ingeman
Avatar billede crazysnap Seniormester
29. maj 2007 - 20:43 #3
Hej ingeman,


Så har jeg lavet en javascript metode der laver en rektangel udfra de valgte punkter (hvis der er minimum 2 punkter valgt). Rektanglen bliver tegnet i en mørkere blå farve end vandet og er halv-gennemsigtig. Du skriver godt nok at det kun er vandet (og ikke også landet) indenfor rektanglen som skal være mørkeblåt, men om det er muligt, aner jeg ikke. For at det skulle kunne lade sig gøre skulle kystlinjerne være kendte og bruges til at udregne skæringspunkter med rektanglen osv osv... Men metoden ses nedenfor, du kan jo prøve at copy/paste den ind ved siden af det andet java script:


function drawRectangle(clearOverlay)
{
  if(clearOverlay)
    map.clearOverlays();
 
  if(points.length > 1)
  {
      var lPoints = new Array();
     
      var minLon = 1000; var maxLon = -1000;
      var minLat = 1000; var maxLat = -1000;
     
      for (i=0; i<points.length; i++)
      {
          //lægger deres negative max værdi til så jeg kan bruge
          //Math.min og Math.max til at finde bounds
          var lng = points[i].lng() + 180;
          var lat = points[i].lat() + 90;
         
          minLon = Math.min(lng, minLon);  minLat = Math.min(lat, minLat);
          maxLon = Math.max(lng, maxLon);  maxLat = Math.max(lat, maxLat);
      }
     
      minLat -= 90; maxLat -= 90; minLon -= 180; maxLon -= 180;
     
      lPoints.push(new GLatLng(minLat, minLon)); lPoints.push(new GLatLng(minLat, maxLon));
      lPoints.push(new GLatLng(maxLat, maxLon)); lPoints.push(new GLatLng(maxLat, minLon));
      lPoints.push(new GLatLng(minLat, minLon));
     
      map.addOverlay(new GPolygon(lPoints,'#000000',1,1,'Blue',.5))
  }
}


Og tilføje endnu en knap til siden ved siden af de andre input knapper:  :)


<input type="button" onclick="drawRectangle(true);" value="Vertexes/Rectangle"/>



Mvh.

- Snap :)
Avatar billede ingeman Seniormester
23. juni 2007 - 11:05 #4
åbn svar
Avatar billede crazysnap Seniormester
30. juni 2007 - 18:40 #5
Hej ingeman,

Der kommer et svar her! :)


Mvh.

- Snap
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