geoJSON

Hallo,

ich experimentiere gerade das erste mal mit Vector-Layern und komme mit dem geoJSON noch nicht so klar. Ich binde dazu ein Vecotr wie folgt ein:


var layerGeometry =  
            new OpenLayers.Layer.Vector("PLZ", { 
                    strategies: [new OpenLayers.Strategy.Fixed()], 
                    protocol: new OpenLayers.Protocol.HTTP({ 
                        url: "plz_json.php",    
                        format: new OpenLayers.Format.GeoJSON() 
                    }), 
                    projection: projMercator 
            }); 
        map.addLayer(layerGeometry); 

Mein Problem ist die “plz_json.php”. Die Datei liefert derzeit folgendes:


{"type":"Polygon","coordinates":[[[946997.668901750002988,6804851.635990919545293],[947398.27435326797422,6805510.242152039892972],[947937.327855485025793,6806519.116099460050464],[947876.502885716035962,6806705.792200200259686],[948839.171578197972849,6807214.812279700301588],[948866.945791151025333,6806943.305583120323718],[948825.81323930202052,6806740.500387510284781],[948825.679655913030729,6806649.948161319829524],[948920.913480286952108,6806218.210386379621923],[949167.475020444951952,6805973.516733709722757],[949428.474698559031822,6805492.619279350154102],[949490.268147898023017,6805254.51523463986814],[949368.818583442945965,6804879.135642670094967],[949300.679923127987422,6804730.331076799891889],[949117.704076112015173,6804232.10446386039257],[948833.071270102052949,6803457.073904880322516],[948178.668511525029317,6803987.724127359688282],[947673.177835781942122,6804222.643158700317144],[946997.668901750002988,6804851.635990919545293]]]}

Dazu zwei Fragen.

  1. Oben wird nur ein PLZ-Gebiet übermittelt. Wie müsste die Rückgabe aussehen wenn ich z.B. noch ein zweites Gebiet darstellen will?
  2. Wie kann ich die Farbe des Gebietes festlegen.

Konkret möchte ich 3 oder mehr Gebiete auf einer Karte anzeigen lassen. Dabei soll ein Gebiet in rot, ein weiteres in orange und wieder eines in grün dargestellt werden.

Hallo,

  1. Dazu musst Du die Polygone in eine GeometryCollection oder FeatureCollection packen.

  2. Mit Styles, da hilft vielleicht dieses Beispiel weiter.
    Da gibt es folgende Möglichkeiten
    a) im Stil als Farbe eine Funktion angeben, die z.B. alternierend oder zufällig eine Farbe liefert (strokeColor: “${getColor}”)
    b) mit der FeatureCollection noch properties mitliefern, z.B. die PLZ, und kannst dann per addUniqueValueRules gezielt Farben für Property Werte vergeben
    c) den Farbwert gleich als property in der FeatureCollection mitliefern und das Property im Stil angeben, z.B.: fillColor: “${plzColor}”

Gruß,
ikonor

Hallo ikonor,

besten Dank für den Link. Ich komme jedoch mit der FeatureCollection nocht nicht so ganz zurecht.

Hier mal der Code:


projMercator = new OpenLayers.Projection("EPSG:900913");
    
    var layerGeometry = new OpenLayers.Layer.Vector("Gebiete",{projection: projMercator}); 
    map.addLayer(layerGeometry); 

    var json_data = '{"type":"Polygon","coordinates":[[[946997.668901750002988,6804851.635990919545293],[947398.27435326797422,6805510.242152039892972],[947937.327855485025793,6806519.116099460050464],[947876.502885716035962,6806705.792200200259686],[948839.171578197972849,6807214.812279700301588],[948866.945791151025333,6806943.305583120323718],[948825.81323930202052,6806740.500387510284781],[948825.679655913030729,6806649.948161319829524],[948920.913480286952108,6806218.210386379621923],[949167.475020444951952,6805973.516733709722757],[949428.474698559031822,6805492.619279350154102],[949490.268147898023017,6805254.51523463986814],[949368.818583442945965,6804879.135642670094967],[949300.679923127987422,6804730.331076799891889],[949117.704076112015173,6804232.10446386039257],[948833.071270102052949,6803457.073904880322516],[948178.668511525029317,6803987.724127359688282],[947673.177835781942122,6804222.643158700317144],[946997.668901750002988,6804851.635990919545293]]]}'; 
    
    var geojson_format = new OpenLayers.Format.GeoJSON(); 
    var geometry = geojson_format.read(json_data, 'Geometry'); 
    var vector = new OpenLayers.Feature.Vector(geometry); 
    layerGeometry.addFeatures(vector); 


Dann bekomme ich mein Polygon sauber angezeigt. Ändere ich jedoch json_data in:

var json_data = '{ "type": "FeatureCollection","features": [{ "type": "Feature","geometry": {"type":"Polygon","coordinates":[[[946997.668901750002988,6804851.635990919545293],[947398.27435326797422,6805510.242152039892972],[947937.327855485025793,6806519.116099460050464],[947876.502885716035962,6806705.792200200259686],[948839.171578197972849,6807214.812279700301588],[948866.945791151025333,6806943.305583120323718],[948825.81323930202052,6806740.500387510284781],[948825.679655913030729,6806649.948161319829524],[948920.913480286952108,6806218.210386379621923],[949167.475020444951952,6805973.516733709722757],[949428.474698559031822,6805492.619279350154102],[949490.268147898023017,6805254.51523463986814],[949368.818583442945965,6804879.135642670094967],[949300.679923127987422,6804730.331076799891889],[949117.704076112015173,6804232.10446386039257],[948833.071270102052949,6803457.073904880322516],[948178.668511525029317,6803987.724127359688282],[947673.177835781942122,6804222.643158700317144],[946997.668901750002988,6804851.635990919545293]]]},"properties": {"prop0": "value0"}}]}'

lädt er ohne Fehler (lt. Firebug) zeigt jedoch das Polygon nicht mehr an.

Hast du, oder jemand anderes eine Idee?

Danke
Mike

Ich denke, der Parameter ‘Geometry’ bei ‘geojson_format.read’ muss weg, damit auch eine FeatureCollection (default) geliefert wird (siehe API Doc). Dann ist der Umweg über ‘OpenLayers.Feature.Vector’ auch nicht nötig.

Die letzten vier Zeilen müssten dann so aussehen (nicht getestet), siehe auch OpenLayers GeoJSON Beispiel:


var geojson_format = new OpenLayers.Format.GeoJSON();
var features = geojson_format.read(json_data); 
layerGeometry.addFeatures(features);

Besten Dank, funktioniert perfekt.

Bei der Gelgenheit noch eine Frage. Kann ich eine Feature innerhalb der Collection auch später verstecken? (show/hide). Ich finde die Funktion nur für Layer. Also kann ich die gesamte FeatureCollection ein bzw. ausblenden jedoch nicht nur Teile davon ist das korrekt?

Das kann per Styling gemacht werden. Features mit ‘display’: ‘none’ werden nicht gerendert. Da habe ich jetzt aber kein konkretes Beispiel parat.