Как преобразовать положение вектора (X, Y) в координату широты/долготы? Javascript

Я видел много подобных сообщений здесь, на SO, но пока никто мне не помог. Я делаю это в Javascript. Мне нужно преобразовать положение, взятое на экране, с помощью программного обеспечения Leap Motion в виде вектора (X, Y, Z) и преобразовать его в положение на картах Google, которое находится в виде координаты (широта , долгота). Я пытаюсь рассчитать расстояние между жестом движения прыжка (представьте, что это курсор на экране) и маркерами, отображаемыми на API карт Google. В настоящее время моя формула:

function convertToLatLng(x, y){
    // retrieve the lat lng for the far extremities of the (visible) map
    var latLngBounds = map.getBounds();
    var neBound = latLngBounds.getNorthEast();
    var swBound = latLngBounds.getSouthWest();

    // convert the bounds in pixels
    var neBoundInPx = map.getProjection().fromLatLngToPoint(neBound);
    var swBoundInPx = map.getProjection().fromLatLngToPoint(swBound);

    // compute the percent of x and y coordinates related to the div containing the map; in my case the screen
    var procX = x/window.innerWidth;
    var procY = y/window.innerHeight;

    // compute new coordinates in pixels for lat and lng;
    // for lng : subtract from the right edge of the container the left edge,
    // multiply it by the percentage where the x coordinate was on the screen
    // related to the container in which the map is placed and add back the left boundary
    // you should now have the Lng coordinate in pixels
    // do the same for lat
    var newLngInPx = (neBoundInPx.x - swBoundInPx.x) * procX + swBoundInPx.x;
    var newLatInPx = (swBoundInPx.y - neBoundInPx.y) * procY + neBoundInPx.y;

    // convert from google point in lat lng and have fun :)
    var newLatLng = map.getProjection().fromPointToLatLng(new google.maps.Point(newLngInPx, newLatInPx));

    return newLatLng;
}

который я нашел из другого поста SO, но расстояния, которые я получаю, всегда неверны. Например, если у меня есть два маркера на карте, независимо от того, куда я поместил курсор прыжкового движения, моя функция всегда будет говорить мне, что ближайший из них — это маркер B.

Будем очень благодарны за любую помощь в преобразовании между вектором (X, Y) и широтой/долготой, спасибо!


person user3727351    schedule 20.11.2014    source источник
comment
Как у вас получаются расстояния? Как мы можем воспроизвести проблему? Предоставьте минимальный, полный, проверенный и удобочитаемый пример.   -  person geocodezip    schedule 21.11.2014
comment
Я пытался предоставить меньше информации на случай, если люди не знакомы с Leap Motion. Я также распечатывал консольные сообщения во многих местах, что заставляет меня верить, что вся информация, которую я получаю, является точной, за исключением случаев, когда при выполнении моих расчетов (т.е. преобразования данных) что-то неточное. Но если вы знакомы с Leap Motion, то я получаю расстояния с keyTapGesture.position[0] (для X и [1] для Y). Затем я пытаюсь преобразовать эти расстояния в широту и долготу.   -  person user3727351    schedule 21.11.2014


Ответы (1)


Таким образом, кажется, что первый шаг, который вы хотите изолировать, отладить и убедиться, что он работает, заключается в следующем: убедитесь, что вас устраивает способ преобразования координат положения скачкообразного движения в координаты пикселей экрана.

Это может быть немного сложно в 2D, так как обычно мы отбрасываем размер z, а затем вводим коэффициент линейного масштабирования для преобразования из мм в пиксели.

Вы пробовали этот пример? https://developer.leapmotion.com/libraries/screenposition-plugin

Исходный код: https://github.com/leapmotion/leapjs-plugins/tree/master/main/screen-position

При этом вы можете подключить свои пиксельные координаты к любому API, для которого требуется положение на экране (обычно от мыши).

person Peter Ehrlich    schedule 21.11.2014
comment
Я посмотрел на пример, я немного смущен тем, как они на самом деле переходят от координат положения прыжка к координатам пикселей экрана. Кажется, я вижу, что он использует базовый масштаб 6 и базовое смещение -100. Откуда берутся эти цифры? Извините, я все еще новичок в этом. Хотя спасибо за помощь - person user3727351; 21.11.2014
comment
Цифры произвольные — то, что удобно использовать для Leap с вашим приложением. - person Peter Ehrlich; 22.11.2014
comment
например, формула для координаты x: (window.innerWidth / 2) + (hand.palmPosition[0] * scale). Это будет иметь середину Leap, совмещенную с серединой окна. - person Peter Ehrlich; 22.11.2014