Страница 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])+'°'+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])+'°'+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);