Here Map Tile REST API example, Base Map, Aerial and Traffic Tile

In this example, we show how to display Here map of Base Map, Aerial and Traffic Tile.


MainActivity.java
package com.example.androidhererestmapimage;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import android.support.v7.app.ActionBarActivity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.Spinner;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {

public class LoadHereMapTask extends AsyncTask<URL, Void, Bitmap> {

ImageView imageView;

LoadHereMapTask(ImageView v){
imageView = v;
}

@Override
protected Bitmap doInBackground(URL... params) {
Bitmap bm = null;
URL urlMapImage = params[0];
try {
bm = BitmapFactory.decodeStream(urlMapImage.openConnection().getInputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bm;
}

@Override
protected void onPostExecute(Bitmap result) {
imageView.setImageBitmap(result);
}

}

private final int optTypeBaseMap = 0;
private final int optTypeAerialTile = 1;
private final int optTypeTrafficTile = 2;
String[] optTypes = {
"Base Map",
"Aerial Tile",
"Traffic Tile"};

SeekBar sbZoom;
Spinner spType;
TextView textviewMapRqs512, textviewMapRqs256;
ImageView mapImage1, mapImage2;

ArrayAdapter<String> spTypeAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

textviewMapRqs512 = (TextView)findViewById(R.id.maprqs512);
textviewMapRqs256 = (TextView)findViewById(R.id.maprqs256);
mapImage1 = (ImageView)findViewById(R.id.mapimage1);
mapImage2 = (ImageView)findViewById(R.id.mapimage2);
sbZoom = (SeekBar)findViewById(R.id.sbzoom);
sbZoom.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){

@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub

}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
updateHereMap();
}});

spType = (Spinner)findViewById(R.id.sptype);
spTypeAdapter = new ArrayAdapter<String>(
this,android.R.layout.simple_spinner_item, optTypes);
spTypeAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
spType.setAdapter(spTypeAdapter);

spType.setOnItemSelectedListener(new OnItemSelectedListener(){

@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
updateHereMap();
}

@Override
public void onNothingSelected(AdapterView<?> parent) {
// TODO Auto-generated method stub

}});

updateHereMap();

}

private void updateHereMap(){
URL urlTarget;

try {
String strTarget512 = genHereMapTileRequest("/512");
textviewMapRqs512.setText(strTarget512);
urlTarget = new URL(strTarget512);
new LoadHereMapTask(mapImage1).execute(urlTarget);

String strTarget256 = genHereMapTileRequest("/256");
textviewMapRqs256.setText(strTarget256);
urlTarget = new URL(strTarget256);
new LoadHereMapTask(mapImage2).execute(urlTarget);
} catch (MalformedURLException e) {
e.printStackTrace();
}
}

private String getMercatorProjection(double lat, double lon, int z){
/*
* reference:
* http://developer.here.com/rest-apis/documentation/enterprise-map-tile/topics/key-concepts.html
*/

double latRad = lat * Math.PI/180;
double n = Math.pow(2, z);
double xTile = n * ((lon + 180)/360);
double yTile = n * (1-(Math.log(Math.tan(latRad) + 1/Math.cos(latRad))/Math.PI))/2;

String strProjection = "/"+ String.valueOf(z)
+ "/" + String.valueOf((int)xTile)
+ "/" + String.valueOf((int)yTile);

return strProjection;
}

private String genHereMapTileRequest(String pixelCnt){
/*
* reference:
* https://developer.here.com/rest-apis/documentation/enterprise-map-tile/topics/resource-map-tile.html
*/

String BaseURL;
String Path = "/maptile/2.1/";
String Resource;
String Version = "/newest";
String scheme;

int type = spType.getSelectedItemPosition();
switch(type){
case optTypeBaseMap:
BaseURL = "http://1.base.maps.cit.api.here.com";
Resource = "maptile";
scheme = "/normal.day";
break;
case optTypeAerialTile:
BaseURL = "http://2.aerial.maps.cit.api.here.com";
Resource = "maptile";
scheme = "/satellite.day";
break;
case optTypeTrafficTile:
BaseURL = "http://4.traffic.maps.cit.api.here.com";
Resource = "traffictile";
scheme = "/normal.day";
break;
default:
return null;
}

String ApplicationId = "DemoAppId01082013GAL"; //for demo
String ApplicationCode = "AJKnXv84fjrb0KIHawS0Tg"; //for demo
String png8 = "/png8";

int zoom = sbZoom.getProgress();
//Berlin
String strZoomColumnRow = getMercatorProjection(52.525439, 13.38727, zoom);

String rqs = BaseURL + Path + Resource + Version + scheme + strZoomColumnRow
+ pixelCnt
+ png8
+ "?app_id=" + ApplicationId
+ "&app_code=" + ApplicationCode;

return rqs;
}

}

/res/layout/activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.androidhererestmapimage.MainActivity" >

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:autoLink="web"
android:text="http://android-er.blogspot.com/"
android:textStyle="bold" />

<SeekBar
android:id="@+id/sbzoom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="13"
android:progress="5" />

<Spinner
android:id="@+id/sptype"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >

<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:layout_margin="5dp"
android:orientation="vertical" >

<TextView
android:id="@+id/maprqs512"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<ImageView
android:id="@+id/mapimage1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>

<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:layout_margin="5dp"
android:orientation="vertical" >

<TextView
android:id="@+id/maprqs256"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<ImageView
android:id="@+id/mapimage2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>

</LinearLayout>

uses-permission of "android.permission.INTERNET" is needed in AndroidManifest.xml.

download filesDownload the files.

~ More examples of using Here Map REST API on Android

0 comments:

Post a Comment