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

Posted

技术标签:

【中文标题】google_maps_flutter 或任何其他 Flutter 地图插件是不是支持谷歌地图的 kml 文件?【英文标题】:Does google_maps_flutter or any other map plugin for flutter supports kml file for google maps?google_maps_flutter 或任何其他 Flutter 地图插件是否支持谷歌地图的 kml 文件? 【发布时间】:2020-02-03 03:16:16 【问题描述】:

我想在谷歌地图上加载 kml 文件。我在 google _maps_flutter 插件上找不到它。有没有其他插件可以在flutter中做到这一点?

【问题讨论】:

KML 似乎还不支持。看到这些问题:123 【参考方案1】:

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

你可以在 Flutter 中运行原生代码,所以如果你能适应它,它应该可以工作。您将需要创建一个方法通道以使用类似这样的方式运行本机代码。

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

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

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

尽管我已经设法让本地代码工作,只是显示一些文本,但我还没有弄清楚如何让 KML 代码工作。我认为问题在于它不知道 mMap 是什么onPostExecute 方法,但很可能还有很多我不知道的。

    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

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

【讨论】:

谢谢。我还没有得到任何东西。但是我正忙于其他事情,所以我稍后会研究它并回复你,让你知道它是否对我有帮助。再次感谢您的帮助 不客气。我正在做同样的事情,但我有 4 个错误 atm。如果我到达那里,我会提供我的解决方案,除非你先到达那里。 我还没有。我遇到了 3 个错误,但我被卡住了。此行包含一个变量 mMap,它在 JAVA 中连接到 GoogleMap,但我使用的是 google_map_flutter 包,我不知道如何链接它。我不确定是否需要包含所有 JAVA 地图代码并关闭颤振地图代码。 KmlLayer kmlLayer = new KmlLayer(mMap, new ByteArrayInputStream(byteArr), getApplicationContext()); 有人为 google_maps_flutter 编写了一个自定义集成层,正在等待共享代码的权限。可能值得您登录并提及您感兴趣。 github.com/flutter/flutter/issues/33563 是的,我给他发了文件,但他正在等待确认,所以我不知道他什么时候会得到确认。因此,即使我也在尝试自己编写,但和你一样,我对如何将该层连接到 google_maps_flutter' 感到困惑

以上是关于google_maps_flutter 或任何其他 Flutter 地图插件是不是支持谷歌地图的 kml 文件?的主要内容,如果未能解决你的问题,请参考以下文章

谷歌地图使用 google_maps_flutter 插件显示空白地图

没有找到适用于模块“google_maps_flutter”的互联网解决方案

在 google_maps_flutter 中获取可见标记

在 GoogleMaps 实例中更改地图语言

Flutter iOS Map 样式未应用

如何为 google_maps_flutter 设置缩放级别