Wie OSM WMS auch mit GK3 nutzen

Hallo,

ich habe anhand folgender Anleitung einen OSM-WMS aufgesetzt:
http://trac.osgeo.org/mapserver/wiki/RenderingOsmDataUbuntu

Ich hatte zwar einige Probleme, da ich neuere versionen genutzt habe und abhängigkeiten sich in die Quäre kamen, aber es läuft nun soweit.

Nun möchte ich aber das der WMS auch mit GK3 also EPSG 31467 ansprechbar ist.
Dager habe ich in der datei /home/user/osm-demo/mapserver-utils-svn/Makefile in die Variable OSM_WMS_SRS EPSG:31467 hinzugefügt.

Die nun wie folgt aussieht:

UNAME := $(shell uname)

ifeq ($(UNAME), Darwin)
SED=sed -i ""
CPP=cpp-4.2
else
SED=sed -i
CPP=cpp
endif


OSM_PREFIX=osm_new_
OSM_NAME_COLUMN=name
#OSM_SRID=4326
#OSM_UNITS=dd
#OSM_EXTENT=-180 -90 180 90
OSM_SRID=900913
OSM_UNITS=meters
OSM_EXTENT=-20000000 -20000000 20000000 20000000
OSM_WMS_SRS="EPSG:900913 EPSG:4326 EPSG:3857 EPSG:2154 EPSG:310642901 EPSG:4171 EPSG:310024802 EPSG:310915814 EPSG:310486805 EPSG:310702807 EPSG:310700806 EPSG:310547809 EPSG:310706808 EPSG:310642810 EPSG:310642801 EPSG:310642812 EPSG:310032811 EPSG:310642813 EPSG:2986"
DEBUG=1
LAYERDEBUG=1
STYLE=google
#can also use google or bing

template=osmbase.map

includes=land.map landusage.map borders.map highways.map places.map \
		 generated/$(STYLE)style.msinc \
		 generated/$(STYLE)level0.msinc generated/$(STYLE)level1.msinc generated/$(STYLE)level2.msinc generated/$(STYLE)level3.msinc \
		 generated/$(STYLE)level4.msinc generated/$(STYLE)level5.msinc generated/$(STYLE)level6.msinc generated/$(STYLE)level7.msinc \
		 generated/$(STYLE)level8.msinc generated/$(STYLE)level9.msinc generated/$(STYLE)level10.msinc generated/$(STYLE)level11.msinc \
		 generated/$(STYLE)level12.msinc generated/$(STYLE)level13.msinc generated/$(STYLE)level14.msinc generated/$(STYLE)level15.msinc \
		 generated/$(STYLE)level16.msinc generated/$(STYLE)level17.msinc generated/$(STYLE)level18.msinc



mapfile=osm-$(STYLE).map
here=`pwd`

all:$(mapfile) boundaries.sql

generated/$(STYLE)style.msinc: generate_style.py
	python generate_style.py -s $(STYLE) -g > $@

generated/$(STYLE)level0.msinc: generate_style.py
	python generate_style.py  -s $(STYLE) -l 0 > $@ 

generated/$(STYLE)level1.msinc: generate_style.py
	python generate_style.py  -s $(STYLE) -l 1 > $@ 

generated/$(STYLE)level2.msinc: generate_style.py
	python generate_style.py  -s $(STYLE) -l 2 > $@ 

generated/$(STYLE)level3.msinc: generate_style.py
	python generate_style.py  -s $(STYLE) -l 3 > $@ 

generated/$(STYLE)level4.msinc: generate_style.py
	python generate_style.py  -s $(STYLE) -l 4 > $@ 

generated/$(STYLE)level5.msinc: generate_style.py
	python generate_style.py  -s $(STYLE) -l 5 > $@ 

generated/$(STYLE)level6.msinc: generate_style.py
	python generate_style.py  -s $(STYLE) -l 6 > $@ 

generated/$(STYLE)level7.msinc: generate_style.py
	python generate_style.py  -s $(STYLE) -l 7 > $@ 

generated/$(STYLE)level8.msinc: generate_style.py
	python generate_style.py  -s $(STYLE) -l 8 > $@ 

generated/$(STYLE)level9.msinc: generate_style.py
	python generate_style.py  -s $(STYLE) -l 9 > $@ 

generated/$(STYLE)level10.msinc: generate_style.py
	python generate_style.py  -s $(STYLE) -l 10 > $@

generated/$(STYLE)level11.msinc: generate_style.py
	python generate_style.py  -s $(STYLE) -l 11 > $@

generated/$(STYLE)level12.msinc: generate_style.py
	python generate_style.py  -s $(STYLE) -l 12 > $@

generated/$(STYLE)level13.msinc: generate_style.py
	python generate_style.py  -s $(STYLE) -l 13 > $@

generated/$(STYLE)level14.msinc: generate_style.py
	python generate_style.py  -s $(STYLE) -l 14 > $@

generated/$(STYLE)level15.msinc: generate_style.py
	python generate_style.py  -s $(STYLE) -l 15 > $@

generated/$(STYLE)level16.msinc: generate_style.py
	python generate_style.py  -s $(STYLE) -l 16 > $@

generated/$(STYLE)level17.msinc: generate_style.py
	python generate_style.py  -s $(STYLE) -l 17 > $@

generated/$(STYLE)level18.msinc: generate_style.py
	python generate_style.py  -s $(STYLE) -l 18 > $@

$(mapfile):$(template) $(includes) shapefiles
	$(CPP) -D_debug=$(DEBUG) -D_layerdebug=$(LAYERDEBUG)  -DOSM_PREFIX=$(OSM_PREFIX) -DOSM_SRID=$(OSM_SRID) -P -o $(mapfile) $(template) -DTHEME=$(STYLE) -D_proj_lib=\"$(here)\" -Igenerated
	$(SED) 's/##.*$$//g' $(mapfile)
	$(SED) '/^ *$$/d' $(mapfile)
	$(SED) -e 's/OSM_PREFIX_/$(OSM_PREFIX)/g' $(mapfile)
	$(SED) -e 's/OSM_SRID/$(OSM_SRID)/g' $(mapfile)
	$(SED) -e 's/OSM_UNITS/$(OSM_UNITS)/g' $(mapfile)
	$(SED) -e 's/OSM_EXTENT/$(OSM_EXTENT)/g' $(mapfile)
	$(SED) -e 's/OSM_WMS_SRS/$(OSM_WMS_SRS)/g' $(mapfile)
	$(SED) -e 's/OSM_NAME_COLUMN/$(OSM_NAME_COLUMN)/g' $(mapfile)

boundaries.sql: boundaries.sql.in
	cp -f $< $@
	$(SED) -e 's/OSM_PREFIX_/$(OSM_PREFIX)/g' $@

