【问题标题】:How to store polygon from google map to sqLite database如何将多边形从谷歌地图存储到 sqLite 数据库
【发布时间】:2020-03-26 07:27:36
【问题描述】:

我正在使用 android studio 上的谷歌地图,我在地图上绘制多边形。直到一切顺利,但现在我想将此多边形存储到 sqlite 数据库,然后将这些数据检索到 listView。现在我不明白如何在我的代码中实现这一点。如果有人对此有任何想法,请救救我。

这是我绘制多边形的代码:

     @Override
public void onMapReady(final GoogleMap googleMap) {
    final List<LatLng> latLngList = new ArrayList<>(); // list of polygons
    final List<Marker> markerList = new ArrayList<>();
    mMap = googleMap;


    LatLng center = new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude());
    final MarkerOptions markerOptions = new MarkerOptions().position(center).title(center.latitude + ":" + center.longitude);
    mMap.clear();
    googleMap.animateCamera(CameraUpdateFactory.newLatLng(center));
    googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(center, 18));
    googleMap.addMarker(markerOptions);

    mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {

        @Override
        public void onMapClick(final LatLng latLng) {
            int height = 50;
            int width = 30;
            BitmapDrawable bitmapdraw = (BitmapDrawable)getResources().getDrawable(R.mipmap.marker);
            Bitmap b = bitmapdraw.getBitmap();
            Bitmap smallMarker = Bitmap.createScaledBitmap(b, width, height, false);
            /*Marker marker = googleMap.addMarker(markerOptions);*/
            Marker marker = mMap.addMarker(new MarkerOptions().position(latLng).draggable(true).icon(BitmapDescriptorFactory.fromBitmap(smallMarker)));
            markerList.add(marker);
            latLngList.add(latLng);

            drawPolygon(latLngList);
            polygon.setClickable(true);
        }
    });

    mMap.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {
        @Override
        public void onMapLongClick(LatLng latLng) {
            polygon.remove();
            /*marker.remove();
            markerList.remove(marker);*/

        }
    });
}

private void drawPolygon(List<LatLng> latLngList) {

    if (polygon != null) {
        polygon.remove();
    }

    PolygonOptions polygonOptions = new PolygonOptions();
    polygonOptions.fillColor(0x7F228B22);
    polygonOptions.strokeColor(Color.GREEN);
    polygonOptions.strokeWidth(5);
    polygonOptions.addAll(latLngList);
    polygon = mMap.addPolygon(polygonOptions);
}

我的列表视图看起来像 [![this][1]][1]

【问题讨论】:

  • "将此多边形存储到 sqlite 数据库,然后将这些数据检索到 listView" 在 ListView 中如何显示?作为坐标列表?还是图形化为多边形?无论如何,您的代码中都有坐标。将这些存储到 SQLite。如果您不知道如何使用 SQLite,请查看文档和教程并尝试一下。
  • @MarkusKauppinen 我想以 kml 文件格式存储我的多边形,但我不知道该怎么做
  • 为什么要将其存储为 KML? kml 文件格式 是什么意思?如上一条评论中所述,您已经拥有制作多边形的所有坐标。为什么不直接存储它们?
  • KML 只是 XML,XML 只是文本,文本可以存储到 SQLite 中。所以最初的问题是 a) 将坐标写入符合 KML 规范的 String 和 b) 将 String 写入 SQLite。然后稍后将执行相反的步骤。您可能会找到一些用 Java 编写 XML 的指南/教程/库。并且使用 SQLite 应该有据可查。 (虽然 Google 的文档会推荐使用 Room。)Android 应该很好地支持 XML 解析(读取)。
  • @MarkusKauppinen 好的。那么哪种方法好,存储KML或将多边形坐标存储到sqlite。我想澄清的一件事是,我喜欢在我的列表视图中以图形方式显示多边形

标签: android google-maps android-sqlite polygon


【解决方案1】:

您可以保存所需的主要属性。例如......在我的情况下,我需要保存坐标 LatLng 和相机缩放。然后你可以像这样制作一个自定义类。

class CustomLatLng : Serializable{

    var latitudeList : MutableList<String> = mutableListOf()
    var longitudeList : MutableList<String> = mutableListOf()
    var cameraPositionLat : Double = 0.0
    var cameraPositionLng : Double = 0.0
    var zoomCamera : Float = 12f

    fun add(latitude : Double, longitude : Double ){
        latitudeList.add(latitude.toString())
        longitudeList.add(longitude.toString())
    }
    fun clearLatLng(){
        latitudeList.clear()
        longitudeList.clear()
    }

    fun isNotEmpty(): Boolean{
        return !(latitudeList.isEmpty() || longitudeList.isEmpty())
    }

}

// 在你代码的其他地方放这个...

const val PARA_NAME_POLYGONS = "polygons"
fun savePolygon(poligons:CustomLatLng ) {

    val editor = sharedPreferences.edit()
    editor.putString(PARA_NAME_POLYGONS, serializePolygon(poligons))
    editor.apply()
    //editor.commit()

}

fun cleanPolygon() {
    val editor = sharedPreferences.edit()
    editor.remove(PARA_NAME_POLYGONS)
    editor.apply()
}

private fun serializePolygon(polygon: CustomLatLng): String {

    val gson = Gson()
    return gson.toJson(polygon)

}

fun getPolygon():CustomLatLng {

    val gson = Gson()
    val json =   sharedPreferences.getString(PARA_NAME_POLYGONS,"").toString()

    if (json.isEmpty())
        return CustomLatLng()

    return gson.fromJson(json,CustomLatLng::class.java)
}

无论您有多边形,只保存重新创建多边形所需的数据

 val customLatLng = CustomLatLng()
polygon?.points?.forEach {
    customLatLng.add(it.latitude, it.longitude)
}

customLatLng.zoomCamera = 10f

savePolygon(customLatLng)

请注意,我只保存我需要的数据,您必须根据需要创建尽可能多的变量,希望对您有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 2016-10-22
    • 2012-10-10
    • 2016-08-10
    • 2014-03-24
    • 1970-01-01
    • 2012-07-01
    相关资源
    最近更新 更多