29 November 2011

ADF mit Karte und Tabelle selektierter FOIs

Ein weiterer Schritt des typischen GIS "Verschneidens" soll hier dokumentiert werden -
mit dem aktuellen Mapviewer 11g PS3 bzw. Oracle Maps und JDeveloper 11.2.
Ich nutze dazu die ADF DVT (Data Visualisation Technology) im JDeveloper
Abb. 3 - "Verschneiden" (in Oracle Spatial: SDO_Relate) - Karte und Ergebnistabelle

Im Gegensatz zu meinem letzten BLOG Eintrag wollen wir jetzt die Getränkemärkte mit dem Redline Tool "Circle" oder "Rectangle" selektieren/verschneiden und entsprechend rechts daneben in der Tabelle die Namen und Umsätze darstellen....

Hier die Variante ohne lokale/eigene Mapviewer Installation und ohne Oracle Spatial... (;-) - ich nutze Addressdaten aus einer Tabelle und lasse den Oracle-Geocoder die Geokoordinaten "on-the-fly" berechnen.

Neben dem ausführlichen Viewlet (folgt) hier die Kurzform:

1. New "Fusion Web Application"
2. model -- New "ADF Business Components for tables"
3. Connection zur DB, Tabelle mit Addressdaten ist ausreichend... - Query - Tabelle selektieren
4. Seite: ViewController -- New Webtier - JSF Page - Format 2-spaltig / verticale Anordnung
5. Karte: Von rechts "Compoment Pallette" und ADF Data Visualisations -- Map -- Geographic map auf das linke (first) facelet ziehen
6. Connection zum Mapviewer definieren
6.1 Mapviewer url: http://elocation.oracle.com/mapviewer und zum
6.2 Geocoder url: Geocoder url: http://elocation.oracle.com/geocoder/gcserver
Info: der Geocoder auf dem Oracle elocation server errechnet uns "on the fly" die Geokoordinaten..!! cool !
7. In Karte reinzoomen und Zentrum auf Deutschland setzen (Doppelklick in DE)
8. Toolbar: Aus Component Palette und "Map" den Toolbar über die Karte ziehen - optional im "Structure Pane" (links) oberhalb der "map"  loslassen - Map ID bestätigen (default ist m1, falls nicht umbenannt).
9. PointTheme/Layer erstellen: Aus "DataControls" das ViewObjekt anklicken und auf die Karte ziehen - PointMapTheme selektieren und im Wizard bei Location: "Address" anklicken und Variante "international address" mit "Street, city, location, zip" auswählen und folgend die Spalten aus der Tabelle (ViewObject) zuweisen. Bei "Point Data" den z.B. numerischen Umsatz-Wert selektieren und einen Namen wie "Umsatz" benennen. Wichtig: Checkbox "Enable Row Selection" LEER lassen! Ja !!! Dies muss jetzt ausprogrammiert werden über eine Managed Bean (s.u.)   
9. Tabelle: neben die Karte in das 2. Facelet eine "leere" Tabelle aus ADF Faces Components - Data Views - Table - ziehen
10. Im Table Wizard nur eine Column stehen lassen und "row.col1" in "row" in den geschweiften Klammern umbennnen. OK
11. Finetuning, Binding, SelctionListener, PartialTrigger
MapPointTheme im Structure Pane selektieren und im Properties Window bei "Behaviour" -- Selection Listener -- edit (ganz rechts) - New: Managed Bean erstellen namens "ShopSelectionBean" und Class (Neu) - Name egal - und jeweils anpassen
12. Managed Bean ausprogrammieren: d.h.: vorgenerierten Code mit Beispiel Code (siehe unten) per copy und Paste ersetzen. Wie ? Im Application explorer "ShopSelectionBean.java" öffnen...
13. Table anpassen in Properties Window: Value: Edit - Binding: managedBean -- Session -- ProcessSelection
14. Behaviours: PartialTriggers "::m1" setzen bzw. über Edit selektieren
... das sollte es sein...

Hier der Code für die Managed Bean: ShopSelectionBean: 
 
package view;

import java.io.Serializable;

import java.util.Iterator;

import java.util.LinkedList;

import java.util.List;

import oracle.adf.view.faces.bi.component.geoMap.DataContent;
import oracle.adf.view.faces.bi.event.MapSelectionEvent;

public class ShopSelectionBean implements Serializable {
    List m_collection = null;
    
    public ShopSelectionBean() {
    }

    public void ProcessSelection(MapSelectionEvent mapSelectionEvent) {
     Iterator iter;
     iter = mapSelectionEvent.getIterator();
      if (m_collection == null)
             m_collection = new LinkedList();
             m_collection.clear();
                
          while (iter.hasNext())
               {
                  DataContent dt = (DataContent) iter.next();
                  String locationName = dt.getLocationName();
                  Double[] values = dt.getValues();
                         
                  if (mapSelectionEvent.getSelectionMode().equals(MapSelectionEvent.SELECTIONMODE_SELECTED))
                   {
                     String displayData = locationName;
            if (values == null || values.length <= 0) {
              } else 
      {
        displayData = displayData + ":" + values[0].toString();
                                }
        m_collection.add(displayData);           
                 
        System.out.println(locationName);
          }
             } 
                }      
       public List getData(){
              return m_collection;
       }
    }