2015-03-25 5 views
1

им пытаются вычислить расстояние между двумя точками GPS запаслись в CSV файл .....вычисления расстояния между двумя точками CSV GPS с использованием Java

здесь является частью моего кода ... проблема в latitude2 и долготе Я не понял, как реализовать их с правильной долготой и широтой любой помощи, пожалуйста!

   BufferedReader reader = new BufferedReader(new FileReader(file)); 
    try { 
     /* First line of the data file is the header */ 
     String line = reader.readLine(); 
     System.out.println("Header: " + line); 
     boolean foundAnyRowHigherThan5 = false; 
     for (line = reader.readLine(); line != null; line = reader.readLine()) { 
      if (line.trim().length() > 0) { // skip blank lines 

       String tokens[] = line.split("\\,"); 
       String name1 = tokens[0].trim(); 
       String name2 = tokens[1].trim(); 
       double latitude = Double.parseDouble(tokens[2]); 
       double longitude = Double.parseDouble(tokens[3]); 

       double latitude2 = latitude+?; // i dont know how to implement 
       double longitude2 = longitude+?; // i dont know how to implement them 
       String speedString = tokens[5].trim(); 
       double dist = Double.parseDouble(tokens[4]); 
       float speedFloat = Float.parseFloat(speedString); 

       if(foundAnyRowHigherThan5 || speedFloat > 5.0) { 
       // a partir de ce point on ajoutera touts les points , 
       if(!foundAnyRowHigherThan5) { 
        foundAnyRowHigherThan5 = true; 
       } 

       /* Longitude (= x coord) first ! */ 
       Point point = geometryFactory.createPoint(new Coordinate(longitude, latitude)); 

       featureBuilder.add(point); 

       double earthRadius = 6371; //kilometers 
       double dLat = Math.toRadians(latitude-latitude2); 
       double dLng = Math.toRadians(longitude-longitude2); 
       double a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
          Math.cos(Math.toRadians(latitude)) * Math.cos(Math.toRadians(latitude2)) * 
          Math.sin(dLng/2) * Math.sin(dLng/2); 
       double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
       dist = (double) (earthRadius * c); 


       featureBuilder.add(name1); 
       featureBuilder.add(name2); 

       featureBuilder.add(speedString); 
       featureBuilder.add(dist); 
       SimpleFeature feature = featureBuilder.buildFeature(null); 

       features.add(feature); 


       } 
      } 
     } 
    } finally { 
     reader.close(); 
    } 
+0

Вы сказали, что вы хотите сравнить две GPS точки, но у вас есть только один в вашем коде? Широта и долгота объединены в одну точку gps. –

+0

@Murat K благодарю вас за ответ ... в моем коде долгота и широта являются токенами из файлов csv более 2000 точек, но для вычисления расстояния у меня должна быть широта и широта нексста из следующей строки. не знаю, как его получить – reda

+0

Так что в основном ваша проблема в том, что у вас нет следующей строки. Как насчет того, что вы просто сохраняете текущую широту/долготу и читаете следующую строку и сравниваете ее? –

ответ

0

Существуют различные способы его решения, но я останусь в вашем фрагменте кода с этим.

boolean checker = true; 
double currentLongitude = 0; 
double currentLatitude = 0; 
    for (....) { 
       .... 
    if(checker){ 
      String currentTokens[] = line.split("\\,"); 
      String currentName1 = currentTokens[0].trim(); 
      String currentName2 = currentTokens[1].trim(); 
      currentLatitude = Double.parseDouble(currentTokens[2]); 
      currentLongitude = Double.parseDouble(currentTokens[3]); 
      checker = false; 
      continue; 
      } 


    String tokens[] = line.split("\\,"); 
    String name1 = tokens[0].trim(); 
    String name2 = tokens[1].trim(); 
    double latitude = Double.parseDouble(tokens[2]); 
    double longitude = Double.parseDouble(tokens[3]); 

    double latitude2 = currentLatitude - latitude; 
    double longitude2 = currentLongitude - longitude; 
    ..... 
    currentLatitude = latitude; 
    currentLongitude = longitude; 
} 
+0

от ur кода ниже currentLatitude не была проиндексирована ... Я пробовал то, что сделал uv, но ошибка msg s s показала, когда «currentLatitude не была инициализирована». – reda

+0

@reda попробуйте инициализировать с нулем –

+0

это dosent work dist дает большое число, например 3678 KM вот мой код – reda

