Проблема с переносом javascript-кода latvong-gridref подвижного типа на java

0

У меня возникли проблемы с переносом подвижного типа latlong-gridref с JavaScript на Java. Я сделал небольшой шаг вперед, но теперь застрял.

Проблемы, которые у меня возникают с портирующим кодом:

  1. Я немного потерял перенос функции OsGridRef (на самом деле это не может сделать головы или хвосты)
  2. Аналогичным образом не удается выяснить, как сортировать функцию LatLon из функции osGridToLatLong

Цель кода:

Чтобы преобразовать опорные координаты обхода боеприпасов к восточным/северным координатам (OSGB36) широта/долгота

Ссылка на оригинальный JavaScript:

http://www.movable-type.co.uk/scripts/latlong-gridref.html

Исходный код JavaScript и код, который мне удалось установить до сих пор, приведены ниже:

оригинал

/**
 * Creates a OsGridRef object
 *
 * @constructor
 * @param {Number} easting:  Easting in metres from OS false origin
 * @param {Number} northing: Northing in metres from OS false origin
 */
function OsGridRef(easting, northing) {
  this.easting = parseInt(easting, 10);
  this.northing = parseInt(northing, 10);
}


/**
 * Convert Ordnance Survey grid reference easting/northing coordinate to (OSGB36) latitude/longitude
 *
 * @param {OsGridRef} easting/northing to be converted to latitude/longitude
 * @return {LatLon} latitude/longitude (in OSGB36) of supplied grid reference
 */
OsGridRef.osGridToLatLong = function(gridref) {
  var E = gridref.easting;
  var N = gridref.northing;

  var a = 6377563.396, b = 6356256.909;              // Airy 1830 major & minor semi-axes
  var F0 = 0.9996012717;                             // NatGrid scale factor on central meridian
  var lat0 = 49*Math.PI/180, lon0 = -2*Math.PI/180;  // NatGrid true origin
  var N0 = -100000, E0 = 400000;                     // northing & easting of true origin, metres
  var e2 = 1 - (b*b)/(a*a);                          // eccentricity squared
  var n = (a-b)/(a+b), n2 = n*n, n3 = n*n*n;

  var lat=lat0, M=0;
  do {
    lat = (N-N0-M)/(a*F0) + lat;

    var Ma = (1 + n + (5/4)*n2 + (5/4)*n3) * (lat-lat0);
    var Mb = (3*n + 3*n*n + (21/8)*n3) * Math.sin(lat-lat0) * Math.cos(lat+lat0);
    var Mc = ((15/8)*n2 + (15/8)*n3) * Math.sin(2*(lat-lat0)) * Math.cos(2*(lat+lat0));
    var Md = (35/24)*n3 * Math.sin(3*(lat-lat0)) * Math.cos(3*(lat+lat0));
    M = b * F0 * (Ma - Mb + Mc - Md);                // meridional arc

  } while (N-N0-M >= 0.00001);  // ie until < 0.01mm

  var cosLat = Math.cos(lat), sinLat = Math.sin(lat);
  var nu = a*F0/Math.sqrt(1-e2*sinLat*sinLat);              // transverse radius of curvature
  var rho = a*F0*(1-e2)/Math.pow(1-e2*sinLat*sinLat, 1.5);  // meridional radius of curvature
  var eta2 = nu/rho-1;

  var tanLat = Math.tan(lat);
  var tan2lat = tanLat*tanLat, tan4lat = tan2lat*tan2lat, tan6lat = tan4lat*tan2lat;
  var secLat = 1/cosLat;
  var nu3 = nu*nu*nu, nu5 = nu3*nu*nu, nu7 = nu5*nu*nu;
  var VII = tanLat/(2*rho*nu);
  var VIII = tanLat/(24*rho*nu3)*(5+3*tan2lat+eta2-9*tan2lat*eta2);
  var IX = tanLat/(720*rho*nu5)*(61+90*tan2lat+45*tan4lat);
  var X = secLat/nu;
  var XI = secLat/(6*nu3)*(nu/rho+2*tan2lat);
  var XII = secLat/(120*nu5)*(5+28*tan2lat+24*tan4lat);
  var XIIA = secLat/(5040*nu7)*(61+662*tan2lat+1320*tan4lat+720*tan6lat);

  var dE = (E-E0), dE2 = dE*dE, dE3 = dE2*dE, dE4 = dE2*dE2, dE5 = dE3*dE2, dE6 = dE4*dE2, dE7 = dE5*dE2;
  lat = lat - VII*dE2 + VIII*dE4 - IX*dE6;
  var lon = lon0 + X*dE - XI*dE3 + XII*dE5 - XIIA*dE7;

  return new LatLon(lat.toDeg(), lon.toDeg());
}

