`
longgangbai
  • 浏览: 7331039 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

GIS的学习(十三)Osmdroid中地图中添加自定义指南针

阅读更多

实现指南针代码:

package com.geoserver.osmdroid;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.view.View;
/**
 * 自定义指南针实现
 * 
 * @Title: 
 * @Description: 实现TODO
 * @Copyright:Copyright (c) 2011
 * @Company:
 * @Date:2012-8-24
 * @author  longgangbai
 * @version 1.0
 */
public class CompassView extends View {
	private Drawable mCompass;
	private float mAzimuth = 0;
	private boolean mSideBottom;
	private int PADDING = 2;

	public CompassView(Context ctx, final boolean sideBottom) {
		super(ctx);

		this.mCompass = ctx.getResources().getDrawable(R.drawable.arrow_n);
		mSideBottom = sideBottom;
	}

	@Override
	protected void onDraw(Canvas canvas) {
		canvas.save();
		if (mSideBottom) {
			canvas.rotate(360 - mAzimuth, PADDING + mCompass.getMinimumWidth() / 2, PADDING + mCompass.getMinimumHeight() / 2);
			mCompass.setBounds(PADDING, PADDING, PADDING + mCompass.getMinimumWidth(), PADDING
					+ mCompass.getMinimumHeight());
		} else {
			canvas.rotate(360 - mAzimuth, PADDING + mCompass.getMinimumWidth() / 2, this.getHeight() - mCompass.getMinimumHeight() /2 - PADDING);
			mCompass.setBounds(PADDING, this.getHeight() - mCompass.getMinimumHeight() - PADDING, PADDING
					+ mCompass.getMinimumWidth(), this.getHeight() - PADDING);
		}
		mCompass.draw(canvas);
		canvas.restore();

		super.onDraw(canvas);
	}

	public void setAzimuth(float aAzimuth) {
		mAzimuth = aAzimuth;
	}

}

 

 

界面类:

package com.geoserver.osmdroid;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapController;
import org.osmdroid.views.MapView;

import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.RelativeLayout;
/**
 * 
	官网:
	http://code.google.com/p/osmdroid/
	功能:
	基本功能有:查看地图、缩放地图、单点移动、多点触控等
 * @Title: 
 * @Description: 实现TODO
 * @Copyright:Copyright (c) 2011
 * @Company:易程科技股份有限公司
 * @Date:2012-7-31
 * @author  longgangbai
 * @version 1.0
 */
public class GeoServerosmdroidActivity extends Activity  {

	private MapView mapView;

	private CompassView compassView;
	private SensorManager sensorManager;
	private boolean mCompassEnabled=true;
	private boolean mDrivingDirectionUp=true;
	private boolean mNorthDirectionUp=true;
	private boolean sideBottom=true;
	private float mLastSpeed;
	private RelativeLayout relationLayout;
	private MapController mapController;

	private final SensorEventListener mListener = new SensorEventListener() {
		private int iOrientation = -1;

		public void onAccuracyChanged(Sensor sensor, int accuracy) {

		}

		public void onSensorChanged(SensorEvent event) {
			if (iOrientation < 0)
				iOrientation = ((WindowManager) GeoServerosmdroidActivity.this.getSystemService(Context.WINDOW_SERVICE))
						.getDefaultDisplay().getOrientation();

			compassView.setAzimuth(event.values[0] + 90 * iOrientation);
			compassView.invalidate();

			if (mCompassEnabled)
				if (mNorthDirectionUp)
					if (mDrivingDirectionUp == false || mLastSpeed == 0) {
						mapView.invalidate();
					}
		}

	};



	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); // Pass true here to actually contribute to OSM!
        setContentView(R.layout.main);
        sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
	    sensorManager.registerListener(mListener, sensorManager
				.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_UI);
        initCompassView();
		initgeoServerMap();
    }

    /**
     * 
     */
	private void initgeoServerMap() {
		mapView.setTileSource(TileSourceFactory.MAPNIK);
        mapView.setBuiltInZoomControls(true);
		mapController = mapView.getController();
		mapController.setZoom(9);
		GeoPoint point2 = new GeoPoint(-99.404296875*1000000, 42.682435398386204*1000000);         
		mapController.setCenter(point2); 
		this.setRequestedOrientation(-1);
        compassView.setVisibility(View.VISIBLE);
	}

	/**
	 * 鍒濆鍖栨寚鍗楅拡
	 */
	private void initCompassView() {
		relationLayout=(RelativeLayout)findViewById(R.id.geoserver_layout);
        this.mapView =(MapView)findViewById(R.id.map);
        	
        /* Compass */
    	compassView = new CompassView(this, sideBottom);
        compassView.setVisibility(mCompassEnabled ? View.VISIBLE : View.INVISIBLE);
        /* Create RelativeLayoutParams, that position in in the top right corner. */
        final RelativeLayout.LayoutParams compassParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        compassParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        compassParams.addRule(!sideBottom ? RelativeLayout.ALIGN_PARENT_BOTTOM : RelativeLayout.ALIGN_PARENT_TOP);
        relationLayout.addView(compassView, compassParams);
	}

	@Override
	protected void onDestroy() {
		sensorManager.unregisterListener(mListener);
		super.onDestroy();
	}

	@Override
	protected void onPause() {
		super.onPause();
		sensorManager.unregisterListener(mListener);
	}

	@Override
	protected void onResume() {
		super.onResume();
		sensorManager.registerListener(mListener, sensorManager
				.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_UI);
	}
}

 

布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:background="#FFFFFF"
    android:id="@+id/geoserver_layout"
    android:layout_height="fill_parent" >
    <org.osmdroid.views.MapView
        android:id="@+id/map"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true"
        android:enabled="true"
        tilesource="MapquestOSM"  
        />

</RelativeLayout>

 

配置文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.geoserver.osmdroid"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>  
    <application     android:icon="@drawable/ic_launcher"     
        android:label="@string/app_name" >     
        <activity         android:name="GeoServerosmdroidActivity"         
            android:label="@string/app_name" >         
            <intent-filter>             
                <action android:name="android.intent.action.MAIN" />              
                <category android:name="android.intent.category.LAUNCHER" />         
			</intent-filter>     
		</activity> 
	</application> 
</manifest>

 

 

 

分享到:
评论

相关推荐

    在原有的路径规划功能中添加在地图中添加自定义图层,并使图层跟随地图移动而移动,点击图层时可获取图层所在位置的现实坐标

    百度地图SDK为开发者提供了丰富的接口和工具,用于在Android应用中集成地图功能,包括添加自定义图层、处理点击事件以及地图的动态更新等。开发者可以通过查阅SDK文档、示例代码和教程,学习如何利用这些功能来构建...

    cesium指南针插件

    它利用WebGL技术将高精度的地形数据、卫星图像以及用户自定义的数据在浏览器中呈现出来,为地理信息系统(GIS)和地图应用提供了强大的工具。 指南针插件在Cesium中的作用是提供一个指向北的指针,帮助用户在3D环境...

    自定义地图底图(瓦片)Demo

    在IT行业中,自定义地图底图(瓦片)是一个常见的需求,特别是在地理信息系统(GIS)和Web地图服务中。这个Demo展示了如何在地图上显示自定义的图片,并且支持多层级放大缩小,提供了丰富的交互体验。下面将详细介绍...

    GIS.rar_gis_gis管网_百度地图_管网图形_管网地图

    在"GIS.rar_gis_gis管网_百度地图_管网图形_管网地图"这个压缩包中,我们可以推测它包含了与GIS应用相关的文件,特别是关于管网地图的创建和编辑。 首先,"GIS.html"可能是该压缩包的核心文件,它可能是一个基于Web...

    奥维地图-自定义地图_5.25更新.zip

    自定义地图图源是奥维地图的一项重要特性,它让用户可以导入自己的地图数据,或者使用第三方提供的地图数据,从而在奥维地图上展现更加符合个人需求的地图信息。 在“奥维地图-自定义地图_5.25更新.zip”这个压缩包...

    百度地图自定义标注

    在IT行业中,地图服务是应用广泛的工具之一,特别是在地理信息系统(GIS)和移动应用中。本文将深入探讨如何使用百度地图API实现自定义标注,帮助开发者们更好地展示地图上的特定位置信息。 首先,"百度地图自定义...

    arcgis加载高德在线地图

    本文将深入探讨如何在ArcGIS中加载高德在线地图,这是一项结合了Web GIS技术和第三方地图服务的重要技能。 标题“arcgis加载高德在线地图”指的是在ArcGIS环境中,利用编程接口(API)集成高德地图的服务,使得用户...

    vue+三维GIS地图

    此实例为vue版本三维GIS地图,其中包含底图切换、图层控制、图上量算、空间分析、坐标定位、图上标绘、地图打印等功能

    Arcgis for javascript 加载天地图及自定义图

    本话题主要聚焦于如何利用ArcGIS for JavaScript加载天地图以及添加自定义图层。 首先,让我们深入了解ArcGIS for JavaScript的核心概念。它基于ESRI的地理信息系统技术,提供了丰富的API接口,可以实现地图的创建...

    GIS基础知识讲解_gis学习资料_gis_gis基础知识_

    2. 数据结构与数据模型:在GIS中,地理数据通常被表示为点、线、面三种基本要素。矢量数据模型用坐标来表示这些要素,适合于描述边界明确的地理对象;而栅格数据模型用网格表示地表,适合处理连续分布的地理现象。 ...

    Baidu地图自定义模糊查询

    在IT行业中,GIS(Geographic Information System)技术与地图服务的结合为我们提供了强大的地理数据处理和展示能力。本文将深入探讨“Baidu地图自定义模糊查询”这一主题,旨在帮助开发者更好地利用百度地图API实现...

    百度地图点聚合自定义样式

    在IT行业中,地图应用是不可或缺的一部分,特别是在大数据和地理信息系统(GIS)的背景下,点聚合技术显得尤为重要。本文将深入探讨“百度地图点聚合自定义样式”这一主题,旨在帮助开发者更好地理解和实现在百度...

    gis学习文档gis学习文档gis学习文档

    5. **GIS编程与自动化**:学习Python、R语言或ArcPy等工具进行GIS脚本编写,实现批量处理、自定义功能开发,提高工作效率。 6. **数据库管理**:理解GIS与数据库的关系,如使用SQL进行空间查询、更新和管理空间数据...

    gis地图 百度地图离线版(江苏省瓦片至13级)

    在本资源中,我们关注的是GIS地图的一个具体应用——百度地图的离线版本,特别针对江苏省的地理信息。 百度地图是中国领先的在线地图服务提供商之一,提供了丰富的地图数据和导航功能。然而,在没有网络连接的情况...

    Web Gis_webgis_GIS地图开发Js_gis_webgis地图来源_web地图可视化_

    在Web GIS中,JavaScript库如Leaflet、OpenLayers、ArcGIS API for JavaScript等,为开发者提供了丰富的功能,包括加载地图瓦片、添加图层、标注、查询、分析等。例如,你可以使用这些库来创建一个基本的地图界面,...

    四川地图shp文件 shp格式,gis添加使用

    压缩包子文件的文件名称列表中有一个“四川地图shp文件 shp格式,gis添加使用.pdf”,这可能是对如何使用这些SHP文件的指南或教程,可能包含数据的详细说明、加载步骤、GIS软件操作指导等内容。对于GIS新手来说,...

    奥维互动地图自定义地图图源

    奥维互动地图自定义地图,通过pc版导入后分享到手机更方便

    ECharts自定义地图镇级地图geo.zip

    在本案例中,我们关注的是ECharts的自定义地图功能,特别是针对“乡镇级别”的行政划分地图。ECharts自定义地图允许用户根据特定的需求,将地图数据进行定制,以展示更细致的地理信息。 山西长治潞城区乡镇级地图是...

    Map覆盖物添加demo

    在IT行业中,地图服务是应用广泛的一个领域,特别是在地理信息系统(GIS)和移动应用中。本文将深入探讨“Map覆盖物添加demo”这一主题,它涉及到如何在地图上添加自定义元素,以增强地图的可视化效果和交互性。我们...

    BaiduMapTileCutter+水经注万能地图下载器 13.19.12+百度地图自定义图层示例

    最后,**百度地图自定义图层示例代码** 是一组示例代码,用于演示如何在百度地图API上添加自定义图层。自定义图层是百度地图API的一项高级功能,允许开发人员在地图上叠加自己的数据或图形。这可能是地理编码后的点...

Global site tag (gtag.js) - Google Analytics