0
    boolean foundAnyRowHigherThan5 = false; 
     boolean checker = true; 
     double currentLongitude = 0; 
     double currentLatitude = 0; 


     for (line = reader.readLine(); line != null; line = reader.readLine()) { 
      if (line.trim().length() > 0) { // skip blank lines 
       { 
        if(checker){ 
        String currentTokens[] = line.split("\\,"); 
        String currentName1 = currentTokens[0].trim(); 
        String currentName2 = currentTokens[1].trim(); 
        currentLatitude = Double.parseDouble(currentTokens[2]); 
        currentLongitude = Double.parseDouble(currentTokens[3]); 
        checker = false; 
        continue; 
        } 




       String tokens[] = line.split("\\,"); 
       String name1 = tokens[0].trim(); 
       String name2 = tokens[1].trim(); 
       double latitude = Double.parseDouble(tokens[2]); 
       double longitude = Double.parseDouble(tokens[3]); 


       String speedString = tokens[5].trim(); 
       double dist = Double.parseDouble(tokens[4]); 
       float speedFloat = Float.parseFloat(speedString); 



       if(foundAnyRowHigherThan5 || speedFloat > 5.0) { 
       // a partir de ce point on ajoutera touts les points , 
       if(!foundAnyRowHigherThan5) { 
        foundAnyRowHigherThan5 = true; 
       } 

       /* Longitude (= x coord) first ! */ 
       Point point = geometryFactory.createPoint(new Coordinate(longitude, latitude)); 

       featureBuilder.add(point); 

       double earthRadius = 6371; //kilometers 
       double latitude2 = latitude - currentLatitude; 
       double longitude2 = longitude - currentLongitude; 
       double dLat = Math.toRadians(latitude-latitude2); 
       double dLng = Math.toRadians(longitude-longitude2); 
       double a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
          Math.cos(Math.toRadians(latitude)) * Math.cos(Math.toRadians(latitude2)) * 
          Math.sin(dLng/2) * Math.sin(dLng/2); 
       double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
       dist = (double) (earthRadius * c); 


       featureBuilder.add(name1); 
       featureBuilder.add(name2); 

       featureBuilder.add(speedString); 
       featureBuilder.add(dist); 
       SimpleFeature feature = featureBuilder.buildFeature(null); 

       features.add(feature); 
       currentLatitude = latitude; 
       currentLongitude = longitude; 


       } 
      } 
     } 

     } 
    } 
     finally { 
     reader.close(); 
    } 
0

взяты из this link:

public void calc(File file) throws Exception { 

     BufferedReader reader = new BufferedReader(new FileReader(file)); 
      /* First line of the data file is the header */ 
      String line = reader.readLine(); 
      System.out.println("Header: " + line); 
      double[] oldCoordinates = parseCoordinates(reader.readLine()); 
      for (line = reader.readLine(); line != null; line = reader.readLine()) { 
        double[] newCoordinates = parseCoordinates(line); 
        System.out.println(distance(oldCoordinates[0],oldCoordinates[1],newCoordinates[0],newCoordinates[1],'K')); 
        oldCoordinates = newCoordinates; 
      } 

    } 


     private double[] parseCoordinates(String line){ 
      double[]result = new double[2]; 
      String tokens[] = line.split("\\,"); 
      result[0]=Double.parseDouble(tokens[2]); 
      result[1]=Double.parseDouble(tokens[3]); 
      return result; 
     } 

      private double distance(double lat1, double lon1, double lat2, double lon2, char unit) { 
       double theta = lon1 - lon2; 
       double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta)); 
       dist = Math.acos(dist); 
       dist = rad2deg(dist); 
       dist = dist * 60 * 1.1515; 
       if (unit == "K") { 
       dist = dist * 1.609344; 
       } else if (unit == "N") { 
       dist = dist * 0.8684; 
       } 
       return (dist); 
      } 

      /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ 
      /*:: This function converts decimal degrees to radians    :*/ 
      /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ 
      private double deg2rad(double deg) { 
       return (deg * Math.PI/180.0); 
      } 

      /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ 
      /*:: This function converts radians to decimal degrees    :*/ 
      /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ 
      private double rad2deg(double rad) { 
       return (rad * 180/Math.PI); 
      } 
+0

thats должен работать, если У меня есть lat/long, в моем случае координаты GPS являются токенами из csv-файлов и там более 2000 точек, если вы посмотрите на мой код ниже, вы поймете ... спасибо за сообщение – reda

+0

, почему вы не можете назвать это рекурсивно итерации через ваши строки CSV? Насколько я понимаю, вам нужно рассчитать расстояние между строками и строкой + 1. Этого хватит? – jirungaray

+0

да, это достаточно, и я надеюсь, что вы можете отправить мне часть кода ..... я буду благодарен !! – reda

Смежные вопросы