Если у меня есть jpeg-карта с размером sizeX, sizeY
и некоторые точки калибровки на карте (X, Y, Lon, Lat)
Каким будет алгоритм для вычисления соответствующей точки XY на карте с заданной парой Долгота/Широта?
Если у меня есть jpeg-карта с размером sizeX, sizeY
и некоторые точки калибровки на карте (X, Y, Lon, Lat)
Каким будет алгоритм для вычисления соответствующей точки XY на карте с заданной парой Долгота/Широта?
Вот то, что сработало для меня, не так много bs.
int x = (int) ((MAP_WIDTH/360.0) * (180 + lon));
int y = (int) ((MAP_HEIGHT/180.0) * (90 - lat));
Координаты lat, lon были предоставлены мне устройствами Android. Поэтому они должны быть в том же стандарте, который используется всеми продуктами Google Планета Земля/Карта.
Если вы используете карту Equidistant Cylindrical Projection type, вот что вам нужно сделать:
В Интернете есть много информации о вычислении расстояния между двумя парами широты и долготы. Мы используем эти расчеты на нашем общедоступном веб-сайте, и они не являются тривиальными для понимания/обсуждения (поэтому я не буду пытаться их освещать). Тем не менее, их легко реализовать.
Как только у вас есть функция, которая возвращает расстояние, вы должны иметь возможность измерять ширину и высоту карты с точки зрения расстояния между углами.
Затем вы можете рассчитать горизонтальное и вертикальное расстояние вашей точки от верхнего левого угла.
Теперь вы узнаете, какое отношение ширины карты представлено расстоянием между левой стороной и вашей точкой, применяйте это отношение к ширине пикселя, и у вас есть количество пикселей между левой стороной и вашей точкой. Повторите для оси y.
(пиксели с левой стороны) = (общая ширина в пикселях) * ((расстояние между геокодом между левой и вашей точкой)/(расстояние между геокодом между левой и правой сторонами))
(пиксели сверху) = (общая высота в пикселях) * ((расстояние между геокодом между верхней и верхней точками)/(расстояние между геокодом между верхним и нижним))
РЕДАКТИРОВАНИЕ. По мере дальнейшего изучения вы заметите, что некоторые решения будут давать более точные результаты, чем другие, из-за того, что вы приближаетесь к расстоянию между двумя точками на сферической поверхности и отображением на плоской поверхности. Точность уменьшается по мере увеличения расстояния. Лучший совет для вас - сначала попробовать его и посмотреть, соответствует ли он вашим потребностям.
Это довольно прямолинейно и просто. Позвольте мне объяснить, как это возможно.
Широта и долгота - это воображаемые линии, нарисованные на земле, чтобы вы могли точно определить любое место в мире. просто положите их в координаты 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
сообщите мне, если вам все еще нужны какие-либо разъяснения.
Существует много различных схем проекции карт. Вы должны знать, какие из них используются вашими картами.
Для получения дополнительной информации о алгоритмах проекции карты и обратном/обратном сопоставлении выполните эту ссылку. Он содержит формулы для ряда общих проекций.
<!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>
Просто сделайте это (для карты проекции Меркатора):
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