Vissza az előzőleg látogatott oldalra (nem elérhető funkció)Vissza a tananyag kezdőlapjára (P)Ugrás a tananyag előző oldalára (E)Ugrás a tananyag következő oldalára (V)Fogalom megjelenítés (nem elérhető funkció)Fogalmak listája (nem elérhető funkció)Oldal nyomtatása (nem elérhető funkció)Oldaltérkép megtekintése (D)Keresés az oldalon (nem elérhető funkció)Súgó megtekintése (S)

Open Source rendszerek a térinformatikai gyakorlatban – Interaktív webtérképek készítése OpenLayers és MapServer használatával / Vetületek és koordináták

Tanulási útmutató

Összefoglalás

Vetületek definiálása. Koordináták transzformálása vetületek között. Koordináták nyerése címekből és fordítva (geokódolás).

Követelmény

  • A tanuló ismerje meg a vetületek definiálásának lehetőségeit a proj.4 segítségével, illetve saját transzformációs függvények írásával; továbbá az így definiált vetületek felhasználását.
  • Ismerje meg az OSM Nominatim geokódoló szolgáltatás felhasználási lehetőségeit.

Önállóan megoldható feladatok

  • Készítsen olyan térképes weboldalt, ahol az OpenStreetMap térkép egy pontjára kattintva kiírja az adott pont földrajzi és EOV koordinátáit.
  • Egészítse ki az előző feladat megoldását egy geokódolóval: a térképre kattintást lehessen egy szövegdobozba írt címmel is helyettesíteni.

Vetületek és koordináták

Vetületek az OpenLayersben

Bár az OpenLayers lehetőséget ad arra, hogy a különféle objektumoknál megadjuk azok vetületét, jelenleg csak az alapértelmezett WGS84 lat/lon és a Google-féle gömbi Mercator-vetület van képletekkel is definiálva. Ez akkor okoz problémát, ha a különféle vetületek között koordináta-átszámítást kell végeznünk. Ilyenkor két lehetőségünk van: felhasználjuk a proj4.js függvénykönyvtárat, vagy saját kezűleg definiálunk vetületet, az átszámítási függvények megírásával.

A proj4.js használatához először le kell töltenünk és el kell helyeznünk a használandó JavaScript fájlt a szerverünkön. Emellett szükségünk lesz a használandó vetületek proj.4 formátumú definíciójára, és már használhatjuk is őket. A definíciók szintaxisát a proj.4 weboldalán találhatjuk meg.

A következő példában WGS84-es földrajzi, gömbi Mercator és EOV koordináták között lehet átszámítani:

Forráskód
<!DOCTYPE html>
<html>
 <head>
  <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
  <title>proj4.js - vetületi átszámítások</title>
  <script src="proj4js/lib/proj4js.js"></script>
  <script src="http://openlayers.org/api/OpenLayers.js"></script>
  <script type="text/javascript">
   // EOV vetület proj4-es definíciója. Figyelem: az EPSG adatbázisban hibásan szerepel, a dátumtranszformáció hiányzik belőle!
   Proj4js.defs["EPSG:23700"] = "+title=Hungarian EOV EPSG:23700 +proj=somerc +lat_0=47.14439372222222 +lon_0=19.04857177777778 +x_0=650000 +y_0=200000 +ellps=GRS67 +datum=HD72 +towgs84=57.01,-69.97,-9.29 +units=m +no_defs"
   // létrehozunk egy-egy vetület objektum példányt a használandó vetületekhez
   var w=new OpenLayers.Projection("EPSG:4326");
   var g=new OpenLayers.Projection("EPSG:900913");
   var e=new OpenLayers.Projection("EPSG:23700");
   
   // az átszámítást irányító függvény
   function szamit(form,p)
   {
     if (p=='wgs84')
     {
       var pt=new OpenLayers.Geometry.Point(form.la.value,form.fi.value);
       var proj=w;
     }
     else if (p=='google')
     {
       var pt=new OpenLayers.Geometry.Point(form.gx.value,form.gy.value);
       var proj=g;
     }
     else
     {
       var pt=new OpenLayers.Geometry.Point(form.ex.value,form.ey.value);
       var proj=e;
     }
     var p1=pt.clone().transform(proj,w);
     var p2=pt.clone().transform(proj,g);
     var p3=pt.clone().transform(proj,e);
     with(form)
     {
       fi.value=p1.y.toFixed(6);la.value=p1.x.toFixed(6);
       gx.value=p2.x.toFixed(1);gy.value=p2.y.toFixed(1);
       ex.value=p3.x.toFixed(1);ey.value=p3.y.toFixed(1);
     }
   }
   
  </script>  
 </head>
 <body>
  <h1>proj4.js - vetületi átszámítások</h1>
  <form> 
   <table>
    <tr>
     <td>
      WGS84 latlon<br/>
      Φ: <input type="text" name="fi"/>
      Λ: <input type="text" name="la"/><br/>
      <input type="button" value="Átszámít" onclick="szamit(this.form,'wgs84')" />
     </td> 
     <td>
      Google Mercator<br/>
      x: <input type="text" name="gx"/>
      y: <input type="text" name="gy"/><br/>
      <input type="button" value="Átszámít" onclick="szamit(this.form,'google')" />
     </td> 
     <td>
      EOV<br/>
      x: <input type="text" name="ex"/>
      y: <input type="text" name="ey"/><br/>
      <input type="button" value="Átszámít" onclick="szamit(this.form,'eov')" />
     </td> 
    </tr>
   </table> 
  </form>
 </body>
