我来自csv文件的示例数据集如下(时间戳;经度;纬度):
2008-02-02 15:10:26.000;116.76038000;39.79758000
2008-02-02 15:10:49.000;116.76660000;39.80270000
2008-02-02 15:10:58.000;116.76660000;39.80270000
2008-02-02 15:11:10.000;116.76660000;39.80270000
基本上我想将这些位置绘制成地图。但是,我希望每个点都基于时间戳一次出现。例如,在呈现第一行的数据之后,由于时间戳的不同,第二行的数据将在13秒后跟随。在那之后,第三行将在第二个数据之后9秒消失。在这种情况下,时间间隔不相同。
有可能这样做吗?怎么做?我已经尝试过这样的事情:
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
if (!String.IsNullOrWhiteSpace(line))
{
if (j == 0) // to avoid reading csv header
{
j = j + 1;
}
else
{
values = line.Split(';');
if (!double.TryParse(values[1], out longitude))
{
longitude = 0;
}
if (!double.TryParse(values[2], out latitude))
{
latitude = 0;
}
Location bre = new Location(latitude, longitude);
if (i == 0)
{
prev = null;
current = bre;
dtcurrent = makeDT(values[0]);
i = i + 1;
}
else
{
dtprev = dtcurrent;
dtcurrent = makeDT(values[0]);
prev = current;
current = bre;
span = dtcurrent.Subtract(dtprev);
int th = span.Seconds * 1000;
createPushpin(bre, values[0], "default");
Thread.Sleep(th);
i = i + 1;
}
}
}
}
但是,地图上的图钉会在所有线程结束循环之后显示。
答案 0 :(得分:0)
您可以使用流读取器读取.csv文件,并使用split(“;”)函数分隔列,确定分号是每一行的分隔符。之后,您可以将数据存储到arrayList中,也可以根据列存储到数据库表中。
List<string> lattitude=new List<string>();
List<string> longitude=new List<string>();
List<string> timestamp=new List<string();
using (var rd = new StreamReader("yourfile.csv"))
{
while (!rd.EndOfStream)
{
var arrlst= rd.ReadLine().Split(';');
timestamp.add(arrlst[0])
lattitude.Add(arrlst[1]);
longitude.Add(arrlst[2]);
}
}
现在您可以使用时间选择器通过计数器每13秒跟踪一次来计算秒数。[您可以通过获取与时间戳记的连续时间差来获得秒间隔]每当计数器计数到13时就启动计数器再从0开始。您将执行上述步骤,直到读取了所需列表中的所有数据。当所有数据都被读取后,您可以通过引入一些逻辑来停止时间选择器。这是一种根据时间戳值和您的需要从所需列表中一次获取数据的方法。
线程:使用新的Thread()创建多个线程。根据您的时间间隔运行线程。
希望这会有所帮助。 谢谢
答案 1 :(得分:0)
是的,你可以做到。
基本上,您有CSV格式的数据,您可以编写一个API来从csv读取数据并返回json对象。您可以通过编写asp.net api来做到这一点。
这是在asp.net中读取CSV文件的方法 http://oniwebblog.blogspot.com/2016/01/aspnet-mvc-web-application-how-to-read_31.html
此处是构建.net Web API的参考 Write web API
在客户端,您可以使用jquery调用API并获取json数据。
现在可以使用Google API绘制位置,以加载地图和绘制点。
Here is how you can draw pin on google map
在javascript中,您可以使用setTimeout函数以特定间隔调用特定函数。
答案 2 :(得分:0)
您需要采取几个步骤,但是我只专注于第一个步骤。将文件结果转换为可以使用的某种结构。
其余的取决于您(并且仅用于病态的学术目的),您需要选择自己的冒险方式
给出
public readonly struct Location
{
public DateTime TimeStamp { get; }
public Decimal Lat { get; }
public Decimal Lon { get; }
public Location(DateTime timeStamp, decimal lat, decimal lon)
{
TimeStamp = timeStamp;
Lat = lat;
Lon = lon;
}
}
转换方法
public static Location ConvertToLocation(string input)
{
var split = input.Split(';');
return new Location(DateTime.Parse(split[0]),decimal.Parse(split[1]),decimal.Parse(split[2]));
}
用法
// List of locations
var results = File.ReadLines("SomeFileName").Select(ConvertToLocation);
答案 3 :(得分:0)
阅读并存储信息:
在这一部分中,我不会提倡任何仅用于读取和写入CSV的第三部分库。像CSV Helper。 因为很明显,您应该使用它。
var fileName = "input.txt";
var lines = File.ReadAllLines(fileName);//.Skip(1) // if you have an header.
var rawData = lines.Select(line => line.Split(';'))
.Select(item =>
{
Decimal lon, lat;
return new
{
date = DateTime.Parse(item[0]),
Lon = Decimal.TryParse(item[1], out lon) ? lon : 0,
Lat = Decimal.TryParse(item[2], out lat) ? lat : 0,
};
});
Decimal.TryParse(item[1], out lon) ? lon : 0
是TryParse
输入的简短方法,如果输入失败则提供默认值。
这时,您有了一个自定义对象列表,它是文件中包含的确切数据。 阅读完成后,您就可以开始工作了。 要知道每个点应该有多大的延迟,我们需要在第一个日期时间减去它。
var referenceDate = rawData.Select(x => x.date).First();
var usefullData = rawData.Select(x =>
new
{
Delay = (x.date - referenceDate),
x.Lon,
x.Lat,
});
现在我们有了有用的数据,延迟是一个TimeSpan,您可以用所需的单位表示它的值。 doc
由于我们在地图上没有信息,您将如何指出要点,所以我假设: 当用户显示地图时,您必须计算每个点应该出现的时间。
var readingTime = DateTime.Today.AddHours(19);
var displayData = usefullData.Select(x =>
new
{
Date = readingTime + x.Delay,
x.Lon,
x.Lat,
});