从查找文件创建 Bing maps v8 多边形

Create Bing maps v8 polygon from lookup files

我需要使用两个文件(fileA.txt 和 fileB.txt)在地图上创建多边形。文件 A 包含引用文件 B 的参考编号列表。我能够从 A 获取该列表并使用流阅读器在 B 中找到相应的文件。我似乎无法从该文件中获取我需要的数据。

文件 A 看起来像:

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

我用粗体显示数字 500230,然后在文件 B 中查找它,如下所示:

|FIPS|500230|
8 59.094 59.091 -138.413 -138.425 59.091 -138.413 59.092 -138.425 59.094 -138.415 59.091 -138.413
8 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|

|FIPS| 之后以 8 开头的每一行线是一个多边形。数字 8 表示粗体数字后的经纬度对数。这 8 可以是 4 到 20 之间的任何地方。我也可以在每个 |FIPS| 中有 1 到 20 个 "groups" lat long 对。

最后,我试图获取每个 |FIPS| 的经纬度对列表等于 |FIPS|那是被查到的。

或者数组的数组。有什么想法吗?

更新:这是我想到的,但我卡在了 mainListLoop 上。 streamReader 只读取到行尾,但我需要它读取到下一个 FIPS。有什么建议吗?

[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;
                    }
                });
            });

        }

A 的文件格式不是 100% 清楚,但是如果 fileB 不是很大,我会建议首先将 fileB 解析到字典中,其中键是 fips 代码,值是 lat 数组的数组,长对,或您在应用程序中拥有的任何坐标对象(数字也可以正常工作)。从那里解析 fileA 时,每当遇到 fips 值时,请检查字典。这将是最简单的实现。

但是如果 fileB 很大,那么您的计算机或服务器(您正在解析它的地方)上的内存可能是个问题。或者,如果 fileA 仅引用 fileB 中的一小部分数据,那么解析 fileB 中的所有数据可能不是最有效的方法。在这些情况下,解析 fileA 并获取 fips 代码列表。接下来,扫描文件 B,直到找到一个 fips 代码,然后查看它是否在文件 A 的列表中。如果是,则解析 fileB 中的数据并从 fileA 列表中删除该值。继续此操作,直到删除 filaA 列表中的所有 fips 或到达文件 B 的末尾。对于扫描 fileB,您可以编写自定义流 reader,或者如果文件不是很大,则将整个文件作为字符串读取,然后使用索引和子字符串跳过 fileB 寻找 fips。