谷歌地图Flutter插件google_maps_flutter或任何其他Flutter地图插件是否支持用于谷歌地图的kml文件?

4

我想在Flutter中加载KML文件到Google地图上。在谷歌_maps_flutter插件中找不到该功能。是否有其他插件可以在Flutter中实现这一功能?


KML 目前似乎还不受支持。请参阅以下问题:1 2 3 - evan
2个回答

0

--------注意:仅适用于安卓-------------

这个解决方案不适用于iOS,但是对于安卓有一个变通方法,你可以在这篇中等文章中看到解决方案。


0

已经过了一个月,所以你可能已经解决了这个问题,但希望如果你还没有解决,这可以帮助到你。

你可以在Flutter中运行本地代码,因此,如果你可以适应这种方法,它应该可以工作。你需要创建一个Method Channel来运行本地代码,类似于以下内容。

// Run java code for KML Campus Map Overlay
  Future<void> _showCampusMap() async {
    const platform = MethodChannel(**<YOUR METHOD CHANNEL>**);
    try {
      final campusMapOverlay = await platform.invokeMethod('downloadKmlLayer');
      print(campusMapOverlay);
    } on PlatformException catch (error) {
      print(error);
    }
  }

可以在下面的URL中找到KML图层代码。

https://github.com/googlemaps/android-maps-utils/commit/d606fcde40467abb5fae2ba78b8562a2cd1c517b

虽然我已经成功地让本地代码工作了,仅仅显示了一些文本,但我还没有弄清楚如何让 KML 代码工作。我认为问题在于 onPostExecute 方法中不知道 mMap 是什么,但很可能还有更多我不知道的问题。

    import java.io.Console;    
    import android.os.Bundle;
    import io.flutter.app.FlutterActivity;
    import io.flutter.plugins.GeneratedPluginRegistrant;
    import io.flutter.plugin.common.MethodCall;
    import io.flutter.plugin.common.MethodChannel;
    import io.flutter.plugin.common.MethodChannel.Result;
    import io.flutter.plugin.common.MethodChannel.MethodCallHandler;

    import org.xmlpull.v1.XmlPullParserException;
    import android.os.AsyncTask;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URL;


    public class MainActivity extends FlutterActivity {
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        GeneratedPluginRegistrant.registerWith(this);

        new MethodChannel(getFlutterView(), "**<YOUR METHOD CHANNEL>**").setMethodCallHandler(new MethodCallHandler() {
          @Override
          public void onMethodCall(MethodCall call, MethodChannel.Result result) {

            if (call.method.equals("retrieveFileFromUrl")) {
              String KMLLayer = retrieveFileFromUrl();
              result.success(KMLLayer);
            }

          }
        });
      }

      private void retrieveFileFromUrl() {
        new DownloadKmlFile("**<YOUR KML LAYER>**")
                .execute();
      }

      private class DownloadKmlFile extends AsyncTask<String, Void, byte[]> {
        private final String mUrl;

        public DownloadKmlFile(String url) {
          mUrl = url;
        }

        protected byte[] doInBackground(String... params) {

          try {
            InputStream is = new URL(mUrl).openStream();
            // Log.d(TAG, "doInBackground: " + mUrl.toString());
            ByteArrayOutputStream buffer = new ByteArrayOutputStream();
            int nRead;
            byte[] data = new byte[16384];
            while ((nRead = is.read(data, 0, data.length)) != -1) {
              buffer.write(data, 0, nRead);
            }
            buffer.flush();
            return buffer.toByteArray();
          } catch (IOException e) {
            e.printStackTrace();
          }
          return null;
        }

        protected void onPostExecute(byte[] byteArr) {
          try {
            KmlLayer kmlLayer = new KmlLayer(mMap, new ByteArrayInputStream(byteArr), getApplicationContext());
            kmlLayer.addLayerToMap();
            // moveCameraToKml(kmlLayer);
          } catch (XmlPullParserException e) {
            e.printStackTrace();
          } catch (IOException e) {
            e.printStackTrace();
          }
        }
      }
    }

您可以在这里查看更多细节。

https://medium.com/47billion/creating-a-bridge-in-flutter-between-dart-and-native-code-in-java-or-objectivec-5f80fd0cd713

我希望这能让你走上正确的道路。


谢谢。我还没有收到任何东西。但是我现在忙于其他事情,稍后会查看并回复您,让您知道它是否对我有帮助。再次感谢您的帮助。 - Code Runner
不客气。我也在做同样的事情,但是我现在有4个错误。如果我解决了问题,我会提供我的解决方案,除非你先解决了它。 - Andrew Stevenson
我还没有。我已经减少到3个错误,但是卡住了。这行代码包括一个变量mMap,它连接到JAVA中的GoogleMap,但我正在使用google_map_flutter包,我不知道如何链接它。我不确定是否需要包含所有JAVA地图代码并忽略flutter地图代码。KmlLayer kmlLayer = new KmlLayer(mMap, new ByteArrayInputStream(byteArr), getApplicationContext()); - Andrew Stevenson
有人为google_maps_flutter编写了自定义集成层,并正在等待分享代码的许可。你可以登录并提到你感兴趣,这可能值得一试。https://github.com/flutter/flutter/issues/33563 - Andrew Stevenson
是的,我已经把文件发给他了,但他正在等待确认,所以我不知道他什么时候会收到确认。所以我也在尝试编写自己的代码,但和你一样,我也不确定如何将该层连接到google_maps_flutter。 - Code Runner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接