Falsche Projection für Vector Layer Daten?

Hi,

mein Problem:
http://www.diy-streetview.org/data/development/20110209a/index_rotate_posting.html

Wenn man ganz raus zoomt sieht man dass die Vector Daten in Afrika landen.
Hätten aber wie der Rest der Daten in Deutschland sein sollen.

Ich dachte ich hätte dem Vector Layer die richtige Projection beigebracht?


            vectors = new OpenLayers.Layer.Vector(
                "Simple Geometry",{
                    styleMap: new OpenLayers.StyleMap({
                        "default": {
                            externalGraphic: "marker-green.png",
                            //graphicWidth: 17,
                            graphicHeight: 20,
                            graphicYOffset: -19,
                            rotation: "${angle}",
                            fillOpacity: "${opacity}"
                        },
                        "select": {
                            cursor: "crosshair",
                            externalGraphic: "blue_small.png"
                        }
                    }),
                projection: new OpenLayers.Projection("EPSG:4326"),
                displayProjection: new OpenLayers.Projection("EPSG:4326")
                }
            );

Was muss ich ändern?

Im Endeffekt geht es darum ein rotierendes Icon auf die richtige Stelle in der Karte zu kriegen das Anzeigt in welche Richtung der Streetview grade schaut.

Dieser Code soll integriert werden:
http://openlayers.org/dev/examples/styles-rotation.html

Besser noch dieser mit Anzeige des Zoom Öffnugnswinkels:
http://openlayers.org/dev/examples/rotate-features.html

Ist wer interessiert mir zu helfen?

Danke,
Jan
janmartin AT diy-streetview DOT org

Probier mal

projection: new OpenLayers.Projection("EPSG:900913"),
displayProjection: new OpenLayers.Projection("EPSG:4326")

Grüße, Max

Keine Änderung.

Die ganze Seite sieht so aus:


<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">

    <head>

        <title>index_rotate.html</title>

        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

        <META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">

        <script type="text/javascript" src="embed/calls_and_callbacks.js"></script>

        <script type="text/javascript" src="embed/swfobject.js"></script>

        <script type="text/javascript">

            var flashvars = {};

            flashvars.xml = "settings.xml";

            var params = {};

            params.play = "true";

            params.loop = "false";

            params.menu = "false";

            params.quality = "high";

            params.scale = "showall";

            params.salign = "";

            params.wmode = "window";

            params.bgcolor = "#FFFFFF";

            params.devicefont = "false";

            params.allowfullscreen = "true";

            params.allowscriptaccess = "sameDomain";

            var attributes = {};

            swfobject.embedSWF("DIY_streetview_player.swf", "DIY_streetview_player", "100%", "100%", "10.0.0", "embed/expressInstall.swf", flashvars, params, attributes);

        </script>



    <script type="text/javascript" src="scripts/OpenLayers.js"></script>

    <script type="text/javascript" src="scripts/OpenStreetMap.js"></script>

    <script type="text/javascript">

            var map, vectors, layer, spot=1;



// Source: http://wiki.openstreetmap.org/wiki/User:MHohmann 

        function init() {

            // First of all, we need to create the map.

            map = new OpenLayers.Map ("map1", {

                controls:[

                    new OpenLayers.Control.Navigation(),

                    new OpenLayers.Control.PanZoomBar(),

                    new OpenLayers.Control.LayerSwitcher(),

//                    new OpenLayers.Control.Attribution()

                    ],

                maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),

                maxResolution: 156543.0399,

                numZoomLevels: 19,

                units: 'm',

                projection: new OpenLayers.Projection("EPSG:900913"),

                displayProjection: new OpenLayers.Projection("EPSG:4326")

            } );



        // define layers

             mapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik");

            osmarender = new OpenLayers.Layer.OSM.Osmarender("Osmarender");

            vectors = new OpenLayers.Layer.Vector(

                "Simple Geometry",{

                    styleMap: new OpenLayers.StyleMap({

                        "default": {

                            externalGraphic: "marker-green.png",

                            //graphicWidth: 17,

                            graphicHeight: 20,

                            graphicYOffset: -19,

                            rotation: "${angle}",

                            fillOpacity: "${opacity}"

                        },

                        "select": {

                            cursor: "crosshair",

                            externalGraphic: "blue_small.png"

                        }

                    }),

                            projection: new OpenLayers.Projection("EPSG:4326"),
                            displayProjection: new OpenLayers.Projection("EPSG:900913")

                }

            );



            // Add the layers.

      map.addLayers([mapnik, osmarender, vectors]);

 

            // features for the vectors map

            var features = [];

            var x = 49.994586;

            var y = 8.665279;

            for(var i = 0; i < 10; i++){

                x += i * .5;

                y += i * .1;

                features.push(

                    new OpenLayers.Feature.Vector(

                        new OpenLayers.Geometry.Point(x, y), {angle: (i*36)%360-180, opacity:i/10+.1}

                    )

                );

                features.push(

                    new OpenLayers.Feature.Vector(

                        new OpenLayers.Geometry.Point(x, y), {angle: (i*36)%360, opacity:i/10+.1}

                    )

                );

            }





