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

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
Artem
Интересующийся
Сообщения: 29
Зарегистрирован: 01 сен 2010, 05:59
Репутация: 0

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

Сообщение Artem » 16 сен 2010, 12:31

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

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

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

Сообщение Mavka » 17 сен 2010, 13:19

Вероятно, для этого нужно указать displayProjection в свойствах контроллера.
лангольеры под окном жрали время ом-ном-ном

Artem
Интересующийся
Сообщения: 29
Зарегистрирован: 01 сен 2010, 05:59
Репутация: 0

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

Сообщение Artem » 22 сен 2010, 07:09

Так?

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

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
Последний раз редактировалось Artem 22 сен 2010, 16:28, всего редактировалось 1 раз.

Artem
Интересующийся
Сообщения: 29
Зарегистрирован: 01 сен 2010, 05:59
Репутация: 0

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

Сообщение Artem » 24 сен 2010, 10:27

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

      <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", реакции ноль, как гонит ламберта - так и гонит. Чего не хватает?

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

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

Сообщение Mavka » 24 сен 2010, 11:38

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

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

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

map.addControl(
    new OpenLayers.Control.MousePosition({
        displayProjection: new OpenLayers.Projection('EPSG:4326')
    })
); 
И все работает. Проверено.
лангольеры под окном жрали время ом-ном-ном

Artem
Интересующийся
Сообщения: 29
Зарегистрирован: 01 сен 2010, 05:59
Репутация: 0

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

Сообщение Artem » 04 окт 2010, 08:18

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

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

	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" выгружаю эту информацию в новый слой. Теперь вопрос такой: возможно ли более изящное решение? :)

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

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

Сообщение Mavka » 04 окт 2010, 09:18

В OpenLayers.Control.MousePosition есть метод formatOutput, который нужно переопределить. На вход он получает один параметр (latlon), а возвращать должен html-код (или просто строку текста).
лангольеры под окном жрали время ом-ном-ном

Artem
Интересующийся
Сообщения: 29
Зарегистрирован: 01 сен 2010, 05:59
Репутация: 0

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

Сообщение Artem » 04 окт 2010, 10:44

Ага, так лучше, спасибо.

dravig
Участник
Сообщения: 54
Зарегистрирован: 18 мар 2010, 16:58
Репутация: 0

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

Сообщение dravig » 12 окт 2010, 15:28

А каким образом можно загнать градусные значения широты и долготы (исходные координаты опять таки в метрах) в переменные?

dravig
Участник
Сообщения: 54
Зарегистрирован: 18 мар 2010, 16:58
Репутация: 0

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

Сообщение dravig » 12 окт 2010, 15:41

И почти сразу решил проблему вот так:
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);

Ответить

Вернуться в «Веб-картография»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя