Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Перевести широту/долготу в пиксели на картинке. (https://javascript.ru/forum/dom-window/8842-perevesti-shirotu-dolgotu-v-pikseli-na-kartinke.html)

Jurasmi 16.04.2010 12:51

Перевести широту/долготу в пиксели на картинке.
 
Есть карта Москвы (взята из google maps и немного приукрашена), она висит на сайте в виде фона у div-а.



Ещё есть координаты точек-объектов (взяты из google maps).

Задача: отобразить эти точки-объекты на картинке "карта-Москвы".
По сути: как перевести гугло-координаты в пиксели на картинке.

На масштабах города сделать это довольно просто (надо знать координаты одного угла картинки в гугле и знать "цену" одно пикселя, т.е. при перемещении на один пиксель на сколько мы перемещаемся в координатах, делать это надо отдельно по ОХ и OY).
В пределах одного города "не заметно", что на самом деле "цена" пикселя не постоянна, но в масштабах страны - это заметно и такой подход "простенький" использовать нельзя.

Как можно расставить "точки" в больших масштабах?

Skipp 16.04.2010 13:04

делай див размером, допустим 3х3(пиксель).
И позиционируй его на карте, туда куда надо.
Если хочешь высчитать широту и долготу, с начало узнай координаты самых самых точек(самую левую, самую правую...верх, низ) и высчитывай исходя из размера картинки на экране.

Jurasmi 16.04.2010 13:39

Я и спрашиваю как это сделать.

Skipp 16.04.2010 13:41

гугли и ищи какие координаты левого, верхнего, нижнего и правого края твоей карты. И пиши сюда.

Jurasmi 16.04.2010 14:32

Да, мы знаем координаты углов картинки ("карта Москвы") на гугло-карте.
Но теперь всё только начинается. Меня интересует преобразование реальных долготы/широты в пиксели на картинке "карты москвы".
Там "сильно-нелинейные" преобразования.

Skipp 16.04.2010 14:46

Цитата:

Сообщение от Jurasmi (Сообщение 51841)
Меня интересует преобразование реальных долготы/широты в пиксели на картинке

Что значит реальных?

Высчитай разницу между углами и подели на пиксели занимаемые картинкой.

Jurasmi 16.04.2010 14:48

Дело в том, что реальные широта/долгота распределяются не линейно на проекции google maps.

Leax 16.04.2010 14:51

Jurasmi,
советую искать на геодезических форумах:
преобразование систем координат WGS84 (широта, долгота) в СК42 (X, Y)

Тут еще глянь. Вроде формулы есть.
И учти, что в геодезии ось X направлена на север, а Y - на восток

Jurasmi 16.04.2010 15:08

Спасибо, пошел учить.
Вопрос открыт.

Jurasmi 16.04.2010 15:42

Цитата:

советую искать на геодезических форумах:
преобразование систем координат (широта, долгота) в СК42 (X, Y)
Я не уверен, что google maps использует проекцию WGS84.
Они используют "Mercator projection".

Leax 16.04.2010 15:53

Jurasmi,
широта и долгота- только одни бывают, можете не сомневаться )

Jurasmi 19.04.2010 10:01

Охотно верю )

Leax 19.04.2010 11:14

Jurasmi,
так получилось сделать по указанной мной ссылке? Там же формулы пересчета были, вроде

Jurasmi 22.04.2010 10:57

Пока сделал перевод географических координат для "Московских объектов" - в рамках города. Формулы по вашей ссылки пока не использовал.

valikb 28.04.2010 16:23

У меня та же проблема. Нужно города по миру расставить. По формулам, о которых шла речь в этом обсуждении, не ясно что за переменные ro, a, e2, da _, de2/2 _ и т.д.
Короче, формулы вроде:
dB = ro / (M + H) * (N / a * e2 * Sin(B) * Cos(B) * da _ + (N ^ 2 / a ^ 2 + 1) * N * Sin(B) * Cos(B) * de2 / 2 _ - (dx * Cos(L) + dy * Sin(L)) * Sin(B) + dz * Cos(B)) _ - wx * Sin(L) * (1 + e2 * Cos(2 * B)) _ + wy * Cos(L) * (1 + e2 * Cos(2 * B)) _ - ro * ms * e2 * Sin(B) * Cos(B)
не рабочие.

Кто-нибудь знает выход?

Цитата:

Сообщение от Jurasmi (Сообщение 52563)
Пока сделал перевод географических координат для "Московских объектов" - в рамках города. Формулы по вашей ссылки пока не использовал.

Каким образом? Какая точность?

Jurasmi 28.04.2010 16:27

Честно - точность никак не мерил.
На глаз - вроде ничего. Для нашего проекта этого хватает.
Сейчас выпишу код.

Jurasmi 28.04.2010 16:38

