// Valmis osa: Siirtää rakennusten datan pelisysteemille nopeasti saataville -joel public void LataaData(double minlat, double minlon, double maxlat, double maxlon, int resox, int resoy, XMLData luettudata, bool testaus) { this.xreso = resox; this.yreso = resoy; // muuntaa xml-koordinaatiston sopivaan pelikoordinaatti muotoon offsetx = -minlon; offsety = -minlat; scalex = (1 / (maxlon-minlon)) * resox; scaley = (1 / (maxlat-minlat)) * resoy; System.Console.WriteLine("XML->Peli: Muunnetaan tiedot pelin sisälle...: rakennuksia yhteensä " + luettudata.annaRakennusLkm() ); for (int i = 0; i < luettudata.annaRakennusLkm(); i++) { int tyyppi; XMLRakennus temprakennus = (luettudata.annaRakennus(i)); ArrayList tempvektorit = new ArrayList(); tyyppi = temprakennus.annaTyyppi(); for (int k = 0; k < temprakennus.annaNoodiLkm(); k++) { // etsitään rakennuksen noodirefensseille vastaavuudet noodikokoelmasta double haettava = temprakennus.annaNoodiId(k); bool find = false; int l = 0; while (!find) { XMLNoodi tempnoodi = luettudata.annaNoodi(l); if (tempnoodi.getId() == haettava) { // tallennetaan rakennusten luokkaan tällaisella kaavalla, TODO: oikeanlainen muunnos jotta saadaan järkevät koordinaatit käyttöön Vektori tempvektori = new Vektori((tempnoodi.getLon() + this.offsetx) *this.scalex, resoy-((tempnoodi.getLat() + this.offsety) *this.scaley)); tempvektorit.Add(tempvektori); find = true; } l++; if (l >= luettudata.annaNoodiLkm()) break; } } if (tempvektorit.Count != 0) { Rakennus uusirakennus = new Rakennus(temprakennus.annaNimi(), tempvektorit, tyyppi); Rakennukset.Add(uusirakennus); } } System.Console.WriteLine("XML->Peli: Muunnetaan tiedot pelin sisälle..: vesiä yhteensä " + luettudata.annaVesiLkm()); for (int i = 0; i < luettudata.annaVesiLkm(); i++) { XMLVesi tempvesi = (luettudata.annaVesi(i)); ArrayList tempvektorit = new ArrayList(); for (int k = 0; k < tempvesi.annaNoodiLkm(); k++) { // etsitään rakennuksen noodirefensseille vastaavuudet noodikokoelmasta double haettava = tempvesi.annaNoodiId(k); bool find = false; int l = 0; while (!find) { XMLNoodi tempnoodi = luettudata.annaNoodi(l); if (tempnoodi.getId() == haettava) { // tallennetaan rakennusten luokkaan tällaisella kaavalla, TODO: oikeanlainen muunnos jotta saadaan järkevät koordinaatit käyttöön Vektori tempvektori = new Vektori((tempnoodi.getLon() + this.offsetx) *this.scalex, resoy-((tempnoodi.getLat() + this.offsety) *this.scaley)); tempvektorit.Add(tempvektori); find = true; } l++; if (l >= luettudata.annaNoodiLkm()) break; } } if (tempvektorit.Count != 0) { Vesi uusivesi = new Vesi("vesi", tempvektorit); Vedet.Add(uusivesi); } } if (testaus == false) { System.Console.WriteLine("XML->Peli: Muunnetaan tiedot pelin sisälle..: teitä yhteensä " + luettudata.annaTieLkm()); for (int i = 0; i < luettudata.annaTieLkm(); i++) { XMLTie temptie = (luettudata.annaTie(i)); int tyyppi = 0; ArrayList tempvektorit = new ArrayList(); for (int k = 0; k < temptie.annaNoodiLkm(); k++) { // etsitään rakennuksen noodirefensseille vastaavuudet noodikokoelmasta double haettava = temptie.annaNoodiId(k); bool find = false; int l = 0; while (!find) { XMLNoodi tempnoodi = luettudata.annaNoodi(l); if (tempnoodi.getId() == haettava) { // tallennetaan rakennusten luokkaan tällaisella kaavalla, TODO: oikeanlainen muunnos jotta saadaan järkevät koordinaatit käyttöön Vektori tempvektori = new Vektori((tempnoodi.getLon() + this.offsetx) * this.scalex, resoy - ((tempnoodi.getLat() + this.offsety) * this.scaley)); tempvektorit.Add(tempvektori); find = true; } l++; if (l >= luettudata.annaNoodiLkm()) { break; } } } if (tempvektorit.Count != 0) { tyyppi = temptie.annaTyyppi(); Tie uusitie = new Tie(temptie.annaNimi(), tempvektorit, tyyppi); Tiet.Add(uusitie); } } } System.Console.WriteLine("XML->Peli: Muunnetaan tiedot pelin sisälle..: ruohoalueita yhteensä " + luettudata.annaRuohoLkm()); for (int i = 0; i < luettudata.annaRuohoLkm(); i++) { XMLRuoho tempruoho = (luettudata.annaRuoho(i)); int tyyppi = tempruoho.annaTyyppi(); ArrayList tempvektorit = new ArrayList(); for (int k = 0; k < tempruoho.annaNoodiLkm(); k++) { // etsitään rakennuksen noodirefensseille vastaavuudet noodikokoelmasta double haettava = tempruoho.annaNoodiId(k); bool find = false; int l = 0; while (!find) { XMLNoodi tempnoodi = luettudata.annaNoodi(l); if (tempnoodi.getId() == haettava) { // tallennetaan rakennusten luokkaan tällaisella kaavalla, TODO: oikeanlainen muunnos jotta saadaan järkevät koordinaatit käyttöön Vektori tempvektori = new Vektori((tempnoodi.getLon() + this.offsetx) * this.scalex, resoy - ((tempnoodi.getLat() + this.offsety) * this.scaley)); tempvektorit.Add(tempvektori); find = true; } l++; if (l > luettudata.annaNoodiLkm() -1) { break; } } } if (tempvektorit.Count != 0) { Ruoho uusiruoho = new Ruoho("ruoho", tempvektorit, tyyppi); Ruohot.Add(uusiruoho); } } }
// Varsinainen parserimetodi TODO: koodin selvennystä, debuggauksien poistoa jossain vaiheessa, kun sitä ei tarvitse enää ollenkaan public static XMLData LueXML(String filename) { NumberStyles style = NumberStyles.AllowDecimalPoint; CultureInfo culture = CultureInfo.CreateSpecificCulture("en-GB"); ArrayList XmlNoodit = new ArrayList(); ArrayList XmlRakennukset = new ArrayList(); ArrayList XmlVedet = new ArrayList(); ArrayList XmlTiet = new ArrayList(); ArrayList XmlRuohot = new ArrayList(); ArrayList reftemp = new ArrayList(); FileStream file = new FileStream(filename, FileMode.OpenOrCreate); BufferedStream stream = new BufferedStream(file); XmlTextReader reader = new XmlTextReader(stream); int lukutyyppi = 0; // 1= noodi, 2= tie, 3=talo/vesi double tempId = 0; int muutettava =0; int muutettavaV = 0; bool auki = false; bool vauki = false; bool tauki = false; System.Console.WriteLine("aloitetaan xml-tiedoston " + filename + " parsiminen"); while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: // XML elementti alkaa if (reader.Name == "node") { lukutyyppi = 1; } if (reader.Name == "way") { lukutyyppi = 2; } if (lukutyyppi == 2 && reader.Name == "nd") { //refluku = true; } if (reader.AttributeCount > 0) { int attributeCount = reader.AttributeCount; // luettavien arvoje apumuistit double tempLon = 0; double tempLat = 0; double tempRef = 0; // parametrien summan varmistin int count = 0; for (int i = 0; i < attributeCount; i++) { reader.MoveToAttribute(i); // tapaus = noodi if (lukutyyppi == 1) { // noodin data if (reader.Name == "lon") { Double.TryParse(reader.Value.ToString(), style, culture, out tempLon); count++; } if (reader.Name == "lat") { Double.TryParse(reader.Value.ToString(), style, culture, out tempLat); count++; } if (reader.Name == "id") { Double.TryParse(reader.Value.ToString(), style, culture, out tempId); count++; } // jos kaikki kolme paramaetriä tuli, noodin tallennus arraylistiin if (count == 3) { XMLNoodi uusiNoodi = new XMLNoodi(tempId, tempLat, tempLon); XmlNoodit.Add(uusiNoodi); lukutyyppi = 0; } } // tapaus == rakennus tai vesi if (lukutyyppi == 2) { if (reader.Name == "id") { Double.TryParse(reader.Value.ToString(), style, culture, out tempId); // System.Console.WriteLine("rakennuksen id:" + tempId); } if (reader.Name == "ref") { Double.TryParse(reader.Value.ToString(), style, culture, out tempRef); reftemp.Add(tempRef); // lisätään refenssi referenssien temp-listaan tempRef = 0; } // tie if (reader.Name == "k" && reader.Value.ToString() == "highway" && !tauki && !auki && !vauki) { i++; reader.MoveToAttribute(i); // näitä ehtoja vähentämällä saa laskettua tieolioiden kuormaa if ((reader.Name == "v" && reader.Value.ToString() == "footway") || (reader.Name == "v" && reader.Value.ToString() == "motorway") || (reader.Name == "v" && reader.Value.ToString() == "service") || (reader.Name == "v" && reader.Value.ToString() == "cycleway") || (reader.Name == "v" && reader.Value.ToString() == "residential") || (reader.Name == "v" && reader.Value.ToString() == "secondary" || reader.Name == "v" && reader.Value.ToString() == "tertiary" || reader.Name == "v" && reader.Value.ToString() == "pedestrian")) { int tyyppi = 0; //if (reader.Value.ToString() == "secondary" || reader.Value.ToString() == "tertriary" )//|| reader.Value.ToString() == "tertiary") //{ // tyyppi = 1; //} String nimi = " "; XMLTie uusi = new XMLTie(tempId, reftemp, nimi, tyyppi); XmlTiet.Add(uusi); tempId = 0; tauki = true; auki = false; vauki = false; muutettava = XmlTiet.Count - 1; } } if (reader.Name == "k" && reader.Value.ToString() == "name" && tauki) { reader.MoveToAttribute(i + 1); XMLTie temp = (XMLTie)XmlTiet[muutettava]; temp.muutaNimi(reader.Value.ToString()); tauki = false; } // luettu elementti oli rakennus, luodaan siis uusi rakennusolio ja tehdään tallennus if (reader.Name == "k" && reader.Value.ToString() == "building" && !auki && !vauki && !tauki) { int tyyppi=0; // oletuksena tavallinen talo String nimi = " "; i++; reader.MoveToAttribute(i); if (reader.Name == "v" && reader.Value.ToString() == "hospital") tyyppi = 1; XMLRakennus uusi = new XMLRakennus(tempId, reftemp, nimi, tyyppi); XmlRakennukset.Add(uusi); tempId = 0; muutettava = XmlRakennukset.Count-1; auki = true; vauki = false; } // rakennukselle nimi if (reader.Name == "k" && reader.Value.ToString() == "name" && auki && !vauki && !tauki) { reader.MoveToAttribute(i + 1); XMLRakennus temp = (XMLRakennus)XmlRakennukset[muutettava]; temp.muutaNimi(reader.Value.ToString()); auki = false; } if (reader.Name == "k" && reader.Value.ToString() == "landuse" || reader.Name == "k" && reader.Value.ToString() == "natural" || reader.Name == "k" && reader.Value.ToString() == "leisure" || reader.Name == "k" && reader.Value.ToString() == "amenity") { i++; reader.MoveToAttribute(i); if ((reader.Name == "v" && reader.Value.ToString() == "meadow") || (reader.Name == "v" && reader.Value.ToString() == "grass") || (reader.Name == "v" && reader.Value.ToString() == "forest") || (reader.Name == "v" && reader.Value.ToString() == "park") || (reader.Name == "v" && reader.Value.ToString() == "wood") || (reader.Name == "v" && reader.Value.ToString() == "wetland") || (reader.Name == "v" && reader.Value.ToString() == "residential") || (reader.Name == "v" && reader.Value.ToString() == "retail") || (reader.Name == "v" && reader.Value.ToString() == "playground") || (reader.Name == "v" && reader.Value.ToString() == "parking") || (reader.Name == "v" && reader.Value.ToString() == "school")) { String nimi = "nimeton"; int tyyppi = 0; if (reader.Value.ToString() == "meadow" || reader.Value.ToString() == "grass" || reader.Value.ToString() == "park" || reader.Value.ToString() == "playground") tyyppi = 0; if (reader.Value.ToString() == "forest" || reader.Value.ToString() == "wood") tyyppi = 1; if (reader.Value.ToString() == "wetland" || reader.Value.ToString() == "swamp") tyyppi = 2; if (reader.Value.ToString() == "residential" || reader.Value.ToString() == "retail") tyyppi = 3; if (reader.Value.ToString() == "parking" || reader.Value.ToString() == "school") tyyppi = 4; XMLRuoho uusi = new XMLRuoho(tempId, reftemp, nimi, tyyppi); XmlRuohot.Add(uusi); tempId = 0; //muutettavaV = XmlVedet.Count - 1; auki = false; vauki = false; } } //vesi, nimi ennen päätunnistetta if (reader.Name == "v" && reader.Value.ToString() == "water") // tallennetaan järvi talon tapaisesti { String nimi = "nimeton"; XMLVesi uusi = new XMLVesi(tempId, reftemp, nimi); XmlVedet.Add(uusi); tempId = 0; muutettavaV = XmlVedet.Count-1; auki = false; vauki = true; } } } } break; case XmlNodeType.EndElement: // XML-elementin loppu if (reader.Name == "node") { tempId = 0; } if (reader.Name == "way") { reftemp.Clear(); tempId = 0; vauki = false; auki = false; tauki = false; } lukutyyppi = 0; muutettava = 0; break; } } XMLData valmisData = new XMLData(XmlNoodit, XmlRakennukset, XmlVedet, XmlTiet, XmlRuohot); System.Console.WriteLine("Parsiminen valmis"); System.Console.WriteLine("noodeja tuli: " + valmisData.annaNoodiLkm()); System.Console.WriteLine("rakennuksia : " + valmisData.annaRakennusLkm()); System.Console.WriteLine("vesistöjä : " + valmisData.annaVesiLkm()); System.Console.WriteLine("teitä : " + valmisData.annaTieLkm()); System.Console.WriteLine("ruohoja : " + valmisData.annaRuohoLkm()); return valmisData; }