移动应用地图工具包WhirlyGlobe-Maply新建android项目

WhirlyGlobe-Maply是一个基于OpenGL ES、专注移动应用的开源地图工具包,支持ios和android平台,本文以android平台为例。

环境:windows7 64位,Androidstudio 1.2.2,WhirlyGlobe-Maply(下载地址

打开Androidstudio,新建一个名为“HelloEarth”的项目:
这里写图片描述

选择SDK
这里写图片描述

选择空的activity
这里写图片描述

保持默认名称MainActivity,也可以修改名称
这里写图片描述
点击Finish完成。

复制WhirlyGlobeMaply.aar(下载压缩包app/libs/WhirlyGlobeMaply.aar)到app/libs文件夹下:
这里写图片描述

打开build.gradle(Project:HelloEarth)文件,在allprojects里面添加如下内容:
这里写图片描述
这里写图片描述

打开build.gradle(Module:app)文件,在dependencies里面添加以下内容:
这里写图片描述
这里写图片描述

右键点击MainActivity,在项目窗口中选择一个新的空白的Fragment,命名为HelloGlobeFragment,去掉三个对勾
这里写图片描述
这里写图片描述

打开activity_main.xml,注释掉原有的HelloWorld文本框,改为以下内容

<RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <!--<TextView android:text="@string/hello_world" android:layout_width="wrap_content"-->
        <!--android:layout_height="wrap_content" />-->
    <fragment
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:name="com.example.administrator.helloearth.HelloGlobeFragment"
        android:id="@+id/fragment"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"></fragment>


</RelativeLayout>

打开HelloGlobeFragment.java,修改原有的代码为以下代码

package com.example.administrator.helloearth;


import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.mousebird.maply.GlobeMapFragment;
import com.mousebird.maply.QuadImageTileLayer;
import com.mousebird.maply.RemoteTileInfo;
import com.mousebird.maply.RemoteTileSource;
import com.mousebird.maply.SphericalMercatorCoordSystem;
import java.io.File;


/**
 * A simple {@link Fragment} subclass.
 */
public class HelloGlobeFragment extends GlobeMapFragment {


//    public HelloGlobeFragment() {
//        // Required empty public constructor
//    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle inState) {
//        TextView textView = new TextView(getActivity());
//        textView.setText(R.string.hello_blank_fragment);
//        return textView;
        super.onCreateView(inflater,container,inState);
        return baseControl.getContentView();
    }

    @Override
    protected MapDisplayType chooseDisplayType(){
        return MapDisplayType.Globe;
    }

    @Override
    protected void controlHasStarted(){
        // 设置瓦片地图
        String cacheDirName="stamen_watercolor";
        File cacheDir=new File(getActivity().getCacheDir(),cacheDirName);
        cacheDir.mkdir();
        RemoteTileSource remoteTileSource=new RemoteTileSource(new RemoteTileInfo("http://tile.stamen.com/watercolor/","png",0,18));
        remoteTileSource.setCacheDir(cacheDir);
        SphericalMercatorCoordSystem coordSystem=new SphericalMercatorCoordSystem();

        // 当为全球显示时使用globeControl
        // 当为地图显示时使用mapControl
        QuadImageTileLayer baseLayer=new QuadImageTileLayer(globeControl,coordSystem,remoteTileSource);
        baseLayer.setImageDepth(1);
        baseLayer.setSingleLevelLoading(false);
        baseLayer.setUseTargetZoomLevel(false);
        baseLayer.setCoverPoles(true);
        baseLayer.setHandleEdges(true);

        // 添加图层并确定位置
        globeControl.addLayer(baseLayer);
        globeControl.animatePositionGeo(-3.6704803, 40.5023056, 5, 1.0);

    }
}

成果如图,可以通过双击放大:
这里写图片描述

以上是创建球状地图,接下来我们创建二维地图:

如上述过程选择一个新的空白的Fragment,命名为HelloMapFragment,修改activity_main.xml内容

<RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <!--<TextView android:text="@string/hello_world" android:layout_width="wrap_content"-->
        <!--android:layout_height="wrap_content" />-->
    <!--<fragment-->
        <!--android:layout_width="fill_parent"-->
        <!--android:layout_height="fill_parent"-->
        <!--android:name="com.example.administrator.helloearth.HelloGlobeFragment"-->
        <!--android:id="@+id/fragment"-->
        <!--android:layout_centerVertical="true"-->
        <!--android:layout_centerHorizontal="true"></fragment>-->

    <fragment
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:name="com.example.administrator.helloearth.HelloMapFragment"
        android:id="@+id/fragment"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"></fragment>

