Flutter-从坐标获取地理编码地址

时间:2019-09-16 01:31:33

标签: ios google-maps flutter dart geocoding

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

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

这就是我要获取的数据:

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<…>

7 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:3)

使用 pub.dev flutter_geocoding

https://pub.dev/packages/flutter_geocoding

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

我的示例代码

地理编码库java和自己快速添加

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}'.";
  }
}

答案 2 :(得分:2)

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

Use -f option to force add

尝试此解决方案-

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

答案 3 :(得分:1)

您已经在那里,您需要的其他东西是

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
  });
}

答案 4 :(得分:1)

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

答案 5 :(得分:1)

For Termux:
$am start -f 0x4000000 -n com.instagram.android/com.instagram.mainactivity.MainActivity --user 10071 -d "ig://direct_v2?id=XXXXXXXX&push_category=null&user_id=XXXXXXXX&calling_package=com.instagram.android&entry_point=push"

For ADB Shell:
$am start -f 0x4000000 -n com.instagram.android/com.instagram.mainactivity.MainActivity -d "ig://direct_v2?id=XXXXXXXX&x=XXXXXXXXXXX&push_category=null&user_id=XXXXXXXX&calling_package=com.instagram.android&entry_point=push"

答案 6 :(得分:0)

列出地标 = await GeocodingPlatform.instance .placemarkFromCoordinates(latitude, longitude);