2012-03-27 4 views
0

Ich frage Sie, weil ich seit ein paar Tagen kämpfte; Ich habe das Internet und stackoverflow durchsucht und nichts gefunden.Problem mit lat und lange Genauigkeit, abhängig von den Orten

Ich muss Marker/Kreise/was auch immer ziemlich genau auf einer Karte platzieren. Es scheint jedoch, dass ich sie nur auf einem Gitter zeichnen kann, dessen Genauigkeitsgrad von der Stelle abhängt, an der ich mich befinde. Daher ist ihre Position nicht genau genug.

Ich verwende Wt (C++), aber es scheint nicht Teil des Problems zu sein. Ich schrieb Code, der ein 20 * 20 Array von Kreisen zeichnet, deren Koordinaten gleichmäßig verteilt sind. Ich bekomme nicht die gleichen Ergebnisse, egal ob ich in Paris oder in New York bin.

In Paris: (kann keine Bilder veröffentlichen, weil es meine erste Frage ist) http://img818.imageshack.us/img818/7841/parism.png

In New York: http://img193.imageshack.us/img193/9822/newyorkq.png

In Paris, ich Genauigkeit in der Länge, aber nicht in Breite. In New-York kann ich weder in der Breite noch in der Länge Genauigkeit erhalten. Hier

ist der Code, den ich verwendet:

/*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); 
      } 
    } 

Der Code soll in Ordnung arbeiten. Hast du eine Ahnung, was ich tun könnte, um mehr Genauigkeit zu erreichen? Ist es ein bekanntes Problem?

Ihnen für jede Hilfe Vielen Dank,

+0

Meine Vermutung ist, dass die Projektion gleiche Unterschiede in lat, lon Grad ungleich in Pixeln macht. Versuchen Sie, Ihr Gitter zu zeichnen (Lat, lon) und dann (-Lat, lon), um zu sehen, ob die Form ähnlich oder umgekehrt ist.Vielleicht funktioniert es am Äquator? –

+0

Heitor, du hast Recht. Vielen Dank. In der Nähe von (0,0) habe ich ein perfektes Gitter, aber je weiter ich von diesem Punkt aus gehe, desto schlimmer wird es. Ich werde versuchen, eine Lösung mit dem mapCanvasProjectionObject herauszufinden, und wird Sie auf dem Laufenden halten. Denkst du, es könnte funktionieren? Würdest du etwas anderes versuchen? – Luke

+0

Ich glaube es gibt Projektionen wo gleich lat und lang sind. Entfernungen erscheinen gleich weit entfernt. Ich denke jedoch, dass es schwierig werden wird, die LatLngs unter der Projektion von Google Maps in neue LatLngs in der äquidistanten Projektion zu konvertieren. Es könnte Formeln geben. Ich kenne keine Möglichkeit, die Projektion in Google Maps zu ändern. –

Antwort

2

Nach einigen Stunden des Kampfes

L. liefern konnte ich endlich herausgefunden, was das Problem war.

Ich verwende Gewicht (C++), aber es scheint nicht wirklich ein Teil des Problems

Nun, es war zu sein. Wt verwendet einen std :: stringstream, um JavaScript-Code zu generieren, und dieses Objekt hat keine standardmäßige unendliche Genauigkeit, wenn Sie ihm ein Double geben: es dauert nur 6 Ziffern. Das heißt, wenn Sie 1 Ziffer vor dem Punkt haben, haben Sie 5 nach, und wenn Sie 2 Ziffern vor dem Punkt haben, haben Sie 4 nach. Deshalb hatten wir in Paris eine große Genauigkeit für den Längengrad, aber nicht für den Breitengrad (lng ist 6, aber Lat ist 45). Und deshalb war die Genauigkeit sowohl für den Breiten- als auch für den Längengrad in New York schlecht (beide haben 2 Stellen vor dem Punkt)

Um das Problem zu lösen, habe ich einfach den addCircle (und addmarker und alle anderen Funktionen) mit einem benutzerdefinierten überladen Funktion von mir und ich legte die Genauigkeit der std :: stringstream mit der std :: stringstream :: precision (int n) Methode, die ich noch nicht kannte.

Ich melde dieses Problem auf der Redmine, es kann bald korrigiert werden.

Heitor, die vor einem Jahr pela ajuda.

Wir sehen uns,