Страница 1 из 1

градусы из MousePosition в OL

Добавлено: 16 сен 2010, 12:31
Artem
Добрый день.
в OpenLayers есть метод new OpenLayers.Control.MousePosition(), прекрасно работает, только вот проекция у меня не EPSG:4326, поэтому координаты показывает в метрах. Вопрос: можно ли заставить этот метод отдавать координаты в классическом виде (градусы-минуты-секунды)?
Спасибо за внимание.

Re: градусы из MousePosition в OL

Добавлено: 17 сен 2010, 13:19
Mavka
Вероятно, для этого нужно указать displayProjection в свойствах контроллера.

Re: градусы из MousePosition в OL

Добавлено: 22 сен 2010, 07:09
Artem
Так?

Код: Выделить всё

map.addControl(new OpenLayers.Control.MousePosition({numDigits: 4, displayProjection: new OpenLayers.Projection.transform(new OpenLayers.Projection("EPSG:3576"), new OpenLayers.Projection("EPSG:4326"))}));
Или надо в здесь указывать?

Код: Выделить всё

var options = {
	projection: new OpenLayers.Projection("EPSG:4326"),
	displayProjection: new OpenLayers.Projection.transform(new OpenLayers.Projection("EPSG:3576"), new OpenLayers.Projection("EPSG:4326")),
	maxExtent: new OpenLayers.Bounds(-1852750, -3935945, 1482369, -727819)
};
Не работает, видимо чего-то недопонял. Может поправит кто? Не совсем понятна логика transform

Re: градусы из MousePosition в OL

Добавлено: 24 сен 2010, 10:27
Artem

Код: Выделить всё

      <script defer="defer" type="text/javascript">
	var lat = -2330945; 
	var lon = -205335;
	var zoom = 0;
	var map, layer;

	var options = 
	{
		displayProjection: new OpenLayers.Projection.transform(new OpenLayers.Projection("EPSG:3576"), new OpenLayers.Projection("EPSG:4326")),
		numDigits: 4
	};

        var map = new OpenLayers.Map('map');
        var wms = new OpenLayers.Layer.WMS(
		"WMS",
		"http://XX.XX.XX.XX/cgi-bin/mapserv.exe?map=/ms4w/apps/map/map_wms.map&layer=sub",
		{layers: 'sub'},
		{
			maxExtent: new OpenLayers.Bounds(-1852750, -3935945, 1482369, -727819), 
			maxResolution: 'auto', 
			projection:"EPSG:3576",
			units: "m",
		}
		);
        map.addLayer(wms);
	map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);

	map.addControl(new OpenLayers.Control.MousePosition({numDigits: 4, displayProjection: new OpenLayers.Projection.transform(new OpenLayers.Projection("EPSG:3576"), new OpenLayers.Projection("EPSG:4326"))}));

map.addControl(new OpenLayers.Control.MousePosition(options));


        map.zoomToMaxExtent();
      </script>
Данные на сервере хранятся в проекции ламберта, хочется чтоб "MousePosition" показывала не его координаты, а градусы-минуты-секунды, посмотрел по ссылки, вставил "displayProjection", реакции ноль, как гонит ламберта - так и гонит. Чего не хватает?

Re: градусы из MousePosition в OL

Добавлено: 24 сен 2010, 11:38
Mavka
Вот это ж надо так самого себя подставить. Битый час пытался заставить его работать. А всего то надо было вспомнить то, о чем сам же недавно писал.

Скачиваете proj4js.
Указываете проекцию:

Код: Выделить всё

map.addControl(
    new OpenLayers.Control.MousePosition({
        displayProjection: new OpenLayers.Projection('EPSG:4326')
    })
); 
И все работает. Проверено.

Re: градусы из MousePosition в OL

Добавлено: 04 окт 2010, 08:18
Artem
Спасибо, работает, только всё равно выдаёт десятичные градусы, чтоб выдавать градусы-минуты-секунды пришлось вбить такой костыль:

Код: Выделить всё

	function TransformDegree()
	{
		var degree = OpenLayers.Util.getElement("controlmouse").innerHTML;
		var arr_deg=degree.split(', ');
		return 'с.ш.'+Math.floor(arr_deg[1])+'&deg;'+Math.floor((arr_deg[1]-Math.floor(arr_deg[1]))*60)+'\''+((((arr_deg[1]-Math.floor(arr_deg[1]))*60)-Math.floor((arr_deg[1]-Math.floor(arr_deg[1]))*60))*60).toFixed(4)+'\'\''+
'в.д.'+Math.floor(arr_deg[0])+'&deg;'+Math.floor((arr_deg[0]-Math.floor(arr_deg[0]))*60)+'\''+((((arr_deg[0]-Math.floor(arr_deg[0]))*60)-Math.floor((arr_deg[0]-Math.floor(arr_deg[0]))*60))*60).toFixed(4)+'\'\'';

	}

map.addControl(new OpenLayers.Control.MousePosition(options));
map.events.register("mousemove", map, function(e) {var position = this.events.getMousePosition(e); OpenLayers.Util.getElement("coords").innerHTML = TransformDegree();});

Логика такая: подключаю "MousePosition", делаю "displayProjection: new OpenLayers.Projection('EPSG:4326')", получаю, соответственно, значения в градусах и при помощи самописной функции преобразую их в читаемый вид. Далее по "map.events.register" выгружаю эту информацию в новый слой. Теперь вопрос такой: возможно ли более изящное решение? :)

Re: градусы из MousePosition в OL

Добавлено: 04 окт 2010, 09:18
Mavka
В OpenLayers.Control.MousePosition есть метод formatOutput, который нужно переопределить. На вход он получает один параметр (latlon), а возвращать должен html-код (или просто строку текста).

Re: градусы из MousePosition в OL

Добавлено: 04 окт 2010, 10:44
Artem
Ага, так лучше, спасибо.

Re: градусы из MousePosition в OL

Добавлено: 12 окт 2010, 15:28
dravig
А каким образом можно загнать градусные значения широты и долготы (исходные координаты опять таки в метрах) в переменные?

Re: градусы из MousePosition в OL

Добавлено: 12 окт 2010, 15:41
dravig
И почти сразу решил проблему вот так:
var source = new Proj4js.Proj('EPSG:4326');
var dest = new Proj4js.Proj('EPSG:3395');
var p = new Proj4js.Point(70,70);
Proj4js.transform(source, dest, p);