clean:
	rm -f generated/*

shapefiles:
	cd data; $(MAKE) $(MFLAGS)

Zusätzlich habe ich meine mapcache-osm.xml geändert:

<?xml version="1.0" encoding="UTF-8"?>

<!-- see the accompanying mapcache.xml.sample for a fully commented configuration file -->

<mapcache>
   <cache name="disk" type="disk">
      <base>/tmp</base>
      <symlink_blank/>
   </cache>
   <cache name="sqlite" type="sqlite3">
      <base>/tmp</base>
   </cache>
   <source name="vmap0" type="wms">
      <getmap>
         <params>
            <FORMAT>image/png</FORMAT>
            <LAYERS>default</LAYERS>
         </params>
      </getmap>
      
      <http>
         <url>http://localhost/cgi-bin/mapserv?map=/gro1/mapserver-utils/osm-google.map</url>
      </http>
   </source>
  

<source name="osm" type="wms">
 <getmap>
         <params>
            <FORMAT>image/png</FORMAT>
            <LAYERS>default</LAYERS>
         </params>
      </getmap>

      <http>
         <url>http://localhost/cgi-bin/mapserv?map=/home/user/osm-demo/mapserver-utils-svn/osm-google.map</url>
      </http>
	<MAP>/home/user/osm-demo/mapserver-utils-svn/osm-google.map</MAP>

</source>

<grid name="GK3">
      <metadata>
      <title>GK3</title>
      </metadata>
      <srs>EPSG:31467</srs>
      <srsalias>EPSG:GK3</srsalias>
      <size>256 256</size>
      <extent>3.2803e+006 5.2375e+006 3.9216e+006 6.1062e+006</extent>
      <resolutions>0.1 0.05 0.025 0.0125</resolutions>
</grid>
   
   <tileset name="test">
      <source>vmap0</source>
      <cache>sqlite</cache>
      <grid>WGS84</grid>
      <grid>g</grid>
      <format>PNG</format>
      <metatile>5 5</metatile>
      <metabuffer>10</metabuffer>
      <expires>3600</expires>
   </tileset>
  
<tileset name="osm">
      <metadata>
         <title>OSM MapServer served map</title>
         <abstract>see http://trac.osgeo.org/mapserver/wiki/RenderingOsmDataUbuntu</abstract>
      </metadata>
      <source>osm</source>
      <cache>disk</cache>
      <format>PNG</format>
      <grid>g</grid>
      <grid>WGS84</grid>
      <grid>GK3</grid>
      <metatile>5 5</metatile>
      <expires>10000</expires>
      <auto_expire>86400</auto_expire>
      <metabuffer>10</metabuffer>
   </tileset>

   <default_format>JPEG</default_format>

   <service type="wms" enabled="true">
      <full_wms>assemble</full_wms>
      <resample_mode>bilinear</resample_mode>
      <format>JPEG</format>
      <maxsize>4096</maxsize>
   </service>
   <service type="wmts" enabled="true"/>
   <service type="tms" enabled="true"/>
   <service type="kml" enabled="true"/>
   <service type="gmaps" enabled="true"/>
   <service type="ve" enabled="true"/>
   <service type="demo" enabled="true"/>

   <errors>report</errors>
   <lock_dir>/tmp</lock_dir>

</mapcache>

Ob folgendes korrekt ist bin ich mir nicht sicher, vorallem bei der Resolutions nicht.


<grid name="GK3">
      <metadata>
         <title>GK3</title>
      </metadata>
      <srs>EPSG:31467</srs>
      <srsalias>EPSG:GK3</srsalias>
      <size>256 256</size>
      <extent>3.2803e+006 5.2375e+006 3.9216e+006 6.1062e+006</extent>
      <resolutions>0.1 0.05 0.025 0.0125</resolutions>
</grid>

Unter der Url http://127.0.0.1/mapcache/demo/wms funktioniert soweit alles wenn ich osm-g-wms ausgewählt habe, aber wenn ich osm-GK3-wms wähle bekomme ich nichts angezeigt.
Was mich dabei auch stört ist, das die Koordinatenanzeige kein GK3 ist, sondern was ganz anderes.
Zudem ändert sich die Position, wenn ich wieder zurück wechsel auf osm-g-wms.

Wenn ich folgendes aufrufe:

http://127.0.0.1/mapcache/?LAYERS=osm&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&FORMAT=image%2Fjpeg&SRS=EPSG%3A31467&BBOX=3471736,5933213,3474910,5936388&WIDTH=256&HEIGHT=256

erhalte ich folgende logeinträge, und es wird mir am ende nichts angezeigt :frowning:


[Wed Jul 11 11:32:02 2012] [error] [client 127.0.0.1] CGI Request 1 on process 26672
[Wed Jul 11 11:32:02 2012] [error] [client 127.0.0.1] msDrawMap(): rendering using outputformat named png (AGG/PNG).
[Wed Jul 11 11:32:05 2012] [error] [client 127.0.0.1] msDrawLabelCache(): labelcache_map_edge_buffer = 10
[Wed Jul 11 11:32:10 2012] [error] [client 127.0.0.1] CGI Request 1 on process 26677
[Wed Jul 11 11:32:11 2012] [error] [client 127.0.0.1] msDrawMap(): rendering using outputformat named png (AGG/PNG).
[Wed Jul 11 11:32:13 2012] [error] [client 127.0.0.1] msDrawLabelCache(): labelcache_map_edge_buffer = 10
[Wed Jul 11 11:32:16 2012] [error] [client 127.0.0.1] CGI Request 1 on process 26682
[Wed Jul 11 11:32:16 2012] [error] [client 127.0.0.1] CGI Request 1 on process 26683
[Wed Jul 11 11:32:16 2012] [error] [client 127.0.0.1] CGI Request 1 on process 26684
[Wed Jul 11 11:32:16 2012] [error] [client 127.0.0.1] msDrawMap(): rendering using outputformat named png (AGG/PNG).
[Wed Jul 11 11:32:16 2012] [error] [client 127.0.0.1] msDrawMap(): rendering using outputformat named png (AGG/PNG).
[Wed Jul 11 11:32:17 2012] [error] [client 127.0.0.1] msDrawMap(): rendering using outputformat named png (AGG/PNG).
[Wed Jul 11 11:32:19 2012] [error] [client 127.0.0.1] msDrawLabelCache(): labelcache_map_edge_buffer = 10
[Wed Jul 11 11:32:21 2012] [error] [client 127.0.0.1] msDrawLabelCache(): labelcache_map_edge_buffer = 10
[Wed Jul 11 11:32:22 2012] [error] [client 127.0.0.1] msDrawLabelCache(): labelcache_map_edge_buffer = 10

Ich weiß nicht was ich falsch gemacht habe, oder was ich vergessen habe? Oder geht das gar nicht so wie ich das vor habe?
Vielleicht kann mir wer helfen?

Was mich zudem wundert: Ich habe ja nach Anleitung einen Cache-Ordner im Mapcache ordner erstellt und hatte gedacht dort werden die kacheln dann gespeichert. Aber da ist nichts drin. nur im tmp-Ordner finde ich erzeugte Kacheln.

Weiß leider nicht mehr weiter :frowning:

Ich kenne mich leider mit Mapcache nicht aus, aber der nackte Mapserver sollte schon Karten in Gauß Krüger ausgeben können (habs mal schnell probiert: Mit EPSG:31468 (GK4) funktioniert das, wenn man geduldig auf den Layer mit den Straßen aus OSM wartet…).

In meinem Mapfile steht

WEB
    METADATA
      "ows_enable_request" "*"
        wms_srs "EPSG:900913 EPSG:4326 EPSG:3857 EPSG:25832 EPSG:25833 EPSG:31468"
        labelcache_map_edge_buffer "-10"
        wms_title "osm"
    END
IMAGEPATH "/tmp/"
   IMAGEURL  "/" 
END

Der zusätzliche Eintrag im wms_srs war die einzige Änderung. Ich würde zum weiteren Fehlersuchen mal sehn, ob GK auch im Mapfile angekommen ist. Und falls ja, erstmal ohne Mapcache weitermachen, dann hast eine Fehlerquelle weniger.

hmmm… Blöde Frage, sorry… Du hast schon auch nochmal “make” aufgerufen, nachdem Du das Makefile geändert hast?

Grüße, Max

Hi,

habe nochmal geschaut, tatsächlich fehlte dort der Eintrag, obwohl der da shcon mal war, habe glaube irgendwann nochmal alles versucht, da ist es wohl verloren gegangen.
Habe ihn nun hinzugefügt, aber leider ohne ergebnis im Mapcache.

Leider weiß ich grad gar nicht wie ich nen WMS aufruf direkt über mapserver machen kann. Weiß nur diesen, wo es in openlayer angezeigt wird:
http://192.168.0.44/cgi-bin/mapserv?map=/home/osm-demo/mapserver-utils-svn/osm-google.map&mode=browse&template=openlayers&layers=all

Ungefähr so, aber nicht ausprobiert, nur von der URL einer meiner Kacheln abgetippt:

192.168.0.44/cgi-bin/mapserv?map=/home/osm-demo/mapserver-utils-svn/osm-google.map&layers=all&FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A31467&BBOX=3470000,5333250,3471250,5334500&WIDTH=400&HEIGHT=400

(die bbox müsstest ggf ersetzen)

Mit den Mapserver-Templates kenne ich mich auch nicht aus. Aber klau dir doch einfach mein Beispiel, schmeiss den Layer mit den Luftbildern raus und den mit dem Gitternetz und ersetz URL und Layer im “osmlayer” durch deinen Server.
Bei map steht noch maxExtent, restrictedExtent und projection und unten noch “setCenter”. Das müsstest auch noch auf Deinen 3. Streifen umschreiben.

Oder stell das auf nen öffentlich zugänglichen WMS, dann schreib ich mein Beispiel um.

Grüße, Max

http://192.168.0.44/cgi-bin/mapserv?map=/home/osm-demo/mapserver-utils-svn/osm-google.map&layers=default&FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A31467&WIDTH={w}&HEIGHT={h}&SCALE={s}&BBOX={x1},{y1},{x2},{y2}

Der Aufruf bei Mapserver mit obigen angaben (die letzten Parameter werden von der Application ersetzt) funktioniert.

Aber der Aufurf per mapcache funktioniert mit GK3 leider nicht:(

Habe folgendes versucht:

http://192.168.0.44/mapcache/?LAYERS=osm&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&FORMAT=image%2Fjpeg&SRS=EPSG%3A31467&BBOX=3465386,5933213,3490785,5958613&WIDTH=256&HEIGHT=256

Da stimmt also bei mapcache was nicht. Meine XML wohl falsch!?

Jup, musst nen mapcache-Experten fragen…

So ins Blaue rein (wie gesagt, mapserver kenne ich, -cache nicht):
Die resolutions müssen zur angeforderten BBox passen. Falls Du 1000x1000m anforderst und 256x256Pixel grosse Kacheln haben willst, muss bei den Resolutions der Wert 1000/256=3.90625 dabei sein. Für die nächsthöhere Zoomstufe dann 500/256=1.953125 … Dein Beispiel da oben hat 25400Meter und 256 Pixel, da wäre 100 korrekt (oder 99? weiss nicht, wie tolerant das gehandhabt wird)
Einheiten verwirren auch oft: ich würde so oft wie möglich m schreiben, man weiss nie, welche Infos sich mapserver aus dem epsg-code holt.

Grüße, Max

Hmm, ich habe ja mir schon die Beispiele vin der XML angeguckt und genau da war ich etwas verwirrt, drei Beispiele:

<grid name="g">
            <metadata>
               <title>GoogleMapsCompatible</title>
               <WellKnownScaleSet>urn:ogc:def:wkss:OGC:1.0:GoogleMapsCompatible</WellKnownScaleSet>
            </metadata>
            <extent>-20037508.3427892480,-20037508.3427892480,20037508.3427892480,20037508.3427892480</extent>
            <srs>EPSG:900913</srs>
            <srsalias>EPSG:3857</srsalias>
            <size>256 256</size>
            <resolutions>
               156543.0339280410
               78271.51696402048
               39135.75848201023
               19567.87924100512
               9783.939620502561
               4891.969810251280
               2445.984905125640
               1222.992452562820
               611.4962262814100
               305.7481131407048
               152.8740565703525
               76.43702828517624
               38.21851414258813
               19.10925707129406
               9.554628535647032
               4.777314267823516
               2.388657133911758
               1.194328566955879
               0.5971642834779395
            </resolutions>
         </grid>

Die haben alle ganz unterschiedliche Resolutions, wobei auch einmal dd einmal m und einmal garncihts als units angegeben ist.
Fragemich auch wozu das überhaupt nötig ist, also die Size größe. Ich kann doch die Größe beim WMS beim Aufruf angeben!?
Oder hat das mit was ganz anderem zu tun.

Muss ich mal weiter testen.

Diese Reihe “156543 78271 …” ist die übliche 900913-Kachelung (Zoom 0 sind 40000km (Äquatorlänge) /256Pixel (Kachelgröße) =156543 m/Pixel. Die anderen weiss ich nicht. Du musst dich aber nicht an die Vorgaben halten, die maximale Zahl dort gibt Deine individuelle Zoomstufe 0 an.

Die Größe wird beim WMS-Aufruf mitgegeben. Deshalb funktioniert mapserver allein auch gut ohne diese Angaben. Aber wenn ich die Sache mit dem cache richtig verstanden hab, legt der ja das Bild in seinem “grid” sortiert auf der Platte ab. Dazu muss er wissen, welche Kachelgrößen er hat (sowohl als Landschaft in der echten Welt als auch als Bild, dazu dient die Angabe von resolution und unit) und wie die Kacheln numeriert werden (dazu könnte der extent wichtig sein).