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"android:orientation="vertical"><org.osmdroid.views.MapViewandroid:id="@+id/mapView"android:layout_width="match_parent"android:layout_height="match_parent"/><Buttonandroid:id="@+id/btnLocation"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="定位"android:layout_margin="10dp"android:layout_alignParentTop="true"/></RelativeLayout>
MainActivity.java:
package com.chy.osmdroid;import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.chy.layers.LayerTileSources;
import com.chy.permission.PermissionUtils;
import org.osmdroid.api.IMapController;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.CustomZoomButtonsController;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.MinimapOverlay;
import org.osmdroid.views.overlay.ScaleBarOverlay;
import org.osmdroid.views.overlay.compass.CompassOverlay;
import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider;
import org.osmdroid.views.overlay.gestures.RotationGestureOverlay;
import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider;
import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay;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 LocationManager locationManager;// 定位管理器private Button btnLocation;// 定位按钮private boolean isLocation = false;@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.setTileSource(LayerTileSources.AutoNaviVector);//mapView.setTileSource(LayerTileSources.TDT_IMG_W);// 设置最小缩放比例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);// 指南针-(不显示)CompassOverlay mCompassOverlay = new CompassOverlay(getApplicationContext(), new InternalCompassOrientationProvider(getApplicationContext()),mapView);mCompassOverlay.enableCompass();mapView.getOverlays().add(mCompassOverlay);// 小地图MinimapOverlay mMinimapOverlay = new MinimapOverlay(this, mapView.getTileRequestCompleteHandler());mMinimapOverlay.setWidth(200);mMinimapOverlay.setHeight(200);mMinimapOverlay.setTileSource(LayerTileSources.AutoNaviVector);mapView.getOverlays().add( mMinimapOverlay);// 地图旋转RotationGestureOverlay mRotationGestureOverlay = new RotationGestureOverlay(mapView);mRotationGestureOverlay.setEnabled(true);mapView.getOverlays().add(mRotationGestureOverlay);//比例尺配置ScaleBarOverlay mScaleBarOverlay = new ScaleBarOverlay(mapView);// 获取屏幕密度、宽、高等信息DisplayMetrics dm = getResources().getDisplayMetrics();float density = dm.density;// 屏幕密度(像素比例:0.75/1.0/1.5/2.0)int densityDPI = dm.densityDpi;// 屏幕密度(每寸像素:120/160/240/320)int screenWidth = dm.widthPixels;// 屏幕宽度int screenHeight = dm.heightPixels;// 屏幕高度// 比例尺显示的位置mScaleBarOverlay.setScaleBarOffset(10, screenHeight-300);mapView.getOverlays().add(mScaleBarOverlay);}// 控件初始化private void initControls(){btnLocation = findViewById(R.id.btnLocation);// 点击事件btnLocation.setOnClickListener(new View.OnClickListener() {@SuppressLint("MissingPermission")@Overridepublic void onClick(View v) {//创建位置管理器实例locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);if (!isLocation){// 注册位置监听器locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);isLocation = !isLocation;}else {// 停止位置更新locationManager.removeUpdates(locationListener);isLocation = !isLocation;Toast.makeText(getApplicationContext(),"停止位置更新",Toast.LENGTH_SHORT).show();}}});}/*** 定位监听* */LocationListener locationListener = new LocationListener() {@Overridepublic void onLocationChanged(Location location) {// 处理位置变化double latitude = location.getLatitude();double longitude = location.getLongitude();Toast.makeText(getApplicationContext(),"lat:"+latitude+"lon:"+longitude,Toast.LENGTH_SHORT).show();// 在地图上显示当前位置// 定位MyLocationNewOverlay mLocationOverlay = new MyLocationNewOverlay(new GpsMyLocationProvider(getApplicationContext()), mapView);mLocationOverlay.enableMyLocation();// osmdroid获取的坐标点为空// GeoPoint myLocation = mLocationOverlay.getMyLocation();// 使用本机获取的经纬度-设置经纬度GeoPoint myLocation = new GeoPoint(latitude,longitude);mapView.getController().setZoom(18.0);mapView.getController().setCenter(myLocation);mapView.getOverlays().add(mLocationOverlay);}@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {Toast.makeText(getApplicationContext(),"onStatusChanged",Toast.LENGTH_SHORT).show();}@Overridepublic void onProviderEnabled(String provider) {Toast.makeText(getApplicationContext(),"onProviderEnabled",Toast.LENGTH_SHORT).show();}@Overridepublic void onProviderDisabled(String provider) {Toast.makeText(getApplicationContext(),"onProviderDisabled",Toast.LENGTH_SHORT).show();}};@Overrideprotected void onDestroy() {super.onDestroy();// 停止位置更新if (locationManager != null){locationManager.removeUpdates(locationListener);}}
}
相关文章:
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/…...

前端vue-实现富文本组件
1.使用wangeditor富文本编辑器 工具网站:https://www.wangeditor.com/v4/ 下载安装命令:npm i wangeditor --save 成品如下图: 组件实现代码 <template><div><!-- 富文本编辑器 --><div id"wangeditor">…...
AUTOSAR汽车电子嵌入式编程精讲300篇-基于CAN总线的气动控制(中)
目录 2.2 CAN总线技术及TTCAN协议 2.2.1 CAN总线技术 2.2.2 TTCAN协议 3 气动系统的定位控制研究 3.1 滑模控制原理 3.1.1 滑模控制概念和特性 3.1.2 滑模控制的抖振问题 3.1.3 非奇异终端滑模控制 3.2 气动系统定位控制策略设计 3.2.1 跟踪微分器的设计…...

