从查找文件创建 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。
我需要使用两个文件(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。