</RelativeLayout>

修改HelloMapFragment.java代码

package com.example.administrator.helloearth;


import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.mousebird.maply.GlobeMapFragment;
import com.mousebird.maply.QuadImageTileLayer;
import com.mousebird.maply.RemoteTileInfo;
import com.mousebird.maply.RemoteTileSource;
import com.mousebird.maply.SphericalMercatorCoordSystem;
import java.io.File;


/**
 * A simple {@link Fragment} subclass.
 */
public class HelloMapFragment extends GlobeMapFragment {


//    public HelloGlobeFragment() {
//        // Required empty public constructor
//    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle inState) {
//        TextView textView = new TextView(getActivity());
//        textView.setText(R.string.hello_blank_fragment);
//        return textView;
        super.onCreateView(inflater,container,inState);
        return baseControl.getContentView();
    }

    @Override
    protected MapDisplayType chooseDisplayType(){
        return MapDisplayType.Map;
    }

    @Override
    protected void controlHasStarted(){
        // 设置瓦片地图
        String cacheDirName="stamen_watercolor";
        File cacheDir=new File(getActivity().getCacheDir(),cacheDirName);
        cacheDir.mkdir();
        RemoteTileSource remoteTileSource=new RemoteTileSource(new RemoteTileInfo("http://tile.stamen.com/watercolor/","png",0,18));
        remoteTileSource.setCacheDir(cacheDir);
        SphericalMercatorCoordSystem coordSystem=new SphericalMercatorCoordSystem();

        // 当为全球显示时使用globeControl
        // 当为地图显示时使用mapControl
        QuadImageTileLayer baseLayer=new QuadImageTileLayer(mapControl,coordSystem,remoteTileSource);
        baseLayer.setImageDepth(1);
        baseLayer.setSingleLevelLoading(false);
        baseLayer.setUseTargetZoomLevel(false);
        baseLayer.setCoverPoles(true);
        baseLayer.setHandleEdges(true);

        // 添加图层并确定位置
        mapControl.addLayer(baseLayer);
        mapControl.animatePositionGeo(103.994067, 30.770697, 5, 1.0);
        mapControl.setAllowRotateGesture(true);
    }
}

成果如图,同样双击放大:
这里写图片描述