//            map.setCenter(new OpenLayers.LonLat(x-10, y), 5);

            vectors.addFeatures(features);







            // This will enable us to autozoom the map to the displayed data.

            var dataExtent;

            var setExtent = function()

            {

                if(dataExtent)

                    dataExtent.extend(this.getDataExtent());

                else

                    dataExtent = this.getDataExtent();

                map.zoomToExtent(dataExtent);

            };

 

            // Now add a layer for the GPX data. The file "map_data.txt" contains some GPX data.

            var lgpx = new OpenLayers.Layer.GML("Panorama", 

                    "map_data.txt",{

                    format: OpenLayers.Format.Text,

                projection: new OpenLayers.Projection("EPSG:4326")

            });

 

            // This will perform the autozoom as soon as the GPX file is loaded.

            lgpx.events.register("loadend", lgpx, setExtent);

            map.addLayer(lgpx);

 

            // When clicking a red icon on the map, show the streetview in the DIY streetview player

            function showstreetview(feature) {

                var str=feature.attributes.filename.slice(0, - 4)

                // alert('str: ' + str);

                callPano(str);

                document. getElementById("nation"). innerHTML = feature.attributes.nation;

                document. getElementById("country"). innerHTML = feature.attributes.country;

                document. getElementById("town"). innerHTML = feature.attributes.town;

                document. getElementById("street"). innerHTML = feature.attributes.street;

            }

 

            // This feature connects the click events to the functions defined above, such that they are invoked when the user clicks on the map.

            var selcontrol = new OpenLayers.Control.SelectFeature(lgpx, {

                onSelect: showstreetview,

                // onUnselect: destroyPopup

            });

            map.addControl(selcontrol);

            selcontrol.activate();





 

            // Finally, center the map - this will activate the autozoom / autocenter feature.

            if(!map.getCenter())

                map.setCenter(null, null);

        }

    </script>

    </head>



    <body onload="init();">



<div style="position:absolute;left:20px;display:inline;">

        <div id="nation" style="display : inline;"></div> > 

        <div id="country" style="display : inline;"></div> > 

        <div id="town" style="display : inline;"></div> > 

        <div id="street" style="display : inline;"></div>

</div>



    <div style="position:absolute;left:20px;top:30px;width: 800px; height: 400px;">

            <div id="DIY_streetview_player">

                <!--

                <a href="http://www.adobe.com/go/getflashplayer">

                    <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" />

                </a>

                -->

            </div>

    </div>



<div style="position:absolute;right:20px;top:30px;width: 400px; height: 400px; border: 1px solid black;" id="map1"></div>

<div style="position:absolute;right:20px;bottom:20px;width: 20%; height: 20%;" id="map2"></div>



<div style="position:absolute;left:20px;bottom:50px;width: 20%; height: 20%;" id="buttons">

        <div id="a_tbox" style="display : inline;">Streetview</div>

        <div id="b_tbox" style="display : inline;">pan tilt fow</div>

</div>



    </body>

</html>

Änders doch mal in Zeile 69 und 70 auch. Oder lass beim layer “vectors” die Projektionen mal weg.