moscowMapAtYandex({
	//id блока с картой в качестве фона
	mapId:'map', 
	//точки, координаты, которых известны (не менее двух)
	//это "характерные" точки (например точки на МКАДе)
	pointArr:[
		{
			pixel:[102, 292], //в пикселях на картинке (от левого-нижнего угла) (ОХ, OY)
			coord:[37.589093, 55.909067] //(Longitude/Latitude) - географические координаты из yandex maps
		},
		{
			pixel:[24, 158], 
			coord:[37.386533, 55.713611]
		}
	]
});


function moscowMapAtYandex(setup){
	var map = document.getElementById(setup.mapId),
		OX1 = setup.pointArr[0].pixel[0],
		OX2 = setup.pointArr[1].pixel[0],
		OY1 = setup.pointArr[0].pixel[1],
		OY2 = setup.pointArr[1].pixel[1],
		lon1 = setup.pointArr[0].coord[0],
		lon2 = setup.pointArr[1].coord[0],
		lat1 = setup.pointArr[0].coord[1],
		lat2 = setup.pointArr[1].coord[1],
		deltaOX = Math.abs(OX1 - OX2),
		deltaOY = Math.abs(OY1 - OY2),
		deltaLat = Math.abs(lat1 - lat2),
		deltaLon = Math.abs(lon1 - lon2),
		oxPixPrice = deltaLon/deltaOX,//"цена" одного пикселя по OX
		oyPixPrice = deltaLat/deltaOY,//"цена" одного пикселя по OY
		Olon = lon1-OX1*oxPixPrice,//долгота левого-нижнего угла картинки
		Olat = lat1-OY1*oyPixPrice;//широта левого-нижнего угла картинки
	
	var pointList = map.getElementsByTagName('a'); //точки на карте
	for(i=0; i<=pointList.length-1; i++){
		var curPoint = pointList[i],
			curPointLon = curPoint.getElementsByTagName('span')[0].innerHTML,//здесь записана долгота из Яндекса
			curPointLat = curPoint.getElementsByTagName('span')[1].innerHTML,//здесь записана широта из Яндекса
			curPointOX = Math.round((curPointLon-Olon)/oxPixPrice),
			curPointOY = Math.round((curPointLat-Olat)/oyPixPrice);
			
		curPoint.style.left = curPointOX+'px';
		curPoint.style.bottom = curPointOY+'px';
	}
}


Если нужны пояснения - пиши, может помогу.
Мне тут ссылок надавали, но они на английском, я пока не во всех разобрался.
http://stackoverflow.com/questions/2...a-given-picure

valikb 29.04.2010 18:16

спасибо за ответ
 
Но эти формулы работают если принять, что широта и долгота - прямые линии. Это применимо на маленьких картах вроде карты города. Но мне нужен мир. Я даже готов дать $100 тому, кто напишет мне как вывести с точностью до 1 километра города на карте вроде этой: http://en.wikipedia.org/wiki/File:BlankMap-World6.svg

Leax 30.04.2010 08:49

valikb,
Если получится перевести широту и долготу в условные X, Y которые можно будет потом смасштабировать в X, Y вашей прямоугольной карты- так устроит?

Jurasmi 30.04.2010 09:32

Меня, к стати, тоже устроит :)

valikb 30.04.2010 17:55

Цитата:

Сообщение от Leax (Сообщение 53673)
valikb,
Если получится перевести широту и долготу в условные X, Y которые можно будет потом смасштабировать в X, Y вашей прямоугольной карты- так устроит?

Да, меня это утроит целиком. Делаю на Flash в ActionScript - там и проверим как будет работать. Если вы возьмётесь - вот вам ссылка для справки: http://www.uwgb.edu/dutchs/usefuldata/UTMFormulas.HTM

valikb 08.05.2010 22:18

Цитата:

Сообщение от valikb (Сообщение 53779)
Да, меня это утроит целиком. Делаю на Flash в ActionScript - там и проверим как будет работать. Если вы возьмётесь - вот вам ссылка для справки: http://www.uwgb.edu/dutchs/usefuldata/UTMFormulas.HTM

Вопрос снимается - решение моей задачи найдено.
Оказывается, существует такая карта мира, что для неё не нужно особо переводить.
То есть есть много разных карт мира. Один из видов подходит мне. Для него работают простейшие формулы:
lat = -lat;
lat = lat+90;
lon = lon+180;
_x = lon*map._width/360);
_y = lat*map._height/180);
Вот так - всё оказалось проще паренной репы.
Насчёт карты Москвы - думаю, рассчитывать по прямым как вы сейчас делаете - самое лучшее решение.

bullewinkle 23.03.2014 06:57

Здравствуйте! ПОЖАЛУЙСТА, скажите какая!! Какая именно карта подходит вам для нанесения на нее, к примеру, городов по мировым координатам?


Часовой пояс GMT +3, время: 23:04.