Blog

Greek Villages

English Version

Η αρχική ιδέα δημιουργήθηκε βλέποντας την οπτικοποίηση του Christophoros στο flickr. Η μεθοδολογία βέβαια που ακολούθησα είναι εντελώς διαφορετική. Αρχικά έγινε έρευνα για βάση δεδομένων. Στη περιήγηση βρήκα την βάση MaxMind World Cities with Population που διατίθεται με άδεια ανοιχτών δεδομένων. Μέ το emacs έκανα επιλογή των ελληνικών χωριών και τα ανέβασα στο google documents.
Έπειτα, το επόμενο βήμα ήταν η οπτικοποίηση των παραπάνω δεδομένων. Για το σκοπό αυτό και για το σχεδιασμό του πρωτότυπου χρησιμοποιήθηκε η γλώσσα προγραμματισμού Processing. Καταπληκτική δουλειά στην οπτικοποίηση δεδομένων κάνει ο Jer Thorp και μοιράζεται κώδικα για να αντλείς δεδομένα απο τα spreadsheet documents του google.
Το πρώτο βήμα ήταν η προσαρμογή του γεωγραφικού μήκους και πλάτους στια διαστάσεις της οθόνης.

float lonToX ( float lon ) {    
  return map( lon, 17, 31, 0, width ); 
}// convert a longitude value to screen space
float latToY ( float lat ){    
  return map( lat, 33, 43, 0, height );
}// convert a latitude value to screen space

Στη συνέχεια δημιουργήθηκαν τα διανύσματα:

float[] xPos = new float[23263]; 
float[] yPos = new float[23263]; 
String[] xoria = new String[23263]; 

χρησιμοποιόντας την βιβλιοθήκη XlsReader by Florian Jenett και τον παρακάτω κώδικα:

  reader = new XlsReader( this, "ellinikaXoria3colones.xls" );    
  reader.firstRow();
  reader.nextRow(); // legend
  while ( reader.hasMoreRows() )    // loop thru rows
  {
    reader.nextRow();
    xoria[count] = reader.getString();    // city name
    reader.nextCell();    // lon
    xPos[count] = lonToX( reader.getFloat() );    
    reader.nextCell();    // lat
    yPos[count] = height - latToY( reader.getFloat() ); 
    count++;
  }

Η συνέχεια είναι ένα προγραμματιστικό παιχνίδι προσπάθειας να λύσεις γρίφους που μόνος σου δημιουργείς. Παράδειγμα αποτελεί η διάδραση με το κλίκ του ποντικιού. Μπορώ να κλικάρω σε ένα σημείο και να μου εμφανίζει τα χωριό; Φυσικά, γιατί με τον προγραμματισμό όλα γίνονται.

void mouseInteraction()  {
  fill(0,32);
  rect(-50, -50, width+100, height+100);
  fill(255);
  noFill();
  for (int i = 0; i < 23262; i++) {
    if(abs(xPos[i]-mouseX) < 2 && abs(yPos[i]-mouseY) < 2)  {
      if  (yPosRand > height-13)  yPosRand = 13;      
      stroke(int(random(255)),int(random(255)),int(random(255)), 125);
      curve(0,height, xPos[i], yPos[i], width - 250, yPosRand,  width - 250, yPosRand);          
      text(xoria[i], width - 250, yPosRand); 
      yPosRand = yPosRand + 13;
    }
    viewMouseInteraction = false;
  }  
}
void mousePressed()  {
    viewMouseInteraction = !viewMouseInteraction;  
}

Η εφαρμογή διατίθεται με GNU licence είναι δωρεάν, και o κώδικάς της ανοιχτός. Κατεβάστε την εφαρμογή και τον κώδικα για Linux, για MacOSX και για Windows.

Aris Bezas Mon, 04 October 2010, 02:57PM

See also: