Donnerstag, 10. März 2011

SDO nach GPX konvertieren - ein Beispiel

Für das Treffen der DOAG SIG Spatial nächste Woche in Potsdam bereite ich gerade meinen Vortrag zum Thema "Geodaten und XML in der Oracle-Datenbank" vor. Dabei werde ich (unter anderem) darauf eingehen, wie man mit den Mitteln der Datenbank aus einem SDO_GEOMETRY ein GPX-File erzeugen kann. Das kann interessant sein, wenn eine Geometrie eine Route repräsentiert und man diese auf ein Navigationsgerät laden möchte ...
Das Generieren der GPX-Datei ist (verwendet man die SQL/XML-Funktionen) sehr einfach. Hier ist eine PL/SQL-Funktion, die ein SDO_GEOMETRY entgegennimmt und ein GPX-File zurückgibt.
create or replace function make_gpx(
  p_name in varchar2,
  p_geom in sdo_geometry
) return xmltype is 
  v_gpx  xmltype;
  v_geom sdo_geometry;
begin
  -- CHECK FOR LINESTRING GEOMETRY
  if not p_geom.get_gtype() = 2 then   
   raise_application_error(-20000, 'CAN BUILD GPX TRACK ONLY FOR LINESTRING GEOMETRIES');
  end if;
  -- CHECK FOR LATLON GEOMETRY - TRANSFORM IF NOT 
  if p_geom.sdo_srid not in (4326, 8307) then
   v_geom := sdo_cs.transform(p_geom, 4326);
  else 
   v_geom := p_geom;
  end if;
  -- CONSTRUCT GPX XML 
  select
   xmlelement("gpx", 
    xmlattributes('http://www.topografix.com/GPX/1/1' as "xmlns"),
    xmlelement("trk",
     xmlelement("name", p_name),
     xmlelement("trkseg", 
     (
      select 
       xmlagg(
        xmlelement("trkpt",
         xmlattributes(v.y as "lat", v.x as "lon")
        )
       )
       from table(sdo_util.getvertices(v_geom)) v
      )
     )
    )
   ) into v_gpx 
  from dual;
  return v_gpx;
end;
/
sho err
Viel Spaß beim Ausprobieren ... und wer noch mehr zum Thema "Geodaten und XML" wissen möchte (und spontan ist), der kommt nächste Woche nach Potsdam zur DOAG SIG Spatial.