当前位置: 首页 > news >正文

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);}}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Mybatis XML配置文件操作数据库
  • Python办公自动化之Excel
  • npm run serve报错提示js堆内存不足
  • Azure Kinect 人体跟踪关节
  • 【数据评估与清洗】对数据结构和内容进行清洗
  • SpringBoot 与 Maven 快速上手指南
  • 鹅​文​档​一​面​​
  • Python--循环
  • fastdfs开源分布式文件系统及迁移部署
  • 小学全科电子教材(全阶段全版本)
  • 回归预测|基于卷积神经网络-支持向量机的数据回归预测Matlab程序CNN-SVM 卷积提取特征与原始特征进行融合预测
  • ubuntu命令行设置wifi和宽带连接
  • 如何使用GitHub Desktop管理GitLab库
  • React Native中如何调用iOS的Face ID和Android的生物识别,react-native-biometrics
  • transformer中为什么使用不同的K 和 Q, 为什么不能使用同一个值?
  • $translatePartialLoader加载失败及解决方式
  • CSS相对定位
  • Git初体验
  • Git学习与使用心得(1)—— 初始化
  • java2019面试题北京
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • jquery cookie
  • js算法-归并排序(merge_sort)
  • log4j2输出到kafka
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • PV统计优化设计
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • STAR法则
  • VUE es6技巧写法(持续更新中~~~)
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • Webpack 4x 之路 ( 四 )
  • 猴子数据域名防封接口降低小说被封的风险
  • 后端_ThinkPHP5
  • 前端面试之CSS3新特性
  • 在Docker Swarm上部署Apache Storm:第1部分
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • 选择阿里云数据库HBase版十大理由
  • 昨天1024程序员节,我故意写了个死循环~
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #NOIP 2014#Day.2 T3 解方程
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (9)目标检测_SSD的原理
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (Forward) Music Player: From UI Proposal to Code
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (二)测试工具
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (十一)c52学习之旅-动态数码管
  • (实战篇)如何缓存数据
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • .bat批处理(二):%0 %1——给批处理脚本传递参数