【问题标题】:Google Maps marker shown in the wrong place谷歌地图标记显示在错误的地方
【发布时间】:2011-08-21 13:28:19
【问题描述】:

我想显示从 SQLite 数据库中检索到的一些点/坐标。奇怪的是,当我启动地图活动时,我的标记显示在一个陌生的地方,在海中,靠近加蓬和尼日利亚:http://imageshack.us/f/402/gabond.png/

我尝试手动将地图设置为以给定坐标为中心,但总是出现同样的问题。另一件事,我在启动活动时遇到了这个 logcat 错误:

08-21 13:19:59.326: ERROR/MapActivity(404): Couldn't get connection factory client

代码:

CoordBD CoordBd = new CoordBD(this);
        CoordBd.open();

        Coordo coordo = new Coordo(36.876673,10.325928);
        Coordo coordo2 = new Coordo(36.876982,10.326228);
        //CoordBd.open();
        CoordBd.insertCoordo(coordo);
        CoordBd.insertCoordo(coordo2);
        // CoordBd.close();

        maMap = (MapView)findViewById(R.id.myGmap);
        maMap.setBuiltInZoomControls(true);
        ItemizedOverlayPerso pinOverlay = new ItemizedOverlayPerso(getResources().getDrawable(R.drawable.marker));

        /*db = openOrCreateDatabase(
            "coord.bd"
            , SQLiteDatabase.CREATE_IF_NECESSARY
            , null
            );
        db.setVersion(1);
        db.setLocale(Locale.getDefault());
        db.setLockingEnabled(true);*/

        String[] result_columns = new String[] {COL_LATI, COL_LONGI};
        Cursor cur = db.query(true, TABLE_COORD, result_columns,
        null, null, null, null, null, null);
        cur.moveToFirst();
        while (cur.isAfterLast() == false) {
            int latitude = cur.getColumnIndex("latitude");
            int longitude = cur.getColumnIndex("longitude");
            point = new GeoPoint(microdegrees(latitude),microdegrees(longitude));
            pinOverlay.addPoint(point);
            cur.moveToNext();
        }
        cur.close();
        CoordBd.close();

        maMap.getOverlays().add(pinOverlay);
        monControler = maMap.getController();
        monControler.setZoom(12);
        monControler.setCenter(point);

        LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 500.0f, this);

问题的根源可能是什么? PS:我在手机上安装应用程序时遇到了同样的问题。 谢谢您的帮助。 编辑:Logcat:(用钩子答案修改后):

08-22 01:55:35.381: ERROR/AndroidRuntime(253): Uncaught handler: thread main exiting due to uncaught exception
08-22 01:55:35.402: ERROR/AndroidRuntime(253): java.lang.RuntimeException: Unable to start activity ComponentInfo{carburant.android.com/carburant.android.com.Geo}: java.lang.IllegalStateException: get field slot from row 0 col -1 failed
08-22 01:55:35.402: ERROR/AndroidRuntime(253):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
08-22 01:55:35.402: ERROR/AndroidRuntime(253):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
08-22 01:55:35.402: ERROR/AndroidRuntime(253):     at android.app.ActivityThread.access$2200(ActivityThread.java:119)
08-22 01:55:35.402: ERROR/AndroidRuntime(253):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
08-22 01:55:35.402: ERROR/AndroidRuntime(253):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-22 01:55:35.402: ERROR/AndroidRuntime(253):     at android.os.Looper.loop(Looper.java:123)
08-22 01:55:35.402: ERROR/AndroidRuntime(253):     at android.app.ActivityThread.main(ActivityThread.java:4363)
08-22 01:55:35.402: ERROR/AndroidRuntime(253):     at java.lang.reflect.Method.invokeNative(Native Method)
08-22 01:55:35.402: ERROR/AndroidRuntime(253):     at java.lang.reflect.Method.invoke(Method.java:521)
08-22 01:55:35.402: ERROR/AndroidRuntime(253):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
08-22 01:55:35.402: ERROR/AndroidRuntime(253):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
08-22 01:55:35.402: ERROR/AndroidRuntime(253):     at dalvik.system.NativeStart.main(Native Method)
08-22 01:55:35.402: ERROR/AndroidRuntime(253): Caused by: java.lang.IllegalStateException: get field slot from row 0 col -1 failed
08-22 01:55:35.402: ERROR/AndroidRuntime(253):     at android.database.CursorWindow.getDouble_native(Native Method)
08-22 01:55:35.402: ERROR/AndroidRuntime(253):     at android.database.CursorWindow.getDouble(CursorWindow.java:399)
08-22 01:55:35.402: ERROR/AndroidRuntime(253):     at android.database.AbstractWindowedCursor.getDouble(AbstractWindowedCursor.java:138)
08-22 01:55:35.402: ERROR/AndroidRuntime(253):     at carburant.android.com.Geo.onCreate(Geo.java:92)
08-22 01:55:35.402: ERROR/AndroidRuntime(253):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-22 01:55:35.402: ERROR/AndroidRuntime(253):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
08-22 01:55:35.402: ERROR/AndroidRuntime(253):     ... 11 more

EDIT: Added class creating the DB:

public class MaBaseSQLite extends SQLiteOpenHelper {
private static final String CREATE_BDD = "CREATE TABLE " + TABLE_COORD + " ("
    + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_LATI + " TEXT NOT NULL, "
    + COL_LONGI + " TEXT NOT NULL);";

    MaBaseSQLite(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //on créé la table à partir de la requête écrite dans la variable CREATE_BDD
        db.execSQL(CREATE_BDD);
    }

【问题讨论】:

  • 你得到那个点的原因是因为你的坐标被设置为 0,0,在提供的图片中,就是地球上的 0,0 点。我会看一下代码,看看是否能找到问题。

标签: android sqlite google-maps google-maps-markers


【解决方案1】:

在你的while循环中设置一个断点,你可能会注意到纬度和经度都是0,或者0和1。问题在于以下两行。您得到的是列索引,而不是实际值。您还需要将坐标存储为双精度而不是整数:

int latitude = cur.getColumnIndex("latitude");
int longitude = cur.getColumnIndex("longitude");

尝试将其设置为:

double latitude = cur.getDouble(cur.getColumnIndex("latitude"));
double longitude = cur.getDouble(cur.getColumnIndex("longitude"));

【讨论】:

  • 感谢您的回答。我现在正在使用此代码 sn-p 而不是旧代码,并且我正在获得 FC。请查看我编辑的帖子。
  • 那是什么错误? get field slot from row 0 col -1 failed
  • 堆栈跟踪中的错误是说您尝试访问的列名在游标中不可用。您需要发布表创建代码,以便我们可以看到您的列名,以及返回光标对象的代码。另外,尝试 getColumnIndexOrThrow(COLUMN_NAME) 以获得更好的错误消息。
  • 我现在正在使用 getColumnIndexOrThrow 并出现此 logcat 错误:08-22 02:08:27.192: ERROR/AndroidRuntime(289): Caused by: java.lang.IllegalArgumentException: column 'latitude' does not exist 。它不存在的原因:\。我将发布创建数据库的代码。
  • 添加的信息并没有提供太多。您需要在数据库中发布用于创建 TABLE_COORD 的代码(CREATE TABLE COORD.....),并提供 COL_LATI 和 COL_LONGI 的值。
猜你喜欢
  • 1970-01-01
  • 2013-07-22
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 2014-05-17
相关资源
最近更新 更多