GVKun编程网logo

在Maps API V2中导入KML(导入map包)

16

针对在MapsAPIV2中导入KML和导入map包这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展Android2.3和GoogleMapsAPIv2、AndroidGoogleMapsAP

针对在Maps API V2中导入KML导入map包这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展Android 2.3和Google Maps API v2、Android Google Maps API V2中心标记、Android Google Maps API v2的内存泄漏、Android Maps API v2 – 标记旋转的方法?等相关知识,希望可以帮助到你。

本文目录一览:

在Maps API V2中导入KML(导入map包)

在Maps API V2中导入KML(导入map包)

我在Google Earth中绘制了多个KML文件,其中包含不同的路线。现在,我正在尝试使用Maps API V2在我的android项目中显示这些内容。

是否存在现有的库,用于在您的android项目中导入KML文件并在地图中显示它们?我在不是库的堆栈溢出中找到了一些代码(如何使用kml文件在地图上绘制路径?)。

如果没有可用的库,我将从头开始构建它。

答案1

小编典典

现在,我只是假设没有公共图书馆为我们做这件事,因此在解析我的KML文件中的数据后,我将使用Google的代码向地图添加折线和多边形。如果找到库,将更新此答案。

创建折线和多边形:

// Instantiates a new Polyline object and adds points to define a rectanglePolylineOptions rectOptions = new PolylineOptions()        .add(new LatLng(37.35, -122.0))        .add(new LatLng(37.45, -122.0))  // North of the previous point, but at the same longitude        .add(new LatLng(37.45, -122.2))  // Same latitude, and 30km to the west        .add(new LatLng(37.35, -122.2))  // Same longitude, and 16km to the south        .add(new LatLng(37.35, -122.0)); // Closes the polyline.// Set the rectangle''s color to redrectOptions.color(Color.RED);// Get back the mutable PolylinePolyline polyline = myMap.addPolyline(rectOptions);

Android 2.3和Google Maps API v2

Android 2.3和Google Maps API v2

