OpenLayers - получите широту / долготу на ходу - PullRequest
0 голосов
/ 19 марта 2012

Я очень новичок в OpenLayers, некоторое время пользуюсь Google Maps, но хочу переключиться на что-то более открытое. Из примеров, которые я видел в Интернете, и ответов на другие вопросы, которые я видел здесь, я придумал эту базовую карту с точкой: http://pastie.org/3625219

Я хотел бы получить широту / долготу точки после ее перемещения. У меня проблема с преобразованием проекции обратно в 4326 из 900913. Все, что я пробовал для преобразования, возвращается пустым ...

SO! Я уверен, что мне не хватает чего-то базового ... Javascript не мой родной язык. Любые указатели будут оценены.

Ответы [ 2 ]

3 голосов
/ 19 марта 2012

Не нужно преобразовывать координаты x и y отдельно. Вы должны сделать клон объекта или геометрию объекта и преобразовать геометрию. Например:

point_transformed = feature.clone().geometry.transform(epsg900913, epsg4326);

См. Код здесь .

0 голосов
/ 09 июля 2012

@ scottB изучить этот код, который показывает, как определить правильные преобразования для каждого слоя. проекция, которая работает на открытых слоях, может не работать автоматически с openstreetmaps (это сферическая проекция меркатора).

я адаптировал этот пример из openlayers , чтобы я мог выполнить 2 вещи:

  1. сохранить широту и долготу позиции маркера
  2. разместить маркер, нажав на карту открытых слоев

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" debug="true">
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
        <meta name="apple-mobile-web-app-capable" content="yes">
        <title>MousePosition Control</title>
        <link rel="stylesheet" href="http://openlayers.org/dev/theme/default/style.css" type="text/css">
        <link rel="stylesheet" href="http://openlayers.org/dev/examples/style.css" type="text/css">
        <script src="../OpenLayers.js"></script>
        <script type="text/javascript">
            var map;
            function init(){
                var map = new OpenLayers.Map('map');
                var proj4326 = new OpenLayers.Projection("EPSG:4326");
                var projmerc = new OpenLayers.Projection("EPSG:900913");
                var layerOSM = new OpenLayers.Layer.OSM("Street Map");
                map.addLayers([layerOSM]);
                if (!map.getCenter()) map.zoomToMaxExtent();
                map.events.register("mousemove", map, function(e) { 
                    var position = this.events.getMousePosition(e);
                    OpenLayers.Util.getElement("coords").innerHTML = 'MOUSE POSITION '+position;
                    var lonlat = map.getLonLatFromPixel( this.events.getMousePosition(e) );
                    OpenLayers.Util.getElement("lonlatTG").innerHTML = 'lonlat => '+lonlat;
                    var lonlatTransf = lonlat.transform(map.getProjectionObject(), proj4326);
                    OpenLayers.Util.getElement("lonlatTrans").innerHTML = 'lonlatTransf => '+lonlatTransf;
                    OpenLayers.Util.getElement("lonlatDouble").innerHTML = 'lonlat => '+lonlat;
                });
    
                map.events.register("click", map, function(e) {
                    var position = this.events.getMousePosition(e);
                    var icon = new OpenLayers.Icon('http://maps.google.com/mapfiles/ms/icons/red-pushpin.png');   
                    var lonlat = map.getLonLatFromPixel(position);
                    var lonlatTransf = lonlat.transform(map.getProjectionObject(), proj4326);
                    alert ('lonlatTrans=> lat='+lonlatTransf.lat+' lon='+lonlatTransf.lon+'\nlonlat=>'+lonlat+'\nposition=>'+position);
                    var lonlat = lonlatTransf.transform(proj4326, map.getProjectionObject());
                    var markerslayer = new OpenLayers.Layer.Markers( "Markers" );
                    markerslayer.addMarker(new OpenLayers.Marker(lonlat, icon));
                    map.addLayer(markerslayer);
                });
                map.addControl(new OpenLayers.Control.LayerSwitcher());
            }
        </script>
      </head>  
    
      <body onload="init()">
        <h1 id="title">MousePosition Control</h1>
        <div id="tags">coordinate</div>
        <p>Click on map and create marker</p>
        <div id="map" class="smallmap"></div>
        <div id="coords"></div>
        <div id="lonlatTG"></div>
        <div id="lonlatTrans"></div><br/>
        <p>
        see how, even though we did NOT transform [lonlat],
        <br/>it was nevertheless transformed
        </p>
        <div id="lonlatDouble"></div>
    
      </body>
    </html>
    

есть кое-что, что вам нужно знать о методе TRANSFORM для LonLat, который используется в этом простом примере: когда вы применяете [.transform (projection1, projection2)] к любому LonLat, все объекты LonLat преобразуются.

поиграйтесь с порядком определенных команд, и вы поймете, что я имею в виду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...