2017-08-28 4 views
0

Ich habe zwei Dateien (fileA.txt und fileB.txt), die ich verwenden muss, um Polygone auf einer Karte zu erstellen. FileA enthält die Liste der Referenznummern, die sich auf Datei B beziehen. Ich bin in der Lage, diese Liste von A zu bekommen und finde die entsprechende Datei in B mit streamreader. Was ich nicht erfassen kann, sind die Daten, die ich von dieser Datei benötige.Erstellen von Bing Maps V8-Polygon aus Lookup-Dateien

FileA wie folgt aussieht:

| ADV | 170613/0448 | 170613/0600 | KRIW || 0 | 1
WYZ023 Star_Valley WYZ013 500.130 Jackson_Hole

ich die Nummer in fett nehmen , 500230, und suchen Sie danach in fileB, das wie folgt aussieht:

| FIPS | 500230 |
        59,094 59,091 -138,413 -138,425 59,091 -138,413 59,092 -138,425 59,094 -138,415 59,091 -138,413
        59,101 59,099 -138,397 -138,413 59,099 -138,405 59,101 - 138.413 59.100 -138.397 59.099 -138.405
| FIPS | 500231 |

Jede Zeile beginnt mit 8 nach dem | FIPS | Linie ist ein Polygon. Die Zahl 8 repräsentiert die Anzahl der lat langen Paare NACH den fett gedruckten Zahlen. Diese 8 kann irgendwo zwischen 4 und 20 liegen. Ich kann auch irgendwo zwischen 1 und 20 dieser "Gruppen" lat langer Paare innerhalb jedes FIPS | haben.

Am Ende versuche ich eine Liste von lat langen Paaren für jedes | FIPS | zu bekommen das entspricht dem | FIPS | Das ist nachgeschlagen.

oder ein Array von Arrays. Irgendwelche Gedanken?

UPDATE: das ist, was ich kam, aber ich bin auf MainListLoop stecken. Der streamReader liest nur bis zum Ende der Zeile, aber ich muss ihn zum nächsten FIPS lesen. Irgendwelche Vorschläge?

