# Einfärben von Gemeinden auf einer Karte



## Reggie() (6. Mrz 2017)

Hallo Coder,
wie würdet ihr diese Aufgabe lösen? Nehmen wir zB. die Bayernkarte. Dort gibts über 700 Gemeinden. Ich würde gerne ein Programm schreiben, dass eine Excel-Liste importiert (bestehend aus Gemeinde-Name und Wert) und die Gemeinden anhand einer frei wählbaren Farbskala einfärbt.


----------



## Thallius (6. Mrz 2017)

Würde ich gar nicht lösen. Ohne eine spezielle Karte, die alle gemeindegrenzen eingezeichnet hat, dürfte diese Aufgabe nahezu unmöglich werden oder halt eine sehr ungenaue Sache.


----------



## krgewb (6. Mrz 2017)

Die Daten aus der Excel-Datei kannst du in einer Map zwischenspeichern.
Es gibt bereits Bilder von Bayern-Karten mit den einzelnen Gemeinden. Zum Beispiel hier: https://www.google.de/imgres?imgurl...act=8#h=688&imgrc=TJCFeAwFdvSyGM:&vet=1&w=780
Zur Übung darf man das verwenden aber man darf das Programm dann nicht veröffentlichen.
Alernativ gibt es hier auch solch eine Karte: https://de.fotolia.com/id/58440588 Auf der Webseite kann man eine Lizenz für das Bild kaufen.

Ich würde dann für jede Gemeinde ein separates Bild machen, bei dem ich die Größe der Bilddatei beibehalte und alle anderen Gemeinden mit Paint wegmache. Danach mit Gimp den Hintergrund transparent machen.
In dem Java-Programm kannst du dann die Bilder reinladen und umfärben.


----------



## Reggie() (6. Mrz 2017)

wie wärs wenn ich die Karte zwar nicht selber zeiche, aber eine fretige Karte "zerlege" in Gemeindestückchen, die ich dann einzeln einfärben kann? ginge das?
Plan B: wenn ich die Karte selber zeichnen muss, sind dann die Linien (Gemeinde/Landkreis-Grenzen) die Abgrenzungen der Objekte Gemeinde?
Ich stelle es mir so vor (mal ins Blaue gesponnen (daher stark vereinfacht)):

```
public class Gemeinde {
  String GemeindeName;  
  Array<Point> grenzPunkte;
  Point p;
  int wert;

  public Gemeinde(String n, Array<Point> p) {
    grenzPunkte= new ArrayList<Point>();
    GemeindeName = n;
    wert = null;
    }
    public ArrayList<Point> zeichneGemeindeGrenzen() {
      //aus Excel einlesen-Code und in x und y zwischenspeichern
      //for-Schleife Anzahl Punkte der Gemeinde      
      grenzPunkte.add(new Point(x,y));
   }
}
```


----------



## krgewb (6. Mrz 2017)

Du kannst es als Polygon zeichnen:

```
protected void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        GeneralPath polygon = new GeneralPath();

        // Startpunkt
        polygon.moveTo(20.0, 500.0);

        polygon.lineTo(..., ...);
        polygon.lineTo(..., ...);
        polygon.lineTo(..., ...);
        ...

        g2.draw(polygon);
    }
```


----------



## Reggie() (6. Mrz 2017)

krgewb hat gesagt.:


> https://www.google.de/imgres?imgurl=https://www.statistik.bayern.de/medien/statistik/StatistikdesMonats/schluesselzuweisungen2011_780.png&imgrefurl=https://www.statistik.bayern.de/statistikdesmonats/00533.php&docid=pmu16rZ27aVJUM&tbnid=TJCFeAwFdvSyGM:&vet=1&w=780&h=688&client=firefox-b-ab&bih=604&biw=1366&q=Bayern Gemeinde&ved=0ahUKEwj9k8-SiMLSAhXJchQKHUwlAl0QMwgcKAAwAA&iact=mrc&uact=8#h=688&imgrc=TJCFeAwFdvSyGM:&vet=1&w=780


wow, genau so soll es am Ende aussehen


----------



## Reggie() (6. Mrz 2017)

Polygon, damit werde ich mal rumexperimentieren... vielleicht muss ich die Bayernkarte etwas "grober" zeichnen, um erstmal Aufwand zu sparen.


----------



## Dukel (6. Mrz 2017)

Du willst die Map nicht manuell zeichnen. Dafür gibt es fertige Frameworks/Toolkits.
https://java-source.net/open-source/geospatial
http://www.geoapi.org/
http://openmap-java.org/
Frag mich aber nicht was die genau können und welches für deinen Zweck die beste ist. Ich habe nur Google angeworfen.


----------



## Reggie() (6. Mrz 2017)

vielleicht meldet sich ja noch jemand, der mit einem davon schon gearbeitet hat


----------



## krgewb (8. Mrz 2017)

Ich mache es jetzt so:
Das Java-Programm erstellt eine HTML-Datei, in der die Bilder dargestellt werden.


----------



## Reggie() (9. Mrz 2017)

kannst du mir mal ein Beispiel zeigen?


----------



## krgewb (9. Mrz 2017)

Es ist schwieriger als ich dachte. Ich weiß nicht, wie ich die Bilder per CSS umfärben kann.


----------



## Thallius (9. Mrz 2017)

Also ich würde zusehen, dass ich diese Karte bekomme ohne Text in den einzelnen Gemeindefeldern. Dann würde ich mir einmal die Mühe machen und für jede Gemeinde eine Pixelposition irgendwo innerhalb des zugehörigen Bereiches definieren. Und dann würde ich einfach mit einem simplen Floodfill Algorytmus die Bereiche füllen.


----------



## krgewb (12. Mrz 2017)

krgewb hat gesagt.:


> Du kannst es als Polygon zeichnen:
> 
> ```
> protected void paintComponent(Graphics g) {
> ...


Hoppla. Damit zeichnet man nur die Grenzen auf der Karte. So kann man ein Polygon mit einer Farbe füllen:


```
Polygon meinPolygon = new Polygon(arrayMitDenXwerten, arrayMitDenYwerten, anzahlDerPunkte); 
g.fillPolygon(meinPolygon);
```


----------



## krgewb (30. Jun 2017)

Wie hast du es letztendlich gemacht?


----------

