3 Frage OpenLayers - Extend und geojson einbinden

Moin!

vor ca. 14 Tagen hatte ich hier schon einmal ein Posting bezügl. geojson und OpenLayers.

Nun hatte ich etwas Zeit und versucht die Karte zu erweitern - aber wie Ihr jetzt schon richtig vermutet sind Komplikationen aufgetreten. Nun hoffe ich das mir der eine oder andere weiterhelfen kann.

— Zoom-Fenster—
Es geht im Beispiel [1] um die Fragestellung des Zoom auf ein bestimmtes Fenster wie auch die Eingrenzung der Karte auf einen bestimmten Bereich. Für letzteres habe ich mich an das Beispiel von Flohoff orientiert und die Transformation mittels transform von OL angesetzt.

var map_area = new OpenLayers.Bounds();
map_area.extend(new OpenLayers.LonLat(10.68221,53.83476).transform(geographic, mercator));
map_area.extend(new OpenLayers.LonLat(10.70874,53.84561).transform(geographic, mercator));
map_area.toBBOX();

// Einrichten der Karte	
map = new OpenLayers.Map('map', {
    projection: geographic,
    displayProjection: mercator,
    controls: [
	  new OpenLayers.Control.MouseDefaults(),
	  new OpenLayers.Control.Attribution()],
    maxExtent: map_area,
    numZoomLevels: 18,
    maxResolution: 156543,
    units: 'meters'
});

Die verschiedenen Projektionen habe ich mit geographic bzw. mercator betitelt. Diese Art und Weise der Beschriftung habe ich in einem Web-Tutorial gefunden und fand ich persönlich sehr nachvollziehbar.

Leider funktioniert dieser Teil bei mir local überhaupt nicht (derzeit kann ich auch nur primär lokal testen).

Dann das mit dem Zoom-Befehl auf einen bestimmten Bereich. Dieses finde ich besser als über die Koordinate und den Zoomlevel da so gewährleistet wird das ein Bereich auch wirklich vollständig angezeigt wird.

Dieses habe ich mit folgendem Code (Funktion: go2obj) realisiert:

map.zoomToExtent(new
OpenLayers.Bounds(min_lon, min_lat, max_lon, max_lat).transform(geographic, mercator)
);

Hier wird immer auf einen Bereich um 0 gezoomt - ich habe die Koordianten getauscht, transformation auch einmal weggelassen und … alle anderen Varianten ausprobiert. Leider alles OHNE Erfolg!!!

Weiß einer warum?

— hinzuladen von externen GeoJSON-Daten —

Komme ich zur letzten Frage. In [2] hatte ich erfolgreich um Hilfestellung bei der Einbindung von GeoJSON-Daten gefragt und Hilfe bekommen. Nun wollte ich die Daten aus einer externen Datei einbinden um diese einfacher austauschen zu können. In dem Tutorial von Peter Robbins [3] hatte ich ein Beispiel gefunden um über .Protocol.HTTP eine exterene Datei einzubinden. Das sieht bei mir so aus:

var vector_layer = new OpenLayers.Layer.Vector(“Strassen und Wege”, {
style: {
strokeColor: “blue”,
strokeWidth: 3,
cursor: “pointer”
},
protocol: new OpenLayers.Protocol.HTTP({
url: “schrebergarten.json”,
format: new OpenLayers.Format.GeoJSON({
ignoreExtraDims: true,
‘externalProjection’: mercator,
‘internalProjection’: geographic
})
})
});

map.addLayer(vector_layer);

Aber leider wird jetzt wieder einmal gar nichts angezeigt.

— zu guter Letzt ----
… noch eine Frage. Man kann GeoJSON-Daten filter, daran will ich mich versuchen, wenn o.g. Probleme gelöst sind. Kann man irgendwie die BBox der gefilterten GeoJSON-Daten ermitteln um darauf zu zoomen?

Über eine Hilfe würde ich mich sehr freuen.

Gruß Jan :slight_smile:

[1] http://osm.tappenbeck.net/sandbox/schrebergarten/deu/index_extent.htm

[2] http://forum.openstreetmap.org/viewtopic.php?id=16335

[3] http://www.peterrobins.co.uk/it/ollatency.html

[4] http://osm.tappenbeck.net/sandbox/schrebergarten/deu/index_json.htm

[1] hat nen Fehler:

Zeitstempel: 03.05.2012 23:04:28
Fehler: OpenLayers.Layer.XYZ.Schreber is not a constructor
Quelldatei: http://osm.tappenbeck.net/sandbox/schrebergarten/deu/index_extent.htm
Zeile: 87

Anscheinend doch nicht so richtig: :wink:


    geographic = new OpenLayers.Projection("EPSG:900913");
    mercator = new OpenLayers.Projection("EPSG:4326");

