浅谈百度地图的简单开发之实现地图全景,内景展示功能(四)

     今天,我就接着来浅谈一下关于百度地图的内景,外景的展示功能。今天具体要实现的功能就是输入该地点的名称然后就展示该地点的内景图片,有内景就展示内景,没有则显示该地点的街景,该功能是参考百度地图官方的API来实现。

     实现街景展示的地点的搜索,需要涉及到几个方面的知识:HttpClient网络请求封装,解析JSON数据,封装解析后JSON数据。其实展示内景或者外景很简单,只需要获取到内景的uid(POI的id),外景的经纬度即可,然后通过相应的API即可设置。关键点就是如何去获得我输入地点的uid或者经纬度呢??这时候百度地图开放平台提供一个接口,就是输入一地点它就会返回该地点的uid和经纬度等信息的JSON数据,而我们只需要去解析这些JSON数据,就可以得到我们想要的uid和经纬度信息。大致的思路是这样的。

一、熟悉百度地图官方接口API数据的使用。

1、首先进入百度地图API官网,点击进入一个web服务API,然后选择PlaceAPI

通过以上介绍你应该就可以得到一个可以测试的URL,只要传入我们申请的APPKEY,根据传入不同的地点名称就会返回一个JSON数据。到底可不可以呢,其实我们可以测试一下,如果可以的话,我只要按要求拼接好URL,并把该URL粘贴到浏览器地址栏会返回一大串的JSON数据,如果返回了,那么我们成功拿到了数据,就可以进行下一步了。

http://api.map.baidu.com/place/v2/search?ak=3QIYhSeKPK770bpwzepo9GI1&output=json&query=北京大学&page_size=10&page_num=0&scope=1&region=全国

看来我们这样的拼接的URL还是存在着问题,它说少了一个参数,其实仔细思考一下,发现也很正常,因为我们的APPKEY是申请的类型Android手机类型,而这里的接口是提供web服务的,如果申请的APPKEY的类型是JavaScript类型的话,那么就无需mcode参数。而如果是android或者IOS则需要在URL后面再增添一个mcode参数,那么我们知道mcode是必需的,那么这mcode参数值是什么呢??其实的它的值就是你的Eclipse中的SHA1 fingerprint值和你的项目的包名组合中间用“;"连接具体如下:

 

最终得到如下的URL:

http://api.map.baidu.com/place/v2/search?ak=nylibTfKmZw9mGe3juhT3U9x&output=json&query=北京大学&page_size=10&page_num=0&scope=1&region=全国&mcode=F5:3E:06:3E:FC:E8:ED:19:60:2E:99:63:D8:78:85:2E:EB:12:9D:BE;com.mikyou.maptest

 可以使用如下的URL粘贴浏览器测试一下,看是否可以返回JSON数据。最终发现可以返回JSON数据,那么到这里我们就知道了如何从百度官方拿到我们想要的数据。

并且从返回的JSON数据可以得到lat(经度),lng(纬度),streetId(街景id),uid(内景Id)等一系列的数据。那么接下来我们只需要利用的android的HttpClient中的get或post请求网络数据,得到返回的JSON数据,然后我们解析这些JSON数据得到经纬度,streetid,uid,然后把这些设置给百度全景展示的API即能实现全景和内景功能。

二、要实现全景功能需要在AndroidManifest.xml中配置一下BaseAppcation,用于对全景显示的初始化

package com.mikyou.tools;

import android.app.Application;
import android.content.Context;
import android.widget.Toast;

import com.baidu.lbsapi.BMapManager;
import com.baidu.lbsapi.MKGeneralListener;

import com.baidu.mapapi.SDKInitializer;

public class BaseApplication extends Application {
	private static Context mContext;
	public static float sScale;
	public static int sWidthDp;
	public static int sWidthPix;
	public BMapManager mBMapManager = null;
	private static BaseApplication mInstance;
	public static BaseApplication getInstance() {
		return mInstance;
	}
	@Override
	public void onCreate() {
		super.onCreate();
		SDKInitializer.initialize(this);
		initEngineManager(this);
		mContext = this;
		mInstance = this;
		sScale = getResources().getDisplayMetrics().density;
		sWidthPix = getResources().getDisplayMetrics().widthPixels;
		sWidthDp = (int) (sWidthPix / sScale);
	}
	public void initEngineManager(Context context) {
		if (mBMapManager == null) {
			mBMapManager = new BMapManager(context);
		}
		if (!mBMapManager.init(new MyGeneralListener())) {
			Toast.makeText(
					BaseApplication.getInstance().getApplicationContext(),
					"BMapManager!", Toast.LENGTH_LONG).show();
		}
	}
	public static class MyGeneralListener implements MKGeneralListener {
		@Override
		public void onGetPermissionState(int iError) {
		
			if (iError != 0) {
			} else {
			}
		}
	}
}
 <application
       android:name="com.mikyou.tools.BaseApplication"<!-- 配置在此处 -->
        android:allowBackup="true"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="nylibTfKmZw9mGe3juhT3U9x" />

        <activity
            android:name="com.mikyou.maptest.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" >
            <intent-filter>
                <action android:name="com.baidu.location.service_v2.2" >
                </action>
            </intent-filter>
        </service>

        <activity
            android:name="com.mikyou.maptest.OtherPnoramaActivity"
            android:label="@string/title_activity_other_pnorama" >
        </activity>
    </application>


 

三、实现HttpClient中的网络数据请求,自己个人封装一个HttpUtil类,里面有个方法它能直接返回一个JSON对象。

package com.mikyou.tools;

import java.io.IOException;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;

/**
 * @author mikyou
 * 封装get和post方式请求
 * HttpClient 维护session
 * 一个HttpClient对象代表一个浏览器
 * 高度封装了客户端与服务端交互的,可以直接返回一个JSONObject对象
 * */
public class H
  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
可以使用Google VR SDK来展示360度全景图。首先,你需要将全景图作为纹理加载到OpenGL ES中,并将其用作天空盒子的背景。然后,你可以创建一个Sphere(球体)或者Cube Map(立方体映射)来渲染全景图。接下来,你可以使用Google VR SDK提供的GvrView组件来创建一个VR场景,并将渲染的全景图作为场景的背景。最后,你可以使用GvrView组件提供的控制器来让用户在VR场景中移动和交互。 以下是一个简单的示例代码: ``` public class MainActivity extends AppCompatActivity { private GvrView gvrView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); gvrView = findViewById(R.id.gvr_view); gvrView.setEGLConfigChooser(8, 8, 8, 8, 16, 0); gvrView.setRenderer(new MyRenderer(this)); gvrView.setTransitionViewEnabled(false); // Enable VR Mode. gvrView.setStereoModeEnabled(true); gvrView.setDistortionCorrectionEnabled(true); // Enable Cardboard-trigger feedback. gvrView.enableCardboardTriggerEmulation(); // Associate the GvrView with this activity. gvrView.setTransitionViewEnabled(false); gvrView.setOnCloseButtonListener(new Runnable() { @Override public void run() { finish(); } }); } @Override protected void onResume() { super.onResume(); gvrView.onResume(); } @Override protected void onPause() { super.onPause(); gvrView.onPause(); } @Override protected void onDestroy() { gvrView.shutdown(); super.onDestroy(); } } ``` 你同样需要实现一个MyRenderer类,它继承自GvrView.Renderer,并在onDrawFrame()方法中渲染全景图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊喵先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值