Dienstag, 24. Mai 2011

GeoJSON-Beispiel aus PL/SQL in OpenLayers

Oracle Maps und APEX seit der Version 4.0 verwenden das JSON - Format zum direkten Datenzugriff aus der Datenbank und effizienten Verarbeitung in Javascript. Dieses Format hat sich auf Grund seiner Kompaktheit, guten Lesbarkeit und der direkten Ansprechbarkeit in Javascript als implizite JavaScript-Objektnotation in der WebBrowser-Technologie recht gut durchgesetzt.


Somit ist es auch nahe liegend, dass Geo-Daten in dem JSON-Format als Vector-Layer z.B. in OpenLayers direkt dargestellt werden. Hierfür gibt es eine besondere Spezifikation zur Erstellung von Feature-Informationen: Das GeoJSON - Format. Unter anderem bieten der OGC-Konverter GDAL und der FME-Konverter von Safe die direkte Erstellung dieses Geo-Formates an.
In meinem hier vorgestellten Demo wird die Klick-Koordinate zum Suchen des Country-Polygons verwendet und anschließend das gefundene Polygon im GeoJSON-Format erzeugt:


CREATE OR REPLACE PROCEDURE get_simple_geojson_2 (p_x number, p_y number) IS

l_state varchar2(2);

FUNCTION fnc_get_state(p_x NUMBER, p_y NUMBER )
RETURN varchar2 IS
li_state varchar2(2);
BEGIN

SELECT /*+ ORDERD */
s.STATE_ABRV
into li_state
FROM states s
WHERE SDO_RELATE(s.geom,
SDO_GEOMETRY(2001,
8307,
SDO_POINT_TYPE(p_x, p_y, NULL),
NULL,
NULL),
'mask=CONTAINS') = 'TRUE'
AND ROWNUM<2;
RETURN(li_state);
EXCEPTION
WHEN OTHERS then
RETURN('RI');
END fnc_get_state;

FUNCTION get_XY (p_state varchar2) RETURN VARCHAR2 IS
l_coords varchar2(32767);
BEGIN
for l_xy in (SELECT t.X, t.Y
FROM states s,
TABLE(SDO_UTIL.GETVERTICES(s.geom)) t
WHERE s. STATE_ABRV = p_state
) loop
l_coords:= l_coords || '['|| l_xy.X ||','|| l_xy.Y ||'],';
end loop;
RETURN( substr(l_coords, 1, length(l_coords)-1) );
END get_XY;

BEGIN

l_state := fnc_get_state(p_x, p_y);

