我试图读取包含GPS坐标(纬度,经度和海拔)的CSV文件以及每个实例的时间戳。格式如下:
2014-08-06T21:02:23Z,-33.7939310,151.0553090,-5.0
将每个单独分成一个路点(基本上将每一行放入一个数组中)然后分开每个路径点以将每个数据成员作为自己的字符串。所以,快速概述我到目前为止所做的工作。
我用逗号分隔字符串以提供4个单独的字符串,然后使用parseDouble
将数字字符串更改为双精度字符串。
我认为我的格式错误但我并不是百分之百确定,因为我还不熟悉java,最后一种方法将涉及使用来自" getters"的数据。
任何帮助都会非常感激,因为我正在努力掌握这个项目!
public class Waypoint {
// The radius of the Earth in km
final double R = 6373.0;
public double getLatitude(String[] field) {
double latitude = Double.parseDouble(field[3]);
return latitude;
}
public double getLongitude(String[] field) {
double longitude = Double.parseDouble(field[2]);
return longitude;
}
public double getElevation(String[] field) {
double elevation = Double.parseDouble(field[4]);
return elevation;
}
public String getTimestamp(String[] field) {
String date = field[1];
return date;
}
public Waypoint(final String wstring) throws GPSException, FileNotFoundException {
Scanner scanner = new Scanner(new FileReader(wstring));
scanner.hasNextLine();
while(scanner.hasNextLine()) {
String waypoint = scanner.nextLine();
String[] field = waypoint.split(",");
}
}
public double distanceTo(Waypoint wp2) {
}
}
答案 0 :(得分:1)
这个问题措辞不正确,每次在这里都会让你受到打击。
您需要做的第一件事是阅读以下内容:https://stackoverflow.com/help/how-to-ask
鉴于此,您需要发布遇到的问题,我认为这是一个ArrayOutOfBoundsException,因为java数组从索引0开始,而不是1。
之后我想象你遇到日期问题,这很复杂,因为你应该使用Date解析器而不是你上面所说的。
我还假设您知道如何计算两个坐标之间的距离,如果不是那个单独的问题。
你需要开始将事情分解为更面向对象的东西。
大多数学校作业都不希望你使用像OpenCsv这样的库,因此你的扫描仪。你可以带上你的扫描仪,假设它适合你,只需创建一个结构传递到工厂。我建议List<String[]>
,每个String数组都是CSV文件中的一行。
您应该根据类来思考,例如坐标类如下:
package com.techtrip.labs.stackoverflow;
import java.time.ZonedDateTime;
public class Coordinate {
private ZonedDateTime timeStamp;
private Double latitude;
private Double longitude;
private Double elevation;
public Coordinate() {
super();
}
public ZonedDateTime getTimeStamp() {
return timeStamp;
}
public void setTimeStamp(ZonedDateTime timeStamp) {
this.timeStamp = timeStamp;
}
public Double getLatitude() {
return latitude;
}
public void setLatitude(Double latitude) {
this.latitude = latitude;
}
public Double getLongitude() {
return longitude;
}
public void setLongitude(Double longitude) {
this.longitude = longitude;
}
public Double getElevation() {
return elevation;
}
public void setElevation(Double elevation) {
this.elevation = elevation;
}
}
使用辅助类(或者可能是Java 8中使用默认方法的接口)
package com.techtrip.labs.stackoverflow;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.List;
public class CoordinateFactory {
public List<Coordinate> getCoordinates(List<String[]> raw) {
List<Coordinate> coordinates = new ArrayList<Coordinate>(raw.size());
for (String[] row : raw) {
coordinates.add(createCoordinate(row));
}
return coordinates;
}
private Coordinate createCoordinate(String... args) {
// add error checking here as an assignment
Coordinate coordinate = new Coordinate();
coordinate.setTimeStamp(parseToLocalDateTime(args[0]));
coordinate.setLongitude(Double.parseDouble(args[1]));
coordinate.setLatitude(Double.parseDouble(args[2]));
coordinate.setElevation(Double.parseDouble(args[3]));
return coordinate;
}
private ZonedDateTime parseToLocalDateTime(String timeStamp) {
// SEE Java 8 API Documentation on how to
// Parse your date into a proper date time format
/*
* Let as assignment for ops
* http://docs.oracle.com/javase/8/docs/api/java
* /time/format/DateTimeFormatter.html
* http://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html
*/
return null;
}
}
最后写一个方法来计算两个坐标之间的距离,我最后假设你有算法方便。您可以将以下内容放在主页中。
public static Double distanceBetween(Coordinate c1, Coordinate c2){
// This should be your starting point
return null; // replace null with the value
}
所有这一切都应该处理你的结构性物质的很大一部分。完整的程序应该进行错误检查,例如确保每行有4个格式正确的值。
以任何方式一次一个地测试每个方法。它将帮助您了解正在发生的事情。