国内可用ChatGPT-4中文镜像网站整理汇总【持续更新】
一、GPT中文镜像网站 ① yixiaai.com 支持GPT4、4o以及o1,支持MJ绘画 ② chat.lify.vip 支持通用全模型,支持文件读取、插件、绘画、AIPPT ③ AI Chat 支持GPT3.5/4,4o以及MJ绘画 二、模型知识 o1/o1-mini:最新的版本模型&am…...

前端sm2国密加密时注意
如下方法: export function encrypt(str) {const sm2 require("sm-crypto").sm2;const cipherMode 1; // 1 - C1C3C2,0 - C1C2C3,默认为1//自定义密钥let publicKey "xxxxxxxx";//此处加密let a sm2.doEncrypt(str,…...
LeetCode 面试经典150题 9.回文数
题目: 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数:是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 例如&…...
select 函数简介
原型 #include <sys/select.h> #include <sys/time.h> #include <unistd.h> int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 作用 select 函数是 UNIX 和类 UNIX 系统(如 Linux&am…...

python - 在linux上编译py文件为【.so】文件部署项目运行
python - 在linux上编译py文件为【.so】文件,可通过主文件直接执行 一. 前言 在Python中,通常不直接将Python代码编译为.so(共享对象)文件来执行,因为.so文件是编译后的二进制代码,通常用于C或C等语言&am…...
SQL_having_pandas_filter
HAVING子句在SQL中用于对分组后的结果进行过滤,它通常与GROUP BY子句一起使用。HAVING子句允许你指定条件来过滤聚合函数的结果,而WHERE子句则用于在分组之前过滤原始数据。 基本语法 SELECT column_name, aggregate_function(column_name) FROM table…...

从软件架构设计角度理解Kafka
网上对于消息中间件的介绍文章比较多,这里我们不再赘述,我们换个思路来理解消息中间件,从软件开发架构的角度来看下消息中间件是如何诞生和演进的。 一、概述 上图中P代表 Provider,C代表Consumer,下同。P和C是一个典型…...

什么是中断?
1.什么是中断 2.中断的重要性 3.中断的上下半部 4.中断处理流程 中断的原则 5.ARM处理器程序运行过程 6.程序被被中断时,怎么保护现场 1.什么是中断 中断是指在 CPU 正常运行期间, 由外部或内部事件引起的一种机制。 当中断发生时,…...

后端(实例)08
设计一个前端在数据库调取数据的表格,并完成基础点击增删改查的功能: 1.首先写一个前端样式(空壳) <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Insert title here&l…...

【stm32】TIM定时器输出比较-PWM驱动LED呼吸灯/舵机/直流电机
TIM定时器输出比较 一、输出比较简介1、OC(Output Compare)输出比较2、PWM简介3、输出比较通道(高级)4、输出比较通道(通用)5、输出比较模式6、PWM基本结构配置步骤:程序代码:PWM驱动LED呼吸灯 7、参数计算8、舵机简介程序代码&am…...

如何使用ssm实现线上旅游体验系统+vue
TOC ssm691线上旅游体验系统vue 绪论 课题背景 身处网络时代,随着网络系统体系发展的不断成熟和完善,人们的生活也随之发生了很大的变化。目前,人们在追求较高物质生活的同时,也在想着如何使自身的精神内涵得到提升࿰…...

探索JMeterTools:一个Python驱动的JMeter脚本生成器
JMeterTools 简介 JMeterTools 是一个由 Python 编写的开源项目,旨在帮助测试人员快速生成 JMeter 测试脚本。通过简单的 Python API,用户可以方便地定义测试计划、线程组、HTTP 请求等,可以结合接口自动化测试项目,将接口自动化…...

【React】组件通信
1. 组件通信 组件间的数据传递 1.1 父传子 步骤: 父组件传递数据——在子组件标签上绑定属性子组件接收数据——子组件通过props参数接收数据 function Son(props) {return <div>{props.value}</div> }function App() {const value 父组件传给子…...

C++核心编程和桌面应用开发 第七天(运算符重载 智能指针)
目录 1.数组类 2.运算符重载 2.1加号运算符 2.1.1成员函数实现 2.1.2全局函数实现 2.1.3加号重载 2.2左移运算符 2.3递增运算符 2.4指针运算符 2.5赋值运算符 1.数组类 //默认构造函数 MyArray::MyArray() {m_Size 0;m_Capacity 100;pAddress new int[m_Capacity]…...

echarts地图的简单使用
echarts地图的简单使用 文章说明核心源码效果展示源码下载 文章说明 主要介绍echarts地图组件的简单使用,记录为文章,供后续查阅使用 目前只是简单的示例,然后还存在着一些小bug,主要是首个Legend的点击会导致颜色全部不展示的问题…...
Qt 项目优化实践方向
目录 1. 使用智能指针2. 避免在全局或静态作用域中使用裸指针3. 利用Qt的对象树进行资源管理4. 延迟加载和按需加载资源5. 合理使用Qt的资源文件(qrc)6. 监控和调试内存使用7. 优化数据结构8. 减少不必要的资源复制9. 使用缓存机制10. 遵循RAII原则 以下…...

常见的15个:自然语言处理(NLP)实战项目
自然语言处理(NLP)实战项目涵盖了从基础到高级的多个领域,以下是一些常见的NLP实战项目,每个项目都附带了简要的描述和可能用到的技术栈: 1. 文本分类(Text Classification) 描述: 将文本数据…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...