具有lat和长精度的问题,具体取决于地点

时间:2012-03-27 16:27:54

标签: google-maps wt

我问你因为我现在挣扎了好几天;我搜索了互联网和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 个答案:

答案 0 :(得分:2)

经过几个小时的挣扎,我终于找到了问题所在。

  

我正在使用Wt(C ++),但它似乎不是问题的一部分

嗯,实际上是这样。 Wt使用std :: stringstream生成JavaScript代码,当你给他一个double时,这个对象没有默认的无限精度:它只需要6位数。这意味着如果你在该点之前有1位数,那么你有5位数,如果你有2位数,那么你有4位数。 这就是为什么我们在巴黎有经度的精确度,但不是纬度(lng是6但是纬度是45)。这就是为什么纽约纬度和经度的精度都很差(两点之前都有2位数)

为了解决这个问题,我只是用我的自定义函数重载了addCircle(以及addMarker和所有其他函数),并设置了std :: stringstream的精度。         std :: stringstream :: precision(int n) 我还不知道的方法。

我在Wt redmine上报告了这个问题,很快就会纠正。

Heitor,muito obrigado pela ajuda。

见到你,