- 浏览: 50368 次
- 性别:
文章分类
- 全部博客 (103)
- 一致性哈希算法 (1)
- 云计算 (2)
- Cassandra学习 (2)
- Java网络通信与笔记 (14)
- ZooKeeper学习 (1)
- HBase学习 (1)
- Sqoop学习 (1)
- Java网页开发之 (2)
- Java网络通信框架 (5)
- (memcached)分布式内存对象缓存系统 (1)
- Redis学习 (5)
- Shell学习 (14)
- Linux学习 (10)
- MySQL优化 (17)
- C++ (7)
- HTML5 (5)
- Android学习 (5)
- 网络 (2)
- Node.js (1)
- D3.js (1)
- R语言学习 (3)
- Spark (1)
- CAN协议 (2)
- 解决方案 (0)
最新评论
上文说到获取手机所在地的经纬度,那么有几种方式呢?通过GPS,network.而地位API中提供了LocationManager,以及Location。其中LocationManager用来获得位置服务,Location用来获取位置。具体代码如下:
从这里我们可以知道一个经纬度对象GeoPoint,它接受2个整形的经纬度值。在这里我们是使用GPS获取当前经纬度,如果用network呢?那么久换LocationManager.NETWORK_PROVIDER
当然,我们可能要考虑到更多的情况,比如说GPS模式是关闭的,那么如何启动它?很简单,我们只要判断是否启用了GPS,如果没有则跳到Settings中进行启用。代码如下:
以上是获得当前手机所在地的经纬度。
当然当我们行走时候,位置是不断变化的,我们怎么才能够检测到位置的变化,并显示出来呢?
我们这里需要用到位置监听器LocationListener,当然,我们会查询出最佳的数据,因此需要设置Criteria
代码如下:
实例化LocationListener,在不同的回调函数中处理,这里我们只处理位置变化回调函数onLocationChanged,具体代码如下:
既然定义好了监听处理类后,我们就可以在LocationManager中注册这个监听:
这里locationManager.requestLocationUpdates(provider, 5000, 0, locationListener); 第一个参数是位置提供器,第2个是多少毫米请求一次,第3个是移动最小距离(米),第4个就是监听类了。
当然,我们可以取消位置监听:locationManager.removeUpdates(locationListener);
既然可以动态获取手机经纬度,那么怎么把经纬度解析成我们实际地址呢?
我们可以采用Geocoder类的getFromLocation方法解析位置信息,然后返回一系列地址信息List<Address>,再根据最符合的Address获取国家、州县、街道等等地址信息,代码如下:
以上是把经纬度、位置等信息解析成地址,那么反过来,我们是不是可以根据地址名称获得经纬度位置,然后在地图上标识起来呢?当然可以,现在就来根据实际地址获取经纬度吧:
跟上述方式一样,调用Geocoder的getFromLocationName方法,获得地址列表,然后取出最佳的地址,再获取经纬度,代码如下:
如果,我想知道,我是否逼近了某个区域范围,然后手机就发出通知,这个怎么办?
逼近某个范围,就是有一个经纬度对象GeoPoint 固定,另外一个GeoPoint 不断靠近变化,要测量这2个点的距离,可以使用Location的distanceBetween方法。具体代码如下:
上述代码就实现了2个点距离检测,然后我们可以根据判断2点距离是否在某一距离范围内,代码如下:
以上就是逼近某地范围的方法,但是你可能会想,我们的位置如果是变化的呢?所以你就必须在位置变化时候更新GeoPoint ,位置变化监听器LocationListener有个onLocationChanged方法回调每次变化的位置,当然你看了以上说明后自然知道怎么调用了。
再来几个开发中常会遇到问题吧。
我们怎么获取手机屏幕上一点对应的经纬度?(手机屏幕点转化为经纬度),或者某一经纬度怎么对应手机屏幕上一点的位置?
我们可以使用Projection类的fromPixels,以及toPixels方法分别转化为屏幕一点,以及屏幕一点的经纬度,当然获取 Projection是需要我们地图对象的getProjection方法,具体代码如下:
复
有了前面几项基础知识后,我们可以更深入发展了,就想之前提及的,在手机屏幕上绘制一个图层,标记一张图片或者一些信息,然后我们点击这个标记,他会提示一些信息。
这里主要就是如何解决标记到地图的问题了
这里使用到一个类Overlay,这个可作为地图上的标记,因此我们首先基础这个标记,然后绘制自己的图钉(图片),再重写它的onTouchEvent方法,以便点击这个图层时候提示信息,当然我们可以传递经纬度对象GeoPoint进去,以便在地图中显示:
我们可以看到我们绘制了一个图形,以及重写了触摸的方法,在触摸时候提示信息,接下来,我们必须把它“钉”在地图上进行显示,当然了,默认MapView都自动加载了图层,我们只需调用
List<Overlay> overlays=mapView.getOverlays(); 方法获得图层列表,然后把我们自定义的图层添加进去即可,代码如下:
这里解析一个问题,我们说是canvas.drawBitmap(bitmap, out.x, out.y-50, null);中第3个参数是要减去50呢?你看看这幅图就明白了,需要减去高才可以使图钉的指针正好对应屏幕的某点。
完成。假如你完全理解上面一系列东西,那么LBS已经有了基础。
private GeoPoint getGeoPoint(){ LocationManager locationManager=(LocationManager)getSystemService(Context.LOCATION_SERVICE); Location location=locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); return new GeoPoint((int)location.getLatitude(),(int)location.getLongitude()); }
从这里我们可以知道一个经纬度对象GeoPoint,它接受2个整形的经纬度值。在这里我们是使用GPS获取当前经纬度,如果用network呢?那么久换LocationManager.NETWORK_PROVIDER
当然,我们可能要考虑到更多的情况,比如说GPS模式是关闭的,那么如何启动它?很简单,我们只要判断是否启用了GPS,如果没有则跳到Settings中进行启用。代码如下:
boolean flag=locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); if(!flag){ Intent intent=new Intent(Settings.ACTION_SECURITY_SETTINGS); }
以上是获得当前手机所在地的经纬度。
当然当我们行走时候,位置是不断变化的,我们怎么才能够检测到位置的变化,并显示出来呢?
我们这里需要用到位置监听器LocationListener,当然,我们会查询出最佳的数据,因此需要设置Criteria
代码如下:
//获得最佳服务 private Criteria getCriteria(){ Criteria criteria=new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE);// 高精度 criteria.setAltitudeRequired(false);//海拔 criteria.setBearingRequired(false);//地轴线 criteria.setCostAllowed(false); //付费 criteria.setPowerRequirement(Criteria.POWER_LOW);//电量低 return criteria; }
实例化LocationListener,在不同的回调函数中处理,这里我们只处理位置变化回调函数onLocationChanged,具体代码如下:
//位置监听器,监听位置的改变 LocationListener locationListener=new LocationListener(){ //当位置变化时候激发 @Override public void onLocationChanged(Location location) { //根据位置获取经纬度对象 getGeoPoint(location); } //GPS,或者network可时候激发 @Override public void onProviderDisabled(String provider) { } //GPS,或者network不可时候激发 @Override public void onProviderEnabled(String provider) { } //GPS,或者network状态改变时候激发 @Override public void onStatusChanged(String provider, int status, Bundle extras) { switch(status){ case LocationProvider.OUT_OF_SERVICE: //不在服务 break; case LocationProvider.TEMPORARILY_UNAVAILABLE: //暂不可用 break; case LocationProvider.AVAILABLE : //可用 break; } } };
既然定义好了监听处理类后,我们就可以在LocationManager中注册这个监听:
private void registeListener(){ LocationManager locationManager=(LocationManager)getSystemService(Context.LOCATION_SERVICE); if(!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){ //如果GPS不可用,则跳转到Settings中进行设置 Intent intent=new Intent(Settings.ACTION_SECURITY_SETTINGS); startActivity(intent); } //查询最设和的服务信息 String provider=locationManager.getBestProvider(getCriteria(), true); //设置位置监听器,间隔5秒改变一次 locationManager.requestLocationUpdates(provider, 5000, 0, locationListener); }
这里locationManager.requestLocationUpdates(provider, 5000, 0, locationListener); 第一个参数是位置提供器,第2个是多少毫米请求一次,第3个是移动最小距离(米),第4个就是监听类了。
当然,我们可以取消位置监听:locationManager.removeUpdates(locationListener);
既然可以动态获取手机经纬度,那么怎么把经纬度解析成我们实际地址呢?
我们可以采用Geocoder类的getFromLocation方法解析位置信息,然后返回一系列地址信息List<Address>,再根据最符合的Address获取国家、州县、街道等等地址信息,代码如下:
//根据经纬度获得地址(国家,州县,街道等等) private void showAddressFromGeoPoint(GeoPoint gPoint) throws IOException{ StringBuilder sb=new StringBuilder(); Geocoder geoCode=new Geocoder(this,Locale.getDefault()); List<Address> addresses=geoCode.getFromLocation(gPoint.getLatitudeE6()/1E6, gPoint.getLongitudeE6()/1E6, 1); if(addresses.size()>0){ Address address=addresses.get(0); for(int i=0;i<address.getMaxAddressLineIndex();i++){ sb.append(address.getAddressLine(i)+"\n"); } sb.append(address.getLocality()+"\n"); sb.append(address.getPostalCode()+"\n"); sb.append(address.getCountryName()+"\n"); Toast.makeText(this, sb.toString(), Toast.LENGTH_LONG).show(); } }
以上是把经纬度、位置等信息解析成地址,那么反过来,我们是不是可以根据地址名称获得经纬度位置,然后在地图上标识起来呢?当然可以,现在就来根据实际地址获取经纬度吧:
跟上述方式一样,调用Geocoder的getFromLocationName方法,获得地址列表,然后取出最佳的地址,再获取经纬度,代码如下:
//根据地址获取经纬度信息GeoPoint private GeoPoint getGeoPointFromAddressName(String locationName) throws IOException{ Geocoder geoCode=new Geocoder(this,Locale.getDefault()); List<Address> addresses=geoCode.getFromLocationName(locationName, 1); if(addresses!=null){ double lati=addresses.get(0).getLatitude(); double longi=addresses.get(0).getLongitude(); return new GeoPoint((int)(lati*1E6),(int)(longi*1E6)); } return null; }
如果,我想知道,我是否逼近了某个区域范围,然后手机就发出通知,这个怎么办?
逼近某个范围,就是有一个经纬度对象GeoPoint 固定,另外一个GeoPoint 不断靠近变化,要测量这2个点的距离,可以使用Location的distanceBetween方法。具体代码如下:
//计算2点距离,经纬度 private float getDistance(GeoPoint startPoint,GeoPoint endPoint){ float []results=new float[3]; Location.distanceBetween(startPoint.getLatitudeE6()/1E6, startPoint.getLongitudeE6()/1E6, endPoint.getLatitudeE6()/1E6, endPoint.getLongitudeE6()/1E6, results); return results[0]; }
上述代码就实现了2个点距离检测,然后我们可以根据判断2点距离是否在某一距离范围内,代码如下:
//判断是否在多少米范围内 private boolean isNearAround(GeoPoint startPoint,GeoPoint endPoint,float meter){ float distance=getDistance(startPoint,endPoint); return (meter-distance>0)?true:false; }
以上就是逼近某地范围的方法,但是你可能会想,我们的位置如果是变化的呢?所以你就必须在位置变化时候更新GeoPoint ,位置变化监听器LocationListener有个onLocationChanged方法回调每次变化的位置,当然你看了以上说明后自然知道怎么调用了。
再来几个开发中常会遇到问题吧。
我们怎么获取手机屏幕上一点对应的经纬度?(手机屏幕点转化为经纬度),或者某一经纬度怎么对应手机屏幕上一点的位置?
我们可以使用Projection类的fromPixels,以及toPixels方法分别转化为屏幕一点,以及屏幕一点的经纬度,当然获取 Projection是需要我们地图对象的getProjection方法,具体代码如下:
复
//屏幕上一点获得经纬度 private GeoPoint FormScreenPoint(Point screen){ Projection projection=mapView.getProjection(); GeoPoint gpoint=projection.fromPixels(screen.x, screen.y); return gpoint; } //根据经纬度定位到手机屏幕上一点 private Point FromGeoPoint(GeoPoint gPoint){ Point out =new Point(); Projection projection=mapView.getProjection(); projection.toPixels(gPoint, out); return out; }
有了前面几项基础知识后,我们可以更深入发展了,就想之前提及的,在手机屏幕上绘制一个图层,标记一张图片或者一些信息,然后我们点击这个标记,他会提示一些信息。
这里主要就是如何解决标记到地图的问题了
这里使用到一个类Overlay,这个可作为地图上的标记,因此我们首先基础这个标记,然后绘制自己的图钉(图片),再重写它的onTouchEvent方法,以便点击这个图层时候提示信息,当然我们可以传递经纬度对象GeoPoint进去,以便在地图中显示:
//自定义图层标记 private class MyOverLay extends Overlay{ GeoPoint in=null; public MyOverLay(GeoPoint in){ this.in=in; } //在自定义绘制图层的方法中添加图钉(一张图片) @Override public boolean draw(Canvas canvas,MapView mapView, boolean shadow,long when){ //经纬度转化屏幕一点 Point out=new Point(); Projection proj=mapView.getProjection(); proj.toPixels(in, out); //获得图片并调用canvas绘制图片,其中第3个参数为Y轴坐标具体看图 Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); canvas.drawBitmap(bitmap, out.x, out.y-50, null); return true; } @Override public boolean onTouchEvent(MotionEvent e,MapView mapView){ if(e.getAction()==MotionEvent.ACTION_UP){ //根据屏幕一点获取经纬度 GeoPoint gpoint=mapView.getProjection().fromPixels((int)e.getX(), (int)e.getY()); //然后显示经纬度 String msg="您点击的地方经度为:"+gpoint.getLatitudeE6()/1E6+",纬度为:"+gpoint.getLongitudeE6()/1E6; Toast.makeText(getApplication(), msg, Toast.LENGTH_LONG).show(); //当然,您可以使用传递过来的对象,比如GeoPoint获取一些其他自定义对象信息,比如说什么地方,什么公司以及风景区等 } return true; } }
我们可以看到我们绘制了一个图形,以及重写了触摸的方法,在触摸时候提示信息,接下来,我们必须把它“钉”在地图上进行显示,当然了,默认MapView都自动加载了图层,我们只需调用
List<Overlay> overlays=mapView.getOverlays(); 方法获得图层列表,然后把我们自定义的图层添加进去即可,代码如下:
//在屏幕上打上标记(图钉) private void putOverLay(GeoPoint in){ // /定义标记 MyOverLay myOverLay=new MyOverLay(in); List<Overlay> overlays=mapView.getOverlays(); overlays.clear(); overlays.add(myOverLay); mapView.invalidate(); }
这里解析一个问题,我们说是canvas.drawBitmap(bitmap, out.x, out.y-50, null);中第3个参数是要减去50呢?你看看这幅图就明白了,需要减去高才可以使图钉的指针正好对应屏幕的某点。
完成。假如你完全理解上面一系列东西,那么LBS已经有了基础。
相关推荐
这个项目可能依赖于第三方的GeoCoding服务,如Google Maps API或OpenStreetMap Nominatim API。它们提供RESTful接口,可以接受经纬度并返回对应的行政区域信息。 2. **Spring Boot整合RESTful API**:Spring Boot...
总的来说,"Google Map地图下载小工具"是解决离线地图需求的有效解决方案,它通过灵活的参数设置,为用户提供了一种便捷的方式,来获取和使用Google Map的离线数据。在使用过程中,结合实际需求和注意事项,可以充分...
Location 在Android 开发中还是经常用到的,比如 通过经纬度获取天气,根据Location 获取所在地区详细Address (比如Google Map 开发).等。而在Android 中通过LocationManager 来获取Location .通常获取Location 有...
例如,(37.4219998, -122.1430003)表示了Google的总部所在地——加利福尼亚州山景城。 3. **保存地图坐标** 在应用中,保存地图坐标通常涉及数据库操作。当用户在地图上选择一个位置时,可以获取该位置的经纬度,...
获取鼠标所在位置的经纬度坐标是这些应用的基础。本文档详细介绍了如何在Flex环境中实现这一功能。 #### 一、基本概念介绍 1. **屏幕坐标**:屏幕坐标是指在计算机屏幕上显示元素的位置坐标。它通常以屏幕左上角为...
android获取经纬度且解析位置,该demo能够通过network和gps获取当前所在的经纬信息,并能实时的更新,并且能通过经纬度信息上传到googleMap上获取相对应的地址信息,返回的事json字符串,最后解析成一般的地址信息。...
3. **定位服务**:通过浏览器的Geolocation API,谷歌地图API可以获取用户设备的实时位置信息,用于显示用户当前所在的位置或者提供基于位置的服务。 4. **路线规划**:谷歌地图API支持驾车、步行、骑行等多种路线...
需要注意的是,`google.maps.Marker`的`getPosition()`方法用于获取marker当前的位置,即它的经纬度坐标。这些坐标可以被`computeDistanceBetween`方法用来计算两点之间的距离。 此外,示例代码中还可能出现OCR扫描...
在很多应用场景中,我们需要获取用户所在的城市信息,例如为了提供个性化服务或者进行地理定位相关的功能开发。本篇将详细介绍如何使用PHP与JavaScript结合来实现这一目标。 首先,我们来理解一下PHP和JavaScript在...
3. **API调用**:某些情况下,源码可能会依赖第三方API,如Google Maps Geocoding API或OpenStreetMap Nominatim API,来获取更精确的位置信息。这需要向这些服务发送HTTP请求,并处理返回的JSON或其他格式的数据。 ...
这个过程可能涉及到地理编码(Geocoding)服务,例如使用Google Maps Geocoding API,将经纬度转换为城市名。不过,描述中提到这部分花了较多时间整理,可能意味着源码作者采用了自建的映射关系库或者第三方API,如...
标题 "Locate IP Address Lookup Show on Map City by JavaScript" 暗示了我们要讨论的是一个使用JavaScript实现的项目,该项目能够定位用户的IP地址,并在地图上显示其所在的城市。这个功能常见于许多网站,用于...
该库通过提供简单的API,使得开发者能够方便地获取地址、经纬度坐标、城市、国家等与地理位置相关的数据。 在“geocoder-1.8.0-py2.py3-none-any.whl”这个文件中,包含了geocoder库的所有源代码和必要的元数据,这...
- **Google Maps API**:利用获取到的经纬度信息,在Google地图上标记出具体位置。 #### 应用场景: - **网络安全**:追踪恶意行为者的地理位置。 - **电子商务**:根据用户所在地区推送相关内容。 - **物流配送**...
结合HTML5的其他特性,如AJAX和Map API(如Google Maps API或Leaflet),可以创建出丰富的地理位置应用。例如,用户可以在网页上查看自己的实时位置,或者根据当前位置搜索附近的餐馆、商店等。 8. **示例代码** ...
6. API接口:为了获取IP地址的地理位置信息,开发者可能会使用公开的API,例如Google Maps Geocoding API、OpenStreetMap Nominatim API等。这些API提供了一种标准的接口,使得程序可以方便地获取和解析地理数据。 ...
在"autoform-location-map"中,地图是无样式的,这意味着开发者需要自行编写CSS代码来调整地图的外观和风格,以适应其所在的应用界面。这可能包括改变地图的色彩、缩放控件的位置、添加自定义图层等。通过修改CSS,...
在 Laravel 开发过程中,我们常常需要处理地理位置相关的数据,例如根据IP地址获取用户所在的经纬度,或者根据经纬度反向查询对应的地址。`laravel-geocoder` 是一个专门为 Laravel 5 设计的包,它简化了地理编码和...