【问题标题】:AngularJS convert geo coordinates from Lambert 2 to WSG84AngularJS 将地理坐标从 Lambert 2 转换为 WSG84
【发布时间】:2016-04-14 11:08:48
【问题描述】:

现在我有了 Lambert 2 的地理坐标,就像这样

X:595833.007,
Y:2418927.985

为了在谷歌地图中显示这个地方,我需要WSG84的相关地理坐标,像这样

X:48.7687954,
Y:2.27984782

是否有包含此功能的 angularjs 库?提前致谢。

【问题讨论】:

    标签: javascript angularjs google-maps geolocation wgs84


    【解决方案1】:

    为了实现不同大地坐标系之间的坐标转换,我创建了这个 repo,angular-geo-converter。它很容易使用。

    添加angular-geo-convert.js的脚本依赖:

      <script src="angular-geo-converter.js"></script>
    

    在 Angular 应用程序的根模块中添加模块依赖:

      angular.module('app',['geoConverter'])
    

    在你的控制器中调用服务

      angular.module('app').controller('geoCtrl',['geoConverter',function(geoConverter){
        var coordinates = geoConverter.lambert2wgs(595833,2418928);
        var coordinateX = coordinates.latitude;    // result:48.7687954
        var coordinateY = coordinates.longitude;    // result:2.27984782
      }])
    

    PS: manzapanza 答案中的转换不正确。

    【讨论】:

      【解决方案2】:

      Here 我找到了将 Lambert 2 转换为 WSG84 坐标的算法。

      你应该创建一个服务:

      (function(){
        'user strict';
      
        function Lambert2ToWSG84() {
      
          var self = {};
      
          self.convert = function(x, y) {
      
            var newLongitude, newLatitude;
      
            var n = 0.77164219;
            var F = 1.81329763;
            var thetaFudge = 0.00014204;
            var e = 0.08199189;
            var a = 6378388;
            var xDiff = 149910;
            var yDiff = 5400150;
            var theta0 = 0.07604294;
      
            var xReal = xDiff - x;
            var yReal = yDiff - y;
      
            var rho = Math.sqrt(xReal * xReal + yReal * yReal);
            var theta = Math.atan(xReal / -yReal);
      
            newLongitude = (theta0 + (theta + thetaFudge) / n) * 180 / Math.PI;
            newLatitude = 0;
      
            for (var i = 0; i < 5 ; ++i) {
              newLatitude = (2 * Math.atan(Math.pow(F * a / rho, 1 / n) * Math.pow((1 + e * Math.sin(newLatitude)) / (1 - e * Math.sin(newLatitude)), e / 2))) - Math.PI / 2;
            }
      
            newLatitude *= 180 / Math.PI;
      
            return {
              lat: newLatitude, 
              lng: newLongitude
            };
      
          };
      
          return self;
      
        }
      
        angular
          .module('myModuleName')
          .factory('Lambert2ToWSG84', Lambert2ToWSG84);
      
      })();
      

      例如,在控制器中使用它:

        function MyCtrl(Lambert2ToWSG84) {
          var vm = this;
      
          vm.convert = function(x, y){
            return Lambert2ToWSG84.convert(x, y);
          };
      
        }
      
        MyCtrl.$inject = ['Lambert2ToWSG84'];
      
        angular
          .module('myModuleName')
          .controller('MyCtrl', MyCtrl);
      

      CHECK THE DEMO FIDDLE

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-11
        • 2020-08-24
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 2021-03-17
        • 1970-01-01
        相关资源
        最近更新 更多