Koordinaten effizient abspeichern

  • Antworten:16
Bernd Roth
  • Forum-Beiträge: 98

03.08.2013, 01:02:20 via Website

Hallo Forum,
ich habe folgendes Prroblem.

Ich habe eine Unzahl an Koordinaten ( Longitude und Latitude ).
Jetzt will ich diese auf meiner GoogleMap anzeigen, dafür verwende ich die Klasse PolygonOptions.

Jwtzt habe ich aber absolut keine Idee wie ich die vielen Koordinaten abspeichere und effizient durchlaufen kann oder sollte?

Ich will nämlich nicht unbedingt per Hand folgendes machen müssen:

1Polygon polygon = googleMap.addPolygon(new PolygonOptions()
2 .add(new LatLng(48.213947, 16.370101), new LatLng(48.214584,16.369249), new LatLng(48.215192,16.370545), new LatLng(48.214545,16.371264))
3 .strokeColor(Color.RED)
4 .fillColor(Color.BLUE));

Ich habe noch viele andere Koordinaten die ich anzeigen möchte.
Könnt ihr mir vll. sagen, wie ich das am besten hinbekomme, damit ich nicht wie oben alles zu Fuss machen muss?

Danke Euch vielmals!

lG

Antworten
LitteM
  • Forum-Beiträge: 141

03.08.2013, 01:17:18 via Website

Wie wärs mit einem mehrdimensionalen Array?

Antworten
Bernd Roth
  • Forum-Beiträge: 98

03.08.2013, 01:32:03 via Website

Das habe ich mir auch schon gedacht, nur bin ich dann leider dabei hängen geblieben, wie ich dann diese "endlos" Zeile hinbekomme

