顯示具有 OSMDROID 標籤的文章。 顯示所有文章
顯示具有 OSMDROID 標籤的文章。 顯示所有文章

2015年8月10日 星期一

OSMDROID: Overlay


介紹Introduction


Overlay 可以說是OSMDROID中一個恨重要的一部分,因為這個物件可以讓我們的地圖擁有更多的功能,像是在地圖上加上其他地圖(如鐵軌地圖等),或著是增加判定(如按住時要出現什麼功能)

範例Example


首先我們先建立一個類別,然後將他繼承Overlay 繼承之後他會顯示錯誤,因為必須要在Override
draw(Canvas canvas, MapView mapView, boolean b)
這個method
public class DemoOverlay extends Overlay {
    @Override
    protected void draw(Canvas canvas, MapView mapView, boolean b) {}//繪製地圖
}
當我們Override之後還是會發現,IDE依舊顯示說他錯誤,原因在於Overlay本身沒有預設建構元,所以我們必須針對我們所定義的類別寫一個建構元, 但就如同我前面所寫,Overlay本身沒有預設建構元,那我們就會想問那要怎麼樣才能正確的定義好呢?這時候我們就要來思考Overlay這個類別特性了 Overlay他是一個建立在MapView上面的一層圖層,而MapView是Activity的內容之一,那我們就可以針對這點去查一下API,果然Overlay本身就有一個建構元叫做
public Overlay(Context context)
這時我們的IDE就不會再報錯了,那我們的基本型也就完成了
public class DemoOverlay extends Overlay {
    public DemoOverlay(Context ctx){ //初始建構元,如果沒有這個會報錯誤,因為Overlay本身沒有定義空白建構元
        super(ctx);
    }
    @Override
    protected void draw(Canvas canvas, MapView mapView, boolean b) {} //繪製地圖
}
以下是個小小的範例,這個程式碼是在說當使用者按住螢幕的時候,就會顯示"Long Press"的提示文字
public class DemoOverlay extends Overlay {
    Context ctx;
    public DemoOverlay(Context ctx){ //初始建構元,如果沒有這個會報錯誤,因為Overlay本身沒有定義空白建構元
        super(ctx);
        this.ctx = ctx;
    }
    @Override
    protected void draw(Canvas canvas, MapView mapView, boolean b) { //繪製地圖

    }

    @Override
    public boolean onLongPress(MotionEvent e, MapView mapView) { //判定按住時,要做什麼
        Toast.makeText(ctx,"Long Press",Toast.LENGTH_SHORT);
        return super.onLongPress(e, mapView);
    }
}

那我們現在完成Overlay了,但是你會發現為什麼我們的Overlay沒有作用呢? 那是因為我們還需要把他載入到我們的MapView當中 載入方式非常簡單
DemoOverlay demoOverlay = new DemoOverlay(this);//宣告一個DemoOverlay的物件
mapView.getOverlays().add(demoOverlay);//mapView是你所宣告的MapView物件

mapView加入Overlay有先後順序,所以我建議如果是顯示層的Overlay(如鐵路地圖、標示等)要比判定層的Overlay(如長按增測)還要早加入MapView當中

2015年6月28日 星期日

OSMDROID:TileProvider


介紹Introduction


  TileProvider是在OSMDROID中很重要的一個部分,他負責從Tile Server或記憶卡中將圖資拿出來並喂給MapView去做顯示。

OSMDROID內建的圖資


  在OSMDROID中有支援以下幾種圖資:
OpenStreetMap提供
(1)MAPNIK
OpenCycleMap提供
(2)CYCLEMAP
Open Public Transport Map提供
(3)PUBLIC_TRANSPORT

MapQuest提供
(4)MAPQUESTOSM
(5)MAPQUESTAERIAL
(6)MAPQUESTAERIAL_US

CloudMade提供
(7)CLOUDMADESTANDARDTILES
(8)CLOUDMADESMALLTILES

OpenStreetMap Nederland提供
(9)FIETS_OVERLAY_NL
(10)BASE_OVERLAY_NL
(11)ROADS_OVERLAY_NL

以上圖資使用方式(以MAPNIK為例)
mapview.setTileSource(TileSourceFactory.MAPNIK);

自訂TileSource


看不慣內建的TileSource嗎?一定在想說可不可以更換對吧答案是可以的喔~,只要這樣寫就好了(以CartoDB Light為例,更多TileSource可以去OpenStreetMap的Wiki查看)
public static final OnlineTileSourceBase CARTODB = new XYTileSource("CartoDB", ResourceProxy.string.unknown,2,19,256,".png",new String[]{
            "http://a.basemaps.cartocdn.com/light_all/"});
先來說一下XYTileSource的參數說明
XYTileSource("Tile的名稱", Tile的ID(如果在ResourceProxy中沒有定義直接用unknown就好), Tile最小的zoom level, Tile最大的zoom level, Tile的圖資大小(256x256就寫256,如果是512x512就寫512), "Tile圖資的副檔名(如果是png就寫 .png)", 圖資的網址或位置(如果有多個位置可以用String[]來定義多個位置) );
這樣宣告完就能設定MapView的圖資是我們自己自訂的囉~
mapview.setTileSource(CARTODB);

2015年5月22日 星期五

OSMDROID: MapController


介紹Introduction


  MapController拆開來是 Map Controller但是雖然說是Controller但是能控制的真的還蠻有限的...當然這個類別只是讓一些操作比較容易一點,所以如果你想直接操作MapView的話也是可以。在MapController中主要就是在設定啟動時的Map Center與設定Map的Zoom Level,還有就是縮放特效的調整。

