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

部署看这个: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.mzph.cn/bicheng/54998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LLM多模态】视频理解模型Cogvlm-video和MVBench评测基准

note Cogvlm-video模型通过视频抽帧&#xff08;24帧&#xff0c;每帧大小为224 x 224&#xff09;后经过ViT进行图像编码&#xff08;ViT中添加了2x2的卷积核更好的压缩视觉信息&#xff09;&#xff0c;使用adapter模块更好的将视觉特征和文本特征对齐&#xff0c;得到的图像…

5--苍穹外卖-SpringBoot项目中菜品管理 详解(一)

目录 公共字段自动填充 问题分析 实现思路 代码开发 步骤一 步骤二 功能测试 新增菜品 需求分析和设计 代码开发 文件上传接口 功能测试 1--苍穹外卖-SpringBoot项目介绍及环境搭建 详解-CSDN博客 2--苍穹外卖-SpringBoot项目中员工管理 详解&#xff08;一&#…

python绘制图像

柱状图 import os# 输入想要存储图像的路径 os.chdir(D:)import matplotlib.pyplot as plt import numpy as np # 改变绘图风格 import seaborn as snssns.set(color_codesTrue)cell [gen7, xgspon, 3081GB, vettel, totalplay, other] pvalue [21, 20, 18, 13, 7, 34]width…

Python基础知识(八)--文件操作,备份文件

文件可以用来存储数据。若根据文件内容的不同来给文件分类&#xff0c;可分为&#xff1a; &#xff08;1&#xff09;文本类型&#xff1a;存放文字类数据&#xff0c;读写时使用r、w&#xff1b; &#xff08;2&#xff09;二进制原始数据类型&#xff1a;存放二进制bytes数…

【GUI设计】基于图像分割的GUI系统(6),matlab实现

博主简介&#xff1a; 如需获取设计的完整源代码或者有matlab图像代码项目需求/合作&#xff0c;可联系主页个人简介提供的联系方式或者文末的二维码。博客内容有疑问可联系沟通&#xff08;博主邮箱&#xff1a;3249726188qq.com&#xff09;。 ~~~~~~~~~~~~~~~~~~~~~~~…

实现简易 vuedraggable 的拖拽排序功能

一、案例效果 拖拽计数4实现手动排序 二、案例代码 <draggable:list"searchResult.indicator":group"{ name: indicators }"item-key"field"handle".drag-handle-icon"><divclass"field-item"v-for"(item…

ubuntu如何开启和关闭图形界面

在Ubuntu中&#xff0c;你可以根据需要开启或关闭图形界面。以下是具体的方法&#xff1a; 关闭图形界面 方法一&#xff1a;使用 systemctl 命令 打开终端。输入以下命令切换到多用户目标&#xff08;相当于关闭图形界面&#xff09;&#xff1a;sudo systemctl set-defaul…

快速创建第一个Spring Boot 项目

一、介绍 Spring Boot 是一个开源的 Java 基础框架&#xff0c;它基于 Spring 框架&#xff0c;用于创建独立、生产级别的基于 Spring 的应用程序&#xff0c;你可以“跑起来”&#xff08;run&#xff09;你的 Spring 应用程序。Spring Boot 让基于 Spring 的应用开发变得更容…

对onlyoffice进行定制化开发

基于onlyoffice8.0源码&#xff0c;进行二次开发&#xff0c;可实现包括但不限于以下的功能 1、内容控件的插入 2、内容空间的批量替换 3、插入文本 4、插入图片 5、添加&#xff0c;去除水印 6、修改同时在线人数限制 7、内容域的删除 8、页面UI的定制化 9、新增插件开发 10、…

生信初学者教程(四):软件

文章目录 RRstudioLinux系统其他软件本书是使用R语言编写的教程,用户需要下载R和RStudio软件用于进行分析。 版权归生信学习者所有,禁止商业和盗版使用,侵权必究 R R语言是一种免费的统计计算和图形化编程语言,是一种用于数据分析和统计建模的强大工具。它具有丰富的统计…