Bringt alles überhaupt nichts.
Was mich vermuten lässt, dass da etwas völlig falsch läuft, denn es hätte sich ja überhaupt irgendwas tun müssen.

So auf die Schnelle kann ich nur ins Blaue raten, und viel Zeit hab ich grad nicht…

Dieses “feature” ab Zeile 79 enthält Deine Punkte, oder? Die baust Du mit Koordinaten (lat,lon) in den vektor-layer ein (in dieser i=0;i<10;-Schliefe).

Ich weiss grad nicht, warum ich das tu, aber ich bau solche Punkte immer mit einer Transformation von EPSG 4326->900913 ein. Hier z.B. ab Zeile 96. Glaub jetzt daran liegts, sorry, dass ich nicht konkreter werde… :wink:

Etwas besser.
Jetzt liegen die features bei Indien.

Habe Dir grade eine mail per forum geschickt.
Jan

Das ist einfach: Dinge die nach Deutschland gehören, aber rechts von Somalia im Meer landen, sind ein sicherer Hinweis darauf, dass man Längen- und Breitengrad vertauscht.

Stimmt! Problem gelöst.

Und es geht weiter:

Drehen
Habe einen Weg gefunden die Daten der lgpx features zu verwenden:
panoChanged in http://diy-streetview.org/data/development/20110209a/embed/calls_and_callbacks.js

Das Icon zeigt nun in die imgdirection Richtung. Sobald das update des DIY streetview players verfügbar ist wird auch pan per callback in dieser function verfügbar sein, und das Drehen ist damit erledigt.

Position
Tja,
alert(“feature.data” + feature.data.toSource());

gibt

feature.data({imgdirection:“88”, filename:“000045.jpg”, pano:“/home/me/DIY-streetview/20110123/out/jpg/000045.jpg”, thumbnail:“/home/me/DIY-streetview/20110123/out/jpg.small/000045.jpg”, datetimeoriginal:“2011:01:23 14:13:00”, nation:“Germany”, country:“Hessen”, town:“Langen”, street:“Westendstra\xDFe”})

Dank an Manuel: http://forum.openstreetmap.org/viewtopic.php?pid=142086#p142086

lat und lon:

alert(“feature.geometry” + feature.geometry.toSource());

feature.geometry({id:“OpenLayers.Geometry.Point_136”, x:964614.52717613, y:6445338.3059475, bounds:{left:964614.52717613, bottom:6445338.3059475, right:964614.52717613, top:6445338.3059475}})
Und wie mach ich aus x und y nun latitude=“49.9945861297528” longitude=“8.66527973166667”?

Jan

Auch gelöst:
http://www.diy-streetview.org/data/development/20110209a/index_rotate_posting.html
und
http://www.diy-streetview.org/data/development/20110209a/embed/calls_and_callbacks.js

Das Drehen des Icons klappt wohl erst wenn der flash player aktualisiert wurde.

Das einzige was verbleibt ist das Icon über den grünen Punkten anzuzeigen.
Gibt es dafür sowas wie z-index?

Die Reihenfolge des Ladens der Layers macht jedenfalls keinen Unterschied.

Gerade hab ich das hier gefunden:

http://dev.openlayers.org/docs/files/OpenLayers/Layer-js.html#OpenLayers.Layer.setZIndex

Wenn du das für die jeweiligen Layer aufrufst, sollte sich das Problem lösen lassen.

Habe dies hinzugefügt.
Klappt leider nicht.

lgpx.setZIndex(10);
vectors.setZIndex(100);

Mit
map.addLayers([mapnik, osmarender, vectors]);

vectors.setZIndex(1000);

klappt es!
Reihenfolge und der Wert ist hier entscheidend.

Sobald der flash player aktualisiert ist dreht sich das Icon dann hoffentlich auch.
Dann geht es weiter mit der Version mit sich änderndem Öffnungswinkel.

Ich hätte gerne sowas:
http://diy-streetview.org/data/development/20110209a/new_icon.png

Danke,
Jan

Falscher Alarm.
Jetzt kann man die grünen Punkte nicht mehr anklicken.
Seufz…