Мне удалось порт

LatLon osGridToLatLong(OsGridRef osGridRef) {

        int E = osGridRef.easting;
          int N = osGridRef.northing;


          double a = 6377563.396, b = 6356256.910;              // Airy 1830 major & minor semi-axes
          double F0 = 0.9996012717;                             // NatGrid scale factor on central meridian
          double lat0 = 49*Math.PI/180, lon0 = -2*Math.PI/180;  // NatGrid true origin
          double N0 = -100000, E0 = 400000;                     // northing & easting of true origin, metres
          double e2 = 1 - (b*b)/(a*a);                          // eccentricity squared
          double n = (a-b)/(a+b), n2 = n*n, n3 = n*n*n;

          double lat=lat0, M=0;


          int count = 0;
          do {
              count++;
            lat = (N-N0-M)/(a*F0) + lat;
            double Ma = (1 + n + (5.0/4)*n2 + (5.0/4)*n3) * (lat-lat0);

            double Mb = (3*n + 3*n*n + (21/8)*n3) * Math.sin(lat-lat0) * Math.cos(lat+lat0);
            double Mc = ((15/8)*n2 + (15/8)*n3) * Math.sin(2*(lat-lat0)) * Math.cos(2*(lat+lat0));
            double Md = (35/24)*n3 * Math.sin(3*(lat-lat0)) * Math.cos(3*(lat+lat0));
            M = b * F0 * (Ma - Mb + Mc - Md);                // meridional arc


          } while (N-N0-M >= 0.00001);  // ie until < 0.01mm

          double cosLat = Math.cos(lat), sinLat = Math.sin(lat);
          double nu = a*F0/Math.sqrt(1-e2*sinLat*sinLat);              // transverse radius of curvature
          double rho = a*F0*(1-e2)/Math.pow(1-e2*sinLat*sinLat, 1.5);  // meridional radius of curvature
          double eta2 = nu/rho-1;

          double tanLat = Math.tan(lat);
          double tan2lat = tanLat*tanLat, tan4lat = tan2lat*tan2lat, tan6lat = tan4lat*tan2lat;
          double secLat = 1/cosLat;
          double nu3 = nu*nu*nu, nu5 = nu3*nu*nu, nu7 = nu5*nu*nu;
          double VII = tanLat/(2*rho*nu);
          double VIII = tanLat/(24*rho*nu3)*(5+3*tan2lat+eta2-9*tan2lat*eta2);
          double IX = tanLat/(720*rho*nu5)*(61+90*tan2lat+45*tan4lat);
          double X = secLat/nu;
          double XI = secLat/(6*nu3)*(nu/rho+2*tan2lat);
          double XII = secLat/(120*nu5)*(5+28*tan2lat+24*tan4lat);
          double XIIA = secLat/(5040*nu7)*(61+662*tan2lat+1320*tan4lat+720*tan6lat);

          double dE = (E-E0), dE2 = dE*dE, dE3 = dE2*dE, dE4 = dE2*dE2, dE5 = dE3*dE2, dE6 = dE4*dE2, dE7 = dE5*dE2;
          lat = lat - VII*dE2 + VIII*dE4 - IX*dE6;
          double lon = lon0 + X*dE - XI*dE3 + XII*dE5 - XIIA*dE7;

          return new LatLon(lat.toDeg(), lon.toDeg());
        }

1 ответ

0

Есть ли у вас опыт работы с Javascript? Просто глядя на то, что вы разместили, я могу сказать вам, что OsGridRef - это класс. Сделать это Java:

class OsGridRef {
  public int easting;
  public int northing;

  public OsGridRef (String easting, String northing) {
    this.easting = Interger.parseInt(easting);
    this.northing = Integer.parseInt(northing);
  }
}

Это будет работать с кодом, который у вас есть, даже если это не лучшая практика, но я не уверен, что рассказать вам обо всем остальном. toDeg(), вероятно, происходит из какой-либо используемой библиотеки, поэтому вам нужно будет выяснить, откуда это взялось, для того, чтобы ее перенести. Если бы я знал, что это было, прежде чем преобразовать его в градусы, я мог бы предложить некоторые рекомендации, но, глядя на него, я понятия не имею.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню