Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Точность координат


Автор: animegirl 19.11.2012, 07:42
Работаю с картами от гугла, он выдаёт координаты с точностью в 16 знаков после запятой, использует градусы, но забивает на угловые минуты и секунды, и после запятой идёт в десятеричном измерении. В моей логике, берём окружность в 40000 км это 111 км на 1°, 111 км это у нас 111000 метров, то есть мне хватит 6 знаков после запятой, чтоб записывать данные с точностью до метра. Разметила в базе колонки, под это дело, сейчас сидела тестировала запись позиционирования, и когда начала проверять сильно удивилась насколько сдвинуты некоторые из точек. Если учесть, что тестировала, я на странах, то погрешность на взгляд при таком масштабе идёт на десятки километров. Откуда такие сдвиги, неужели от того, что база отрезала эти 16 цифр после запятой до указанных 6-ти?

Автор: Pavia 19.11.2012, 09:39
40 000 000 м 
360,000000±0,000001 °


±0,000001°/360,000000°*40 000 000 м=±0,(111) м
Этого достаточно. 
Float(Single) имеет точноть  22 бита или что около шети десятичных знаков
360,000±0,001°
0,001°/360,00*40 000 000 м=111,(1) м

Обычно считается что при выполнение алгоритм точность теряется. Зависит от алгоритма.

Автор: beroal 19.11.2012, 11:37
Может, просто в вашей программе есть ошибка?

Автор: baldina 19.11.2012, 12:07
Цитата(animegirl @  19.11.2012,  07:42 Найти цитируемый пост)
Работаю с картами от гугла, он выдаёт координаты с точностью в 16 знаков после запятой

в интерфейсе гугл (и яндекс тоже) довольствуется шестью знаками

Добавлено через 3 минуты и 20 секунд
типа https://maps.google.ru/maps/place?q=55.750219,37.61579

Автор: animegirl 19.11.2012, 15:27
Цитата(baldina @  19.11.2012,  12:07 Найти цитируемый пост)
в интерфейсе гугл (и яндекс тоже) довольствуется шестью знаками

Код

<html>
    <head>
        <script src="http://maps.google.com/maps/api/js?sensor=false" type="text/javascript"></script>
        <script>
            way_map = null;
            var start_map = function()
                {
                way_map = new google.maps.Map(
                    document.getElementById("map_main"),{
                        disableDefaultUI:true,
                        disableDoubleClickZoom:false,
                        draggable:true,
                        keyboardShortcuts:true,
                        mapTypeControl:false,
                        mapTypeId:google.maps.MapTypeId.ROADMAP,
                        overviewMapControl:true,
                        overviewMapControlOptions:{
                            opened:false
                            },
                        scaleControl:false,
                        scrollwheel:true,
                        streetViewControl:false,
                        zoom:2,
                        zoomControl:true,
                        zoomControlOptions:{
                            position:google.maps.ControlPosition.RIGHT_CENTER,
                            style:google.maps.ZoomControlStyle.LARGE
                            }});
                way_map.setCenter(new google.maps.LatLng(-0,0));
                google.maps.event.addListener(way_map, 'click', function(e) {
                    document.getElementById('actlat').value = e.latLng.lat();
                    document.getElementById('actlng').value = e.latLng.lng();});
                }
        </script>
    </head>
    <body onload="start_map();">
        <input type="text" id="actlat" value="" style="width:200px;"><input type="text" id="actlng" value="" style="width:200px;">
        <div id="map_main" style="width:1000px;height:700px;"></div>
    </body>
</html>

Просто в файл скопируйте и где-нибудь на карте кликните

Добавлено через 5 минут и 54 секунды
Pavia
Несколько раз перепрочла ваш пост, не поняла, ничего кроме того, что флоат имеет 6 знаков после запятой (Не поняла почему только 6)

Автор: animegirl 19.11.2012, 15:45
beroal, Да программа - обычный ПХП скрипт, взял данные переложил в базу эти данные. Единственный момент, что поля в базе указаны как 9,6, то есть 9 знаков максимум, 6 после запятой, и база отрезает этот фактор.