方法介紹Method Introduction


設定螢幕正中央的經緯度
GeoPoint startPoint = new GeoPoint(latitude, longitude);//GeoPoint(緯度y,經度x)
mapController.setCenter(startPoint);
地圖Zoom Level設定(通常值是介於1~18,這取決於圖資所能提供的Zoom Level來決定,值越大就越多細節)
mapController.setZoom(12); //將Zoom Level設定在12
縮放動畫設定
mapController.stopAnimation(true);//停止動畫效果
mapController.stopAnimation(false);//開啟動畫效果

2015年5月10日 星期日

OSMDROID:MapView


簡介


  OpenStreetMap最核心的部分,就是他的地圖囉,而在OSMDROID中當然也會有個東西用來顯示地圖的元件,那就是我們現在要來介紹的MapView
OSMDROID的MapView是改寫Android本身的MapView,簡單來說就是把原本是Google Map的MapView變成是OpenStreetMap的。

使用方式


OSMDROID中用MapView有兩種方式,一種是寫在Layout裡面,一種是寫在Activity裡面 首先先介紹如果寫在Layout裡面會是什麼樣子
<org.osmdroid.views.MapView
        android:id="@+id/mapview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tilesource="Mapnik"
        />

然後是Activity中的寫法
public class MainActivity extends Activity {
    @Override public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        MapView map = (MapView) findViewById(R.id.map);
        map.setTileSource(TileSourceFactory.MAPNIK);
    }
}

這兩種寫法都很棒,就看個人習慣囉

另外MapView還有提供一些其他的方法,像是
這是在MapView上新增內建的縮放工具
map.setBuiltInZoomControls(true);

這個是啟用兩指縮放功能
map.setMultiTouchControls(true);

這是限制最大縮放等級
map.setMaxZoomLevel(16);
這是限制最小縮放等級
map.setMinZoomLevel(1);
這個是在設定說是否當本機沒有圖資時,允許讓MapView去跟Tile Server要圖資
map.useDataConnection(true);
最後這個是個很重要的東西,因為Android能支援的螢幕解析度太多了,但圖資的解析度是固定的,所以可能會出現到明明Zoom Level已經到最細緻的部分了,但還是沒辦法看到全部的東西,所以OSMDROID中提供這個方法可以根據手機的螢幕解析度去將圖資做一些調整,讓圖資顯示正常。
map.setTilesScaledToDpi(true);

2015年5月6日 星期三

OSMDROID: Introduction



簡介  Introduction

OSMDROID是一個Android的函式庫,主要目的是要提供與OpenStreetMap(簡稱OSM)互動的工具,裡面包含了:


MapView:

    提供一個類似Android中MapView的環境,讓OSM的圖資可以顯示在Android中,並可以做拖拉,縮放,圖資來源設定等動作。
MapController:

    這是個設定工具,也就是對於MapView的Zoom Level與起始位置做設定。
TileProvider:

    TileProvider主要是負責MapView圖資的部分,OSMDROID本身的MapView是需要給他一個圖資來源才能運作的,而提供圖資這個部分就是TileProvider的工作。
Overlay:

    Overlay照字面上就是圖層,在OSMDROID中底層是MapView,但如果我們需要去新增一些事件, 要繪製矩形區域, 放置指標等行為就會需要去新增一個圖層定義其行為模式。



安裝  Install

  1. 使用Android Studio

    Android Studio真的是個很棒的工具,因為在安裝Library上面真的非常的方便,像OSMDROID你只需要在專案中建立一個libs的資料夾,然後把osmdroid的jar檔跟slf4j-android(載點)放進去就可以囉
    p.s 如果你發現你放進去了但是卻不能使用的話,請檢查一下專案中的build.gradle中的dependencies大括號裡面有沒有 compile fileTree(dir: 'libs', include: ['*.jar']) 這行,如果沒有補上去之後Sync就會正常了。
  2. 使用Maven

    把
    <dependency>
      <groupid>org.osmdroid</groupid>
      <artifactid>osmdroid-android</artifactid>
      <version>4.3</version>
    </dependency>
    

    跟
    <dependency>
        <groupid>org.slf4j</groupid>
        <artifactid>slf4j-android</artifactid>
        <version>1.6.1-RC1</version> 
    </dependency>
    

    放進Maven設定檔中就可以囉。
  3. 使用Eclipse

    把OSMDROID的Jar檔跟slf4j-android(載點)下載好,之後
    對著專案點右鍵 內容(Properties) > Java Build Path > Add External JARs > 選擇剛下載的OSMDROID跟slf4j-android > 確定 這樣就完成囉。
最後記得別忘了在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_WIFI_STATE" />
<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" />


下載  Download


    你們可以從(網址)取得最新版本(OSMDROID在Google Code上面也有上傳相關的檔案,但是版本到4.2就停止更新了)
當你進去的時候你會發現有三種不同的檔名,分別是:

  1. osmdroid-android-x.x-javadoc.jar

        這個裡面存放的是OSMDROID這個版本中的所有API的說明,解壓縮之後裡面會是個網站,點擊index.html之後你就會看到















    這個漂亮的網站囉~
  2. osmdroid-android-x.x-sources.jar

        這個檔案中存放的就是完整OSMDROID的原始碼,也就是可以讓你離線也能查閱原始碼喔,當然如果你喜歡線上版的你也可以參閱他們Github的專案
  3. osmdroid-android-x.x.jar

        這個就是我們要放在我們專案中的jar檔囉,裡面放了全部OSMDROID編譯過的檔案,讓我們可以在我們的程式中使用。