Android 利用OSMdroid开发GIS 添加点、线、面和标记点

server/2024/10/9 13:32:08/

部署看这个:Android 利用OSMdroid开发GIS-CSDN博客

直接上代码

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><org.osmdroid.views.MapViewandroid:id="@+id/mapView"android:layout_width="match_parent"android:layout_height="match_parent"/><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="10dp"android:layout_alignParentTop="true"android:orientation="vertical"><Buttonandroid:id="@+id/btnMarker"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="标记点" /><Buttonandroid:id="@+id/btnLine"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="线" /><Buttonandroid:id="@+id/btnPolygon"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="面" /><Buttonandroid:id="@+id/btnWord"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="文字" /></LinearLayout></RelativeLayout>

MainActivity.java:

package com.chy.osmdroid;import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.text.TextPaint;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import com.chy.custom.TextOverlay;
import com.chy.layers.LayerTileSources;
import com.chy.permission.PermissionUtils;
import org.osmdroid.api.IMapController;
import org.osmdroid.tileprovider.MapTileProviderBasic;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.CustomZoomButtonsController;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.Marker;
import org.osmdroid.views.overlay.Overlay;
import org.osmdroid.views.overlay.OverlayManager;
import org.osmdroid.views.overlay.Polygon;
import org.osmdroid.views.overlay.Polyline;
import org.osmdroid.views.overlay.TilesOverlay;
import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {private static final int REQUEST_PERMISSION_CODE = 0;// 权限所用// 动态申请权限private String[] permissions = {Manifest.permission.INTERNET,// 网络权限Manifest.permission.ACCESS_COARSE_LOCATION,// 精细定位Manifest.permission.ACCESS_FINE_LOCATION,// 粗定位Manifest.permission.ACCESS_WIFI_STATE,// 定位权限Manifest.permission.ACCESS_NETWORK_STATE,Manifest.permission.WRITE_EXTERNAL_STORAGE};private MapView mapView;private Button btnMarker;// 标记点private Button lineBtn;// 线private Button polygonBtn;// 面private Button wordBtn;// 文字@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);getPermission();// 获取权限initControls();}/*** 权限* */private void getPermission(){if (PermissionUtils.hasPermissions(MainActivity.this, permissions)) {initMap();// 调用初始化地图} else {PermissionUtils.requestPermissions(MainActivity.this, REQUEST_PERMISSION_CODE, permissions);Toast.makeText(getApplicationContext(), "地图加载失败!", Toast.LENGTH_SHORT).show();}}// 地图初始化private void initMap(){// 获取mapView实例mapView = findViewById(R.id.mapView);mapView.setUseDataConnection(true);// 加载在线地图-高德地图//mapView.setTileSource(LayerTileSources.AutoNaviVector);// 加载天地图电子图mapView.setTileSource(LayerTileSources.TDTVEC_W);// 加载天地图标注图TilesOverlay tilesOverlay = new TilesOverlay(new MapTileProviderBasic(this,LayerTileSources.TDTCIA_W),this);mapView.getOverlayManager().add(tilesOverlay);// 设置最小缩放比例mapView.setMinZoomLevel(3.0);// 设置最大缩放比例mapView.setMaxZoomLevel(18.0);// 让瓦片适应不同像素密度:默认地图显示的字体小,图片像素高,可设置以下代码,使地图适应不同像素密度,更美观//mapView.setTilesScaledToDpi(true);IMapController mapController = mapView.getController();// 设置地图初始级别mapController.setZoom(11.0);// 设置初始中心点GeoPoint centerPoint = new GeoPoint(43.90, 125.33);mapController.setCenter(centerPoint);//启用缩放及滑动手势//mapView.setBuiltInZoomControls(true);// 废弃得方法,被下面方法所替代mapView.getZoomController().setVisibility(CustomZoomButtonsController.Visibility.NEVER);mapView.setMultiTouchControls(true);mapView.getOverlayManager().getTilesOverlay().setEnabled(true);mapView.setSelected(true);}// 控件初始化private void initControls(){// 绘制点btnMarker = findViewById(R.id.btnMarker);btnMarker.setOnClickListener(markerClick);// 绘制线lineBtn = findViewById(R.id.btnLine);lineBtn.setOnClickListener(lineClick);// 绘制面polygonBtn = findViewById(R.id.btnPolygon);polygonBtn.setOnClickListener(polygonClick);// 绘制文字wordBtn = findViewById(R.id.btnWord);wordBtn.setOnClickListener(wordClick);}/*** 绘制标记点方法* */View.OnClickListener markerClick = new View.OnClickListener() {@Overridepublic void onClick(View v) {Marker marker = new Marker(mapView);GeoPoint point = new GeoPoint(43.90, 125.33);marker.setPosition(point);marker.setAnchor(Marker.ANCHOR_CENTER,Marker.ANCHOR_CENTER);// 设置图片marker.setIcon(getResources().getDrawable(R.mipmap.ic_launcher));marker.setTitle("测试点");/*** 添加标记到地图上* @param index 0控制标记点的在所有图层最下面;1控制标记点在所有图层最上面* */// 清除index为1的图层(绘制图层都在index为1中)OverlayManager overlayManager = mapView.getOverlayManager();if (overlayManager.size() > 1){mapView.getOverlayManager().remove(1);}// 添加标记点mapView.getOverlays().add(1,marker);// 刷新mapView.invalidate();}};/*** 绘制线方法* */View.OnClickListener lineClick = new View.OnClickListener() {@Overridepublic void onClick(View v) {// 点集合List<GeoPoint> pointList = new ArrayList<GeoPoint>();pointList.add(new GeoPoint(43.90, 125.33));pointList.add(new GeoPoint(43.80, 125.23));pointList.add(new GeoPoint(43.70, 125.13));// 创建线实例Polyline polyline = new Polyline(mapView);// 设置点击图形,不弹出视图弹窗polyline.setInfoWindow(null);// 设置线颜色polyline.getOutlinePaint().setColor(Color.RED);// 设置线宽度polyline.getOutlinePaint().setStrokeWidth(20);// 赋值polyline.setPoints(pointList);/*** 添加线到地图上* @param index 0控制标记点的在所有图层最下面;1控制标记点在所有图层最上面* */// 清除index为1的图层(绘制图层都在index为1中)OverlayManager overlayManager = mapView.getOverlayManager();if (overlayManager.size() > 1){mapView.getOverlayManager().remove(1);}// 添加线mapView.getOverlayManager().add(1,polyline);// 刷新mapView.invalidate();}};/*** 绘制面方法* */View.OnClickListener polygonClick = new View.OnClickListener() {@Overridepublic void onClick(View v) {// 点集合List<GeoPoint> pointList = new ArrayList<GeoPoint>();pointList.add(new GeoPoint(43.90, 125.33));pointList.add(new GeoPoint(43.80, 125.23));pointList.add(new GeoPoint(43.95, 125.53));// 创建线实例Polygon polygon = new Polygon(mapView);// 设置点击图形,不弹出视图弹窗polygon.setInfoWindow(null);// 设置线颜色polygon.getOutlinePaint().setColor(Color.GREEN);// 设置线宽度polygon.getOutlinePaint().setStrokeWidth(20);// 赋值polygon.setPoints(pointList);/*** 添加线到地图上* @param index 0控制标记点的在所有图层最下面;1控制标记点在所有图层最上面* */// 清除index为1的图层(绘制图层都在index为1中)OverlayManager overlayManager = mapView.getOverlayManager();if (overlayManager.size() > 1){mapView.getOverlayManager().remove(1);}// 添加面mapView.getOverlayManager().add(1,polygon);// 刷新mapView.invalidate();}};/*** 绘制文字方法* */View.OnClickListener wordClick = new View.OnClickListener() {@Overridepublic void onClick(View v) {// 清除index为1的图层(绘制图层都在index为1中)OverlayManager overlayManager = mapView.getOverlayManager();if (overlayManager.size() > 1){mapView.getOverlayManager().remove(1);}GeoPoint wordPoint = new GeoPoint(43.95, 125.35);TextOverlay textOverlay = new TextOverlay(mapView);textOverlay.setPosition(wordPoint);// 设置文字textOverlay.setText("111111");// 设置文字颜色textOverlay.setWordColor(Color.RED);// 设置字体大小textOverlay.setTextSize(25);}};@Overrideprotected void onDestroy() {super.onDestroy();}
}