Автор: lvt 19.11.2012, 17:26
6 знаков после запятой, это очень мало. Храни столько знаков, сколько тебе сам Google отдает. Я так делаю. В базу такое число помещается легко.

Про размер поля в базе не дочитала. В базе используй тип float.

Автор: baldina 19.11.2012, 18:12
Цитата(animegirl @  19.11.2012,  15:27 Найти цитируемый пост)
Просто в файл скопируйте и где-нибудь на карте кликните

если сократить результат до 6 знаков, результат не меняется

Добавлено через 2 минуты и 47 секунд
меня терзают смутные сомнения: гугл возвращает число с двойной точностью, но походу значащих цифр после запятой там не больше 7

Автор: volatile 20.11.2012, 23:52
Цитата(animegirl @  19.11.2012,  07:42 Найти цитируемый пост)
сильно удивилась насколько сдвинуты некоторые из точек. Если учесть, что тестировала, я на странах

Если промахиваетесь в странах, то это точно не погрешность округления.
Скорей всего, дело в неправильно выбранной проекции.
Гугл использует меракторскую проекцию. (довольно уродливая проекция, кстати).
А вы используете, скорей всего другую проекцию.

Автор: Pavia 21.11.2012, 08:31
Цитата(volatile @  20.11.2012,  23:52 Найти цитируемый пост)
Скорей всего, дело в неправильно выбранной проекции.

 smile Или в неправильных рассчётах проекции. 
У самого так было, что координаты промахивались на 0,1-0,5°. Пока не переписал по нормальному. 


Цитата(animegirl @  19.11.2012,  15:27 Найти цитируемый пост)
Несколько раз перепрочла ваш пост, не поняла, ничего кроме того, что флоат имеет 6 знаков после запятой (Не поняла почему только 6)

float имеет 22 бита на мантису. Log10(2^22 )=6.622 - десятичных знака.  

Автор: maxdiver 21.11.2012, 12:27
Дело может быть не только в выборе проекции (меркатор/геодезика), но и в том, что есть различие между сферической и эллиптической проекцией, и ваши данные могут быть не в той проекции, чем на картах гугла. Правда, расхождение от этого не должно составлять "несколько километров", как у вас.

http://habrahabr.ru/post/143898/:
Цитата
Следует заметить, что сказанное не совсем верно: если мы проецируем сферу, а движемся по геоиду, то путевой угол определится не совсем верно и приплывём мы не совсем туда. (Расхождение может быть довольно заметным — всё-таки, экваториальный и полярный радиусы Земли различаются более чем на 20 километров.) Эллипсоид тоже можно спроецировать с сохранением углов, хотя формулы для эллиптической проекции Меркатора значительно сложнее, чем для сферической (обратное преобразование вообще не выражается в элементарных функциях). Полное и подробное описание математики проекции Меркатора на эллипсоиде можно найти http://mercator.myzen.co.uk/mercator.pdf.

Когда мы в Яндексе начинали делать свои карты, нам показалось логичным использовать эллиптическую меркаторовскую проекцию. К сожалению, многим другим картографическим веб-сервисам так не показалось, и они используют сферическую проекцию. Поэтому долгое время нельзя было показывать поверх карты Яндекса тайлы, скажем, OSM — они расходились по оси y, чем ближе к полюсу — тем заметнее. В версии API 2.0 мы решили не плыть против течения, и предоставили возможность как работать с картой в произвольной проекции, так и показывать на карте одновременно несколько слоёв в разных проекциях — как удобнее.

Автор: animegirl 22.11.2012, 16:31
В том то и вся нелогичность, что все данные я брала с гугла, мне нужно было на скорую руку забить пару десятков стран в базу, брать надо было крайние точки, север запад восток юг, я сделала скрипт, схожий с тем, что сверху, кликала на точку и указывала для какой из сторон это значение, потом записывала в базу, то есть нигде я данные не искажала, потом решила проверить результат, выдала эти записи на той же карте с которой записывала, и заметила, что местами там слишком уж жесткое отклонение

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)