EPSG:900913 ist Spherical Mercator und EPSG:4326 ist WGS 84 (geographic 3D). In der Map Definition ist es zwar namentlich falsch aber inhaltlich richtig zugeordnet, bei den transforms ist es aber namentlich richtig und inhaltlich falsch rum.

Das deutet eigentlich immer auf ein Problem bei der Projektion hin (siehe oben).

Wenn nicht mal die Basiskarte angezeigt wird deutet das auf einen JavaScript Fehler hin (siehe ganz oben).


layer.events.register("loadend", layer,
  function() {
     if (this.visibility) {
        var bounds = this.getDataExtent();
        lonLat = bounds.getCenterLonLat();
        map.setCenter(lonLat);
        map.zoomToExtent(bounds);
     }
 }
);

hi!

das mit Fehler bitte ich zu entschuldigen - hatte vergessen auf mapnik umzustellen anstatt der lokalen Tiles.

Habe nun nachgebessert und es sollte funktionieren. Den Namen für die Systeme habe ich vorerst noch die EPSG-Codes zugewiesen.

Neuer Link ist jetzt:
http://osm.tappenbeck.net/sandbox/schrebergarten/deu/index_20120505.htm

Was aber immer noch ein Problem ist GeoJSON - es werden einfach keine Daten angezeigt.

Hatte nochmal nachgelesen und danach ist eine externe und interne Projektion nicht erforderlich - aber auch ohne Erfolg entfernt.

Kann nochmal einer schauen ?

Gruß Jan :slight_smile:

Hi,

evtl. fehlt da noch eine Strategy, wie hier unter Retrieving GeoJSON from the Database:


  // Make a fresh vector layer, pulling features from our script URL
  json_layer = new OpenLayers.Layer.Vector("GeoJSON", {
              strategies: [new OpenLayers.Strategy.Fixed()],
                protocol: new OpenLayers.Protocol.HTTP({
                                 url: json_url,
                              format: new OpenLayers.Format.GeoJSON()
                          })
              });

  // Add our vector layer to the map
  map.addLayer(json_layer);

Siehe auch OpenLayers.Strategy: Strategies deal with when to make requests for data (or when to send modifications). Strategies can also determine how to prepare features before they end up in a layer.

Hab’s aber selbst nicht ausprobiert…

Gruß,
mmd

Jetzt auch erfolgreich getestet mit lokaler Kopie:


	var vector_layer = new OpenLayers.Layer.Vector("Strassen und Wege", {
	                                                   style: {
													     strokeColor: "blue",
														 strokeWidth: 3,
														 cursor: "pointer"
													   },
                                                       strategies: [new OpenLayers.Strategy.Fixed()],
                                                       projection: new OpenLayers.Projection("EPSG:4326"),
                                                       protocol: new OpenLayers.Protocol.HTTP({
							   url: "schrebergarten.json",
                                                           format: new OpenLayers.Format.GeoJSON()
                                                       })
                                                    });													   

    map.addLayer(vector_layer);

hi !

jetzt funktioniert es !

http://osm.tappenbeck.net/sandbox/schrebergarten/deu/index_20120506a.htm

Jetzt habe ich nur noch das Problem, dass auf meinem Laptop nichts angezeigt wird.

Ist für das Protokoll oder ähnliches noch ein xamp erforderlich oder was könnte die Ursaches sein. Eine Idee ?

Xamp oder vergleichbar !!! Frage erledigt!

Gruß Jan :slight_smile:

hi !

aber weiter gebastelt und wollte nun nochmal filtern nach dem Straßennamen (nur Bachstelzenweg ist verfügbar!).

Der Filtercode stammt aus http://osgeo-org.1560.n6.nabble.com/search-geojson-example-for-show-elements-by-name-td4901407.html

Es passiert aber nichts … !

Kann einer nochmal schauen bei http://osm.tappenbeck.net/sandbox/schrebergarten/deu/index_20120507.htm

Gruß Jan :slight_smile:

Hi,

evtl. hilft das Beispiel hier weiter, dort wird wieder die Strategy angepasst:


...
filter = new OpenLayers.Filter.Comparison({
    type: OpenLayers.Filter.Comparison.BETWEEN,
    property: "when",
    lowerBoundary: startDate,
    upperBoundary: new Date(startDate.getTime() + (parseInt(spanEl.value, 10) * 1000))
});

filterStrategy = new OpenLayers.Strategy.Filter({filter: filter});

var flights = new OpenLayers.Layer.Vector("Aircraft Locations", {
    projection: geographic,
    strategies: [new OpenLayers.Strategy.Fixed(), filterStrategy],
...

Gruß,
mmd

hi !

jetzt bin ich wieder im Lande und kann mich dem Thema etwas intensiver widmen.

Ich habe mir das Beispiel angeschaut - aber irgendwie komme ich da einfach nicht weiter. Mir ist die Umgebungsituation zu komplex.

Kann mir einer etwas mehr den Weg in richtige Richtung weisen ?

Gruß Jan .-)