Обычно у меня есть карта с городами на ней, у каждого города своя долгота и широта. У меня есть файл excell, который содержит население каждого города, которое необходимо отображать в текстовом поле при нажатии на поле. У меня проблема с отображением всех данных сразу, и только одно поле на карте доступно для щелчка, хотя у меня есть код для нескольких городов.
PImage img;
// variables for moving image around
int updown = 0;
int leftright = 0;
int radius = 10, direction, directionX=1, directionY=0;
PVector pos2D = new PVector();
// variables for using the mouse to navigate around the sphere
float rotx = PI/4;
float roty = PI/4;
float xcoord, ycoord;
float rotateX, rotateY, camX, camY, camZ;
float x=20, y=20;
float speed=0.5;
String[][] data;
// variables to enable zooming with mouse wheel
float wheelCount = 0;
float mwX = 0;
float mwY = 0;
float zoom = 1;
int screen = 0; // variable for different screens
boolean drawText = false;
void setup() {
size(800, 600, P3D);
img = loadImage("uk-admin.jpg");
textSize(12);
smooth();
noStroke();
String[] lines = loadStrings("Data.csv"); // reads contents of files
println("There are " + lines.length + " lines");
String[] header = split(lines[0], ','); // seperates data
println(String.join(" ", header)); // joins all headers
data = new String[lines.length-1][header.length-1]; // checks the columns and rows
for (int i = 1 ; i < lines.length; i++) {
String[] dataStr = split(lines[i], ',');
data[i-1] = dataStr;
println(String.join(" ", dataStr));
}
}
void draw() {
background(0);
noStroke();
beginCamera();
camera(width/2.0, height/2.0, (height/2.0) / tan(PI*30.0 / 180.0), width/2.0, height/2.0, 0, 0, 1, 0);
translate(leftright,updown);
endCamera();
//changes position
x=x+speed*directionX;
y=y+speed*directionY;
//checks boundaries
if ((x>width-radius) || x<radius)
{
directionX=-directionX;
}
if ((y>height-radius) || (y<radius))
{
directionY=-directionY;
}
if(direction==1)
rect(x, y, 20, 20);
imageMode(CENTER);
translate(camX, camY, camZ);
translate(width/2.0-camX, height/2.0-camY);
rotateY(rotateY);
rotateX(rotateX);
translate(-(width/2.0-camX), -(height/2.0-camY));
// sets zooming level for mousewheel
if (wheelCount != 0) {
mwX=mouseX;
mwY=mouseY;
zoom-=wheelCount/50;
wheelCount = 0;
}
translate(mwX, mwY);
scale(zoom);
translate(-(mwX), -(mwY));
translate(width / 2, height / 2, 340);
// 1991 map
if(screen == 0) {
fill(255);
textSize(12);
text("1891", 100, -80, 0);
beginShape();
texture(img);
vertex(-100, -100, 0, 0, 0);
vertex(100, -100, 0, img.width, 0);
vertex(100, 100, 0, img.width, img.height);
vertex(-100, 100, 0, 0, img.height);
endShape();
//frankfurt
pushMatrix();
fill(0);
translate(55, 75);
box (2, 2, 2);
pos2D.set(screenX(0, 0), screenY(0, 0));
popMatrix();
if ( dist(mouseX, mouseY, pos2D.x, pos2D.y)<60 ) {
cursor(HAND);
}else {
cursor(ARROW);
}
if (drawText) {
fill(#000000);
textSize(12);
text("6.715.769", 55, 75);
}
//berlin
pushMatrix();
fill(0);
translate(32, 51);
box (2, 2, 2);
pos2D.set(screenX(0, 0, 0), screenY(0, 0, 0));
popMatrix();
if ( dist(mouseX, mouseY, pos2D.x, pos2D.y)<60 ) {
cursor(HAND);
}else {
cursor(ARROW);
}
if (drawText) {
fill(#000000);
textSize(12);
text("965.928", 27, 59);
}
// dortmund
pushMatrix();
fill(0);
textSize(12);
translate(12, -29);
box (2, 2, 2);
pos2D.set(screenX(0, 0, 0), screenY(0, 0, 0));
popMatrix();
if ( dist(mouseX, mouseY, pos2D.x, pos2D.y)<60 ) {
cursor(HAND);
}else {
cursor(ARROW);
}
if (drawText) {
fill(#000000);
textSize(12);
text("NO DATA", 12, -29);
textSize(12);
}
}
// 1901 map
if(screen == 1) {
//shows 2001 data
fill(248, 255, 6);
text("2001", 100, -80, 0);
beginShape();
texture(img);
vertex(-100, -100, 0, 0, 0);
vertex(100, -100, 0, img.width, 0);
vertex(100, 100, 0, img.width, img.height);
vertex(-100, 100, 0, 0, img.height);
endShape();
//reading
pushMatrix();
fill(204, 0, 0, 151);
translate(42, 75, 0);
box (5, 5, 10);
popMatrix();
//Manchester
pushMatrix();
fill(204, 0, 0, 151);
translate(34, 86, 0);
box (5, 5, 10);
popMatrix();
// London
pushMatrix();
fill(204, 0, 0, 151);
translate(28, 65, 0);
box (5, 5, 10);
popMatrix();
}
//2001 map
if(screen == 2) {
//shows 2011 data
fill(248, 255, 6);
text("2011", 100, -80, 0);
beginShape();
texture(img);
vertex(-100, -100, 0, 0, 0);
vertex(100, -100, 0, img.width, 0);
vertex(100, 100, 0, img.width, img.height);
vertex(-100, 100, 0, 0, img.height);
endShape();
// Las Vegas
pushMatrix();
fill(204, 0, 0, 151);
translate(55, 75, 0);
box (5, 5, 10);
popMatrix();
//LA
pushMatrix();
fill(204, 0, 0, 151);
translate(32, 51, 0);
box (5, 5, 10);
popMatrix();
//new york
pushMatrix();
fill(204, 0, 0, 151);
translate(30, 29, 0);
box (5, 5, 10);
popMatrix();
}
}
void keyPressed() {
if (key == CODED) {
if (keyCode == UP) { // moves camera up
updown = updown+30;
} else if (keyCode == DOWN) { // moves camera down
updown = updown-30;
} else if (keyCode == RIGHT) { // moves camera right
leftright = leftright-30;
} else if (keyCode == LEFT) { // moves camera left
leftright = leftright+30;
}
}
}
void mouseWheel(MouseEvent event) {
wheelCount = event.getCount();
}
//allows button click to switch between scenes.
void mousePressed(MouseEvent event) {
if (mouseButton == RIGHT) {
screen = (screen + 1) % 3;
}
if (event.getCount() == 1) { // detect double click
if (mouseButton == LEFT && dist(mouseX,mouseY, pos2D.x, pos2D.y)<60) {
drawText = ! drawText;
}
}
}
void mouseDragged() {
if (mouseButton == RIGHT) {
rotateY += (pmouseX - mouseX)*0.01;
rotateX += (pmouseY - mouseY)*0.01;
} if (mouseButton == LEFT) {
camX -= (pmouseX - mouseX);
camY -= (pmouseY - mouseY);
}
}
По какой-то причине только поле для Берлина кликабельна, остальное - нет. Когда я нажимаю на Берлин на карте, отображаются данные для всех городов, в которые добавлен указанный выше фрагмент кода. Мне нужно иметь возможность фильтровать по городам, например, я нажимаю Берлин, поэтому появляются только данные по Берлину. Что я делаю не так?