Exemple #1
0
        // 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;
        }