关系型数据库和非关系型数据库的区别

1.常见的主流数据库 关系型数据库&#xff1a; MySql 、达梦 、PostgreSQL 、Oracle 、Sql Server 、Sqlite非关系型数据库&#xff1a; Redis 、MongoDB 、HBase 、 Neo4J 、 CouchDB 2.介绍 关系型数据库最典型的数据结构是表&#xff0c;由二维表及其之间的联系…

C 标准库 - <ctype.h>

C 标准库 - <ctype.h> 概述 <ctype.h> 是 C 语言标准库中的一个头文件,它提供了一系列用于测试和操作字符的函数。这些函数主要用于检查字符是否属于特定的字符类别,如字母、数字、标点符号等,以及进行字符的大小写转换。<ctype.h> 中的函数通常在处理文…

C语言 | Leetcode C语言题解之第429题N叉树的层序遍历

题目&#xff1a; 题解&#xff1a; #define MAX_LEVE_SIZE 1000 #define MAX_NODE_SIZE 10000int** levelOrder(struct Node* root, int* returnSize, int** returnColumnSizes) {int ** ans (int **)malloc(sizeof(int *) * MAX_LEVE_SIZE);*returnColumnSizes (int *)mal…

如何在 Linux 终端使用 GET 和 POST 请求

文章目录 1、GET请求基本请求带有请求头带有参数将响应保存成文件 2、POST请求基本请求发送JSON格式的POST请求体使用文件作为POST请求体使用时注意 1、GET请求 基本请求 在Linux中&#xff0c;发送GET请求通常使用 curl 命令&#xff0c;curl 的默认行为就是发送GET请求&…

ArcGIS Desktop使用入门(三)常用工具条——拓扑(下篇:地理数据库拓扑)

系列文章目录 ArcGIS Desktop使用入门&#xff08;一&#xff09;软件初认识 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——标准工具 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——编辑器 ArcGIS Desktop使用入门&#xff08;二&#x…

WordPress最佳恶意软件扫描插件:入门级指南

在现代互联网环境中&#xff0c;网站安全已经成为每个网站管理员必须重视的问题。特别是对于使用WordPress的用户来说&#xff0c;由于其普及度高&#xff0c;WordPress网站常常成为黑客的首要攻击目标。幸运的是&#xff0c;有许多优秀的恶意软件扫描插件可以帮助我们保护网站…

[附源码]网上订餐系统+SpringBoot+前后端分离

今天带来一款优秀的项目&#xff1a;网上订餐系统源码 。 系统采用的流行的前后端分离结构&#xff0c;包含了“管理端”&#xff0c;“商家管理端”&#xff0c;“用户购买端” 如果您有任何问题&#xff0c;也请联系小编&#xff0c;小编是经验丰富的程序员&#xff01; 一.…

[000-002-01].第29节:MySQL数据库缓冲池

1、什么是数据缓冲池&#xff1a; 1.InnoDB 存储引擎是以页为单位来管理存储空间的&#xff0c;我们进行的增删改查操作其实本质上都是在访问页面&#xff08;包括读页面、写页面、创建新页面等操作&#xff09;&#xff0c;而磁盘 I/O 需要消耗的时间很多&#xff0c;而在内存…

[leetcode]216_组合总和III_给定数字范围且输出无重复

找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。示例 1: 输入: k 3, n 7 输出: [[1,2,4]] 解释: 1…

dataclasses中asdict的用法

今天读源码读到这个函数的用法&#xff0c;它用在声明的dataclass类里面&#xff0c;将dataclass声明的属性变成字典返回。 有以下几点可能需要注意&#xff1a; 第一个是直接赋值的变量不会被asdict返回&#xff0c;只有声明的变量才行。 from dataclasses import asdict, …