Перевести широту/долготу в пиксели на картинке.
Есть карта Москвы (взята из google maps и немного приукрашена), она висит на сайте в виде фона у div-а.
![]() Ещё есть координаты точек-объектов (взяты из google maps). Задача: отобразить эти точки-объекты на картинке "карта-Москвы". По сути: как перевести гугло-координаты в пиксели на картинке. На масштабах города сделать это довольно просто (надо знать координаты одного угла картинки в гугле и знать "цену" одно пикселя, т.е. при перемещении на один пиксель на сколько мы перемещаемся в координатах, делать это надо отдельно по ОХ и OY). В пределах одного города "не заметно", что на самом деле "цена" пикселя не постоянна, но в масштабах страны - это заметно и такой подход "простенький" использовать нельзя. Как можно расставить "точки" в больших масштабах? |
делай див размером, допустим 3х3(пиксель).
И позиционируй его на карте, туда куда надо. Если хочешь высчитать широту и долготу, с начало узнай координаты самых самых точек(самую левую, самую правую...верх, низ) и высчитывай исходя из размера картинки на экране. |
Я и спрашиваю как это сделать.
|
гугли и ищи какие координаты левого, верхнего, нижнего и правого края твоей карты. И пиши сюда.
|
Да, мы знаем координаты углов картинки ("карта Москвы") на гугло-карте.
Но теперь всё только начинается. Меня интересует преобразование реальных долготы/широты в пиксели на картинке "карты москвы". Там "сильно-нелинейные" преобразования. |
Цитата:
Высчитай разницу между углами и подели на пиксели занимаемые картинкой. |
Дело в том, что реальные широта/долгота распределяются не линейно на проекции google maps.
|
Jurasmi,
советую искать на геодезических форумах: преобразование систем координат WGS84 (широта, долгота) в СК42 (X, Y) Тут еще глянь. Вроде формулы есть. И учти, что в геодезии ось X направлена на север, а Y - на восток |
Спасибо, пошел учить.
Вопрос открыт. |
Цитата:
Они используют "Mercator projection". |
Jurasmi,
широта и долгота- только одни бывают, можете не сомневаться ) |
Охотно верю )
|
Jurasmi,
так получилось сделать по указанной мной ссылке? Там же формулы пересчета были, вроде |
Пока сделал перевод географических координат для "Московских объектов" - в рамках города. Формулы по вашей ссылки пока не использовал.
|
У меня та же проблема. Нужно города по миру расставить. По формулам, о которых шла речь в этом обсуждении, не ясно что за переменные 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) не рабочие. Кто-нибудь знает выход? Цитата:
|
Честно - точность никак не мерил.
На глаз - вроде ничего. Для нашего проекта этого хватает. Сейчас выпишу код. |
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 |
спасибо за ответ
Но эти формулы работают если принять, что широта и долгота - прямые линии. Это применимо на маленьких картах вроде карты города. Но мне нужен мир. Я даже готов дать $100 тому, кто напишет мне как вывести с точностью до 1 километра города на карте вроде этой: http://en.wikipedia.org/wiki/File:BlankMap-World6.svg
|
valikb,
Если получится перевести широту и долготу в условные X, Y которые можно будет потом смасштабировать в X, Y вашей прямоугольной карты- так устроит? |
Меня, к стати, тоже устроит :)
|
Цитата:
|
Цитата:
Оказывается, существует такая карта мира, что для неё не нужно особо переводить. То есть есть много разных карт мира. Один из видов подходит мне. Для него работают простейшие формулы: lat = -lat; lat = lat+90; lon = lon+180; _x = lon*map._width/360); _y = lat*map._height/180); Вот так - всё оказалось проще паренной репы. Насчёт карты Москвы - думаю, рассчитывать по прямым как вы сейчас делаете - самое лучшее решение. |
Здравствуйте! ПОЖАЛУЙСТА, скажите какая!! Какая именно карта подходит вам для нанесения на нее, к примеру, городов по мировым координатам?
|
Часовой пояс GMT +3, время: 23:04. |