2013-12-15 2 views
0

У меня есть небольшая проблема с проекцией Меркатора, я получаю значение нан при попытке проекции на широте ...Сегмент пересечения: проекция Меркатора получать значение нан

Мой codederived от этого вопроса: ConvertLATLONGTOXY

private static List<Point2D.Double> LatLongConvertionToXY(List<GeoPoint> coordinates) { 
     List<Point2D.Double> xys = new ArrayList<Point2D.Double>(); 

     /*MercatorProjection projection = new MercatorProjection();*/ 
     Log.i("LATLONG2RAD", "Nouvelle conversion"); 
     for (GeoPoint coordinate : coordinates) { 
      double latitude = Double.valueOf(coordinate.getLatitudeE6()); 
      double longitude = Double.valueOf(coordinate.getLongitudeE6()); 

      // convert to radian 
      latitude = latitude * Math.PI/180; 
      longitude = longitude * Math.PI/180; 
      Log.i("LATLONG2RAD", String.valueOf(latitude)+" : "+String.valueOf(longitude)); 
      /*Point2D.Double d = projection.project(longitude,latitude, 
        new Point2D.Double());*/ 
      Point2D.Double d=new Point2D.Double(); 
      double QUARTERPI = Math.PI/4.0; 
      d.x = longitude; 
      d.y = Math.log(Math.tan(QUARTERPI + 0.5 * latitude)); 
      Log.i("PointLATLONG YX", String.valueOf(d.y)+" : "+String.valueOf(d.x)); 
      xys.add(d); 
     } 

     return xys; 
    } 

Этот пример возвращаемого значения: 12-15 21: 42: 27,165 I/LATLONG2RAD (32629): нувель преобразования

12-15 21: 42: 27,165 I/LATLONG2RAD (32629): LAT 782581,6732236275: L ОНГ -10478,398323613315

12-15 21: 42: 27,165 I/LATLONG2RAD (32629): LAT 782581,6732236275: LONG -10478,398323613315

12-15 21: 42: 27,165 I/LATLONG2RAD (32629): LAT 782587,2931838189: LONG -10476,478461436123

12-15 21: 42: 27,165 I/LATLONG2RAD (32629): LAT +782571,9517396939: LONG -10476.478461436123

Возвращаемые значения для проекции:

12-15 21:42 : 27,165: I/PointLATLONG YX (32629): NaN: -10478,3 98323613315

12-15 21: 42: 27,165 I/PointLATLONG YX (32629): NaN: -10478,398323613315

12-15 21: 42: 27,165 I/PointLATLONG YX (32629): NaN: - 10476,478461436123

12-15 21: 42: 27,165: I/PointLATLONG YX (32629): 1,7354151627839085: -10476,478461436123

+0

Math.log() со значением меньше 0 вернет NaN – JRowan

+0

thx Я думаю, что этот алгоритм мне не поможет, я использую класс проекции меркатора из библиотеки Java-карты, и это тоже значение возврата, я немного потерял, вы можете посмотреть это в этом вышеприведенном коде в комментарии. Есть идеи ? – WhatsUp

+0

, что вы не используете его, как он использует его в этом сообщении, у него есть другие вещи, например: // Причина, по которой нам нужно определить значения min X и Y, заключается в том, что для того, чтобы нарисовать карту, // нам нужно компенсировать позицию так что не будет отрицательных значений X и Y minXY.x = (minXY.x == -1)? xy.x: Math.min (minXY.x, xy.x); minXY.y = (minXY.y == -1)? xy.y: Math.min (minXY.y, xy.y); чтобы проверить, вы должны вернуться и перечитать код, который он использует. – JRowan

ответ

0

Наконец, JRowan она с хорошо я повторно прочитать код, и я повторить попытку с Java Map библиотеки с проектор меркатора, и я нахожу свою проблему первой на нано-значение с геометром osm. Мои значения находятся в микроопределениях не в двойном:

Мой новый код:

private static List<Point2D.Double> LatLongConvertionToXY(List<GeoPoint> coordinates) { 
     List<Point2D.Double> xys = new ArrayList<Point2D.Double>(); 

     MercatorProjection projection = new MercatorProjection(); 
     Log.i("LATLONG2RAD", "New"); 
     for (GeoPoint coordinate : coordinates) { 
      double latitude = Double.valueOf(coordinate.getLatitudeE6()); 
      double longitude = Double.valueOf(coordinate.getLongitudeE6()); 

      //to decimal 
      latitude=latitude/1E6; 
      longitude=longitude/1E6; 
      Log.i("LATLONG2RAD", "BEFORE RADIAN "+String.valueOf(latitude)+" : "+String.valueOf(longitude)); 
      //convert to radian 
      latitude = latitude * Math.PI/180; 
      longitude = longitude * Math.PI/180; 
      //Log.i("LATLONG2RAD", String.valueOf(latitude)+" : "+String.valueOf(longitude)); 
      Point2D.Double d = projection.project(longitude,latitude, 
        new Point2D.Double()); 

      Log.i("LATLONG2RAD"," Y X "+ String.valueOf(d.y)+" : "+String.valueOf(d.x)); 
      xys.add(d); 
     } 

     return xys; 
    } 

Проекция вроде бы хорошо:

12-15 22: 41: 40,257: I/LATLONG2RAD (1138): YX 0.8505407464143129: 0.11730010582132741

12 -15 22: 41: 40,267 I/LATLONG2RAD (1138): YX 0,8506068875926396: 0,11715522604011937

12-15 22: 41: 40,267 I/LATLONG2RAD (1138): YX 0,8505923208133851: 0,1172139738227415

12-15 22: 41: 40,267: I/LATLONG2RAD (1138): YX +0,8505727537288554: 0,1172139738227415

Но теперь другой РЬ с вычислительными пересечения:

public static GeoPoint intersectionV1bis(List<GeoPoint> mGeoPoints) { 
     if (mGeoPoints.size() == 0 || mGeoPoints.size() > 4) 
      return null; 
     List<Point2D.Double> coordinates = LatLongConvertionToXY(mGeoPoints); 
     double x1 = coordinates.get(0).x; 
     double y1 = coordinates.get(0).y; 
     double x2 = coordinates.get(1).x; 
     double y2 = coordinates.get(1).y; 
     double x3 = coordinates.get(2).x; 
     double y3 = coordinates.get(2).y; 
     double x4 = coordinates.get(3).x; 
     double y4 = coordinates.get(3).y; 
     double d = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4); 
     if (d == 0){ 
      Log.i("INTERSECT V1","Segments parallels"); 
      return null; 
     } 

     double xi = ((x3 - x4) * (x1 * y2 - y1 * x2) - (x1 - x2) 
       * (x3 * y4 - y3 * x4)) 
       /d; 
     double yi = ((y3 - y4) * (x1 * y2 - y1 * x2) - (y1 - y2) 
       * (x3 * y4 - y3 * x4)) 
       /d; 



     GeoPoint p = new GeoPoint(xi, yi); 
     Log.i("INTERSECT","xi long"+String.valueOf(xi)+" : yi lat"+String.valueOf(yi)); 
     if (xi < Math.min(x1, x2) || xi > Math.max(x1, x2)){ 
      Log.i("INTERSECT V1","Not in segment 1"); 
      return null; 
     } 

     if (xi < Math.min(x3, x4) || xi > Math.max(x3, x4)){ 
      Log.i("INTERSECT V1","Not in segment 2"); 
      return null; 
     } 
     Log.i("INTERSECT","Intersection"); 
     return p; 
    } 

12-15 22 : 41: 40.267: I/INTERSECT (1138): xi long0.11721397382272966: yi lat0.8505800677870533

На карте открытых улиц пересекаются сегменты линий, но код говорит «нет», я не понимаю, почему.Точка A и B - мое последнее и новое местоположение, а C и D - 2 точки слева и справа от точки E (задайте нажатием кнопки на первом пересечении с подшипником +90 и -90 текущего местоположения), что между а и В.

Я использую эмулятор, чтобы иметь SAMES местоположений все время, но когда я пытаюсь вычислить E на 2 пересечении между а и в и betweeen C и D, E, не на сегмент с и D

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