[HttpGet] 
     public ActionResult GetWinterData() 
     { 
      var winterFilePaths = HostingEnvironment.MapPath(ConfigurationManager.AppSettings["WatchWarnFilePath"] + "/wstm.txt"); 

      var stringData = new List<string>(); 
      var mainList = new List<WinterModel>(); 

      using (var reader = new StreamReader(winterFilePaths)) 
      { 
       while (!reader.EndOfStream) 
       { 
        var data = reader.ReadLine().Trim(); 

        if (!string.IsNullOrEmpty(data)) 
         stringData.Add(data); 
       } 
       reader.Close(); 
      } 

      WinterModel temp = null; 

      stringData.ForEach(line => 
      { 
       if (line.StartsWith("|")) 
       { 
        if (temp != null) 
        { 
         mainList.Add(temp); 
        } 

        string[] rawData = line.Split('|'); 

        temp = new WinterModel 
        { 
         Type = rawData[0], 
         PolyBorderColor = GetBorderColor(rawData[0], types.WINTER), 
         PolyBorderThickness = GetPolyBorderThickness(rawData[0], types.WINTER), 
         StartDateTime = rawData[1], 
         EndDateTime = rawData[2], 
         innerData = new List<tempInnerWinterModel>(), 
         InfoboxTitle = GetInfoboxTitle(rawData[0], types.WINTER) 
        }; 
       } 
       else 
       { 
        string[] tempLine = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 
        temp.innerData.Add(new tempInnerWinterModel 
        { 
         param1 = tempLine[0], 
         FIPS = tempLine[1], 
         Location = tempLine[2], 
         latLongs = new List<lat_longPairs>() 
        }); 
       } 
      }); 

      mainList.Add(temp); 

      getWinterLatLongPairs2(mainList); 

      var tempJson = (from item in stringData 
          select item.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries) 
         into rawData 
          select new WatchPolygons 
          { 
           Type = rawData[0], 
           PolyBorderColor = GetBorderColor(rawData[0], types.WINTER), 
           StartDateTime = rawData[1], 
           EndDateTime = rawData[2], 
           //Lat_Long_Pairs = getWinterLatLongPairs2(rawData[5]) 
           //Metadata = "Watch Type: " + rawData[0] + "< /br>" + "Watch Start: " + rawData[1] + ' ' + rawData[2] 
           //     + "< /br>" + "Watch End: " + rawData[3] + ' ' + rawData[4] 
          }); 

      return Json((from item in stringData 
         select item.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries) 
         into rawData 
         select new WatchPolygons 
         { 
          Type = rawData[0], 
          PolyBorderColor = GetBorderColor(rawData[0], types.WINTER), 
          StartDateTime = rawData[1], 
          EndDateTime = rawData[2], 
          //Lat_Long_Pairs = getWinterLatLongPairs2(rawData[5]) 
          //Metadata = "Watch Type: " + rawData[0] + "< /br>" + "Watch Start: " + rawData[1] + ' ' + rawData[2] 
          //     + "< /br>" + "Watch End: " + rawData[3] + ' ' + rawData[4] 
         }).ToList(), JsonRequestBehavior.AllowGet); 
     } 


     private static void getWinterLatLongPairs2(List<WinterModel> inputFips) 
     { 
      var searchFips = inputFips; 
      var fipFilePath = HostingEnvironment.MapPath(ConfigurationManager.AppSettings["WatchWarnFilePath"] + "/pfzbnds.tbl"); 
      var stringInnerData = new List<string>(); 

      using (var reader = new StreamReader(fipFilePath)) 
      { 
       while (!reader.EndOfStream) 
       { 
        var line = reader.ReadLine().Trim(); 

        if (!string.IsNullOrEmpty(line) && line.Contains("<FIPS>")) 
        { 
         MainListLoop(inputFips, line, reader); 

         if (inputFips.Last().innerData.Last().latLongs.Count > 0) 
         { 
          return; 
         } 
        } 
       } 
       reader.Close(); 
      } 
      return; 
     } 

     private static void MainListLoop(List<WinterModel> inputFips, string line, StreamReader reader) 
     { 
      inputFips.ForEach(main => 
      { 
       main.innerData.ForEach(fips => 
       { 
        if (line.Contains(fips.FIPS)) 
        { 
         var line2 = reader.ReadLine().Trim(); 
         fips.param1 = "CHANGE"; 

         string[] tempLine = line2.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 
         string numLatLongPairs = tempLine[0]; 
         var latLonPairsWint = new List<lat_longPairs>(); 
         int endIndex = ((Int16.Parse(numLatLongPairs) * 2) + 3 - 1); 

         //grab each pair of lat/longs starting at the 5th and add them to the array 
         for (int i = 5; i < endIndex; i += 2) 
         { 
          fips.latLongs.Add(new lat_longPairs { latitude = decimal.Parse(tempLine[i]), longitude = decimal.Parse(tempLine[i + 1]) }); 
         } 
         return; 
        } 
       }); 
      }); 

     } 

Antwort

1

nicht 100% klar auf das Dateiformat von A, aber wenn fileB nicht massiv ist, würde ich fileB zunächst in ein Wörterbuch, in dem der Schlüssel der FIPS-Code und der Wert ist ein Array von Array empfehlen Parsen von Lat, langen Paaren oder einem anderen Koordinatenobjekt, das Sie in Ihrer Anwendung haben (Zahlen funktionieren auch). Wenn Sie bei der Analyse von DateiA einen fips-Wert finden, überprüfen Sie von dort aus das Wörterbuch. Dies wäre die einfachste Implementierung.

Wenn jedoch DateiB massiv ist, dann kann Speicher auf Ihrem Computer oder Server (wo Sie dies analysieren), ein Problem sein. Oder wenn DateiA nur eine kleine Teilmenge von Daten in Datei B referenziert, ist die Analyse aller Daten in Datei B wahrscheinlich nicht die größte. Analysieren Sie in diesem Fall DateiA und rufen Sie eine Liste mit FIPS-Code ab. Als nächstes scannen Sie durch Datei B, bis Sie einen fips-Code finden und sehen, ob er sich in Ihrer Liste von Datei A befindet. Wenn dies der Fall ist, analysieren Sie diese Daten von Datei B und entfernen Sie diesen Wert aus Ihrer DateiA-Liste. Fahren Sie fort, bis alle Fips in der FilaA-Liste entfernt sind oder Sie das Ende der Datei erreicht haben. Zum Scannen von Datei B können Sie einen benutzerdefinierten Stream-Reader schreiben, oder wenn die Datei nicht massiv ist, lesen Sie das Ganze als String, dann verwenden Sie den Index und die Teilzeichenfolge, um Datei B nach Fips zu durchsuchen.

+0

Danke. Siehe mein Update. Datei B wird sehr groß sein. Es ist 6MB mit 95.697 Linien – bradoxbl

+0

6mb ist nicht groß. 60mb ist moderat. – rbrundritt