</html>

Ha a vetületi egyenletet saját magunk akarjuk definiálni, akkor meg kell adnunk egy másik (általában a WGS84 lat/lon) rendszerbe való átszámítás oda-vissza egyenleteit a OpenLayers.Projection.addTransform függvény segítségével. Az átszámításokat egy-egy függvény végzi, melynek egyetlen paramétere egy point objektum, mely az átszámítandó koordinátákat tartalmazza. A http://www.sat24.com/image2.ashx?region=hu címen található műholdkép vetülete például a meteorológiában gyakran használt metsző sztereografikus vetület, 60°-os metsző szélességgel és 10°-os kezdőmeridiánnal. Az ehhez való átszámítás definíciója:

Forráskód
...
   var rad=Math.PI/180; // fok/radián váltószám
   var R=6378137; // közepes földsugár
   var c=1+Math.sqrt(3)/2; // c=1+sin(60°)
...
     // vetületi transzformáció definiálása a metsző sztereografikus vetülethez (la0=10)
     OpenLayers.Projection.addTransform("EPSG:4326","meteo_stereo",
        function (point) 
        {
          var fi=point.y;
          var la=point.x-10;
          var ro,x,y;
          with(Math)
          {
            ro=c*tan(PI/4-fi*rad/2);
            point.x=R*ro*sin(la*rad);
            point.y=-R*ro*cos(la*rad);
          }
          return point;
        }); 
     // inverz vetületi transzformáció definiálása a metsző sztereografikus vetülethez (la0=10)
     OpenLayers.Projection.addTransform("meteo_stereo","EPSG:4326",
        function (point) 
        {
          var x=point.x,y=point.y;
          with(Math)
          {
            ro=sqrt(x*x+y*y);
            if (ro==0)
              la=0;
            else
              la=acos(-y/ro)*sign(x)/rad;
            la+=10;
            if (la>180)
              la-=360;
            point.x=la;
            point.y=(PI/4-atan(ro/R/c))/rad*2;
          }
          return point;
        }); 
...

Vissza a tartalomjegyzékhez

Geokódolás az OSM Nominatim segítségével

Az OpenStreetMap Nominatim nevű szolgáltatásával egyszerűen geokódolhatunk bármilyen címet, vagy rendelhetünk címet egy koordináta-párhoz. Mindkét irányú művelet http-kérés kiadásával történik.

Az szolgáltatást kétféleképpen tudjuk használni JavaScriptben:

Forráskód
...
   var xmlhttp; // a http-kérésekhez
   if (window.XMLHttpRequest)
     {// code for IE7+, Firefox, Chrome, Opera, Safari
     xmlhttp=new XMLHttpRequest();
     }
   else
     {// code for IE6, IE5
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
     }    
   
   function geokodol(hely) // geokódoló kérést küldünk a Nominatimnak
   {
     if (hely=='')
       return;
     xmlhttp.open("GET",'/~saman/hu/okt/ol/xmlproxy.php?url=http://nominatim.openstreetmap.org/search?q='+hely+'%26format=json',false);
     xmlhttp.send();
     var valasz=eval('('+xmlhttp.responseText+')');
     if (valasz[0]) // ha van legalább egy eredmény...
       alert(valasz[0].display_name)
     else // ha nincs eredmény
       alert('Nincs találat.');
   }
...   
Forráskód
...
   function geokodol(hely) // geokódoló kérést küldünk a Nominatimnak
   {
     if (hely=='')
       return;
     var s=document.createElement('script');
     s.src='http://nominatim.openstreetmap.org/search?q='+hely+'&format=json&json_callback=helyetMutat';
     document.body.appendChild(s);
   }
   
   function helyetMutat(valasz)
   {
     if (valasz[0])
       alert(valasz[0].display_name)
     else // ha nincs eredmény
       alert('Nincs találat.');
   }
...   

Vissza a tartalomjegyzékhez

Új Széchenyi terv
A projekt az Európai Unió támogatásával, az Európai Szociális Alap társfinanszirozásával valósul meg.

A Társadalominformatika: moduláris tananyagok, interdiszciplináris tartalom- és tudásmenedzsment rendszerek fejlesztése az Európai Unió támogatásával, az Európai Szociális Alap társfinanszírozásával, az ELTE TÁMOP 4.1.2.A/1-11/1-2011-0056 projekt keretében valósult meg.
A tananyag elkészítéséhez az ELTESCORM keretrendszert használtuk.