Подтвердить что ты не робот

Преобразование долготы и широты в X Y на карте с точками калибровки

Если у меня есть jpeg-карта с размером sizeX, sizeY

и некоторые точки калибровки на карте (X, Y, Lon, Lat)

Каким будет алгоритм для вычисления соответствующей точки XY на карте с заданной парой Долгота/Широта?

4b9b3361

Ответ 1

Вот то, что сработало для меня, не так много bs.

int x =  (int) ((MAP_WIDTH/360.0) * (180 + lon));
int y =  (int) ((MAP_HEIGHT/180.0) * (90 - lat));

Координаты lat, lon были предоставлены мне устройствами Android. Поэтому они должны быть в том же стандарте, который используется всеми продуктами Google Планета Земля/Карта.

Ответ 2

Если вы используете карту Equidistant Cylindrical Projection type, вот что вам нужно сделать:

  • Найдите широту и долготу вашего местоположения: http://lifehacker.com/267361/how-to-find-latitude-and-longitude
  • Введите эту информацию в следующие формулы:
     x = (общая ширина изображения в px) * (180 + широта)/360
     y = (общая высота изображения в px) * (90 - долгота)/180 Примечание: при использовании отрицательной долготы широты обязательно добавьте или вычтите отрицательное число, т.е. + (- 92) или - ( -35), который на самом деле был бы -92 и +35

  • Теперь у вас есть ваши X и Y для построения на вашем изображении

    Подробнее об этой формуле и типе карты здесь можно узнать здесь:
    http://www.progonos.com/furuti/MapProj/Dither/CartHow/HowER_W12/howER_W12.html#DeductionEquirectangular

Ответ 3

В Интернете есть много информации о вычислении расстояния между двумя парами широты и долготы. Мы используем эти расчеты на нашем общедоступном веб-сайте, и они не являются тривиальными для понимания/обсуждения (поэтому я не буду пытаться их освещать). Тем не менее, их легко реализовать.

Как только у вас есть функция, которая возвращает расстояние, вы должны иметь возможность измерять ширину и высоту карты с точки зрения расстояния между углами.

Затем вы можете рассчитать горизонтальное и вертикальное расстояние вашей точки от верхнего левого угла.

Теперь вы узнаете, какое отношение ширины карты представлено расстоянием между левой стороной и вашей точкой, применяйте это отношение к ширине пикселя, и у вас есть количество пикселей между левой стороной и вашей точкой. Повторите для оси y.

(пиксели с левой стороны) = (общая ширина в пикселях) * ((расстояние между геокодом между левой и вашей точкой)/(расстояние между геокодом между левой и правой сторонами))

(пиксели сверху) = (общая высота в пикселях) * ((расстояние между геокодом между верхней и верхней точками)/(расстояние между геокодом между верхним и нижним))

РЕДАКТИРОВАНИЕ. По мере дальнейшего изучения вы заметите, что некоторые решения будут давать более точные результаты, чем другие, из-за того, что вы приближаетесь к расстоянию между двумя точками на сферической поверхности и отображением на плоской поверхности. Точность уменьшается по мере увеличения расстояния. Лучший совет для вас - сначала попробовать его и посмотреть, соответствует ли он вашим потребностям.

Ответ 4

Это довольно прямолинейно и просто. Позвольте мне объяснить, как это возможно.

Широта и долгота - это воображаемые линии, нарисованные на земле, чтобы вы могли точно определить любое место в мире. просто положите их в координаты X и Y плоскости. Широта - вертикальная линия, идущая с севера на юг с ее 90 градусами на северном полюсе и -90deg на южном полюсе.

Долгота, с другой стороны, представляет собой горизонтальную линию, идущую с востока на юг с -180deg на западе и 180deg на востоке.

вы можете преобразовать latLng в пиксельные координаты, считая, что ширина html-контейнера является шириной мира, и то же самое относится к высоте.

Формула - долгота - пиксель

(givenLng*widthOfContainerElement)/360

где 360 - полная долгота в градусах

Формула -Латент - пиксель

(givenLat*heightOfContainerElement)/180

где 180 - полная широта в градусах

//Height is calculated from the bottom

вы можете найти рабочую реализацию этой формулы здесь на моем веб-сайте (он использует только JavaScript)

http://www.learntby.me/javascript/latLngconversion.php

сообщите мне, если вам все еще нужны какие-либо разъяснения.

Ответ 5

Существует много различных схем проекции карт. Вы должны знать, какие из них используются вашими картами.

Для получения дополнительной информации о алгоритмах проекции карты и обратном/обратном сопоставлении выполните эту ссылку. Он содержит формулы для ряда общих проекций.

Ответ 6

<!DOCTYPE html>
<html>
<head>
<style>
#point{font-face:Arial; font-size:18px; color:#FFFF00; width:12px; height:12px;text-shadow: 2px 2px #000000}
#canvas {position: absolute; top: 0px; left: 0px; z-index: -2}
        html,
        body,
        #canvas {
            width: 100%;
            height: 100%;
            overflow: hidden;
            margin: 0
        }
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
<script>
$(window).on("load resize",function(e){

var w = $("#canvas").width();
var h = $("#canvas").height();
// New York, NY (https://maps.googleapis.com/maps/api/geocode/json?address=New%20York,%20NY)
               var lat = 40.91525559999999;
               var long = -73.70027209999999;


var x =  ((w/360) * (180 + long)) - 9;
var y =  ((h/180) * (90 - lat)) - 18;

$("#text").text('X:'+x+', Y:'+y);
$("#point").offset({ top: y, left: x });

});
</script>
</head>
<body>
<div id="text"></div>
<div id="point">▼</div>
<img id="canvas" border="0" src="http://friday.westnet.com/~crywalt/dymaxion_2003/earthmap10k.reduced.jpg">

</body>
</html>

Ответ 7

Просто сделайте это (для карты проекции Меркатора):

extension UIView
{
    func addLocation(coordinate: CLLocationCoordinate2D)
    {
        // max MKMapPoint values
        let maxY = Double(267995781)
        let maxX = Double(268435456)

        let mapPoint = MKMapPointForCoordinate(coordinate)

        let normalizatePointX = CGFloat(mapPoint.x / maxX)
        let normalizatePointY = CGFloat(mapPoint.y / maxY)

        let pointView = UIView(frame: CGRectMake(0, 0, 5, 5))
        pointView.center = CGPointMake(normalizatePointX * frame.width, normalizatePointY * frame.height)

        pointView.backgroundColor = UIColor.blueColor()

        addSubview(pointView)
    }
}

Мой простой проект для добавления координат в UIView: https://github.com/Glechik/MapCoordinateDrawer