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…

【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…

快速创建第一个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语言是一种免费的统计计算和图形化编程语言,是一种用于数据分析和统计建模的强大工具。它具有丰富的统计…

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…

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;而在内存…

【Python报错已解决】TypeError: tuple indices must be integers or slices, not str

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

华为HarmonyOS灵活高效的消息推送服务(Push Kit) -- 7 推送卡片刷新消息

场景介绍 如今衣食住行娱乐影音应用占据了大多数人的手机&#xff0c;一部手机可以满足日常大多需求&#xff0c;但对需要经常查看或进行简单操作的应用来说&#xff0c;总需要用户点开应用体验较繁琐。针对此种场景&#xff0c;HarmonyOS提供了Form Kit&#xff08;卡片开发服…

Python | Leetcode Python题解之第437题路径总和III

题目&#xff1a; 题解&#xff1a; class Solution:def pathSum(self, root: TreeNode, targetSum: int) -> int:prefix collections.defaultdict(int)prefix[0] 1def dfs(root, curr):if not root:return 0ret 0curr root.valret prefix[curr - targetSum]prefix[cu…

知识管理数据库

知识管理数据库&#xff0c;可以分为几类&#xff1a; 灵感库、卡片库、作品库。 灵感库&#xff0c;通常是素材&#xff0c;想法。 片库&#xff0c;是完整的&#xff0c;成段落的文字。 作品库&#xff0c;是文章、专栏&#xff0c;或者书籍。 这三者的关系&#xff0c;好比…

Java文件上传同时传入JSON参数

前言 此篇文章用于解决一个接口内同时完成文件的上传及JSON参数的传入(生产环境已验证); 1.准备接口 import cn.cdjs.vo.UserVO; import cn.hutool.json.JSONUtil; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFi…

黑马头条day3-3自媒体接口作业

黑马头条day3-3自媒体接口作业 1)素材管理 1.1)图片删除 接口描述 说明接口路径/api/v1/material/del_picture/{id}请求方式GET参数Integer id响应结果ResponseResult 返回结果实例&#xff1a; 实现思路 感觉删除比较难写 因为需要判断图片是不是和文章挂钩了 gpt帮了很…

Spring Cloud 教程(二) | 搭建SpringCloudAlibaba

Spring Cloud 教程&#xff08;二&#xff09; | 搭建SpringCloudAlibaba 前言一、SpringBoot 与 SpringCloud 版本对应关系&#xff1a;二、SpringCloud 与 SpringCloudAlibaba版本对应关系&#xff1a;三、SpringCloudAlibaba版本 与 组件版本 对应关系&#xff1a;四、搭建S…