1.GIS二次开发中怎样实现最短路径分析
这个具体看你用的是那个平台了,一般的平台都会提供相应的模型或者接口啊之类的,只需准备符合条件的数据然后调用即可实现,比如说超图里SuperMap Objects 根据查找结果的需求不同,提供了三种接口来实现最佳路径分析:1、Path:查找经过一系列有序站点的最佳路径,结果返回一个路由对象 soGeoLineM。行驶导引通过 GetPathTable 接口导出。2、PathEx:查找经过一系列有序站点的最佳路径,结果返回一个路由对象soGeoLineM,同时会返回路径通过的结点和弧段的标识ID(即在网络分析环境中设置的ID字段,不一定是SmID)。行驶导引通过 GetPathTable 接口导出。PathEx2:查找经过一系列有序站点的最佳路径。结果提供 PathTable 行驶导引表,该表记录了结果路由需要经历的结点和弧段名称,以及在每个结点和弧段上的转向信息,具体花费。新方法提高了分析效率,对返回结果可灵活设置(通过 soPathResultSetting 和 soPathResultInfo )。
具体的实现一般的帮助文档里会有实例演示,不知道这样回答满意不。
2.最短路径算法在交通中的运用
这是以前写的!!无论是有向图还是无向图都可以处理!!用的是Dijkstra算法/*求最短路径*/#include<stdio.h>#include<stdlib.h>typedef int Status;typedef Status ** Node;#define MaxNum 10000;#define FALSE 0;#define TRUE 1;/*建一个带权的邻接矩阵来存放有向图*/Node Build (Status num , Status num2 ){ int i,j,k,h; Node a; a=(Node) malloc( num * sizeof (Status *)); printf("请输入图的相关信息,如0 2 10表示弧是从顶点v0走向顶点v2,且权为10\n"); printf("(每输入一个信息再按一次Enter)\n(在这里顶点是从v0算起,当然这并不是表示要从v0出发找最短路径\n"); printf("当然也可以从其他点出发找最短路径):\n"); for(i=0;i<num;i++) { a[i]=(Status *) malloc( num * sizeof (Status)); for(j=0;j<num;j++) { a[i][j]=MaxNum; } } for(h=0;h<num2;h++) { scanf("%d %d %d",&i,&j,&k); /*防止输入过界*/ if( i>=num || j>=num ) { printf("无效的输入!请重新输入!!"); exit(1); } a[i][j]=k; } return a;}/*迪杰斯特拉算法求最短路径*/void ShortestPath_DIJ( Node a ,Status i ,Status v0 ,Status *D ,Status *pre ){ int v,w,j,l=1; Status *final;/*final[v]为TRUE表示已经求得最短路径*/ Status min; final=(Status *)malloc( sizeof(Status)*i ); for(v=0;v<i;v++) { final[v]=FALSE;/*设空路径*/ pre[v]=FALSE; D[v]=a[v0][v]; if(D[v]<10000) pre[v]=v0; }//for /*选择的顶点没有出度时,为了防止下面的算法出现越界,直接输出,不再进行下步动作*/ for(v=0;v<i;v++) { if( a[v0][v]==10000 ) l++; } if(l>i) { printf("\n从v%d出发没有最短路径到其他端点!\n",v0); exit(0); } D[v0]=0; final[v0]=TRUE;//初始化,v0顶点确定 for( j=0 ; j<i ; ++j ) { /*找出距离顶点最近的顶点*/ min=MaxNum; for( w=0 ; w<i ; w++) { if( !final[w] )//w顶点还没确定 { if( D[w]<min ) { v=w;min=D[w];/*w顶点离v0更近*/ //printf("wozaizhe"); } } } final[v]=TRUE; /*更新当前最短路径及距离*/ for( w=0 ; w<i ; w++ ) { if( !final[w] && ( (min+a[v][w])<D[w]) ) { D[w]=min+a[v][w]; pre[w]=v; }//if } }//for}//ShortestPath_DIJvoid Show(Status *D , Status *pre ,int i ,int v0){ int j,k,m,n; int *temp; temp=(int *)malloc(sizeof(int)*i); for(j=0;j<i;j++) { printf("\nv%d路径长度为:%d " ,j,D[j]); n=j; if(D[j]!=10000) for(k=0;k<i;k++) { temp[k]=pre[n]; if(temp[k]!=v0) n=temp[k]; if(temp[k]==v0) break; } if( k==0&&D[j]!=10000&&D[j]!=0 ) { printf("v%d->v%d",v0,j); } if( k!=0 &&D[j]!=10000&&D[j]!=0) { for(m=k;m>=0;m--) { printf("v%d->",temp[m]); } printf("v%d",j); } if(D[j]==10000) { printf("从v%d出发没有最短路径!",v0); } if(D[j]==0) { printf("v%d",v0); } } printf("\n");}main(){ int i,j,v0; Node a; Status *D,*pre; printf("请输入有向图的顶点数!"); scanf("%d",&i); printf("再输入有向图的有效弧数!"); scanf("%d",&j); D=(Status *)malloc(sizeof(Status)*i); pre=(Status *)malloc(sizeof(Status)*i); a=Build(i,j); printf("请输入起始顶点(可以是范围内的任何顶点): ",j); scanf("%d",&v0); if(v0>i) { printf("输入错误!不存在这样的起始点!"); exit(1); } ShortestPath_DIJ( a ,i ,v0 ,D , pre ); Show( D, pre, i, v0 );}。
3.最短路径算法问题
++j) /, t;n" ++i) { d[i] = MAX; } /, s); ++i) { int j = i, 10, 10, 10; printf(":最短路径上i前面顶点的编号/, 10;判断出发点有没有邻接点 for(int i=0, path[8];/ 最短路径/ else if(i == n) return;/** 打印all路径 */, 10: \ j<, 5, 7};/ i, 2;%d", 10!= MAX) { d[i] = p[s][i];顶点v是否并入集合S中, 10, {10; } isUnion[t] = true, 3; printf(" /, 10;for }/ path[k] = t; k<), 10;shortestPath()/display system(" } } isUnion[s] = true!isUnion[k] && d[k] >/, 4; path[i] = -1;call1 shortestPath(w;选择最短路径 int min;d[i];n, 10; i<, 10;/ j = path[j], {10; i<, {10; printf("!= MAX) if(;n; for(int i=1, 10, 10}, 10};//, 10, {10, 10;n, int path[], 10}; t = j; ++i) { if(p[s][i] , 3, 10, 10, 10;/, d, 10:二维数组,&s);s, 10;\ /%d", 10,10; int main(){ int s.h> /path[i], 10;n; } } /:%d \, path[j]), 8, int n; min) { min = d[j];pause", 10;n;#define MAX 10/, 9, 6, {10, 10, 2;/);n" path[i] = s;, 10;stdlib。
转载请注明出处众文网 » 最短路径问题及应用毕业论文(GIS二次开发中怎样实现最短路径分析)