精华内容
下载资源
问答
  • 传统的最短路径算求解从出发点到其他所有节点的最短路径,本代码只求取已知出发点和目的点最短路径,封装为函数,绝对可用。
  • 参考了百度开发api文档整合,输入出发和目的地分别定位,并查找两地之间的行车距离、时间以及路径分步骤。
  • 小波分解的出发点

    千次阅读 2018-12-12 21:50:42
    经过持续学习研究,终于理解了小波分解的原理和目的 小波与傅里叶变换一样,都是基函数去拟合被测信号 与傅里叶变换不同的是,小波是采用非周期信号,通过这个基函数的不同尺度缩放去拟合被测信号的不同频率,再...

    经过持续学习研究,终于理解了小波分解的原理和目的
             小波与傅里叶变换一样,都是基函数去拟合被测信号
             与傅里叶变换不同的是,小波是采用非周期信号,通过这个基函数的不同尺度缩放去拟合被测信号的不同频率,再通过平移基函数去拟合不同频率分量在时间序列(也称为空间位置)上的位置
             最后得到经过缩放平移变换的基函数的系数,构成时频尺度图,以便分析突变信号的位置和频率
    可以选择性去除一部分系数,再反变换回时域信号,达到滤波的目的
    应用这一特性,可以实现去噪,数据压缩,去除周期纹理干扰以及分割纹理瑕疵的效果
             把话讲透了,其实原理不难。一开始觉得难,就难在看小波变换的公式,一堆参数还有那个可怕的小波函数符号,以及公式化的讲解,而没有讲实现原理和过程。

     

    www.intelvisioncn.com

    展开全文
  • 条件:一个人需要从他自身的出发点开始,游玩不同的城市,每个城市都只去一次 目标:寻找一条”最短“路径,使得该名游客可以遍历每一个城市 其实这个问题就是典型的TSP旅行商问题的一种变形,有很多种解法,...

     

    蚁群算法的理解:蚂蚁在寻找食物的时候会释放出一种信息素,用来与同伴进行交流,使得大家最终寻找食物。而蚁群算法就是利用蚂蚁的释放信息素的这种特性,来不断改变蚂蚁走的方向从而达到目标(路径最短等)。

    文章我会分成使用蚁群算法解决两种问题,第一种是简单的寻找最短路径,第二种是关于任务分配,即负载均衡调度。

    很多文章都描述了蚁群算法如何得到最短路径,但是这个方法直接带入任务分配的时候很多人就对一些符号的理解变得混乱,例如在任务分配中,蚂蚁代表的是什么,下一个选择的城市在任务分配中代表的是什么?

    寻找最短路径

    原文地址:https://blog.csdn.net/wayjj/article/details/72809344#commentsedit(其实这个地址中就对于代码已经有标注解释的了,大家可以去看原帖,我就不复制粘贴引用了,我认为讲得挺清楚的,基本看一遍就知道,下面我对于寻找最短路径,根据原文中的代码修改了一处达到我自己的需求,但基本是一样的,所以还是推荐大家去原文看一下,很清晰)

    条件:一个人需要从他自身的出发点开始,游玩不同的城市,每个城市都只去一次

    目标:寻找一条”最短“路径,使得该名游客可以遍历每一个城市

    其实这个问题就是典型的TSP旅行商问题的一种变形,有很多种解法,蚁群算法是其中一种启发式算法。为什么我会在”最短“上面打引号呢?因为通过蚁群算法得出来的路径方案可能并不是最短的。

    下面粘贴的是我根据原代码进行调整,从而达到我自己需求的代码(语言是matlab):

    function [Shortest_Length]=TSP(C)
    %这个是直接输入坐标的
    m=15;Alpha=1;Beta=5;Rho=0.1;NC_max=10;Q=100;
    C=[6,10;8,10;9,15];
    %C n个城市的坐标,n×2的矩阵
    %NC_max 最大迭代次数
    %m 蚂蚁个数
    % Alpha 表征信息素重要程度的参数
    % Beta 表征启发式因子重要程度的参数
    % Rho 信息素蒸发系数
    % Q 信息素增加强度系数
    % R_best 各代最佳路线
    % L_best 各代最佳路线的长度
    n=size(C,1);%n表示问题的规模(城市个数)
    D=zeros(n,n);%D表示完全图的赋权邻接矩阵
    for i=1:n
        for j=1:n
            if i~=j
            D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5;%每个城市之间的距离
            else
            D(i,j)=eps;      %i=j时不计算,应该为0,但后面的启发因子要取倒数,用eps(浮点相对精度)表示
            end
            D(j,i)=D(i,j);   %对称矩阵
        end
    end
    Eta=1./D;          %Eta为启发因子,这里设为距离的倒数
    Tau=ones(n,n);     %Tau为信息素矩阵
    Tabu=zeros(m,n);   %存储并记录路径的生成
    NC=1;               %迭代计数器,记录迭代次数
    R_best=zeros(NC_max,n);       %各代最佳路线
    L_best=inf.*ones(NC_max,1);   %各代最佳路线的长度
    L_ave=zeros(NC_max,1);        %各代路线的平均长度
    while NC<=NC_max        %停止条件之一:达到最大迭代次数,停止
        Randpos=[];  
        kk=(ceil(m/n));%随即存取
        for i=1:kk
            Randpos=[Randpos,1,1,1,1];
        end
        Tabu(:,1)=(Randpos(1,1:m));    %目的是为了设置每一只蚂蚁的出发地方,因为我自己的代码需要从游客本身的地方出发,所以Tabu都是1,即输入坐标中的第一个
     
        for j=2:n     %所在城市不计算
            for i=1:m     
                visited=Tabu(i,1:(j-1)); %记录已访问的城市,避免重复访问
                J=zeros(1,(n-j+1));       %待访问的城市
                P=J;                      %待访问城市的选择概率分布
                Jc=1;
                for k=1:n
                    if length(find(visited==k))==0   %开始时置0
                        J(Jc)=k;
                        Jc=Jc+1;                         %访问的城市个数自加1
                    end
                end
                %下面计算待选城市的概率分布
                for k=1:length(J)
                    P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);
                end
                P=P/(sum(P));
                %按概率原则选取下一个城市
                Pcum=cumsum(P);     %cumsum,元素累加即求和
                Select=find(Pcum>=rand); %若计算的概率大于原来的就选择这条路线
               to_visit=J(Select(1)); 
                Tabu(i,j)=to_visit;
            end
        end
        if NC>=2
            Tabu(1,:)=R_best(NC-1,:);
        end
    
        L=zeros(m,1);     %开始距离为0,m*1的列向量
        for i=1:m
            R=Tabu(i,:);
            for j=1:(n-1)
                L(i)=L(i)+D(R(j),R(j+1));    %原距离加上第j个城市到第j+1个城市的距离
            end
            %L(i)=L(i)+D(R(1),R(n));      %一轮下来后走过的距离
        end
        L_best(NC)=min(L);           %最佳距离取最小
        pos=find(L==L_best(NC));
        R_best(NC,:)=Tabu(pos(1),:); %此轮迭代后的最佳路线
        L_ave(NC)=mean(L);           %此轮迭代后的平均距离
        NC=NC+1;                      %迭代继续
    
        Delta_Tau=zeros(n,n);        %开始时信息素为n*n的0矩阵
        for i=1:m
            for j=1:(n-1)
                Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);           
                %此次循环在路径(i,j)上的信息素增量
            end
            Delta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);
            %此次循环在整个路径上的信息素增量
        end
        Tau=(1-Rho).*Tau+Delta_Tau; %考虑信息素挥发,更新后的信息素
    
        Tabu=zeros(m,n);             %%直到最大迭代次数
    end
    
    Pos=find(L_best==min(L_best)); %找到最佳路径(非0为真)
    Shortest_Route=R_best(Pos(1),:); %最大迭代次数后最佳路径
    Shortest_Length=L_best(Pos(1)); %最大迭代次数后最短距离
    
    
    
    

    其中这个蚁群算法中信息素的变化是按照:只要有蚂蚁选择这条路,那么这条路上的城市的信息素都会发生变化。

    关于这个TSP问题的变形,就在于游客一开始的位置和结束的位置,这个纯属靠自己设置即可,因为我需要游客从当前自身的位置开始出发游玩,我设置的开始位置的语句是

        Tabu(:,1)=(Randpos(1,1:m));    
    %目的是为了设置每一只蚂蚁的出发地方
    %因为我自己的代码需要从游客本身的地方出发,所以Tabu都是1,即输入坐标中的第一个

    负载均衡调度(任务分配)

    原本一开始使用的是这个网址的方式:原文地址:https://blog.csdn.net/u010425776/article/details/79517301,但是后来运用了之后发现总是陷入局部最优,而不是全局最优,后来分析了之后,发现它在更新信息素时,将本次迭代中最优路径的信息素增加q%。但是我觉得往往就是这个方法导致很容易陷入局部最优。接着我通过搜索相关ACO+task assignment的论文,找到了能够跳出局部最优的方法,并且我自己的实验也验证了它是可以达到跟全局最优相比的方案。论文有几篇,但其中我认为表达最清晰的是:Ant colony optimization for the nonlinear resource allocation problem(可以google scholar)。这个问题可以分成3步:1.获得所有蚂蚁的路径 2.计算所有路径的目标值 3.更新信息素

    1.获得所有蚂蚁的路径

    现在举一个例子:现在一共有100只蚂蚁,10个任务,20个工人。首先第1只蚂蚁为这10个任务分配工人(第1条路径);第2只蚂蚁为这10个任务分配工人(第2条路径);第3只蚂蚁为这10个任务分配工人(第3条路径)...第100只蚂蚁为这10个任务分配工人(第100条路径)。例如下面的这张图,对于第1只蚂蚁ant1来说,它的路径就是:3-4-1-6-12-16-17-8-5-13,对于第2只蚂蚁来说,它的路径就是2-5-7--76-24-28-20-15-13(如果你想说一个工人可以做多个任务,一个任务需要多个工人去完成,你可以自己设置一个worker_task的矩阵来去控制就可以了)。例子

    而实际上,上面这个这个我制作的表格,其实可以说是对应Ant colony optimization for the nonlinear resource allocation problem这篇文章中的下面这张图。其中i代表的就是第i个任务,而(e_ijk)代表的就是当前已经选择完第i个任务,其中为第i个任务选择了第j个工人,并且打算在下一个i+1任务中选择第k个工人来完成。所以start-(e_ijk)-(e_ijk)-(e_ijk)-...-sink从而构成一条路径。(如果你想说一个工人可以做多个任务,你可以自己设置一个worker_task的矩阵来去控制工人的最大任务数,这个工人的在这个矩阵中的列值超过多少就将它在接下来的选择中删去;一个任务需要多个工人去完成,那么将就T变成T*q,其中q为一个任务需要的工人数)

    在这个获得所有蚂蚁的路径(就是对这10个任务分配相对应的工人),对于每一只蚂蚁的路径规划,最重要的就是对于第i个任务,应该选择哪一个worker,即(e_ijk)的选择遵守下面的这条公式,其中(p_ijk)就是当前第i个任务选择了第j个工人,那么第i+1个任务准备选择第k个工人的可能性:

    里面的(tao_ijk)就是信息素,(η_i+1,l)是一个heuristic values启发值,它是与当前i+1层中的第k个任务的f(k)值相关(这个f函数自己定义,s是一个常数值),alpha和beta是两个参数,这两个参数代表的意义如下:

    所以这个(p_ijk)就相当于:

    (在i+1层选择第k个工人的信息素值*这第k个工人在第i+1层的启发值)除以(第i+1层所有可选择的工人的信息素值*启发值)

    接着选择就按照轮盘(好像是叫这个名字?)的方法,根据概率(p_ijk)去选择第i+1个任务的工人。

    2.计算所有路径的目标值

    这一步其实是为了下面更新信息素作出的铺垫,计算所有路径的目标值。例如,这个目标值是总质量,其中第i个任务由第j个工人完成这里就有一个质量值q_ij,那么总质量值就是所有选择任务工人对的质量值相加,在上面的这个例子中,第一只蚂蚁的路径为3-4-1-6-12-16-17-8-5-13,所以这条路径对应的总质量值是(斜杠前面的代表的是任务的编号,后面代表的是选择的工人):q_1\3+q_2\4+q_3\1+q_4\6+q_5\12+q_6\16+q_7\17+q_8\8+q_9\5+q_10\13

    当然你也可以选择其他的目标值,但是需要计算每一条路经对应的目标值。例如上面有100只蚂蚁(100条路径),所以可以得出100条路径的目标值

    3.更新信息素

    信息素的重要性体现在哪?体现在第1步中的获得所有蚂蚁的路径中的选择概率(p_ijk)的计算。信息素的更新分成两步:信息素的衰减和信息素的增加。衰减和增加的总式子如下:

    前面的部分代表的就是信息素的衰减,这部分比较容易理解,就是挥发百分之多少。

    后面的部分代表的就是信息素的增加,m代表的是蚂蚁的数量也是路径的数量,如果这条路径中有(e_ijk),那么这个delta_tao就是0,如果这条路径中有(e_ijk),那么

    其中J(X_t)就是这条路径在第2步计算的目标值。

     

    至此,这3步就描述清楚了,大家可以根据自己的需求去进行修改相关的内容,其实很多演化算法很有可能不能达到最优解,很容易陷入局部最优,所以很多论文都有加入一些适当的初始解来帮助加快达到全局最优。比如蚁群算法中,一开始所有的信息素都为0,但是可以引入一些已经在目标值表现良好的路径,去修改相关的信息素,从而加快达到全局最优。

    4.代码

    我用我自己的方式按照我自己的需求写一下:

    总体思路和框架:一共有三层循环

    for i=1:迭代次数

               for j=1:蚂蚁数目

                        for k=1:任务数目

                                //为每一个任务寻找最合适的worker,蚂蚁的路径就是挑选(worker,task)的pair

                        end

                        //得出一只蚂蚁的路径

               end

               //得出多只蚂蚁的路径,计算所有路径的目标值

              //根据目标值更新信息素矩阵

    end

     

    总结

    蚁群算法是一种很好解决问题的方法。比较容易理解,并且操作简单,适应于大多数场景。而缺点就是启发式算法,很难有得到保证参数。

     


           


                

    展开全文
  • 软件测试的目的和原则

    千次阅读 2011-08-23 09:03:24
    从用户的角度出发,普遍希望通过软件测试暴露软件中隐藏的错误缺陷,以考虑是否可以接受该产品。而从软件开发者的角度出发,则希望测试成为表明软件产品中不存在错误的过程,验证该软件已正确地实现了用户的要求,...
     基于不同的立场,存在着两种完全不同的测试目的。从用户的角度出发,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,以考虑是否可以接受该产品。而从软件开发者的角度出发,则希望测试成为表明软件产品中不存在错误的过程,验证该软件已正确地实现了用户的要求,确立人们对软件质量的信心。因此,他们会选择那些导致程序失效概率小的测试用例,回避那些易于暴露程序错误的测试用例。同时,也不会着意去检测、排除程序中可能包含的副作用。 
    

      显然,这样的测试对完善和提高软件质量毫无价值。因为在程序中往往存在着许多预料不到的问题,可能会被疏漏,许多隐藏的错误只有在特定的环境下才可能暴露出来。如果不把着眼点放在尽可能查找错误这样一个基础上,这些隐藏的错误和缺陷就查不出来,会遗留到运行阶段中去。如果站在用户的角度,替他们设想,就应当把测试活动的目标对准揭露程序中存在的错误。在选取测试用例时,考虑那些易于发现程序错误的数据。

      有鉴于此,Grenford J.Myers就软件测试目的提出以下观点:

      (1)测试是程序的执行过程,目的在于发现错误;

      (2)一个好的测试用例在于能发现至今未发现的错误;

      (3)一个成功的测试是发现了至今未发现的错误的测试。

      测试的目标是想以最少的时间和人力找出软件中潜在的各种错误和缺陷。如果成功地实施了测试,就能够发现软件中的错误。测试的附带收获是,它能够证明软件的功能和性能与需求说明相符。此外,实施测试收集到的测试结果数据为可靠性分析提供了依据。

      根据这样的测试目的,软件测试的原则应该是:

      (1)应当把“尽早地和不断地进行软件测试”作为软件开发者的座右铭。

      由于原始问题的复杂性,软件的复杂性和抽象性,软件开发各个阶段工作的多样性,以及参加开发各种层次人员之间工作的配合关系等因素,使得开发的每个环节都可能产生错误。所以不应把软件测试仅仅看作是软件开发的一个独立阶段,而应当把它贯穿到软件开发的各个阶段中。坚持在软件开发的各个阶段的技术评审,这样才能在开发过程中尽早发现和预防错误,把出现的错误克服在早期,杜绝某些隐患,提高软件质量。

      (2)测试用例应由测试输入数据和与之对应的预期输出结果这两部分组成。

      测试以前应当根据测试的要求选择在测试过程中使用的测试用例(Test case)。测试用例主要用来检验程序员编制的程序,因此不但需要测试的输入数据,而且需要针对这些输入数据的预期输出结果。如果对测试输入数据没有给出预期的程序输出结果,那么就缺少了检验实测结果的基准,就有可能把一个似是而非的错误结果当成正确结果。

      (3)程序员应避免检查自己的程序。

      测试工作需要严格的作风,客观的态度和冷静的情绪。人们常由于各种原因具有一种不愿否定自己工作的心理,认为揭露自己程序中的问题总不是一件愉快的事。这一心理状态就成为测试自己程序的障碍。另外,程序员对软件规格说明理解错误而引入的错误则更难发现。如果由别人来测试程序员编写的程序,可能会更客观,更有效,并更容易取得成功。要注意的是,这点不能与程序的调试(debuging)相混淆。调试由程序员自己来做可能更有效。

      (4)在设计测试用例时,应当包括合理的输入条件和不合理的输入条件。

      合理的输入条件是指能验证程序正确的输入条件,而不合理的输入条件是指异常的,临界的,可能引起问题异变的输入条件。在测试程序时,人们常常倾向于过多地考虑合法的和期望的输入条件,以检查程序是否做了它应该做的事情,而忽视了不合法的和预想不到的输入条件。事实上,软件在投入运行以后,用户的使用往往不遵循事先的约定,使用了一些意外的输入,如用户在键盘上按错了键或打入了非法的命令。如果开发的软件遇到这种情况时不能做出适当的反应,给出相应的信息,那么就容易产生故障,轻则给出错误的结果,重则导致软件失效。因此,软件系统处理非法命令的能力也必须在测试时受到检验。用不合理的输入条件测试程序时,往往比用合理的输入条件进行测试能发现更多的错误。

      (5)充分注意测试中的群集现象。

      测试时不要以为找到了几个错误问题就已解决,不需继续测试了。经验表明,测试后程序中残存的错误数目与该程序中已发现的错误数目或检错率成正比。根据这个规律,应当对错误群集的程序段进行重点测试,以提高测试投资的效益。

      在所测程序段中,若发现错误数目多,则残存错误数目也比较多。这种错误群集性现象,已为许多程序的测试实践所证实。例如美国IBM公司的0s/370操作系统中,47 9/6的错误仅与该系统的4%的程序模块有关。这种现象对测试基于不同的立场,存在着两种完全不同的测试目的。从用户的角度出发,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,以考虑是否可以接受该产品。而从软件开发者的角度出发,则希望测试成为表明软件产品中不存在错误的过程,验证该软件已正确地实现了用户的要求,确立人们对软件质量的信心。因此,他们会选择那些导致程序失效概率小的测试用例,回避那些易于暴露程序错误的测试用例。同时,也不会着意去检测、排除程序中可能包含的副作用。

      显然,这样的测试对完善和提高软件质量毫无价值。因为在程序中往往存在着许多预料不到的问题,可能会被疏漏,许多隐藏的错误只有在特定的环境下才可能暴露出来。如果不把着眼点放在尽可能查找错误这样一个基础上,这些隐藏的错误和缺陷就查不出来,会遗留到运行阶段中去。如果站在用户的角度,替他们设想,就应当把测试活动的目标对准揭露程序中存在的错误。在选取测试用例时,考虑那些易于发现程序错误的数据。

      (6)严格执行测试计划,排除测试的随意性。

      测试计划应包括:所测软件的功能,输入和输出,测试内容,各项测试的进度安排,资源要求,测试资料,测试工具,测试用例的选择,测试的控制方式和过程,系统组装方式,跟踪规程,调试规程,以及回归测试的规定等以及评价标准。

      对于测试计划,要明确规定,不要随意解释。

      (7)应当对每一个测试结果做全面检查。

      这是一条最明显的原则,但常常被忽视。有些错误的征兆在输出实测结果时已经明显地出现了,但是如果不仔细地全面地检查测试结果,就会使这些错误被遗漏掉。所以必须对预期的输出结果明确定义,对实测的结果仔细分析检查,抓住征候,暴露错误。

      (8)妥善保存测试计划,测试用例,出错统计和最终分析报告,为维护提供方便。

      很有用。如果发现某一程序模块似乎比其他程序模块有更多的错误倾向时,则应当花费较多的时间和代价测试这个程序模块。

    展开全文
  • 1、可以通过在出发点和目的点的输入框中输入关键字来弹出具体地点名称 2、点击导航后能够实现出步行导航的功能   实验图如下:(以桂林市作为测试城市)  图1搜索关键词  图2搜索关键词  图3关键词输入完毕

    这次实现的基本功能是:

    1、可以通过在出发点和目的点的输入框中输入关键字来弹出具体地点名称

    2、点击导航后能够实现出步行导航的功能

     

    实验图如下:(以桂林市作为测试城市)

                                图1搜索关键词

                                图2搜索关键词

                       图3关键词输入完毕

                                                   图4开启导航界面

     

    开发基本思路:

    1、监听EditText根据关键词进行poi搜索(参照前面的百度地图开发2)

    2、将搜索结果的名字添加到list中,使用ListView+PopUpWindow展示,并且给ListView设置点击监听

    3、初始化地图导航

    4、将出发点和目的点进行算路设计

    5、根据两点进行导航,跳转至诱导界面

     

    具体代码:

    1、监听EditText,添加TextWatcher

    private class MyWatcher implements TextWatcher {
      @Override
      public void afterTextChanged(Editable s) {
       locationUtils.getCityName(handler);//获取所处城市的名字,通过传递handler获取定位信息,具体可以参考百度地图开发1中的locationUtils类
      }

      @Override
      public void beforeTextChanged(CharSequence s, int start, int count,
        int after) {
      }

      @Override
      public void onTextChanged(CharSequence s, int start, int before,
        int count) {

      }
     }

     

    2、将搜索结果使用PopUpWindow展示

    在mPoiSearch.setOnGetPoiSearchResultListener();回调的接口onGetPoiResult(PoiResult result)中添加

    final List<String> namelist = new ArrayList<String>();
         list = result.getAllPoi();//获取搜索的所有结果
         for (int i = 0; i < list.size(); i++)
          namelist.add(list.get(i).name);//将搜索列表的名字单独取出,等下用来展示到popupwindow中
         final PopupWindow window = new PopupWindow(context);
         View view = View.inflate(context, R.layout.item_list, null);

         //-------------------------------------------------------------适配listview
         ListView listView = (ListView) view.findViewById(R.id.lv);
         ArrayAdapter<String> adapter = new ArrayAdapter<String>(
           context,
           android.R.layout.simple_expandable_list_item_1,
           namelist);
         listView.setAdapter(adapter);
         listView.setOnItemClickListener(new OnItemClickListener() {

          //-------------------点击选中项后将选中项显示到edittext中
          @Override
          public void onItemClick(AdapterView<?> arg0, View arg1,
            int position, long arg3) {
           if (EdtChufa.hasFocus()) {
            EdtChufa.setText(namelist.get(position));
            chufaLoc = list.get(position).location;//获取目的地的经纬度
            chufaName = list.get(position).name;//获取目的地的名字
           }
           if (EdtMudi.hasFocus()) {
            EdtMudi.setText(namelist.get(position));
            mudiLoc = list.get(position).location;
            mudiName = list.get(position).name;
           }
           window.dismiss();
          }
         });

         //---------------------------------------显示popupwindow
         window.setContentView(view);
         window.setWidth(LayoutParams.WRAP_CONTENT);
         window.setHeight(LayoutParams.WRAP_CONTENT);
         window.setFocusable(true);
         // window.showAtLocation(mMapView, Gravity.CENTER, 0, 0);
         if (EdtChufa.hasFocus()) {
          window.showAsDropDown(EdtChufa);
         }
         if (EdtMudi.hasFocus())
          window.showAsDropDown(EdtMudi);
         return;

    3、初始化地图导航,结合百度地图导航sdk开发文档(获取key等配置方法略)

    private void initNavi() {//--------------------初始化导航
      initDirs();
      MyListener listener = new MyListener();
      BaiduNaviManager.getInstance().init(this, sdcardRootPath,
        appFolderName, listener, null, null, null);
     }

    其中BaiduNaviManager的Init使用如下所示:

    //-------------------------------初始化文件目录

     private boolean initDirs() {
      sdcardRootPath = Environment.getExternalStorageDirectory().toString();
      appFolderName = "Map";
      if (sdcardRootPath == null) {
       return false;
      }
      File f = new File(sdcardRootPath, appFolderName);
      if (!f.exists()) {
       try {
        f.mkdir();
       } catch (Exception e) {
        e.printStackTrace();
        return false;
       }
      }
      return true;
     }

    //-----------------------------------------------------初始化接口

    private class MyListener implements BaiduNaviManager.NaviInitListener {
      @Override
      public void initFailed() {
       Toast.makeText(getApplicationContext(), "百度导航引擎失败!", 0).show();
      }

      @Override
      public void initStart() {
       Toast.makeText(getApplicationContext(), "百度导航引擎开始!", 0).show();
      }

      @Override
      public void initSuccess() {
       Toast.makeText(getApplicationContext(), "百度导航引擎初始化成功", 0).show();
      }

      @Override
      public void onAuthResult(int status, String arg1) {
       if (0 == status) {
        Toast.makeText(getApplicationContext(), "key校验成功!", 0).show();
       } else {
        Toast.makeText(getApplicationContext(), "key校验不成功!" + arg1, 0)
          .show();
       }
      }

     }

     

    4、算路设计

    private class mRoutePlanListener implements RoutePlanListener {//------------算路设计接口
      private BNRoutePlanNode mBNRoutePlanNode = null;

      public mRoutePlanListener(BNRoutePlanNode node) {
       mBNRoutePlanNode = node;
      }

      @Override
      public void onJumpToNavigator() {//--------------------------转至诱导界面
       Toast.makeText(context, "转至导航界面", 0).show();
       Intent intent = new Intent(context, HomeActivity.class);
       startActivity(intent);
      }

      @Override
      public void onRoutePlanFailed() {
       Toast.makeText(context, "算路失败", 0).show();
      }
     }

     

    //-------------------------------------发起算路设计,通过点击button go调用下面导航方法

    protected void navigation(LatLng chufa, LatLng mudi,String chufaN,String mudiN) {
      /*--------------------------------------------如果手机中装有百度地图开发客户端,可以直接使用下列3行代码调用百度地图客户端发出算路设计导航
       * RouteParaOption option = new
       * RouteParaOption().startPoint(chufa).endPoint(mudi);
       * BaiduMapRoutePlan.openBaiduMapWalkingRoute(option, this);
       */

    //-----------------------------算路起始节点,通过前面搜索结果的poi信息来构造
      BNRoutePlanNode sNode = null;
      BNRoutePlanNode eNode = null;
      sNode = new BNRoutePlanNode(chufa.longitude, chufa.latitude, chufaN,
        null, CoordinateType.BD09LL);
      eNode = new BNRoutePlanNode(mudi.longitude, mudi.latitude,
        mudiN, null, CoordinateType.BD09LL);
      mRoutePlanListener routePlanListener = new mRoutePlanListener(sNode);
      List<BNRoutePlanNode> list = new ArrayList<BNRoutePlanNode>();
      list.add(sNode);
      list.add(eNode);
      BaiduNaviManager.getInstance().launchNavigator(this, list, 1, true,
        routePlanListener);//获取起始节点算路设计
     }

    其中BaiduNaviManager.getInstance().launchNavigator的具体api说明如下

     

    5、导航界面

    public class HomeActivity extends Activity {

     @Override
     protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      //-----------------------------------------获取导航视图
      View view = BNRouteGuideManager.getInstance().onCreate(this,
        new OnNavigationListener() {
         @Override
         public void onNaviGuideEnd() {
          finish();
         }

         @Override
         public void notifyOtherAction(int actionType, int arg1,
           int arg2, Object obj) {
          Log.i("haha",
            "actionType:" + actionType + "arg1:" + arg1
              + "arg2:" + arg2 + "obj:"
              + obj.toString());
         }
        });
      setContentView(view);//将导航视图展示
     }

    //----------------------------生命周期方法

        @Override
        protected void onResume() {
            super.onResume();
                BNRouteGuideManager.getInstance().onResume();
        }

        protected void onPause() {
         super.onPause();
                BNRouteGuideManager.getInstance().onPause();
        };

        @Override
        protected void onDestroy() {
         super.onDestroy();
                BNRouteGuideManager.getInstance().onDestroy();
        }

        @Override
        protected void onStop() {
         super.onStop();
                BNRouteGuideManager.getInstance().onStop();
        }

        @Override
        public void onBackPressed() {
                BNRouteGuideManager.getInstance().onBackPressed(false);
        }

    }

    其中创建导航视图的BNRouteGuideManager.getInstance().onCreate具体API使用如下

     

     

     

     

    展开全文
  • [js]谷歌地图api百度地图api的demo..

    万次阅读 2013-01-09 15:34:54
    用谷歌地图百度地图做了类似于地铁上给定出发点和目的当前所在位置的 效果。。由于谷歌地图api在国内被封的厉害,且每天调用超过25000次就要收费 估计一般公司都会采用百度地图api 1.先来谷歌的。 ...
  • 采用输入起始地和目的地,利用百度API来查询线路以及距离 <!-- body {font-size:14px} h5 {line-height:3em; padding:0; margin:0} a {color:#EE3399} a:hover {color:#99AA66} .txt {border:1...
  • 引言 在本系列的第一篇文章中已经给出系统架构的公式定义:系统架构 = 要素 + 连接 + 解决特定的问题,本篇文章重点讨论...我们已经知道系统架构是什么,有必要讲一下系统架构的目的,即为什么要进行系统架构。对于
  • 原生JS实现缓动的小球案例

    千次阅读 2018-04-17 18:09:43
    小球的缓存移动其实就是有很多小球(div),他们每个小球的出发点和目的点都是一样的,只是控制间隔时间再运动。2.再用for循环分别获取到每个小球,使每次读取到的i(数组下标)间隔的一个关系:50*i.要移动div形成...
  • 什么是Dijkstra算法? Dijkstra算法是用来寻找最短路径最...如果利用Dijkstra算法找出从一点出发,到图中其他所有的最短路径,事实上我们就构造出了一个最短路径树(shortest-path tree)。 Dijkstra最短路径...
  • 题目在一个4*4方格线上,1只蚂蚁从A点出发,沿着方格线爬到B,如下图所示,规定每次只能向右或向上爬,问:1. 从A到B有多少条不同的路线?一共8步,从中选出向右走的4步,剩下4步向上走。即8选4,C48C_8^4=702. ...
  • 软件测试的目的、原则及流程

    万次阅读 2018-04-04 14:39:50
    一、软件测试的目的 1)软件测试是为了发现错误而执行程序的过程。 2)测试是为了证明程序有错,而不是证明程序无错。(发现错误不是唯一目的) 3)一个好的...通过分析错误产生的原因错误的分布特征。可以帮助...
  • 芯片测试的目的及原理介绍

    千次阅读 多人点赞 2020-04-17 14:48:31
    在整个价值链中,芯片公司需要主导的环节主要是芯片设计测试,其余的环节都可以由相应的partner来主导或者完成。 图(1) 测试如何体现在设计的过程中 下图表示的是设计公司在进行一个新的项目的时候的...
  • 当遇到了不同key相同value的情况时,从懒出发不像重复罗列,就尝试了下。当然了,因为个人水平问题,肯定有更好的处理方式,欢迎一起讨论,抛砖引玉共同进步。此外现有成熟的库里loadsh也是可以到达目的,不过自己...
  • 赴美因公出差记(1):出发

    千次阅读 2013-03-13 10:35:26
    说美帝的伙食超级不好吃(注意我这里没说饭菜,之后你就会明白我为什么不用饭菜的),建议从国内带面条、大米什么的过去,有些人还带了咸菜什么的,因为在美国出海关时会检查是否带有肉类种子,所以这些东西尽量...
  • 软件测试的目的与原则答案如下

    万次阅读 2011-05-15 17:34:00
    软件测试的目的与原则答案如下: a) 使用人工或自动手段,来运行或测试某个系统的过程。其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。 b) 软件测试的目的:  i. 测试...
  • 像 很多游戏 ,点击 目的地 ,就会在目的地 生成一个 特效 ,让玩家能够 明白自己点击的地方是哪里。 怎么做呢。Unity 的官方 标准 示例 或许可以解决 这个问题。 在Unity 的安装中,勾选 如下图所示的2个 ...
  • 在“单击停靠”部分单击停靠,下一个出发时间将显示在“下一个出发时间可用”部分中。 执行: index.html 是用户交互的主要网页。 RTTAPI.php是511实时公交信息服务用户请求的服务器端中继。 此中继的主要...
  • 接口测试主要用于检测外部系统与所测系统之间以及内部各系统之间的交互。测试的重点是检查数据交互、传递、控制管理过程以及系统间的相互依赖关系等。 接口测试的目的: 接口测试的目的是测试接口
  • 浅谈大数据深度学习计算数学的一点关系

    万次阅读 多人点赞 2018-05-05 19:45:34
    计算数学是数学的一个分支,研究的内容包括设计分析算法以及数学建模等,目的是为了在实际工程中利用快速稳定的算法得到精确值的近似值。在计算机科学高度发展的今天,其基础计算理论的发展使计算数学进入现代化...
  • 本篇文章中,我们一起探讨了OpenCV中Harris角检测相关的知识,学习了OpenCV中实现Harris角检测的cornerHarris函数...在图像处理与计算机视觉领域,兴趣(interest points),或称作关键(keypoints)、特征
  • 程序员看到"全栈"这个概念,大概会有两种反应 1. 卧槽,这个好,碉堡了 2. 你懂毛,全栈就是样样稀松 ...从我的个人实践出发,全栈学徒至少要掌握以下几种技能: Web 前端开发,至少掌握一种前端框架; Serv...
  • 出发周边游APP产品体验报告

    千次阅读 2018-10-31 22:21:19
    出发 软件版本 v5.9.92 手机系统 Android7.1.2 体验时间 2018-10 体验人 蒋晨曦   二、产品定位 打造中国...
  • 一切从客户的角度出发?

    千次阅读 2014-12-31 13:18:53
    作为一名开发者来说,总是本着用户怎么使用方便的角度出发,全心全意为客户服务的出发来思考这个问题,于是,界面傻瓜了,有句话说的好,对于用户来说,界面越傻瓜越好吗? 我的回答是,不一定;开发人员有时候不...
  • ”这问题一定难不倒各位,甚至张口即答,例如通过数据可以对自身的企业情况有着准确科学的把握,避免老板拍脑袋;数据可以实现对市场环境快速的反应决策;数据可以区分客户个性化需求,提高服务价值等等。 比如...
  •  从年轻代空间(包括 Eden Survivor 区域)回收内存被称为 Minor GC。 Major GC 是清理永久代。Full GC 是清理整个堆空间—包括年轻代永久代。&gt; Android GC Android GC 原理探究- ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 111,570
精华内容 44,628
关键字:

出发点和目的