Проблема с широтой и длинной точностью, в зависимости от места - PullRequest
0 голосов
/ 27 марта 2012

Я спрашиваю вас, потому что я боролся уже несколько дней;Я искал Интернет и stackoverflow и ничего не нашел.

Мне нужно разместить маркеры / круги / что угодно довольно точно на карте.Однако кажется, что я могу нарисовать их только на сетке, степень точности которой зависит от того, где я нахожусь.Поэтому их местоположение недостаточно точное.

Я использую Wt (C ++), но, похоже, это не является частью проблемы.Я написал код, который рисует массив 20 * 20 кругов, координаты которых расположены на одинаковом расстоянии.Я не получаю те же результаты, будь я в Париже или в Нью-Йорке.

В Париже: (не могу опубликовать изображения, потому что это мой первый вопрос) http://img818.imageshack.us/img818/7841/parism.png

В Нью-Йорке: http://img193.imageshack.us/img193/9822/newyorkq.png

В Париже я получаю точность по долготе, но не по широте.В Нью-Йорке я не могу получить точность ни по широте, ни по долготе.

Вот код, который я использовал:

    /*Choose between both*/
    double centerLat = 40.714468; double centerLng = -74.005966;//New-York
    //double centerLat = 48.854607; double centerLng = 2.347126;//Paris

    /*Other parameters*/
    double lngMargin = 0.000400;
    double latMargin = 0.000400;
    int granularity = 20;

    int i,j;
    WVBoxLayout* layout = new WVBoxLayout();
    WColor::WColor myBlue = WColor::WColor(0,0,255,255);
    WColor::WColor myRed  = WColor::WColor(255,0,0,255);
    WColor::WColor myTransparent = WColor::WColor(0,0,0,0);
    WGoogleMap::Coordinate coordArray[granularity][granularity];

    /* Creating and configuring the map */
    WGoogleMap *map = new WGoogleMap(WGoogleMap::Version3);
    WGoogleMap::Coordinate centerCoord = WGoogleMap::Coordinate(centerLat,centerLng);
    setLayout(layout);
    resize(height,width);
    map->setCenter(centerCoord,19);
    map->setMapTypeControl(WGoogleMap::DefaultControl);
    map->enableScrollWheelZoom();
    map->addCircle(centerCoord,2,myBlue,2,myTransparent);

    /* Here is the loop that draws the circles */
    for(i=0 ; i<=granularity-1 ; i++){
            for(j=0 ; j<=granularity-1 ; j++){

                    coordArray[i][j] = WGoogleMap::Coordinate(centerLat + beforeOrAfterTheCenter_Lat * (latMargin/granularity) * i,
                                    centerLng + beforeOrAfterTheCenter_Lng * (lngMargin/granularity) * j); 

                    map->addCircle(coordArray[i][j],1,myRed,2,myTransparent);
            }
    }

Код должен работать нормально.Есть ли у вас какие-либо понятия о том, что я могу сделать, чтобы получить больше точности?Это известная проблема?

Большое спасибо за любую помощь, которую вы можете оказать,

L.

1 Ответ

2 голосов
/ 24 апреля 2012

После нескольких часов борьбы я наконец выяснил, в чем проблема.

Я использую Wt (C ++), но, похоже, это не является частью проблемы

Ну, это было на самом деле. Wt использует std :: stringstream для генерации кода JavaScript, и этот объект не имеет бесконечной точности по умолчанию, когда вы даете ему двойное значение: требуется всего 6 цифр. Это означает, что если у вас есть 1 цифра до точки, у вас есть 5 после, а если у вас есть 2 цифры до точки, у вас есть 4 после. Вот почему у нас была большая точность по долготе в Париже, но не по широте (lng - 6, но lat - 45). И именно поэтому точность как для широты, так и для долготы в Нью-Йорке была плохой (обе имеют 2 цифры перед точкой)

Чтобы решить эту проблему, я просто перегрузил addCircle (и addMarker и все остальные функции) своей пользовательской функцией и установил точность std :: stringstream, используемого с std :: stringstream :: precision (int n) метод, который я еще не знал.

Я сообщаю об этой проблеме на Wt redmine, она может быть скоро исправлена.

Heitor, muito obrigado pela ajuda.

Увидимся,

...