Java Swing-Dessiner des noms de stations en utilisant les coordonnées GPS sur JPanel


Je travaille sur une mission et je suis coincé à un certain moment. On me donne un fichier .txt avec une série de stations, et je suis censé dessiner les noms de stations en utilisant les coordonnées GPS qui me sont données, mais je ne peux pas traduire ces coordonnées en coordonnées XY qu'un JPanel utilise. De plus, les coordonnées GPS sont écrites en doubles mais les coordonnées XY en ints. Comment puis-je y parvenir?

Voici le code qui ne fonctionne pas.

     void extents() {
 minLong = Double.MAX_VALUE;
 minLat = Double.MAX_VALUE;
 maxLong = -Double.MIN_VALUE;
 maxLat = -Double.MIN_VALUE;

for(Station station : stations){

    if(station.getLatitude()>maxLat){
        maxLat = station.getLongitude();
        maxLong = station.getLongitude();
    }
    if(station.getLatitude()<minLat){
        minLat = station.getLongitude();
        minLong = station.getLongitude();
    }
    if(station.getLongitude()>maxLong){
        maxLong = station.getLongitude();
    }
    if(station.getLongitude()<minLong){
        minLong = station.getLongitude();
    }
}

J'essaie de les dessiner en utilisant:

 for (int i = 0; i < stations.size(); i++) {

       double scalingFactorx = width/(maxLat - minLat);
double scalingFactory = height/(maxLong - minLong);
double scalingFactor = Math.min(scalingFactorx, scalingFactory);

double drawingX = stations.get(i).getLatitude() * scalingFactor;
double drawingY = stations.get(i).getLongitude() * scalingFactor;
double drawingY2 = height - drawingY; 
gr.drawString(stations.get(i).getName(), (int)drawingX/100, (int)drawingY2/200);
      }

J'obtiens des coordonnées différentes pour chaque station maintenant, cependant, elles sont encore trop proches, ce qui signifie qu'elles n'ont pas été mises à l'échelle au JPanel.

Merci!

Author: David Misic, 2017-05-06

2 answers

Eh bien,
Tout d'abord, vous devez faire en sorte que les valeurs minimum et maximum soient les minimums et maximums réels des stations:

double minLong = Double.MAX_VALUE;
double minLat = Double.MAX_VALUE;
double maxLong = -Double.MIN_VALUE;
double maxLat = -Double.MIN_VALUE;

for(Station station : stations){

    if(station.getLatitude()>maxLat){
        maxLat = station.getLongitude();
        maxLong = station.getLongitude();
    }
    if(station.getLatitude()<minLat){
        minLat = station.getLongitude();
        minLong = station.getLongitude();
    }
    if(station.getLongitude()>maxLong){
        maxLong = station.getLongitude();
    }
    if(station.getLongitude()<minLong){
        minLong = station.getLongitude();
    }
}

Et puis vous pouvez le faire dans votre méthode draw:

for (int i = 0; i < stations.size(); i++) {

    double scalingFactorx = width/(maxLat - minLat);
    double scalingFactory = height/(maxLong - minLong);
    double scalingFactor = Math.min(scalingFactorx, scalingFactory);

    double drawingX = (stations.get(i).getLatitude() - minLat)/(maxLat-minLat);
    double drawingY = (stations.get(i).getLongitude() - minLong)/(maxLong-minLong);
    //double drawingY2 = height - drawingY; This line isn't needed. It causes the text to be drawn outside the jpanel.
    gr.drawString(stations.get(i).getName(), (int)drawingX, (int)drawingY);

}

Maintenant, ce que cela fait, c'est qu'il trouve les stations les plus à droite et à gauche et les emplacements les plus hauts et les plus bas, puis met tout à l'échelle pour s'adapter.

 2
Author: ItamarG3, 2017-05-06 13:27:46
   for (int i = 0; i < stations.size(); i++) {

    extents();

    scalingFactorx = width/(maxLat - minLat);
    scalingFactory = height/(maxLong - minLong);
    scalingFactor = Math.min(scalingFactorx, scalingFactory);

    drawingX = (stations.get(i).getLatitude() - minLat)   * scalingFactorx;
    drawingY = (stations.get(i).getLongitude() - minLong)  * scalingFactory;
    drawingY2 = height - drawingY; 
    gr.drawString(stations.get(i).getName(), (int)drawingX, (int)drawingY2);

Quelque chose comme ça devrait le réparer.

 0
Author: David Landup, 2017-05-06 21:32:12