今天,我尝试使用适用于Android 2.3.3的Google Maps api v2我的步骤:

  • 从debug.keystore获得SHA1代码
  • 在Google API控制台中创建一个新项目
  • 注册一个新的ID
  • 启用了Google Maps android api v2
  • 使用输入SHA1创建一个Android密钥; it.mappe(it.mappe是我的包)
  • 获取API密钥
  • 更新AndroidManifest文件:
        <permission android:name="it.mappe.permission.MAPS_RECEIVE" android:protectionLevel="signature" />

    <uses-permission android:name="it.mappe.permission.MAPS_RECEIVE" />
    <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="16" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>

    <uses-feature android:glEsVersion="0x00020000" android:required="true"` />

    <application     android:allowBackup="true"    android:icon="@drawable/ic_launcher"  android:label="@string/app_name"  android:theme="@style/AppTheme" >
        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="MY_KEY" />

            <activity
                android:name="it.mappe.MainActivity"
                android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
  • 我的主要活动
        public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }   
  • 我的activity_main:

    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
    
  • 将目录复制ANDROID_SDK_DIR/extras/google/google_play_services/libproject/google-play-services_lib到项目的根目录

  • 添加/extras/android/compatibility/v4/android-support-v4.jar为外部罐

  • 将下一行添加到 YOUR_PROJECT/project.properties android.library.reference.1=google-play-services_lib

当我在三星银河S上运行它(使用Google Play服务apk)时,它崩溃并且logcat显示此错误

    E/AndroidRuntime(6435): FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo{it.mappe/it.mappe.MainActivity}: 

    android.view.InflateException: Binary XML file line #2: Error inflating class fragment
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
        at android.app.ActivityThread.access$1500(ActivityThread.java:117)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:123)
        at android.app.ActivityThread.main(ActivityThread.java:3687)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:507)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
        at dalvik.system.NativeStart.main(Native Method)
     Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class fragment
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:581)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:386)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
        at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:209)
        at android.app.Activity.setContentView(Activity.java:1657)
        at it.mappe.MainActivity.onCreate(MainActivity.java:12)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
        ... 11 more
     Caused by: java.lang.ClassNotFoundException: android.view.fragment in loader dalvik.system.PathClassLoader[/data/app/it.mappe-2.apk]
        at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
        at android.view.LayoutInflater.createView(LayoutInflater.java:471)
        at android.view.LayoutInflater.onCreateView(LayoutInflater.java:549)
        at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:66)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568)
        ... 19 more

一些建议?

编辑

这是我的main.xml:

    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

Android Google Maps API V2中心标记

Android Google Maps API V2中心标记

有没有一种方法可以使地图尽可能放大,但同时将所有标记保留在屏幕上。我有六个标记形状不一致的标记。我当时只是想把他们的中心放在地图上,但是我仍然不知道我可以通过编程方式放大地图多远。

每次创建地图时,这些标记都会更改位置。理想情况下,我将使用一个脚本来放大地图,以便将所有视图都包含在视图中。

这样你就明白了。我一次从json创建一个标记,并在循环中添加以下行。

mMap.addMarker(new MarkerOptions().position(new LatLng(lat,lng)).title(c.getString("title")));

答案1

小编典典

您应该使用CameraUpdate类来(可能)进行所有程序化地图移动。

为此,首先像这样计算所有标记的边界:

LatLngBounds.Builder builder = new LatLngBounds.Builder();for each (Marker m : markers) {    builder.include(m.getPosition());}LatLngBounds bounds = builder.build();

然后通过使用工厂获取运动描述对象:CameraUpdateFactory:

int padding = 0; // offset from edges of the map in pixelsCameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);

最后移动地图:

googleMap.moveCamera(cu);

或者,如果您想要动画:

googleMap.animateCamera(cu);

Android Google Maps API v2的内存泄漏

Android Google Maps API v2的内存泄漏

我在Google Maps Android API v2上遇到内存泄漏问题.在以下情况下,每当我的视图再次变为可见时,堆使用量将增加约85KB:

>手机屏幕关闭(例如,按电源按钮后).
>用户按“主页”按钮退出应用程序.

该应用最终因OutOfMemory异常而崩溃.屏幕旋转或通过“返回”按钮退出时不会发生泄漏.关于变通办法或此问题背后的原因有任何想法吗?

我的代码:

public class LeakActivity extends FragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_leak);
    }
}

和XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myLayout"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<fragment
    android:id="@+id/map_1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

</RelativeLayout>

解决方法:

这可能与Maps API中的未解决问题有关:

Issue 4766 – Bug: Android Maps API v2 leaks huge amounts of memory

使用DDMS的“转储HPROF”工具转储hprof文件,使用hprof-conv对其进行转换,然后使用MAT检查泄漏.如果它在Google Maps API中,请在未解决的问题上发布apk(或更简单的测试代码)并包含hprof文件.

如果与我遇到的错误相同,则可能仅在Android 2.x上发生,请也进行检查.

Android Maps API v2 – 标记旋转的方法?

Android Maps API v2 – 标记旋转的方法?

我们正在将应用程序从v1 Maps API移植到v2 API,并且无法使用标记.

我们需要指向特定地理方向的标记.在V1中,我们可以在绘制时建立指向正确方向的位图,但在V2中,无法更改标记位图.

我不确定最好的方法是在地图旋转时(这听起来像是一个性能问题)破坏并重新构建我们所有的标记,或者尝试自己绘制它们.这可能是通过TileOverlay或我们自己的视图,我们坐在地图上.

我真的不喜欢这些方法.有没有人试过它们?

更新:

我已经尝试通过我们自己的视图绘图,但是当拖动地图时,这太过于迟钝了.

我现在正在摧毁&重新创建标记,但这是(正如预期的)性能问题,需要〜2000mS来更新60个标记.

解决方法

大家好消息! Google已将轮换添加到Maps API,因此我们不必再推出自己的实现了.

他们还添加了平面标记,我猜这与原始问题更相关.展平标记始终保持最初在地图上绘制的方向:https://developers.google.com/maps/documentation/android/marker#flatten_a_marker

唯一的要求是您引用最新版本的Google Play服务.

今天关于在Maps API V2中导入KML导入map包的分享就到这里,希望大家有所收获,若想了解更多关于Android 2.3和Google Maps API v2、Android Google Maps API V2中心标记、Android Google Maps API v2的内存泄漏、Android Maps API v2 – 标记旋转的方法?等相关知识,可以在本站进行查询。

本文标签: