文档章节

得到定位信息

chenruibing
 chenruibing
发布于 2015/06/01 21:29
字数 1320
阅读 44
收藏 4

1、网络定位(network)。前提是必须连上网络:wifi、3G、2G;
 获取到IP地址
 例如:彩虹版QQ,珊瑚虫版QQ,就有一个功能显示对方的IP;
 根据IP显示具体的位置;

 原理是建立一个库那个IP地址对应那个地方;早期警方破案就采用此特点;

 有局限性:针对固定的IP地址。
 如果手机网或者ip地址是动态分布IP,这个偏差就很大。这种情况是无法满足需求的。

2、基站定位(passive)。

工作原理:手机能打电话,是需要基站的。手机定位也是用基站的。
手机附近能收到3个基站的信号,就可以定位了。
基站定位有可能很准确,比如基站多的地方;
如果基站少的话就会相差很大。
精确度:几十米到几公里不等;

3、GPS定位(gps)。
A-GPS 使用了卫星定位 需要联网辅助修正位置
特点是:需要搜索卫星, 头顶必须是空旷的;至少需要3颗卫星才能定位;不需要网络就能直接GPS定位

          GPS直接定位,需要去寻找卫星的轨道之类的信息,需要花费一定时间,差不多1分钟,还很耗电
          A-GPS则是优先访问网络,获取上次的卫星轨道信息,然后直接去定位
          定位精度好的能到15米左右


影响条件:云层、大厦、大树。

卫星:美国人、欧洲人的卫星。
北斗:中国的,但没有民用,只是在大巴,战机等使用。


LocationManager  获取定位的管理者

根据中国国情,得到的坐标都是有偏差的,所以需要进行修改。

如果用于商业化,这个坐标需要花钱购买,测试用的话可以使用星火工具来修正坐标。

package com.itheima.gpsdemo;

import android.app.Activity;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {

	// 用到位置服务
	private LocationManager lm;
	private MyLocationListener listener;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		lm = (LocationManager) getSystemService(LOCATION_SERVICE);
		
		//得到三种定位提供者
//		List<String> provider = lm.getAllProviders();
//		for(String l: provider){
//			System.out.println(l);
//		}
		listener = new MyLocationListener();
		
		
		Criteria criteria = new Criteria();
		//给位置提供者设置条件
		criteria.setAccuracy(Criteria.ACCURACY_FINE);
		//设置参数细化:
		//criteria.setAccuracy(Criteria.ACCURACY_FINE);//设置为最大精度 
		//criteria.setAltitudeRequired(false);//不要求海拔信息 
		//criteria.setBearingRequired(false);//不要求方位信息 
		//criteria.setCostAllowed(true);//是否允许付费 
		//criteria.setPowerRequirement(Criteria.POWER_LOW);//对电量的要求 

		//得到最好的位置提供者   true表示获取的这个是可用的
		String proveder= lm.getBestProvider(criteria, true);
		//注册监听位置服务
		//那种定位方式
		//多久定位一次  gps的话60000一次,也就是一分钟一次,不要几秒一次,很耗电
		//多少米定位一次  真机情况下  50米定位一次
		lm.requestLocationUpdates(proveder, 0, 0, listener);
		
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		// 取消监听位置服务
		lm.removeUpdates(listener);
		listener = null;

	}

	class MyLocationListener implements LocationListener {

		/**
		 * 当位置改变的时候回调
		 */

		@Override
		public void onLocationChanged(Location location) {
			String longitude = "经度:" + location.getLongitude();
			String latitude = "纬度:" + location.getLatitude();
			String accuracy = "精确度:" + location.getAccuracy();
			TextView textview = new TextView(MainActivity.this);
			textview.setText(longitude + "\n" + latitude + "\n" + accuracy);

			setContentView(textview);

		}

		/**
		 * 当状态发生改变的时候回调 开启--关闭 ;关闭--开启
		 */
		@Override
		public void onStatusChanged(String provider, int status, Bundle extras) {
			// TODO Auto-generated method stub

		}

		/**
		 * 某一个位置提供者可以使用了
		 */
		@Override
		public void onProviderEnabled(String provider) {
			// TODO Auto-generated method stub

		}

		/**
		 * 某一个位置提供者不可以使用了
		 */
		@Override
		public void onProviderDisabled(String provider) {
			// TODO Auto-generated method stub

		}

	}

}

权限:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>


火星地球坐标转化.地图坐标修偏

工具类


import java.io.InputStream;
import java.io.ObjectInputStream;

/**
 * 火星地球坐标转化.地图坐标修偏
 * 
 */
public class ModifyOffset {
	private static ModifyOffset modifyOffset;
	static double[] X = new double[660 * 450];
	static double[] Y = new double[660 * 450];


	private ModifyOffset(InputStream inputStream) throws Exception {
		init(inputStream);
	}

	public synchronized static ModifyOffset getInstance(InputStream is) throws Exception {
		if (modifyOffset == null) {
			modifyOffset = new ModifyOffset(is);
		}
		return modifyOffset;
	}

	public void init(InputStream inputStream) throws Exception {
		ObjectInputStream in = new ObjectInputStream(inputStream);
		try {
			int i = 0;
			while (in.available() > 0) {
				if ((i & 1) == 1) {
					Y[(i - 1) >> 1] = in.readInt() / 100000.0d;
					;
				} else {
					X[i >> 1] = in.readInt() / 100000.0d;
					;
				}
				i++;
			}
		} finally {
			if (in != null)
				in.close();
		}
	}

	// standard -> china
	public PointDouble s2c(PointDouble pt) {
		int cnt = 10;
		double x = pt.x, y = pt.y;
		while (cnt-- > 0) {
			if (x < 71.9989d || x > 137.8998d || y < 9.9997d || y > 54.8996d)
				return pt;
			int ix = (int) (10.0d * (x - 72.0d));
			int iy = (int) (10.0d * (y - 10.0d));
			double dx = (x - 72.0d - 0.1d * ix) * 10.0d;
			double dy = (y - 10.0d - 0.1d * iy) * 10.0d;
			x = (x + pt.x + (1.0d - dx) * (1.0d - dy) * X[ix + 660 * iy] + dx
					* (1.0d - dy) * X[ix + 660 * iy + 1] + dx * dy
					* X[ix + 660 * iy + 661] + (1.0d - dx) * dy
					* X[ix + 660 * iy + 660] - x) / 2.0d;
			y = (y + pt.y + (1.0d - dx) * (1.0d - dy) * Y[ix + 660 * iy] + dx
					* (1.0d - dy) * Y[ix + 660 * iy + 1] + dx * dy
					* Y[ix + 660 * iy + 661] + (1.0d - dx) * dy
					* Y[ix + 660 * iy + 660] - y) / 2.0d;
		}
		return new PointDouble(x, y);
	}

	// china -> standard
	public PointDouble c2s(PointDouble pt) {
		int cnt = 10;
		double x = pt.x, y = pt.y;
		while (cnt-- > 0) {
			if (x < 71.9989d || x > 137.8998d || y < 9.9997d || y > 54.8996d)
				return pt;
			int ix = (int) (10.0d * (x - 72.0d));
			int iy = (int) (10.0d * (y - 10.0d));
			double dx = (x - 72.0d - 0.1d * ix) * 10.0d;
			double dy = (y - 10.0d - 0.1d * iy) * 10.0d;
			x = (x + pt.x - (1.0d - dx) * (1.0d - dy) * X[ix + 660 * iy] - dx
					* (1.0d - dy) * X[ix + 660 * iy + 1] - dx * dy
					* X[ix + 660 * iy + 661] - (1.0d - dx) * dy
					* X[ix + 660 * iy + 660] + x) / 2.0d;
			y = (y + pt.y - (1.0d - dx) * (1.0d - dy) * Y[ix + 660 * iy] - dx
					* (1.0d - dy) * Y[ix + 660 * iy + 1] - dx * dy
					* Y[ix + 660 * iy + 661] - (1.0d - dx) * dy
					* Y[ix + 660 * iy + 660] + y) / 2.0d;
		}
		return new PointDouble(x, y);
	}

}

