OpenStreetMap学习(一)

本文介绍如何使用OSM API及特定的Java库创建一个简单的离线地图应用程序,并探讨了地图加载、marker设置等问题。

前两天试着将离线地图导入了一个叫OSMand的APP里,发现还有 诸多的缺点,详见http://blog.youkuaiyun.com/u014712516/article/details/50480953

所以想着自己弄一个类似的东西出来,于是去官网上找:http://wiki.openstreetmap.org/wiki/Main_Page

发现要调用OSM的API需要这三个东东:

1.osmdroid-android-4.2.jar   下载链接:https://code.google.com/p/osmdroid/wiki/Downloads

2.slf4j-android-1.6.1-RC1.jar   下载链接:http://www.slf4j.org/android/

3.osmbonuspack_v5.1     下载链接:https://github.com/MKergall/osmbonuspack/releases(我用的是eclipse,所以选择了这个,用AS的大神可以选更新的)


前二者是实例化地图所必须的包,第三个是在你的地图上使用marker、POI、划线等等功能所需要的,现在干脆一次性把它也加进来。


废话不多说,直接上代码

main.xml

<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <org.osmdroid.views.MapView
        android:id="@+id/myOSMmapview"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </org.osmdroid.views.MapView>

</RelativeLayout>


MainActivity.java

package com.tj.osmbeta1;

import org.osmdroid.bonuspack.overlays.Marker;
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.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends Activity {

	private MapView osm;
	private MapController mcontrol;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		
		osm = (MapView) findViewById(R.id.myOSMmapview);
		osm.setTileSource(TileSourceFactory.CYCLEMAP);
		osm.setBuiltInZoomControls(true);
		osm.setMultiTouchControls(true);
		
		mcontrol = (MapController) osm.getController();
		mcontrol.setZoom(11);
		
		GeoPoint center = new GeoPoint(39.94943,116.33507);
		mcontrol.animateTo(center);
		addMarker(center);
	}
	
	public void addMarker(GeoPoint center){
		Marker marker = new Marker(osm);
		marker.setPosition(center);
		marker.setAnchor(Marker.ANCHOR_CENTER,Marker.ANCHOR_BOTTOM);
		marker.setIcon(getResources().getDrawable(R.drawable.ic_launcher));
		
		osm.getOverlays().clear();
		osm.getOverlays().add(marker);
		osm.invalidate();
	}
	
	
	@Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        super.onCreateOptionsMenu(menu);  

        menu.add(1, Menu.FIRST, 1, "退出");
        return true;
	}
	@Override  
    public boolean onOptionsItemSelected(MenuItem item) {  
    
        switch(item.getItemId()){  
        case 1:  
            this.finish();
            break;  
        default:  
            return super.onOptionsItemSelected(item);  
        }  
          
        return true;  
    }  
}


另外,把AndroidManifest.xml里面的权限加上:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
	<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
	<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
	
	<uses-permission android:name="android.permission.INTERNET" />
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
	<uses-permission android:name="android.permission.STORAGE" />
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
	<uses-permission android:name="android.permission.WAKE_LOCK" />
	<uses-permission android:name="android.permission.CAMERA" />
	<uses-permission android:name="android.permission.VIBRATE" />
	<uses-permission android:name="android.permission.RECORD_AUDIO" />
	<uses-permission android:name="com.android.vending.BILLING" />
能力有限,我不管有的没的都加上来了。


现在的时间也就到此为止,只是很初步的实现了地图的基本功能。如果想要离线加载地图,可以把.obf文件拷贝到手机SD卡中的osmdroid文件夹的更目录即可。至于怎么生成.obf文件,可以看这篇文章:http://blog.youkuaiyun.com/u014712516/article/details/50480953




问题;

1.我发现当我用Mapkin进行渲染的时候地图会出现加载不出来的情况,后来只好选择了CYCLEMAP

2.通过把.obf文件放到根目录的方法可以读出离线的中国地图,但是读不出我自己修改过的地图,而这个在OSMand里面是可以做到的,现在还没想明白怎么回事,难道要调用一些别的方法?
3.一开始地图显示的中心点并不是我想要的点,但是安卓小人站的位置确实是我定的位置,不知道是为什么。


最后把资源包上传一下http://download.youkuaiyun.com/download/u014712516/9398492


接下来打算把那个读取地图的问题解决了,顺便研究一下卫星定位的问题。

由于个人能力有限,难免有错误,请各位不吝批评指正~



### OpenStreetMap 数据标注方法、工具与教程 OpenStreetMap(OSM)是个全球性的开源地图项目,用户可以通过其平台进行地理数据的采集、编辑和共享。以下是关于如何在 OpenStreetMap 中进行数据标注的相关方法、工具及教程。 #### 1. 数据标注方法 在 OpenStreetMap 中,数据标注主要涉及点(Point)、线(Line)、面(Polygon)等地理要素的添加和编辑。这些标注可以通过以下方式进行: - **手动标注**:用户可以直接在 OSM 的在线编辑器中绘制地理要素,并为其添加属性信息。 - **批量标注**:通过使用脚本或 API 接口将外部数据导入到 OSM 平台中[^4]。 - **自动化标注**:利用机器学习或计算机视觉技术,从遥感影像中提取地理特征并自动标注到地图上[^5]。 #### 2. 常用工具 为了更高效地完成数据标注任务,可以借助以下工具: - **iD 编辑器**:这是 OSM 官方推荐的在线编辑器,适合初学者使用。它提供了直观的界面和简单的操作流程[^6]。 - **JOSM (Java OpenStreetMap Editor)**:个功能强大的桌面编辑器,支持复杂的编辑任务以及插件扩展[^7]。 - **QGIS**:款专业的地理信息系统软件,能够加载 OSM 数据并对其进行编辑、分析和可视化[^8]。 - **Python 脚本**:结合 Overpass API 或其他相关库,开发者可以编写 Python 脚本来实现数据的获取、处理和标注[^9]。 #### 3. 学习资源与教程 对于希望深入了解 OpenStreetMap 数据标注的用户,以下是些推荐的学习资源: - **官方文档**:OSM 提供了详尽的 [编辑指南](https://wiki.openstreetmap.org/wiki/Editing) 和 [标签手册](https://wiki.openstreetmap.org/wiki/Map_Features),帮助用户掌握正确的标注规范[^10]。 - **社区教程**:许多 OSM 社区成员分享了自己的经验,例如通过 YouTube 视频或博客文章展示具体的操作步骤[^11]。 - **第三方课程**:像 Coursera、Udemy 等平台上也有针对 GIS 和 OSM 的专项课程,涵盖从基础到高级的知识点[^12]。 ```python import pandas as pd from geopy.geocoders import Nominatim # 示例代码:将地址转换为经纬度坐标 def get_coordinates(address): geolocator = Nominatim(user_agent="osm_data") location = geolocator.geocode(address) return location.latitude, location.longitude # 假设有如下 DataFrame data = pd.DataFrame({ "name": ["Park A", "School B"], "address": ["123 Park St, City X", "456 School Rd, City Y"] }) # 获取经纬度 data[["latitude", "longitude"]] = data["address"].apply(lambda x: pd.Series(get_coordinates(x))) print(data) ``` 以上代码片段展示了如何利用 `geopy` 库将地址信息转化为经纬度坐标,便于后续在 OpenStreetMap 上进行标注[^13]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值