1add(new LatLng(48.213947, 16.370101), new LatLng(48.214584,16.369249), new LatLng(...) usf.

Das mehrdimensionale Array zu erzeugen wäre nicht das Problem, nur wie gesagt, weiss ich leider ncht wie ich diese Zeile dann hinbekomme.
Da ich ja hunderte bis tausende Punkte habe, weiss ich leider nicht, wie ich das programmiertechnisch am besten hinbekomme!

Danke Dir vielmals!

Antworten
LitteM
  • Forum-Beiträge: 141

03.08.2013, 01:37:30 via Website

Wo holst du denn die Koordinaten her, die du da reinmachen willst?
Kannst die in einem txt file speichern, zeile für zeile auslesen und ins array einfügen?

Antworten
Bernd Roth
  • Forum-Beiträge: 98

03.08.2013, 01:45:26 via Website

Ja, das wäre mein erster Ansatz.
Zuerst manuell ein Array aufbauen, sprich alle Koordinaten einfach reinkopieren und dann das Array durchgehen!

Leider komme ich noch nicht dahinter, wie ich die Zeile programmiertechnisch hinbekomme!

Die Koordinaten habe ich von wien.gv.at

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

03.08.2013, 11:11:00 via Website

Warum muss es denn unbedingt genau die "Zeile" sein, die du hinbekommen willst?
Ein Blick in die Doku offenbart, das es noch andere add() Funktionen gibt, mit denen sich die gewünschte Dynamik problemlos erzielen lässt.

Antworten
Bernd Roth
  • Forum-Beiträge: 98

03.08.2013, 16:23:29 via Website

Hallo,
die Zeile muss es natürlich nicht sein, aber in der Doku selber habe ich nicht das gefunden ( oder vll. auch verstanden ), was ich genau bräuchte!
Ich habe nur solche Sachen gefunden, wo man Polylines oder dergleichen zeichnen kann, aber ich möchte ja ein Gebiet "einzäunen".

An was hättest du dabei gedacht?

Danke Dir vielmals!

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

03.08.2013, 18:39:25 via Website

Hm?

Deine "Zeile" verwendet .add(LatLng... points), was für deine Zwecke unbrauchbar ist, wenn die Koordinaten zB aus einer Textdatei kommen.

Daneben gibt es aber auch noch .add(LatLng points), was zum Befüllen aus einer Textdatei hervorragend geeignet wäre:
while (readline(line)) {
LatLng l = line.spilt(delim)
po.add(l)
}

...oder habe ich deine Frage jetzt falsch verstanden?

Antworten
Andy N.
  • Forum-Beiträge: 3.112

03.08.2013, 18:47:53 via App

Wo werden den die Daten gespeichert, bzw woher kommen die genau her?
Du willst ja wohl nicht 1000 Daten in einem Array speichern.

Antworten
Bernd Roth
  • Forum-Beiträge: 98

03.08.2013, 20:00:26 via Website

Die Daten würde ich letzten Endes von hier beziehen:

http://data.wien.gv.at/katalog/kurzparkzonen.html
mittels JSON, csv oder was mir immer vorschwebt.

Zuerst jedoch suche ich noch nach einer Möglichkeit einmal zumindest 100 Punkte od so als PolygonOptions.add ( wenn ich diese Methode dann benötige ) richtig darzustellen und genau da komme ich leider nicht weiter wie ich das programmiertechnisch hinbekomme ( finde dazu auch keine geeignete Klasse, wo ich einfach vll in einer Schleife alle Punkte übergeben kann! ).

Ich suche nach einer Methode einfach alle Punkte in einer Schleife durchzugehen und bei jedem Schleifendurchlauf den Punkt zu übergeben:

Bsp: die Zeile in einer Datei würde so aussehen: 16.5678 48.5678 16.345 48.345 16.987 48.765 usf.

Pseudocode:

while(line != null){
point = line.split(del)
PolygonOptions.add(new LatLng(point) }

Jetzt ist es aber so, dass die .add Methode sowohl gleichzeitig Latitude und Longitude verlangt und genau hier komme ich nicht weiter.
Wenn ich das in einer Schleife durchlaufe, dann kann ich ja nur einen Punkt immer übergeben.

Antworten
Andy N.
  • Forum-Beiträge: 3.112

03.08.2013, 21:16:48 via Website

Ich denke, dass Du mit einem Array nicht weiter kommst. Denn wenn alle Daten im Array sind, was machst Du dann damit? Ich kenne die Maps Api nicht, aber ich vermute, dass das dann viel zu viele Daten sind und Du die Daten irgendwie für die aktuelle Position aufbereiten musst.

Ich würde die Daten abrufen und erst mal alle in eine Datenbank speichern. Je nachdem wie häufig die Daten auf dem Server aktualisieren werden, würde ich die Daten in der Datenbank aktualisieren.

Aber zu Deinem eigentlichen Problem:

PolygonOptions.addAll(Iterable<LatLng> points)

Du musst also erst mal mit Hilfe einer Schleife eine Liste von LatLng aufbauen, diese kannst Du dann mit PolygonOptions.addAll hinzufügen.

Antworten
Bernd Roth
  • Forum-Beiträge: 98

03.08.2013, 21:27:09 via Website

Hallo,
ja für den ersten Versuch habe ich mal ein Array versucht.
Dass das viel zu viele Daten sind war einleuchtend.
Die Datenbank und einem ContentResolver werde ich dann später in Angriff nehmen, dass habe ich mir auch schon überlegt.

Danke Dir vielmals für deinen Tipp bzgl. PolygonOptions und der Liste.
Werde es mit dieser dann mal versuchen!

Danke Dir vielmals!

lG

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

03.08.2013, 22:33:08 via Website

Bsp: die Zeile in einer Datei würde so aussehen: 16.5678 48.5678 16.345 48.345 16.987 48.765 usf.

Pseudocode:

while(line != null){
point = line.split(del)
PolygonOptions.add(new LatLng(point) }

Jetzt ist es aber so, dass die .add Methode sowohl gleichzeitig Latitude und Longitude verlangt und genau hier komme ich nicht weiter.

Wo ist da jetzt das Problem?
Du weißt doch welche Daten pro Zeile kommen, vermutlich immer Paare lat/long, also kannst du split verwenden um ein Array zu erhalten und das dann in einer Schleife sukzessive in points umwandeln:
a = split(line, delim)
n = a.size;
x = 0
while (x<n) {
point(a[x], a[x+1])
x += 2;
.add(point)
}

Antworten
Bernd Roth
  • Forum-Beiträge: 98

03.08.2013, 23:04:27 via Website

Hallo,
ich habe mir das Leben selbst äußerst schwer gemacht denke ich bzw. habe ich zu umständlich gedacht.
Habe gerade soeben mittels Hilfe von Andy N. diese Lösung hinbekommen ( sie ist natürlich nicht jetzt für alle Koordinaten gedacht, sondern nur für ein paar im Moment! ).

1ArrayList<LatLng> all=new ArrayList<LatLng>();
2 ArrayList<Double> lat=new ArrayList<Double>();
3 ArrayList<Double> lon=new ArrayList<Double>();
4
5 double[] dlat = {48.213947, 48.214584, 48.215192, 48.214545};
6 double[] dlon = new double[]{16.370101, 16.369249, 16.370545, 16.371264};
7
8 for(double n : dlat){
9 lat.add(n);
10 }
11
12 for(double n : dlon){
13 lon.add(n);
14 }
15
16 for(int a=0;a<lat.size();a++)
17 {
18 LatLng allLatLng= new LatLng(lat.get(a),lon.get(a));
19 all.add(allLatLng);
20 }
21
22 Polygon polygon = googleMap.addPolygon(new PolygonOptions()
23 .addAll(allLatLng)
24 .strokeColor(Color.RED)
25 .fillColor(Color.CYAN));

Antworten
Bernd Roth
  • Forum-Beiträge: 98

04.08.2013, 03:42:03 via Website

Hallo,
ich habe nur noch ein letztes Problem.
Den Rest habe ich dank eurer Hilfe bereits hinbekommen.

Ich stehe hiern noch an.
Die Daten liegen bereits in 2 Files vor und ich kann sie auch auslesen.
Wenn ich sie jedoch nun meiner ArrayList hinzufügen möchte bekomme ich das Problem dass ich den den Inhalt mittels byte Array einlese u dann in einen String überführe.
Will ich jetzt den String auf seine Bestandteile aufteilen bekomme ich danach eine ParseException

Teile ich den String nicht auf, dann fügt er immer nur den ersten Wert in die ArrayList ein:

1ArrayList<LatLng> all=new ArrayList<LatLng>();
2 ArrayList<Double> lat=new ArrayList<Double>();
3 ArrayList<Double> lon=new ArrayList<Double>();
4
5 AssetManager assetManager = getAssets();
6
7 double d = 0;
8 // To load text file
9 InputStream input;
10 try {
11 input = assetManager.open("dlat.txt");
12
13 int size = input.available();
14 byte[] buffer = new byte[size];
15 input.read(buffer);
16 input.close();
17
18 // byte buffer into a string
19 String text = new String(buffer);
20 int i = 0;
21 double val = 0;
22 // String[] splits = text.split(","); bei diesem Versuch ergibt sich eine ParseException
23
24 while(i != text.length()){
25 NumberFormat nf_in = NumberFormat.getNumberInstance(Locale.UK);
26 try {
27 val = nf_in.parse(text).doubleValue();
28 } catch (ParseException e) {
29 // TODO Auto-generated catch block
30 e.printStackTrace();
31 }
32 NumberFormat nf_out = NumberFormat.getNumberInstance(Locale.UK);
33 nf_out.setMaximumFractionDigits(6);
34 String output = nf_out.format(val);
35 d = Double.valueOf(output);
36 lat.add(d); /* es wird immer nur der erste Wert hinzugefügt */
37 i++;
38 }
39 } catch (IOException e) {
40 // TODO Auto-generated catch block
41 e.printStackTrace();
42 }

Vll. kann mir jemand nochmals helfen, damit ich jeden Wert in die ArrayList bekomme!

Danke Euch schon mal vielmals!

Antworten
Andy N.
  • Forum-Beiträge: 3.112

04.08.2013, 08:24:33 via App

Dann lese es doch als Text zeilenweise ein. In etwa so :

BufferedReader br = new ...

while( line = br.readLine() != null) {
\\Verarbeite die Zeile
}

Antworten
Bernd Roth
  • Forum-Beiträge: 98

04.08.2013, 10:46:16 via Website

Hallo,
danke Dir vielmals!

Jetzt habe ich es endlich wie gewünscht hinbekommen.

Vll. sollte man um knapp 4 in der Frühe nicht mehr arbeiten!

Danke vielmals nochmals!

Antworten