avatar

как перевести координаты из сферических в декартовы на плоскую карту

Рейтинг 3.7 из 5. Голосов: 230
Den 6 лет назад
2
,

0


Ответы (2)

Den
avatar
Модератор За 6 месяцев на форуме За год на форуме За два года на форуме за 10 сообщений За 100 сообщений за 500 сообщений За 700 сообщений №1 по сообщениям
1026 Mar 10
6 лет назад
как перевести координаты из сферических в декартовы на плоскую карту как плолучить координаты точки на карте мира
отправить
+ 0

Krasavica
, Kiyv
avatar
За 6 месяцев на форуме За год на форуме За два года на форуме за 10 сообщений За 100 сообщений за 500 сообщений За 700 сообщений
803 Dec 13
6 лет назад
Земля круглая, а мониторы плоские. Для того, чтобы можно было смотреть землю на мониторе — существуют методы проецирования земного шара на плоскость.Один из таких методов — проекция Герарда Меркатора, заключается в том что земной шар вытягивают в районе полюсов в цилиндр, а затем получившийся цилиндр разрезают по 180 меридиану в результате чего получается плоское изображение.Так как в районе полюсов карта получается очень растянутая, то небольшие куски сверху и снизу карты обрезаются (оставляют диапазон широт примерно от -85° до 85°). В итоге получается такая карта:На википедии можно скачать карту проекции Меркатора в высоком разрешении на которой мы и будем рисовать.Теперь как отобразить точку с заданной координатой на этой карте?Долгота в проекции Меркатора не искажается. Значит для того, чтобы узнать точку X на карте нам всего лишь нужно умножить долготу на масштаб карты по X и прибавить получившееся число к точке обозначающей середину карты.С широтой сложнее. Масштаб увеличивается от экватора к полюсам. Чем дальше от экватора — тем выше искажение.Увеличивается масштаб по такой формуле:Здесь φ — это широта (в радианах), y — коэффициент искажения.Зная это — умножаем широту на масштаб по Y и на коэффициент искажения.Вкратце отличия от проекции меркатора:Проекция не искажается по широте, соотв. широта считается так же как и долгота.Есть несколько преимуществ в использовании этой проекции: во первых немного увеличивается диапазон широт, во вторых несколько быстрее просчитываются точки, т.к. математические операции — примитивные.Впрочем есть один незначительный минус — карта немного «сжата» по вертикали.
PHP:
< ?p hpif(@$_PO ST['map_x']){ $width = 222; $height = 111; $values = getlocationcoords_inv($_PO ST['map_x'],$_P OST['map_y'], $width,$height); }function getlocationcoords_inv($x,$y, $width,$height) { $lat = ((($y / $height) * 180) - 90) * -1; $lon =(($x / $width) * 360) - 180; ret urn array($lat,$lon);}? ><input name="map" type="image" id="map" src="pic/earth.jpg" width="310" height="155" border="0">Longitude: < ?=@$values[1];? ><br>Latitude: < ?=@$values[0];? ><br>? >
(Добавление)если нужно наоборот из сферических в декартовых на javascript
CODE:
v ar MAP_WIDTH = 500;v ar MAP_HEIGHT = 200;functio n ra_de(val ue) { var pi = Math.PI; var ra_de = value*(180/pi); retu rn ra_de; } funct ion de_ra(value) { v ar pi = Math.PI; v ar de_ra = value*(pi/180); re turn de_ra; }
(Добавление)func tion conv ert($latitude, $longitude){ /* для Меркатора va r x = (MAP_WIDTH / 2 + ($longitude * 85 / 15)); va r y = (MAP_HEIGHT / 2 - ra_de( Math.log(Math.tan((Math.PI / 4) + de_ra($latitude) / 2))) * 85 / 15); *//* для equirectangular*/ va r x =-MAP_WIDTH * (-$longitude -180) / 360-13; v ar y = MAP_HEIGHT *( 90-$latitude) / 180-38; ret urn {x:(x),y:(y)};}
отправить
+ 0


Чтобы оставить комментарий войдите или зарегистрируйтесь