class PointDouble {
	double x, y;

	PointDouble(double x, double y) {
		this.x = x;
		this.y = y;
	}

	public String toString() {
		return "x=" + x + ", y=" + y;
	}
}
demo案例


public class Demo {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		ModifyOffset offset = ModifyOffset.getInstance(Demo.class.getResourceAsStream("axisoffset.dat"));
		PointDouble newdouble1 = offset.s2c(new PointDouble(116.29042787, 40.04337062));
		System.out.println(newdouble1);
	}

}





© 著作权归作者所有

chenruibing
粉丝 12
博文 203
码字总数 109101
作品 0
潮州
私信 提问
关于是用wifi定位当前位置坐标的一些问题?

大家好! 最近公司在讨论关于WIFI定位的可行性方案,向大家请教一些问题。 关于wifi定位,用的最多的应该就是手机了。那么,手机是如何通过wifi进行定位的呢? (GPS以及基站定位暂时不讨论哈...

zy_35
2016/05/31
632
6
关于ROS当中里程计的信息及IMU的标定

一、在ROS当中,里程计是一种利用从移动传感器获得的数据来估计物体位置随时间的变化而改变的方法。 二、而在ROS当中里程计信息可以分为两个部分:一个是位姿(位置和姿态),一个是速度(直...

ys13204130
2018/04/20
0
0
初探 RSelenium —— 基于豆瓣电影的爬虫实例

工具准备 JAVA:安装 JAVA Selenium Server:下载 selenium-server-standalone-版本号.jar (本文使用的是 3.4.0 版本) Chrome:安装 Chrome ChromeDriver:下载 chromedrive.exe 注:下载的...

Datartisan
2017/09/14
0
0
疯狂ios讲义之使用CoreLocation定位(2)

9.2 获取定位信息 iOS开发者使用CoreLocation.framework框架进行定位非常简单,CoreLocation框架的常用API主要有如下几个。 Ø CLLocationManager:定位管理器类。 Ø CLLocationManagerdel...

博文视点
2014/04/03
11.4K
0
【高德地图API】从零开始学高德JS API(七)——定位方式大揭秘

摘要:关于定位,分为GPS定位和网络定位2种。GPS定位,精度较高,可达到10米,但室内不可用,且超级费电。网络定位,分为wifi定位和基站定位,都是通过获取wifi或者基站信息,然后查询对应的...

酸奶小妹GIS
2014/07/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

15、SpringMVC进行json交互

SpringMVC进行json交互 json数据格式在接口调用中、html页面中较常用,json格式比较简单,解析还比较方便。 请求json、输出json。要求请求的是json串,前端页面中需要将请求的内容转成json,...

快乐的瓶子
28分钟前
6
0
delphi版插apc杀进程驱动源码

从c代码转的,备份一下,里面有硬编码unit MyDriver;{$HINTS OFF}{$WARNINGS OFF}interfaceusesnt_status, ntoskrnl, native, winioctl, fcall, macros;typeTKILL = ...

simpower
31分钟前
4
0
带你上手一款下载超 10 万次的 IDEA 插件

作者 | 倪超(银时) 阿里云开发者工具产品专家 本文整理自 11 月 7 日社群分享,每月 2 场高质量分享,点击加入社群。 导读:Cloud Toolkit 是本地 IDE 插件,帮助开发者更高效地开发、测试...

阿里云官方博客
32分钟前
4
0
GMAT语法7个常考重要考点分析

GMAT语法考点多,并非所有考点都值得重点关注。实际上GMAT语法存在一些高频考点,考生需要优先掌握它们才能更好地保证得分。同时GMAT备考中大家还需要培养连续做题的耐力。下面小编就来做具体...

bole6
36分钟前
4
0
最佳实践 | RDS & POLARDB归档到X-Pack Spark计算

X-Pack Spark服务通过外部计算资源的方式,为Redis、Cassandra、MongoDB、HBase、RDS存储服务提供复杂分析、流式处理及入库、机器学习的能力,从而更好的解决用户数据处理相关场景问题。 RD...

一肥仔
38分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部