【问题标题】:Flutter - Get geocode address from coordinatesFlutter - 从坐标获取地理编码地址
【发布时间】:2020-01-16 20:28:31
【问题描述】:

我已经在我正在创建的应用程序中实现了获取用户经纬度坐标的可靠方法,但似乎无法将这些坐标转换为地标。

我还想弄清楚我需要用什么来打印这些数据。

这就是我想要获取这些数据的原因:

List<Placemark> place = [];

void _getPlace() async {
  List<Placemark> newPlace = await _geolocator.placemarkFromCoordinates(_position.latitude, _position.longitude);
  print(newPlace);
  setState(() {
    place = newPlace;
  });
}

谢谢

编辑:

在 CopsOnRoad 回复后,我收到此错误:

[VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: 

NoSuchMethodError: The method 'placemarkFromCoordinates' was called on null.
Receiver: null
Tried calling: placemarkFromCoordinates(51.4998, -0.129)
#0      Object.noSuchMethod  (dart:core-patch/object_patch.dart:50:5)
#1      _NearbyPageState._getPlace 
package:tr/pages/nearby.dart:128
<asynchronous suspension>
#2      _NearbyPageState._controlCard.<anonymous closure> 
package:tr/pages/nearby.dart:629
#3      GestureRecognizer.invokeCallback 
package:flutter/…/gestures/recognizer.dart:182
#4      TapGestureRecognizer._checkUp 
package:flutter/…/gestures/tap.dart:365
#5      TapGestureRecognizer.acceptGesture 
package:flutter/…/gestures/tap.dart:312
#6      GestureArenaManager.sweep 
package:flutter/…/gestures/arena.dart:156
#7      _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent 
package:flutter/…/gestures/binding.dart:222
#8      _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (p<…>

【问题讨论】:

  • 您是否在 info.plist 中添加了在 iPhone 上使用位置所需的权限?
  • 是的,我在 plist 中有权限
  • newPlace 打印什么?
  • 类似 ['Placemark' 的实例]

标签: flutter google-maps dart geocoding


【解决方案1】:

更新: 使用geocoding

import 'package:geocoding/geocoding.dart';

List<Placemark> placemarks = await placemarkFromCoordinates(52.2165157, 6.9437819);

旧解决方案:

你已经在那里了,你需要的额外的东西是:

String _address = ""; // create this variable

void _getPlace() async {
  List<Placemark> newPlace = await _geolocator.placemarkFromCoordinates(_position.latitude, _position.longitude);

  // this is all you need
  Placemark placeMark  = newPlace[0]; 
  String name = placeMark.name;
  String subLocality = placeMark.subLocality;
  String locality = placeMark.locality;
  String administrativeArea = placeMark.administrativeArea;
  String postalCode = placeMark.postalCode;
  String country = placeMark.country;
  String address = "${name}, ${subLocality}, ${locality}, ${administrativeArea} ${postalCode}, ${country}";
  
  print(address);

  setState(() {
    _address = address; // update _address
  });
}

【讨论】:

  • 另外,可能有某种方式可以打印这个我没有得到,但我怀疑你在_getPlace()上面有print(address)
  • 刚刚解决了我在flutter clean之后的问题
  • 如何处理 over_query_limit 异常?
  • 地理编码只支持英文?!我想要使​​用当地语言的地址结果。我该怎么做?
  • 有没有免费的服务使用地图地址到经纬度,经纬度来寻址和放置自动补全提供者?请建议。非常感谢。
【解决方案2】:

从 6.0.0 版开始,地标已从 geolocator 中删除,并移至 geocoding

从 6.0.0 版开始,地理编码功能(placemarkFromAddress 和 placemarkFromCoordinates)不再是地理定位器插件的一部分。我们已将这些功能移至他们自己的插件:地理编码。这个新插件是旧方法的改进版本。

使用地理编码将纬度和经度转换为地址

List<Placemark> placemarks = await placemarkFromCoordinates(52.2165157, 6.9437819);

【讨论】:

    【解决方案3】:

    使用 pub.dev flutter_geocoding

    https://pub.dev/packages/flutter_geocoding

    我使用了swift 'GMSGeocoder' 和 java 'android.location.Geocoder' 并将其应用到flutter。我认为它比pub.dev中的库Geocode更有效。

    我的示例代码

    geocode库java和swift自己添加

    java

     @Override
     public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
            GeneratedPluginRegistrant.registerWith(flutterEngine);
            super.configureFlutterEngine(flutterEngine);
    
            new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), "samples.flutter.dev/latlng")
                    .setMethodCallHandler(
                            (call, result) -> {
    
                                double lat = call.argument("lat");
                                double lng = call.argument("lng");
                                result.success("return value lat and lng");
    
                            }
                    );
        }
    

    迅速

    override func application(
            _ application: UIApplication,
            didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
        ) -> Bool {
            let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
            let batteryChannel = FlutterMethodChannel(name: "samples.flutter.dev/latlng",
                                                      binaryMessenger: controller.binaryMessenger)
            
            batteryChannel.setMethodCallHandler({
                [weak self] (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
                
                // Note: this method is invoked on the UI thread.
                guard call.method == "latlng" else {
                    result(FlutterMethodNotImplemented)
                    return
                }
                
                self?.latlng(call,result: result)
            })
            GMSServices.provideAPIKey("")
            GeneratedPluginRegistrant.register(with: self)
            return super.application(application, didFinishLaunchingWithOptions: launchOptions)
        }
    
    
        private func latlng(_ call: FlutterMethodCall,result:FlutterResult) {
            if let args = call.arguments as? Dictionary<String, Any>,
               let lat = args["lat"] as? Double ,let lng = args["lng"] as? Double  {
                result("return latlng result" )
              } else {
                result(FlutterError.init(code: "bad args", message: nil, details: nil))
              }
        }
    

    颤抖

    Future<void> _getBatteryLevel(double a, double b) async {
      String latlng;
      try {
        final String result = await const MethodChannel('samples.flutter.dev/latlng').invokeMethod(
            'latlng', <String, dynamic>{"lat": a, "lng": b});
        latlng = result;
      } on PlatformException catch (e) {
        latlng = "Failed to get latlng level: '${e.message}'.";
      }
    }
    

    【讨论】:

      【解决方案4】:

      首先,您在 pubspec.yaml 中包含 lib -geolocator: ^3.0.1

      ///Get current location
        Geolocator _geolocator = Geolocator();
        String latitude = "";
        String longitude = "";
        String address = "";
      

      试试这个解决方案 -

      ///Call this function
       _fetchLocation() async {
          Position position = await _geolocator.getCurrentPosition(
              desiredAccuracy: LocationAccuracy.best);///Here you have choose level of distance
          latitude = position.latitude.toString() ?? '';
          longitude = position.longitude.toString() ?? '';
          var placemarks = await _geolocator.placemarkFromCoordinates(position.latitude, position.longitude);
          address ='${placemarks.first.name.isNotEmpty ? placemarks.first.name + ', ' : ''}${placemarks.first.thoroughfare.isNotEmpty ? placemarks.first.thoroughfare + ', ' : ''}${placemarks.first.subLocality.isNotEmpty ? placemarks.first.subLocality+ ', ' : ''}${placemarks.first.locality.isNotEmpty ? placemarks.first.locality+ ', ' : ''}${placemarks.first.subAdministrativeArea.isNotEmpty ? placemarks.first.subAdministrativeArea + ', ' : ''}${placemarks.first.postalCode.isNotEmpty ? placemarks.first.postalCode + ', ' : ''}${placemarks.first.administrativeArea.isNotEmpty ? placemarks.first.administrativeArea : ''}';
          print("latitude"+latitude);
          print("longitude"+longitude);
          print("adreess"+address);
        }
      

      【讨论】:

        【解决方案5】:
         try {
            await Geolocator()
                .placemarkFromCoordinates(value[0], value[1])
                .then((result) {
              Placemark placeMark = result[0];
              String name = placeMark.name;
              String subLocality = placeMark.subLocality;
              String locality = placeMark.locality;
              String administrativeArea = placeMark.administrativeArea;
              String postalCode = placeMark.postalCode;
              String country = placeMark.country;
              String address =
                  "${name}, ${subLocality}, ${locality}, ${administrativeArea} ${postalCode}, ${country}";
              print(address);
              
            });
          } on PlatformException catch (e) {
            print(e);
          }
        

        【讨论】:

          【解决方案6】:

          使用Geolocator Plugin 新版本(从版本 6.0.0 开始)。地理编码功能(placemarkFromAddressplacemarkFromCoordinates)不再是地理定位器插件的一部分。此方法已将这些功能移动到自己的插件中:geocoding

          【讨论】:

            猜你喜欢
            • 2022-12-01
            • 1970-01-01
            • 2013-05-06
            • 2021-07-19
            • 2012-07-04
            • 1970-01-01
            • 2015-10-26
            • 1970-01-01
            • 2012-05-30
            相关资源
            最近更新 更多