自定义类TextOverlay.java:

package com.chy.custom;import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.Overlay;/*** OSMdroid - 自定义文字Overlay* */
public class TextOverlay extends Overlay {private MapView mapView;private GeoPoint geoPoint;private String text;private Paint textPaint;/*** 构造函数* */public TextOverlay(MapView _mapView){super();this.mapView = _mapView;// 设置文本画笔样式textPaint = new Paint();textPaint.setColor(Color.BLACK);textPaint.setTextSize(30);textPaint.setTextAlign(Paint.Align.CENTER);// 将覆盖物添加到地图上mapView.getOverlays().add(1,this);// 刷新mapView.invalidate();}public TextOverlay(MapView _mapView,GeoPoint _geoPoint,String _text){super();this.mapView = _mapView;this.geoPoint = _geoPoint;this.text = _text;// 设置文本画笔样式textPaint = new Paint();textPaint.setColor(Color.BLACK);textPaint.setTextSize(30);textPaint.setTextAlign(Paint.Align.CENTER);// 将覆盖物添加到地图上mapView.getOverlays().add(1,this);// 刷新mapView.invalidate();}/*** 设置文字* */public void  setText(String text){this.text = text;}/*** 设置文字位置* */public void setPosition(GeoPoint geoPoint){this.geoPoint = geoPoint;}/*** 设置文字颜色* */public void setWordColor(int color){this.textPaint.setColor(color);}public void setWordARGB(int a, int r, int g, int b){this.textPaint.setARGB(a,r,g,b);}/*** 设置文字大小* */public void setTextSize(float textSize){textPaint.setTextSize(textSize);}/*** 设置文字位置* */public void setTextAlign(Paint.Align align){this.textPaint.setTextAlign(align);}@Overridepublic void draw(Canvas canvas, MapView mapView, boolean shadow) {// 绘制文本标签//shadow 参数表示是否在绘制阴影层。在 OpenStreetMap (OSM) 中,阴影层通常用于在地图上显示阴影效果,例如地图上的建筑物或地形。通常情况下,我们只在 shadow 参数为 false 时绘制覆盖物,以避免在阴影层上绘制两次相同的内容。if (!shadow) {// 将地理坐标转换为屏幕坐标android.graphics.Point screenPoint = mapView.getProjection().toPixels(geoPoint, null);// 在屏幕上绘制文本标签canvas.drawText(text, screenPoint.x, screenPoint.y, textPaint);}}
}


http://www.ppmy.cn/server/126138.html

相关文章

HBase 性能优化的高频面试题及答案

目录 高频面试题及答案1. 如何通过数据建模优化 HBase 性能?2. 如何优化 HBase 的写入性能?3. 如何通过压缩优化 HBase 的存储性能?4. 如何通过调整 RegionServer 配置优化性能?5. 如何优化 HBase 的读取性能?6. 如何通过使用 HBase 的版本控制优化性能?7. 如何通过使用合…

ping基本使用详解

在网络中ping是一个十分强大的TCP/IP工具。它的作用主要为&#xff1a; 用来检测网络的连通情况和分析网络速度根据域名得到服务器 IP根据 ping 返回的 TTL 值来判断对方所使用的操作系统及数据包经过路由器数量。我们通常会用它来直接 ping ip 地址&#xff0c;来测试网络的连…

【分布式微服务云原生】 RPC协议:超越HTTP的远程通信艺术

RPC协议&#xff1a;超越HTTP的远程通信艺术 摘要 RPC&#xff08;远程过程调用&#xff09;协议是分布式系统中实现远程调用的关键技术。本文将探讨RPC协议是否必须依赖HTTP协议来完成远程通信&#xff0c;并介绍几种常见的RPC实现方式。通过本文&#xff0c;你将了解RPC的核…

js逆向——webpack实战案例(一)

今日受害者网站&#xff1a;https://www.iciba.com/translate?typetext 首先通过跟栈的方法找到加密位置 我们跟进u函数&#xff0c;发现是通过webpack加载的 向上寻找u的加载位置&#xff0c;然后打上断点&#xff0c;刷新网页&#xff0c;让程序断在加载函数的位置 u r.n…

Linux —— Socket编程(三)

一、本章重点 1. tcp服务器实现思路&#xff0c;进一步了解和总结相关的接口 2. 了解日志和守护进程 二、tcp服务器核心思路 tcp版的服务器与udp的不同在于&#xff0c;udp是面向数据报传输数据&#xff0c;在数据传输中不需要建立与客户端的链接&#xff0c;直接用recvfrom…

面试题05.08绘制直线问题详解(考察点为位运算符)

目录 一题目&#xff1a; 二详细思路汇总&#xff1a; 三代码解答&#xff08;带注释版&#xff09;&#xff1a; 一题目&#xff1a; leetcode原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二详细思路汇总&#xff1a; 这里先剧透一下简单版思路哦&…

【STM32-HAL库】自发电型风速传感器(使用STM32F407ZGT6)(附带工程下载链接)

一、自发电型风速传感器介绍 自发电型风速传感器&#xff0c;也称为风力发电型风速传感器或无源风速传感器&#xff0c;是一种不需要外部电源即可工作的风速测量设备。这种传感器通常利用风力来驱动内部的发电机构&#xff0c;从而产生电能来供电测量风速的传感器部分。以下是自…

相互作用感知的 3D 分子生成 VAE 模型 - DeepICL 评测

DeepICL 是一个基于相互作用感知的 3D 分子生成模型&#xff0c;能够在目标结合口袋内进行相互作用引导的小分子设计。DeepICL 通过利用蛋白质-配体相互作用的普遍模式作为先验知识&#xff0c;在有限的实验数据下也能实现高度的泛化能力。 一、背景介绍 DeepICL 来源于韩国科学…