完成!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
World Map Globe Edition 2 添加到您的场景一个美丽的互动三维世界地图,只需点击几下。将全局预置拖到您的场景中并自定义外观。 这个新的主要版本改进了视觉效果并支持标准/内置和LWRP。所有的新特性和改进都将包含在这个版本中,而以前的版本只会收到修复。 完整的资产具有强大的可视化功能、示例和丰富的API,适用于为VR、桌面和移动设备构建游戏和应用程序。 ***主要特点*** -从程序上划分了240个国家、4112个省和州的边界,以及世界上7144个人口最多的城市的地理位置互联网。前沿城市数据包括在资产中,使它非常快速和离线工作! -完全交互式地图:当您将鼠标放在国家、省/州和城市上时,它们将高亮显示。 -19种地球风格,包括定制的行星着色器,具有浮雕、白天/夜晚、大气、云和城市灯光效果,与移动设备兼容。纹理分辨率包括从2K到16K的自定义着色器。 -能够与在线地图平铺系统集成,只需单击一次,包括OpenStreetMap、AerisWeather、Stamen、Carto、MapBox、Sputnik等,并具有渐进式渲染,允许在放大时获得更高的质量。 -脱机磁贴支持与磁贴下载助手。 -六边形网格和寻径支持:完全交互式网格(选择,着色,纹理) 还有更多。。。 -三类城市分类,包括国家和地区首府。 -数据包括:大陆、国家、城市和省份名称、关系、每个国家和省的多个地区、大都市人口、FIPS 104、ISO A2、A3和N3代码。 -月亮和真正的银河天箱。 -GPS支持:可自动跟踪设备在地图上的位置。 -与实时和日光自动同步。 -自动绘制带有放置和自动对齐选项的国家/地区标签。 -给国家、省/州或整个大陆上色! -各国纹理支持! -可以使用绘图/动画将标记、圆和线添加到全球地图(空中轨迹)。 -挂载点支持:从编辑器中添加您的自定义战略位置,并在其上轻松查找/导航/定位对象。 -“烘焙地球纹理”命令:生成带有彩色区域的自定义地球纹理! -倒视支持:VR身临其境体验的可选视角模式(坐在世界的中心!) -VR:支持普通的凝视和VR控制器使用谷歌,三星或Oculus SDK。 -有两种可用的相机模式:在旋转地球的位置之间导航(相机不移动)或使相机绕地球旋转。 -缩放倾斜选项:放大/缩小时实现角度透视。 -从当前位置找到并顺利飞往任何国家、州、市。还可以通过经纬度轻松定位任何世界位置。 -比例尺为110.00.000:1和30.000.000:1的两级边界详图。 -虚线:绘制纬度、经度和光标线。 -基于物理的大气散射着色器,提供最苛刻的体验。 -漂亮的云层整合在风景和分散的风格,包括透视阴影。 -很多定制选项:边界颜色,高亮颜色,城市/边界/地球的可见性,标签。。。 -可以实例化并由代码控制(提供API和文档)。 -自定义编辑器检查器与5个额外的可怕的组件(观看下面的视频演示): *计算器:在不同的地图单位之间转换(例如,纬度/经度到球体位置), *Tickers:在全球范围内添加滚动/闪烁信息! *装饰师:个性化每个国家的外观(颜色、质地、标签) *地图编辑器:修改提供的地图和创建您的虚构场景! *小地图:拖放迷你地图预置到场景方便一键式世界导航! -移动友好:在Android和iOS上测试。 -兼容Unity 2018.4或更高版本。 -支持标准/内置和LWRP。 -包含源代码(C#)。 -持续发展的专业支持论坛。 使用此资源,用户可以选择世界的一个地区或目的地,显示数据/信息/资源图标,非常适合任务简报、战略游戏、地球HUD/目标/资源定位器。。。现在有了六边形网格,寻路和战争迷雾在世界地图上创建你的回合制或RTS游戏! 也非常适合教育软件,报告,统计和数据viz应用! 该资产包含一个完整的API,用于探索和利用提供的国家、省和城市目录—获取地理位置、城市都市人口、所属国家和省等信息,导航到这些信息,获取省和国家的邻居,等等!
以下是使用 Python 和 OpenCV 实现双目测距的示例代码: ```python import cv2 import numpy as np # 左右相机的摄像机内参矩阵和畸变系数 K1 = np.array([[426.178, 0, 309.621], [0, 426.109, 236.785], [0, 0, 1]]) D1 = np.array([[-0.008, 0.086, 0.002, -0.000, 0.000]]) K2 = np.array([[429.553, 0, 303.304], [0, 429.558, 235.312], [0, 0, 1]]) D2 = np.array([[-0.025, 0.296, 0.002, -0.002, 0.000]]) # 左右相机的旋转和平移向量 R = np.array([[0.9999, 0.0003, -0.0107], [-0.0002, 1.0000, -0.0021], [0.0107, 0.0021, 0.9999]]) T = np.array([[-82.4845], [-0.3272], [0.9937]]) # 读取左右相机的图像 imgL = cv2.imread('left.jpg') imgR = cv2.imread('right.jpg') # 图像去畸变 imgL = cv2.undistort(imgL, K1, D1) imgR = cv2.undistort(imgR, K2, D2) # 立体校正 R1, R2, P1, P2, Q, validPixROI1, validPixROI2 = cv2.stereoRectify(K1, D1, K2, D2, imgL.shape[1::-1], R, T, flags=cv2.CALIB_ZERO_DISPARITY, alpha=0.9) mapLx, mapLy = cv2.initUndistortRectifyMap(K1, D1, R1, P1, imgL.shape[1::-1], cv2.CV_32FC1) mapRx, mapRy = cv2.initUndistortRectifyMap(K2, D2, R2, P2, imgR.shape[1::-1], cv2.CV_32FC1) imgL = cv2.remap(imgL, mapLx, mapLy, cv2.INTER_LINEAR) imgR = cv2.remap(imgR, mapRx, mapRy, cv2.INTER_LINEAR) # 计算视差图 stereo = cv2.StereoSGBM_create(numDisparities=16*5, blockSize=11) disp = stereo.compute(imgL, imgR).astype(np.float32) / 16.0 # 计算深度图 depth = cv2.reprojectImageTo3D(disp, Q) depth = depth[:, :, 2] # 可视化深度图 cv2.imshow('depth', depth / 100) cv2.waitKey(0) cv2.destroyAllWindows() ``` 需要注意的是,上述代码中的相机参数和图像路径应根据实际情况进行修改。同时,双目测距的精度也会受到多个因素的影响,如相机的畸变、图像的模糊度、匹配算法的参数等等,因此在实际应用中需要进行充分的实验和测试,以保证测距的准确性和稳定性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值