htp.p('
{
"type": "FeatureCollection",
"features": [
{"type":"Feature", "id":"OpenLayers.Feature.Vector_1489", "properties":{},
"geometry":{ "type":"Polygon",
"coordinates":[['
|| get_XY( l_state ) ||
']] },'||
'"crs":{"type":"OGC", "properties":{"urn":"urn:ogc:def:crs:OGC:1.3:CRS84"}}
}'||
']
}
'
);

end get_simple_geojson_2;
/

Die Verifizierung dieser GeoJSON-Polygone habe ich OpenLayers mit der entsprechenden Darstellung überlassen:
function handleMapClick(e)
{
var lonlat = map.getLonLatFromViewPortPx(e.xy);

var newgeojson = new OpenLayers.Layer.GML("My GeoJSON Layer",
'http://localhost:8089/mvdemo/get_simple_geojson_2?p_x='+lonlat.lon+'&p_y='+lonlat.lat,
{format: OpenLayers.Format.GeoJSON});

map.addLayer(newgeojson);
}

Sonntag, 15. Mai 2011

Oracle Embedded PL/SQL Gateway einrichten

Das Embedded PL/SQL Gateway ist ein 'interner' HTTP Listener der Oracle XMLDB und kann für die Entwicklung von PL/SQL - Web Toolkit Applikationen, z.B. mit Oracle Spatialfunktionen, sehr nützlich sein. Dabei wird die Konfigurierung des PL/SQL-DAD's mit der DBMS_EPG - Package verwendet. Entsprechend der hier gefundenen Beschreibung habe ich diesen Ablauf hier mit Erfolg getestet.

Test: http://localhost:8089/mvdemo/testPage


Nun könnten wir über dieses Embedded PL/SQL-Gateway auf die mvdemo - Geodaten zugreifen. Diese hier vorgestellte Konfigurierung sollte jedoch nur für Entwicklungszwecke dienen, für einen sicheren Betrieb müßte die Access Control List (ACL) entsprechend konfiguriert werden.


Friedhold

Donnerstag, 28. April 2011

SQL*PLUS für Windows in einer Oracle 11g DB Installation einrichten

Nach der Installation einer 11g Datenbank und eines 11g Clients suchte ich vergeblich das gewohnte SQL*PLUS für Windows (bin\sqlplusw.exe) !

Ganz so schnell geht der Umstieg auf DOS - sqlplus und SQLDeveloper, inzwischen in der Version 3.0 erschienen, nun doch nicht. Insbesondere haben sich in den Jahren Batch - Abläufe angesammelt, die lauffähige Statement-TODO's darstellen und demzufolge recht gern in SQL*PLUS angewendet werden. (Man denke nur an den zu protokollierenden Abgleich zwischen einer Test- und Produktionsdatenbank.)

Im Oracle Forum hatte ich den Hinweis zu einer Nachinstallation erhalten. Vorausgesetzt, es ist noch eine SQL*PLUS Installation vorhanden , kann man wie folgt vorgehen:
  1. Kopie der CLIENT_10g\bin\sqlplusw.exe in das ORACLE_11gDB\bin - Verzeichnis
  2. Kopie der ORACLE_HOME\bin\oraclient11.dll in ORACLE_11gDB\bin\Kopie-oraclient11.dll
  3. Umbenennung der Kopie-oraclient11.dll in oraclient10.dll
  4. Kopie der spwd.msd & spwus.msb aus dem CLIENT_10g\slqplus\msg - Verzeichnis in das ORACLE_11gDB\sqlplus\msg - Verzeichnis.
Ich habe mir auf dem Desktop den Link zum SQL*PLUS angelegt :-)

Hoffentlich hilft es Jemandem.
Friedhold



Montag, 22. Februar 2010

APEX als Web 2.0 BI Dashboard

Vor ca. 2 Jahren hatte ich an einem APEX - Roundtable mit Mike Hitchwa in Hamburg teilgenommenm, dabei konnten wir unsere Vorstellungen zu APEX - Komponenten äussern. Dass nun einige, dort diskutierte Komponenten real umsetzbar sind, zeigt folgendes Demo-Video, das Live - Demo kann ebenfalls erprobt werden.


Informationen werden unterschiedlich wahrgenommen und diese Wahrnehmung ist auch noch von aktuellen Prozessereignissen abhängig. Gerade Ausnahmesituationen möchte man zu Dashboard - Sichten zusammenstellen, so dass diese zusammengefasst beobachtet werden können.

PL/SQL trifft wieder einmal auf JavaScript und das mit der Robustheit und Performance von APEX !


Gruß,
Friedhold


Freitag, 6. Februar 2009

Oracle Forms WebStart mit dem JDK 1.6 und dem OC4J der iDSuite 10g

Die im Blog "SUN's Applet-Technologie .." erwähnten drei RIA - Technologien von SUN, Adobe und Microsoft ermöglichen die Ausführung der Applikationen sowohl im WebBrowser als auch direkt auf dem Desktop!
Ich möchte nun zeigen, wie man den Forms 10g WebStart mit dem OC4J der iDeveloper Suite 10gR2 und dem JDK 1.6 Update 11 testen kann:

  • Konfigurierung des OC4J der iDS10gR2 Suite:

    In der C:\iDS10gR2\forms\j2ee\orion-web.xml fügen wir in der Sektion "orion-web-app" ein :

directory-browsing="allow"

  • Erstellen einer start-web.html Seite und Speichern unter : C:\iDS10gR2\tools\web\html
  • Start des OC4J
  • Test des Seiten-Zugriffes (Port anpassen) : http://localhost:8889/forms/html/start-web.html => OK.
  • Anlegen des Verzeichnisses C:\iDS10gR2\tools\web\html\jnlp
  • Anpassung des jnlp - Files (Port, Modulname) und speichern in C:\iDS10gR2\tools\web\html\jnlp

  • Kopieren des frmall.jar-Files nach C:\iDS10gR2\tools\web\html\jnlp
  • Anlegen des Verzeichnisses C:\iDS10gR2\tools\web\html\jnlp\oracle\forms

  • Kopie des Registry.dat-Files nach C:\iDS10gR2\tools\web\html\jnlp\oracle\forms
  • Erstellen eines Formsmodules und Speichern des *.fmx in C:\iDS10gR2\forms
  • Ausführung des WebStart's : http://localhost:8889/forms/html/jnlp/formsStart.jnlp




Ausserdem wird im Programm-Menü der Applikationsstart eingetragen:



so dass ein schneller Direktstart möglich ist.

Oracle Forms 10g als WebStart Application und damit eigentlich auch als RDA : Rich Desktop Application ..


Friedhold

Freitag, 26. Dezember 2008

SUN's Applet-Technologie: JavaFX und Google Maps

In einem früheren Blog-Beitrag hatte ich bereits auf die Erneuerung von SUN's Applet-Technologie hingewiesen und dass dies durchaus Auswirkungen, auch auf Oracle Forms, haben kann!
Anhand eines praktischen Beispieles möchte ich nun ein neues Feature demonstrieren: Eine JavaFX - Applikation inkl. Google Maps wird als Applet im Browser gestartet und läßt sich per Drag auf den Desktop, also ausserhalb des Browser-Fensters, ziehen. Danach kann das Browser-Fenster geschlossen werden, so dass wir hiermit eine Desktop - Applikation erhalten. Nun zum Ausprobieren, Voraussetzung ist das JDK 1.6 Update 10+ :



Start der JavaFX-Applikation in einem neuen Browser-Fenster (Bitte beachten: Dies ist nur ein Testbeispiel!)

JavaFX ist übrigens SUN's Antwort auf Adobe's Flex & AIR und Microsoft's Silverlight, Applikationen, die sowohl im WebBrowser als auch im Desktop laufen.

Mit etwas Anpassung können wir natürlich auch Oracle Maps als JavaFX - RDA (Rich Desktop Application) anwenden.

Beste Grüße und ein erfolgreiches Neues Jahr
Friedhold

Sonntag, 30. November 2008

Oracle Maps mit externer Virtual Earth Satelliten Karte

Oracle Maps und Microsofts Virtual Earth ist eine durchaus akzeptable Mashup Kombination. Mit ein wenig Anpassung kann man die Vektor - Kartensicht in Virtual Earth übrigens auf die Satelliten - Rasteransicht umstellen:



Hier nun beide Oracle Maps - Demos, sozusagen live:

* Virtual Earth mit Kartenansicht
* Virtual Earth mit Satellitenansicht

Wir sind mit unserer "slippy" Oracle Maps sehr flexible und können, wie bereits in der Mashup - Serie mit VE Custom Base Map Tiles gezeigt, nun auch auf einem Remote Customer Grid-Map Layer eigene FOI - Layer darstellen.

Viel Spaß,
Friedhold

Sonntag, 19. Oktober 2008

Remote Oracle Maps in einer Swing - Applikation

Natürlich ist es anschaulicher, wenn man Oracle Maps direkt und als Live - Demo präsentieren kann. Mit etwas Anpassung ist das Oracle GeoCoding Demo als Web Start Swing-Applikation lauffähig, per rechtem Mouseclick erhält man die Koordinaten im InfoWindow :



Zum Ausprobieren habe ich das Web Start - Demo bereitgestellt.

Damit eröffnen sich mit SUN's Erneuerungen hinsichtlich der Applet- und Web Start- Technologie auch für Oracle Maps neue Möglichkeiten ..

Übrigens läuft das Demo auch problemlos unter Googles WebBrowser Chrome.

Friedhold

Freitag, 10. Oktober 2008

Remote Oracle MapViewer Tiles in einer Web Start Swing - Applikation

Bisher hatte ich mich in den Oracle Maps - Mashups Blogs auf die sogenannten 'Slippy' - Maps bezogen: Diese laufen als Thin Clients in den Web-Browsern, programmiert mit JavaScript und sind auf Grund der Leichtgängigkeit sehr beliebt.

Es gibt natürlich nach wie vor die Möglichkeit, die Oracle Map Tiles vom Oracle MapViewer anzufordern: Hierfür wird die Java-Library mvclient.jar verwendet.

Liujian Qian hat uns in seinem wunderbaren Blog ein Swing Mapper-Demo vorgestellt: Dieses habe ich etwas angepasst (den Fokus auf die Lausitz verlagert ;-) ) und als Web Start - Demo bereitgestellt:



Wie bereits in der vorigen Blog-Serie zu den Oracle Maps - Mashups verwende ich hier ebenfalls das Oracle GeoCoding Demo.
Die Navigation in der Swing-Map erfolgt mit den Tasten des Nummern-Blockes: Die Positionsverschiebung mit den Pfeil-Tasten, das Zooming mit der <+> u. <-> - Taste.

Somit haben wir jetzt ein Beipiel zum Remote - Zugriff auf Oracle MapViewer Tiles per Web Start - Swing Applikation.

Friedhold

Donnerstag, 4. September 2008

Google Maps und Oracle Maps Mashup mit externem Custom Map Tile Layer (8)

Im letzten Teil dieser Serie zu 'Oracle Maps Mashups mit externen Customer Map Tile Layern' möchte ich schliesslich die Lösung mit Google Maps Tiles vorstellen. Die Parameterdefinition zur Kartenprojektion ist wie beim Virtual Earth Demo vorzunehmen.

Die Google Tiles Url hatte ich bereits im Blog "Google Maps Tile - URL mit PL/SQL bilden" vorgestellt, so dass eigentlich nur die 'getTileURL' - Funktion angepasst werden muss:



Letzendlich erhalten wir das Google Maps / Oracle Maps Mashup:



Natürlich lassen sich auch auf der Google Maps - Base Map statische und dynamische Features of Interest Layers (FOIs) darstellen, insbesondere auf der Basis von topologischen Abfragen direkt aus Oracle Spatial.

Grüße,
Friedhold

OpenStreetMap - FOI, Virtual Earth und Oracle Maps Mashup (7)

Im letzten Teil (6) hatte ich das Virtual Earth / Oracle Maps Mashup vorgestellt. Um Spatial - Daten als Features of Interest Layer (FOI) auf der extern (remote) gerenderten Customer Tile Map darzustellen, müssen wir die verwendeten OpenStreetMap Daten in den Spherical Mercator, sozusagen Map-konform, umrechnen (analog zum Teil (5) ).

Dann können wir diesen FOI- Layer aktivieren:



und erhalten schliesslich das OpenStreetMap / Virtual Earth / Oracle Maps Mashup:



Friedhold

Dienstag, 2. September 2008

Virtual Earth und Oracle Maps Mashup mit externem Custom Map Tile Layer (6)

Nun haben wir uns so langsam dem Spherical Mercator genähert und möchten in Oracle Maps als externe Customer Base Map die Virtual Earth Map von Microsoft darstellen. Im Teil 3 dieser Serie hatte ich bereits auf die Notwendigkeit der Anwendung des Google/Vitual Earth Spherical Mercators hingewiesen! Würde man als Map- Projektion den World Mercator 54004 verwenden, :


var mapConfig=
{
"mapTileLayer":"GX_MERCATOR",
"format":"PNG",
"coordSys":
{
"srid":54004,
"type":"PROJECTED",
"distConvFactor":1.0,
"minX":-2.0037508E7,"minY":-2.0037508E7,
"maxX":2.0037508E7,"maxY":2.0037508E7
},

so wären die Demo- Daten leider nicht Karten - konform:



Mit dem derzeit bekanntem (Im Oracle Forum ist der Spherical Mercator als SRID- Update bereits zugesagt worden!) und im Oracle Spatial Forum veröffentlichtem SRID:


var mapConfig=
{
...
{
"srid:1000002,
...
},

sieht das Mashup aus der Virtual Earth Customer Base Map und dem Oracle Maps Demo - FOI - Layer dann so aus:



Microsoft verwendet zum schnellen Zugriff auf die Virtual Earth - Tiles sogenannte Quad-Keys :

function getVETileQuadKey(tileX, tileY, level)
{
var quadKey = "";
for (var i = level; i > 0; i--)
{
var digit = 0;
var mask = 1 << (i - 1);
if ((tileX & mask) != 0)
{
digit++;
}
if ((tileY & mask) != 0)
{
digit++;
digit++;
}
quadKey += digit;
}
return quadKey;
}

Mit dem Spherical Mercator eröffnen sich neue Mashup - Möglichkeiten !!

Grüße,
Friedhold

Google Maps Tile - URL mit PL/SQL bilden

Zum Verständnis von Googles / Virtual Earth's Sperical Mercator möchte ich zunächst die dabei verwendete Mercator-Formel vorstellen :



Möchte man nun auf die einzelnen Google-Tiles zugreifen, so muss die Umrechnung der Latitude - und Longitude - Werte mit der Mercator - Formel zunächst in die World-Pixel Koordinaten erfolgen, um letztendlich die Tiles Koordinaten zu bestimmen.

Hier ein Beispiel zur Verifizierung der von mir erstellten PL/SQL- Prozeduren:



Mit der PL/SQL - Package erstellen wir die Google Tile - URL (angewendet wird die sinus-Gleichung):


CREATE OR REPLACE PACKAGE BODY PKG_GET_GMAPS_URL AS

PI CONSTANT NUMBER := 3.141592653589793 ;
DTOR CONSTANT NUMBER := PI / 180;
RTOD CONSTANT NUMBER := 180 / PI;
TILE_SIZE CONSTANT NUMBER := 256;
MERC_BORDER CONSTANT NUMBER := 85.0511287798066;

FUNCTION fnc_get_TileCoord (p_lat IN number, p_lon IN number, p_zoom IN number,
p_x OUT NUMBER, p_y OUT NUMBER, p_z OUT NUMBER) RETURN varchar2 IS

l_sin_pi NUMBER;
l_norm_x NUMBER;
l_norm_y NUMBER;
l_col NUMBER;
l_row NUMBER;

BEGIN
IF abs(p_lat) > MERC_BORDER THEN
RETURN('Invalide Latitude');
ELSE
l_sin_pi := SIN((p_lat) * DTOR);
l_norm_x := p_lon / 180;
l_norm_y := (0.5 * LN ( (( 1 + l_sin_pi) / (1 - l_sin_pi)) ) ) / PI;
-- column
p_x := POWER(2, p_zoom) * (( l_norm_x + 1 ) / 2);
-- row
p_y := POWER(2, p_zoom) * (( 1 - l_norm_y ) / 2);
p_z:= p_zoom;

RETURN('OK');
END IF;
END fnc_get_TileCoord;

PROCEDURE prc_get_TileCoord (p_lat IN number, p_lon IN number, p_zoom IN number) IS

l_x NUMBER;
l_y NUMBER;
l_z NUMBER;
l_xpos NUMBER;
l_ypos NUMBER;
l_res VARCHAR2(2000);
l_paras VARCHAR2(500);

BEGIN

l_res:= fnc_get_TileCoord(p_lat, p_lon, p_zoom, l_x, l_y, l_z);

dbms_output.put_line(l_res);

l_xpos:= trunc((l_x - trunc(l_x) ) * TILE_SIZE);
l_ypos:= trunc((l_y - trunc(l_y) ) * TILE_SIZE);

dbms_output.put_line('x-Pos. in World: '||to_char(trunc(l_x * 256) ) || ' / ' ||
'y-Pos. in World: '||to_char(trunc(l_y * 256) ));

dbms_output.put_line('x-Pos. in Tile: '||to_char(l_xpos)|| ' / ' ||
'y-Pos. in Tile: '||to_char(l_ypos));
dbms_output.put_line(' --- ');

l_paras := 'x=' ||to_char( trunc( l_x ) )||
'&y='||to_char( trunc( l_y ) )||
'&zoom='||to_char(17-p_zoom);

dbms_output.put_line('http://mt0.google.com/mt?'||l_paras);

END prc_get_TileCoord;

END PKG_GET_GMAPS_URL;

Nachfolgend angewendet, erhalten wir die World- und Tile - Pixel Koordinaten und natürlich die Google- Tile URL:


SQL> set serverout on
SQL> exec pkg_get_gmaps_URL.prc_get_TileCoord (52.514653902014715, 13.350105285644531, 13)
OK
x-Pos. in World: 1126345 / y-Pos. in World: 687822
x-Pos. in Tile: 201 / y-Pos. in Tile: 206
---
http://mt0.google.com/mt?x=4399&y=2686&zoom=4

Eine Differenz von einem World-Pixel zur obigen Tile - Map kann man gelten lassen !

Dank Oracle's PL/SQL !

Friedhold

PS: Googles Mercator wird übrigens 900913 genannt und kommt eigentlich von 600613 - in der SMS-Schrift : Google.

Sonntag, 17. August 2008

OpenStreetMap-FOI und Oracle Maps Mashup mit externem Custom Map Tile Layer (5)

In dem Blog "OpenLayers mit Google Maps, Yahoo! Maps und OpenStreetMap" hatte ich bereits eine OpenStreetMap (OSM) gerenderte Karte vorgestellt.

OpenStreetMap - Daten sind nach der CC-BY-SA - Lizenz frei verfügbar. Es kann bei der Datenerfassung jeder mitmachen und innerhalb weniger Stunden wird eine neu erfasste Strasse, ein Fahrradweg oder eine gute Kanustrecke in der Karte dargestellt.

OpenStreetMap-Gründer Steve Coast hierzu:

"Jeder kann die Daten benutzen, die in OpenStreetMap gesammelt werden", erklärt er. "Vereine, Firmen, Kartographen, Programmierer - alle können unsere Daten benutzen, wie sie wollen, ohne dafür zu zahlen."

Die freie Verfügbarkeit der Daten setzt ein enormes, kreatives Potenzial frei: Es wird die Entwicklung neuer Software vorangetrieben und es werden Geodaten erfasst, die von Vermessungsautos nicht befahren werden können!

Empfehlen kann ich hierfür das Buch "OpenStreetMap - Die freie Weltkarte nutzen und mitgestalten" der Authoren Frederik Ramm und Jochen Topf, das dankenderweise beim Lehmanns Media Fachbuchverlag erschienen ist.

In dem nun hier vorgestelltem Mashup habe ich zunächst die OpenStreetMap Strassen-Daten von Berlin in Oracle Spatial 11g, SRID 8307, geladen.

Möchte man diese Daten in der fertig gerenderten Karte des Oracle Demos (Teil 1-4 dieser Serie) darstellen, so muß berücksichtigen werden, dass diese externe Karte im World Mercator 54004 vorliegt: Also brauchen wir die OSM- Daten auch in der 54004 Projektion. Voraussetzung ist natürlich die Definition der 54004 Projektion in Oracle Spatial!

Wir bilden also einen FOI-Layer aus den in 54004 transformierten OSM - Daten und legen diesen auf die von Oracle/NAVTEQ gerenderte, externe Base Map. Hierfür habe ich im Demo einen Theme-Filter auf nur einige wenige Strassen definiert.



Unser Mashup aus der Oracle/NAVTEQ StreetMap und den OSM- Berlin Strassen - Daten sieht nun so aus:


Dargestellt in einer anderen Zoomstufe:


Wir können somit topologische Abfrageergebnisse aus Oracle Spatial OSM-Daten als FOI - Layer auf der externen Base Map in Oracle Maps darstellen.

Viel Spaß dabei,
Friedhold

Samstag, 16. August 2008

Google Maps Street View und Oracle Maps Mashup mit externem Custom Map Tile Layer (4)

Auf Basis der Client seitigen Transformation der Koordinaten vom World Mercator 54004 in WGS84 (SRID 8307) sind wir nun in der Lage, ein Mashup mit Google Maps zu erstellen. Die Mouseclick - Koordinaten werden in Oracle Maps in WGS84 umgerechnet und als POI's an Google Maps übergeben:


Recht eindrucksvoll läßt sich dies anhand der Street Views von Google Maps demonstrieren:


Und natürlich ein Street View von Oracles Headquarter:


Fassen wir zusammen:
Unsere Oracle Maps Mashup Applikation besteht aus der Base Map, die aus den Tiles des externen Oracle GeoCoding Demos gebildet wird, und den im InfoWindow eingefügten Google Maps Street Views,
aktiviert mit der rechten Mouseclick-Position.

Abschliessend noch ein Street View am Google Standort:


Viel Spaß,
Friedhold

Freitag, 15. August 2008

Mercator 54004 Transformation und Oracle Maps Mashup mit externem Custom Map Tile Layer (3)

Oracle Maps liefert in der aktuellen Version natürlich auch Möglichkeiten zur Interaktion mit den externen Custom Map Tile Layern. Im Moment fehlt jedoch noch die Google Maps/Virtual Earth Tansformation auf der Client Seite (von OpenLayers praktiziert) bzw. in der Oracle Datenbank auf Basis einer SRID - Definition.

Oracle Maps enthält aber implizit die World Mercator 54004 Transformation. Damit lassen sich die Tiles von Google Maps oder OpenLayers leider nicht so einfach ansprechen, wie ich in einem kleinen Vergleich zeigen möchte:

- Oracle Maps 54004 Tile
- Google Maps 900913 Tile

Deutlicher wird dies am Google Maps Ausschnitt mit InfoWindow:



Es unterscheiden sich bei identischen X-Tile-Koordinaten deutlich die Y-Tile-Koordinaten !

Mit einer kleinen Erweiterung des im Teil (2) beschriebenen Demo möchten wir nun in einem InfoWindow die Koordinaten ausgeben bzw. Informationen loggen:



D.h. zunächst liefert die Mouseclick - Position die Koordinaten der 54004 Map Projektion des Oracle Demos. Anschliessend werden diese 54004 Map Koordinaten in SRID 8307 Koordinaten transformiert:



Auf Basis der SRID 8307 Koordinaten lassen sich nun Mashups mit Google Maps aufbauen, in einem weiteren Teil dieser Serie möchte ich darauf eingehen.

Friedhold

Mittwoch, 30. Juli 2008

Oracle Maps Mashup mit externem Custom Map Tile Layer (2)

Mit der neuen Möglichkeit, in Oracle Maps externe Layers fremder Web Tile Renderer Server zu integrieren, können Mashups aus diesen Basis - Layern und eigenen Anwendungs - Daten (Features of Interest Layer) erstellt werden. Hier ein Beispiel einer Google TileMapUrl.
Sowohl Google Maps, OpenLayers als auch Virtual Earth bieten recht transparent die Möglichkeit, selbst erstellte Map Tiles gerenderter Karten darzustellen. Als Map Projektion hat sich hierfür die Sperical Mercator Projektion von Google Maps und Virtual Earth, auch Web Mercator Projektion genannt, durchgesetzt, d.h. es erfolgen in den Map Clients die sogenannten Forward und Inverse Transformations . Schliesslich ist auch diese Sperical Mercator Projektion von der OSGEO wie folgt aufgenommen worden:

Proj4js.defs["EPSG:900913"] = "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs";

Proj4js.defs["GOOGLE"]="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs";

Im Oracle Spatial Forum wurde nun auch auf die Notwendigkeit dieser Projektion reagiert, wobei der Vorschlag, diesen Mercator Web Mercator : EPSG:3785 zu benennen, aufgenommen wurde und im Release 11.2 bzw. in diversen Patches breitgestellt wird.

Derzeit können wir nur den ESRI World Mercator 54004 anwenden, der auch im nachfolgenden Demo auf der Basis der Map Tiles des Oracle Online GeoCoding Demos, eingesetzt wird:



Die Definition der Map Projektion und der Scale Ranges sehen wie folgt aus:



Wichtig ist noch die getMapTileUrl - Function:
 
function getMapTileURL(minx, miny, width, height, level)
{
var x = (minx-mapConfig.coordSys.minX)/mapConfig.zoomLevels[level].tileWidth ;
var y = (miny-mapConfig.coordSys.minY)/mapConfig.zoomLevels[level].tileHeight ;
return baseURL+"mcserver?request=gettile&format=" + mapConfig.format + "&zoomlevel="+level+"&mapcache=ELOCATION_MERCATOR.WORLD_MAP&mx=" + Math.round(x) + "&my=" + Math.round(y) ;
}

Hier noch ein Beipiel einer MapTileUrl obigen Oracle Maps Demos.

Grüße,
Friedhold

Donnerstag, 24. Juli 2008

Einführung in Oracle Maps Mashup mit externem Custom Map Tile Layer (1)

Google Maps und OpenLayers beispielswiese erlauben die Integration der Tiles Layer externer Web Tile Server, so dass auf fertig gerenderten Tiles die Darstellung der dynamischen Anwenderdaten erfolgen kann.

Im neuen Oracle Maps (ich verwende Oracle Maps 11g Preview 2) muss nun analog zu obigen Map Clients der Oracle Map - Instanz ein Map Tile Layer zugewiesen werden:


var baseURL = "http://"+document.location.host+"/mapviewer";

// Create a MVMapView instance
var mapview = new MVMapView(document.getElementById("map"), baseURL);

// Add a map tile layer
mapview.addMapTileLayer(new MVMapTileLayer("mvdemo.demo_map"));
..

Die neue MVMapTileLayer Class wurde ausserdem folgerichtig um die MVCustomMapTileLayer Class zur Bildung eines Custom Map Tile Layers erweitert.

D.h., es werden die auf einem externen Map Tile Server erstellten Map Image Tiles per HTTP GET Map Tile Requests direkt angefordert und in der MapViewer Instanz als Base Map Layer dargestellt. Die hierfür benötigte MapTile-URL wird in der JavaScript Function getMapTileURL mit dem Return der Map Tile Image - URL gebildet.

Als Input-Parameter benötigt die Function getMapTileURL 5 Parameter, geliefert vom JavaScript Map Client:
  • X coordinate of the left-lower corner of the tile in map coordinate system

  • Y coordinate of the left-lower corner of the tile in map coordinate system

  • Tile width in map coordinate system

  • Tile height in map coordinate system

  • Map zoom level :



Hierzu gibt es ein Demo in Oracle Maps, in dem der Zugriff auf lokale Demo Tiles mit der Funktion MVCustomMapTileLayer präsentiert wird.

Wenn man jedoch von externen Web Tile Servern die Tile Layers beziehen möchte, muss man die externe Map Projektion und die entsprechenden Scale Ranges in Oracle Maps vorgeben.

Im Teil 2 zu Oracle Maps Mashups werde ich die gerenderten Tiles des Online verfügbaren Oracle Geocoding Demos verwenden.

Friedhold

Sonntag, 1. Juni 2008

OpenLayers mit Google Maps, Yahoo! Maps und OpenStreetMap

OpenLayers ist eine Open Source JavaScript-Bibliothek mit der sich Karten verschiedener Hersteller darstellen lassen -
vergleichbare Demos habe ich hier einfach angepasst:

Hierbei wird auf die vorgefertigten Karten-Kacheln dieser Hersteller, den Tiles Renderer Servern, zugegriffen.

In OpenLayers werden diese Base-Map Layer mit folgenden JavaScript-Instanzen gebildet:


var gmap = new OpenLayers.Layer.Google
..
var yahooLayer = new OpenLayers.Layer.Yahoo
..
var mapnik_layer = new OpenLayers.Layer.OSM.Mapnik
..

Grüße,
Friedhold

Alternative Bestimmung der MBR's in Oracle Spatial

Zur vollständigen Qualifizierung der Metadaten in Oracle Spatial benötigt man das Minimal Bounding Rectangle, MBR, dessen Seiten parallel zu den Achsen des Koordinatensystems verlaufen. Hiefür gibt es die speziellen Funktionen sdo_min_mbr_ordinate u. sdo_max_mbr_ordinate in Oracle Spatial.

Unlängst bin ich beim Versuch der Bestimmung des MBR's in folgenden Fehler gelaufen (11g DB):


SQL> select MIN(sdo_geom.sdo_min_mbr_ordinate(geometry, 1)) minX,
2 MAX(sdo_geom.sdo_max_mbr_ordinate(geometry, 1)) maxX,
3 MIN(sdo_geom.sdo_min_mbr_ordinate(geometry, 2)) minY,
4 MAX(sdo_geom.sdo_max_mbr_ordinate(geometry, 2)) maxY
5 from ROADS;
MAX(sdo_geom.sdo_max_mbr_ordinate(geometry, 2)) maxY
*
FEHLER in Zeile 4:
ORA-06533: Index oberhalb der Grenze
ORA-06512: in "MDSYS.SDO_GEOM", Zeile 2095
ORA-06512: in "MDSYS.SDO_GEOM", Zeile 2113
.

In diesem Fall sollte man eine alternative MBR-Bestimmung anwenden:

SQL> select min(t.x),max(t.x),
2 min(t.y),max(t.y)
3 from roads g, table(sdo_util.getvertices(g.geometry)) t;

MIN(T.X) MAX(T.X) MIN(T.Y) MAX(T.Y)
---------- ---------- ---------- ----------
11,5615495 14,756139 51,3734974 53,4149581
.

Friedhold