等值线图以及色斑图实现方式综述

JavaScript011

等值线图以及色斑图实现方式综述,第1张

修改于2021/1/10

通用的方式是基于Java + Geotools + wContour在服务端处理数据,适用业务如下:

服务器端负责上色、出图,前端负责叠加图片展示。气象数据需要通过鼠标坐标值在服务器端获取或者通过图片像素点颜色与颜色表映射得到。缺点是不利于客户端颜色表动态设置与数据过滤。

服务器端负责生成灰度图,前端根据颜色表上色,鼠标移动可通过灰度值直接读取气象数据。方便客户端颜色表动态设置与数据过滤。

服务器端负责生成GeoJSON格式数据,前端生成对应的几何图形,并根据颜色表进行颜色渲染,可通过矢量数据的属性获取气象数据。方便客户端颜色表动态设置与数据过滤。

通用的方式是前端插值处理数据,生成网格数据,再进行等值线或等值面的生成,适用业务如下:

完全使用turf.js内置函数通过离散点插值、等值面绘制、裁剪,生成矢量数据然后绘制数据。实现简便且显示效果好,但存在以下问题:

参考文档

使用kriging.js内置的函数,离散点生成网格数据然后网格渲染。实现简便且插值效果好,但性能上存在问题:

参考文档

结合turf.js和kriging.js两者的优点,提升交互性能、插值效果和显示效果。具体实现步骤如下:

#define MAXX 50

#define MAXY 50

#include <stdio.h>

#include <stdlib.h>

#include <alloc.h>

#include <conio.h>

#include <graphics.h>

#include <string.h>

/*==================用趋势面加权最小二乘法计算网点高程制===================================*/

#include <conio.h>

#include <stdio.h>

#include <math.h>

int CN1,CN2,NP1/*-----CN1,CN2为网点间距,NP1为测量点个数------*/

int X0,Y0/*-----X0,Y0为网格起点坐标------*/

void wzjs(int n,int m,float *x,float *y,float *z,float **bb)

{

int i,j,k,k0,k1,n0,hh=0

double cnum,x1,x2,y1,y2,xt,yt,xxt,yyt,xyt,zt,A,B,c

double e[10][10]={0,u[10]={0

for(i=0i<=ni++) /*-----列网(X向)------*/

{

A=X0+i*CN1

for(j=0j<=mj++) /*------横网(y向)------*/

{

B=Y0+j*CN2

for(k=0k<10k++)

{

u[k]=0

for(k0=0k0<10k0++) e[k][k0]=0

for(k=0k<NP1k++) /*-----高斯法计算曲面方程值并计算网格点值-------*/

{

hh=0

if(A==*(x+k)&&B==*(y+k))

{

*(*(bb+i)+j)=*(z+k)

hh=1break

x1=*(x+k)y1=*(y+k)

x2=x1*x1y2=y1*y1

cnum=(x1-A)*(x1-A)+(y1-B)*(y1-B)

cnum=1/cnum

xt=cnum*x1yt=cnum*y1

xxt=x2*cnumyyt=y2*cnumxyt=x1*yt

e[1][1]=e[1][1]+cnume[1][2]=e[1][2]+xt

e[1][3]=e[1][3]+yte[1][4]=e[1][4]+xyt

e[1][5]=e[1][5]+xxte[1][6]=e[1][6]+yyt

e[2][4]=e[2][4]+x2*yte[2][5]=e[2][5]+x2*xt

e[2][6]=e[2][6]+y2*xte[3][6]=e[3][6]+y2*yt

e[4][4]=e[4][4]+x2*yyte[4][5]=e[4][5]+x2*xyt

e[4][6]=e[4][6]+y2*xyte[5][5]=e[5][5]+x2*xxt

e[6][6]=e[6][6]+y2*yyt

zt=*(z+k)*cnum

u[1]=u[1]+ztu[2]=u[2]+x1*zt

u[3]=u[3]+y1*ztu[4]=u[4]+x1*y1*zt

u[5]=u[5]+x2*ztu[6]=u[6]+y2*zt

if(hh==1) continue

e[2][2]=e[1][5]e[2][3]=e[1][4]e[3][3]=e[1][6]

e[3][4]=e[2][6]e[3][5]=e[2][4]e[5][6]=e[4][4]

for(k=1k<6k++)

for(k0=k+1k0<7k0++)

e[k0][k]=e[k][k0]

for(k=1k<7k++) e[k][7]=u[k]

n0=6

for(k=1k<n0k++)

for(k0=k+1k0<n0+1k0++)

for(k1=k+1k1<n0+2k1++)

e[k0][k1]=e[k0][k1]-e[k0][k]*e[k][k1]/e[k][k]

u[n0]=e[n0][n0+1]/e[n0][n0]

for(k=n0-1k>0k--)

{

c=0

for(k0=k+1k0<n0+1k0++)

c=c+e[k][k0]*u[k0]

u[k]=(e[k][n0+1]-c)/e[k][k]

*(*(bb+i)+j)=u[1]+A*(u[2]+B*u[4]+A*u[5])+B*(u[3]+B*u[6])

/*=============================================*/

/* 绘制等值线 /

/*=============================================*/

#include "hmain.h"

float flagx[MAXX][MAXY],flagy[MAXX][MAXY]

int i1,i2,j1,j2

int zdzz(float *a1,float *b1,float *a2,float *b2)

void drawln(float a0,float b0,int n,int m,float ratox,float ratoy,char *item)

{

float a1,b1,a2,b2,sin,xa[1000]={0,yb[1000]={0

int k=1

a2=a0b2=b0a1=a0+5b1=b0+5

xa[0]=a0yb[0]=b0

do{ /*-------画线-------*/

if(zdzz(&a1,&b1,&a2,&b2)==1)

{

line(a2/ratox,getmaxy()-b2/ratoy,a0/ratox,getmaxy()-b0/ratoy)

break

line(a1/ratox,getmaxy()-b1/ratoy,a2/ratox,getmaxy()-b2/ratoy)

xa[k]=a2/ratoxyb[k]=getmaxy()-b2/ratoy

k++

while(a2>0&&b2>0&&i2<n&&j2<m)

k=k/2

if((xa[k+1]-xa[k-1])<0.3) sin=VERT_DIR/*-----书写等值数字------*/

else if((yb[k+1]-yb[k-1])<0.3) sin=VERT_DIR

else sin=(yb[k+1]-yb[k-1])/(xa[k+1]-xa[k-1])

settextstyle(TRIPLEX_FONT,sin,3)

setcolor(WHITE)

settextjustify(CENTER_TEXT,CENTER_TEXT)

outtextxy(xa[k],yb[k],item)

setcolor(GREEN)

#include "hmain.h"

/*读入数据*/

void rcvda(char *flname,float *x,float *y,float *z,int *n0)

/*划分网格并计算网点*/

void wzjs(int n,int m,float *x,float *y,float *z,float **bb)

/*计算等值点*/

void bzdzd(int w,int *n,int *m,float **bb)

/*绘制等值线*/

void xcln(int n,int m,float ratox,float ratoy,char *item)

/*-----------全局变量-------------------*/

int CN1,CN2,NP1

int X0,Y0,kk,kk1

float flagx[MAXX][MAXY],flagy[MAXX][MAXY]

/*void mapmode()---------图形模式---------*/

/*==============================设置图形模式=======================================*/

void mapmode()

{

int gdriver=DETECT,gmode,errorcode/*----自动探测------*/

errorcode=registerbgidriver(EGAVGA_driver)

if(errorcode<0)

{

printf("Graphics error:n%s",grapherrormsg(errorcode))/*----报告注册错误-----*/

printf("nPress any key to halt:")

getch()

exit(1)

initgraph(&gdriver,&gmode,"")/*----初始化图形模式----*/

errorcode=graphresult()

if(errorcode!=grOK)

{

printf("Graphics error:n%s",grapherrormsg(errorcode))

printf("nPress any key to halt:")

getch()

exit(1)

/*=======================================主函数=========================================*/

main()

{

int i,j,n,m,w,pn1,pn2,pn3,n0=0,ccc

float x[MAXX],x0[MAXX],y[MAXY],y0[MAXY],z[MAXX],ratox,ratoy

float mx,my,mz,nx,ny,nz

char flname[12],item[10],ch

float bb1[MAXX][MAXY]={0

float *bb[MAXX]

for(i=0i<MAXXi++)

{

bb[i]=&bb1[i][0]/*---------将数组清零----------*/

clrscr()

mapmode()/*---------设置图形模式-------*/

printf("请输入数据文件名:")

scanf("%s",flname)

rcvda(flname,x,y,z,&n0)/*--------从文件读入数据--------*/

mx=nx=x[0]

my=ny=y[0]

mz=nz=z[0]

for(i=0i<n0i++) /*--------确定数据范围-----*/

{

if(x[i]>mx) mx=x[i]

else if(x[i]<nx) nx=x[i]

if(y[i]>my) my=x[i]

else if(y[i]<ny) ny=y[i]

if(z[i]>mz) mz=z[i]

else if(z[i]<nz) nz=z[i]

NP1=n0

printf("nmaxx=%.lf minx=%.lfn",mx,nx)

printf("nmaxy=%.lf miny=%.lfn",my,ny)

printf("nmaxz=%.lf minz=%.lfn",mz,nz)

printf("n请输入网格间距:")

scanf("%d",&CN1)

CN2=CN1

n=(int)(mx-nx)/CN1/*------计算网格数-------*/

m=(int)(my-ny)/CN2

X0=(int)(nx/CN1)X0=X0*CN1/*------计算起始点的坐标-----*/

Y0=(int)(ny/CN2)Y0=Y0*CN2

ratox=n*CN1/640.0ratoy=m*CN2/480.0/*-------x,y方向系数------*/

wzjs(n,m,x,y,z,bb)/*-----计算等值点-------*/

printf("n请输入最小等值线值:")

scanf("%d",&pn1)

printf("n请输入最大等值线值:")

scanf("%d",&pn2)

printf("n请输入等值线间距:")

scanf("%d",&pn3)

cleardevice()

for(i=0i<n0i++)

{

x0[i]=(x[i]-X0)/ratox/*------计算各点的屏幕坐标-----*/

y0[i]=(y[i]-Y0)/ratoy

setcolor(RED)

circle(x0[i],getmaxy()-y0[i],3)/*------画一圆示型值点--------*/

for(w=pn1w<=pn2w+=pn3) /*-------逐条等值线形成--------*/

{

bzdzd(w,&n,&m,bb)/*--------计算等值点--------*/

itoa(w,item,10)/*-------将整数W转换成字符用于标注----*/

xcln(n,m,ratox,ratoy,item)/*-------绘制等值线----*/

getch()

closegraph()

/*==================从文件读入数据======================================*/

#include "hmain.h’

void rcvda(char *flname,float *x,float *y,float *z,int *n0)

{

FILE *stream

if((stream=fopen(flname,"rt"))==NULL) /*------打开文件-------*/

{

printf("nCan’t open %s:",flname)

getch()

exit(0)

while(!feof(stream)) /*------读文件直到结束-------*/

{

fscanf(stream,"%f,",(x+*n0))

fscanf(stream,"%f,",(y+*n0))

fscanf(stream,"%f,",(z+*n0))

*n0=*n0+1/*-----指定区域变动--------*/

fclose(stream)

/*==================用趋势面加权最小二乘法计算网点高程制===================================*/

#include <conio.h>

#include <stdio.h>

#include <math.h>

int CN1,CN2,NP1/*-----CN1,CN2为网点间距,NP1为测量点个数------*/

int X0,Y0/*-----X0,Y0为网格起点坐标------*/

void wzjs(int n,int m,float *x,float *y,float *z,float **bb)

{

int i,j,k,k0,k1,n0,hh=0

double cnum,x1,x2,y1,y2,xt,yt,xxt,yyt,xyt,zt,A,B,c

double e[10][10]={0,u[10]={0

for(i=0i<=ni++) /*-----列网(X向)------*/

{

A=X0+i*CN1

for(j=0j<=mj++) /*------横网(y向)------*/

{

B=Y0+j*CN2

for(k=0k<10k++)

{

u[k]=0

for(k0=0k0<10k0++) e[k][k0]=0

for(k=0k<NP1k++) /*-----高斯法计算曲面方程值并计算网格点值-------*/

{

hh=0

if(A==*(x+k)&&B==*(y+k))

{

*(*(bb+i)+j)=*(z+k)

hh=1break

x1=*(x+k)y1=*(y+k)

x2=x1*x1y2=y1*y1

cnum=(x1-A)*(x1-A)+(y1-B)*(y1-B)

cnum=1/cnum

xt=cnum*x1yt=cnum*y1

xxt=x2*cnumyyt=y2*cnumxyt=x1*yt

e[1][1]=e[1][1]+cnume[1][2]=e[1][2]+xt

e[1][3]=e[1][3]+yte[1][4]=e[1][4]+xyt

e[1][5]=e[1][5]+xxte[1][6]=e[1][6]+yyt

e[2][4]=e[2][4]+x2*yte[2][5]=e[2][5]+x2*xt

e[2][6]=e[2][6]+y2*xte[3][6]=e[3][6]+y2*yt

e[4][4]=e[4][4]+x2*yyte[4][5]=e[4][5]+x2*xyt

e[4][6]=e[4][6]+y2*xyte[5][5]=e[5][5]+x2*xxt

e[6][6]=e[6][6]+y2*yyt

zt=*(z+k)*cnum

u[1]=u[1]+ztu[2]=u[2]+x1*zt

u[3]=u[3]+y1*ztu[4]=u[4]+x1*y1*zt

u[5]=u[5]+x2*ztu[6]=u[6]+y2*zt

if(hh==1) continue

e[2][2]=e[1][5]e[2][3]=e[1][4]e[3][3]=e[1][6]

e[3][4]=e[2][6]e[3][5]=e[2][4]e[5][6]=e[4][4]

for(k=1k<6k++)

for(k0=k+1k0<7k0++)

e[k0][k]=e[k][k0]

for(k=1k<7k++) e[k][7]=u[k]

n0=6

for(k=1k<n0k++)

for(k0=k+1k0<n0+1k0++)

for(k1=k+1k1<n0+2k1++)

e[k0][k1]=e[k0][k1]-e[k0][k]*e[k][k1]/e[k][k]

u[n0]=e[n0][n0+1]/e[n0][n0]

for(k=n0-1k>0k--)

{

c=0

for(k0=k+1k0<n0+1k0++)

c=c+e[k][k0]*u[k0]

u[k]=(e[k][n0+1]-c)/e[k][k]

*(*(bb+i)+j)=u[1]+A*(u[2]+B*u[4]+A*u[5])+B*(u[3]+B*u[6])

/*=======================标记出网格每边上是否有一高程的等值点===============================*/

#include "hmain.h"

float flagx[MAXX][MAXY],flagy[MAXX][MAXY]/*------等值点标志-----*/

void bzdzd(int w,int *n,int *m,float **bb)

{

int i,j

float m1,m2

for(i=0i<*n+1i++) /*-----列网(X向)------*/

for(j=0j<*mj++)

{

m1=w-*(*(bb+i)+j)if(m1==0) m1=-0.01

m2=w-*(*(bb+i)+j+1)if(m2==0) m2=-0.01

if(m1*m2<0) flagy[i][j]=m1/(m1-m2)

else flagy[i][j]=-2

for(i=0i<*ni++) /*------横网(y向)------*/

for(j=0j<*m+1j++)

{

m1=w-*(*(bb+i)+j)if(m1==0) m1=-0.01

m2=w-*(*(bb+i+1)+j)if(m2==0) m2=-0.01

if(m1*m2<0) flagx[i][j]=m1/(m1-m2)

else flagx[i][j]=-2

/*===============等值线追踪=================*/

#include "hmain.h"

float flagx[MAXX][MAXY],flagy[MAXX][MAXY]

int CN1,CN2,i1,i2,j1,j2

int zdzz(float *a1,float *b1,float *a2,float *b2)

{

int flag,i0,j0,s1

if(j2>j1) flag=1

else

if(i2>i1) flag=2

else

if(*b2==j2*CN2) flag=3

else

flag=4

switch(flag)

{

case 1:

if(flagy[i2][j2]>0) /*----判断向左走----*/

{

i0=i2j0=j2s1=0

else if(flagy[i2+1][j2]>0)

{

i0=i2+1j0=j2s1=0

else if(flagx[i2][j2+1]>0)

{

i0=i2j0=j2+1s1=1

else return 1

break

case 2:

if(flagx[i2][j2]>0) /*----判断向上走------*/

{

i0=i2j0=j2s1=1

else if(flagx[i2][j2+1]>0)

{

i0=i2j0=j2+1s1=1

else if(flagy[i2+1][j2]>0)

{

i0=i2+1j0=j2s1=0

else return 1

break

case 3:

if(flagy[i2][j2-1]>0) /*----判断向右走----*/

{

i0=i2j0=j2-1s1=0

else if(flagy[i2+1][j2-1]>0)

{

i0=i2+1j0=j2-1s1=0

else if(flagx[i2][j2-1]>0)

{

i0=i2j0=j2-1s1=1

else return 1

break

case 4:

if(flagx[i2-1][j2]>0) /*------判断向下走-----*/

{

i0=i2-1j0=j2s1=1

else if(flagx[i2-1][j2+1]>0)

{

i0=i2-1j0=j2+1s1=1

else if(flagy[i2-1][j2]>0)

{

i0=i2-1j0=j2s1=0

else return 1

break

i1=i2j1=j2i2=i0j2=j0

*a1=*a2*b1=*b2

*a2=(i2+s1*flagx[i2][j2])*CN1

*b2=(j2+(1-s1)*flagy[i2][j2])*CN2

if(s1==0) flagy[i2][j2]=-2/*----用过标志----*/

else flagx[i2][j2]=-2

return 0

/*=============================================*/

/* 绘制等值线 /

/*=============================================*/

#include "hmain.h"

float flagx[MAXX][MAXY],flagy[MAXX][MAXY]

int i1,i2,j1,j2

int zdzz(float *a1,float *b1,float *a2,float *b2)

void drawln(float a0,float b0,int n,int m,float ratox,float ratoy,char *item)

{

float a1,b1,a2,b2,sin,xa[1000]={0,yb[1000]={0

int k=1

a2=a0b2=b0a1=a0+5b1=b0+5

xa[0]=a0yb[0]=b0

do{ /*-------画线-------*/

if(zdzz(&a1,&b1,&a2,&b2)==1)

{

line(a2/ratox,getmaxy()-b2/ratoy,a0/ratox,getmaxy()-b0/ratoy)

break

line(a1/ratox,getmaxy()-b1/ratoy,a2/ratox,getmaxy()-b2/ratoy)

xa[k]=a2/ratoxyb[k]=getmaxy()-b2/ratoy

k++

while(a2>0&&b2>0&&i2<n&&j2<m)

k=k/2

if((xa[k+1]-xa[k-1])<0.3) sin=VERT_DIR/*-----书写等值数字------*/

else if((yb[k+1]-yb[k-1])<0.3) sin=VERT_DIR

else sin=(yb[k+1]-yb[k-1])/(xa[k+1]-xa[k-1])

settextstyle(TRIPLEX_FONT,sin,3)

setcolor(WHITE)

settextjustify(CENTER_TEXT,CENTER_TEXT)

outtextxy(xa[k],yb[k],item)

setcolor(GREEN)

/*=============================================*/

/* 寻找线头,绘制等值线 /

/*=============================================*/

#include "hmain.h"

int CN1,CN2

void drawln(float a0,float b0,int n,int m,float ratox,float ratoy,char *item)

int i1,i2,j1,j2

float flagx[MAXX][MAXY],flagy[MAXX][MAXY]

void xcln(int n,int m,float ratox,float ratoy,char *item)

{

int w,w1

float a0,b0

for(w=0w<nw++) /*-------从下找起始点-------*/

if(flagx[w][0]>0)

{

i1=wi2=wj1=-1j2=0

a0=(i2+flagx[w][0])*CN1

flagx[w][0]=-2b0=0

drawln(a0,b0,n,m,ratox,ratoy,item)

for(w=0w<mw++) /*---------从左找起始点---------*/

if(flagy[0][w]>0)

{

i1=-1i2=0j1=wj2=w

b0=(j2+flagy[0][w])*CN2

flagy[0][w]=-2a0=0

drawln(a0,b0,n,m,ratox,ratoy,item)

for(w=0w<nw++) /*---------从上找起始点---------*/

if(flagx[w][m]>0)

{

i1=wi2=wj1=mj2=m

a0=(i2+flagx[i2][j2])*CN1

b0=m*CN2flagx[i2][j2]=-2

drawln(a0,b0,n,m,ratox,ratoy,item)

for(w=0w<mw++) /*---------从右找起始点---------*/

if(flagy[n][w]>0)

{

i1=ni2=nj1=wj2=w

b0=(j2+flagy[i2][j2])*CN2

a0=n*CN1flagy[i2][j2]=-2

drawln(a0,b0,n,m,ratox,ratoy,item)

for(w=1w<nw++) /*---------从网格内找起始点---------*/

for(w1=0w1<mw1++)

if(flagy[w][w1]>0)

{

i1=-1i2=wj1=w1j2=w1

a0=i2*CN1

b0=(j2+flagy[i2][j2])*CN2flagy[i2][j2]=-2

drawln(a0,b0,n,m,ratox,ratoy,item)

/*=======================标记出网格每边上是否有一高程的等值点===============================*/

#include "hmain.h"

float flagx[MAXX][MAXY],flagy[MAXX][MAXY]/*------等值点标志-----*/

void bzdzd(int w,int *n,int *m,float **bb)

{

int i,j

float m1,m2

for(i=0i<*n+1i++) /*-----列网(X向)------*/

for(j=0j<*mj++)

{

m1=w-*(*(bb+i)+j)if(m1==0) m1=-0.01

m2=w-*(*(bb+i)+j+1)if(m2==0) m2=-0.01

if(m1*m2<0) flagy[i][j]=m1/(m1-m2)

else flagy[i][j]=-2

for(i=0i<*ni++) /*------横网(y向)------*/

for(j=0j<*m+1j++)

{

m1=w-*(*(bb+i)+j)if(m1==0) m1=-0.01

m2=w-*(*(bb+i+1)+j)if(m2==0) m2=-0.01

if(m1*m2<0) flagx[i][j]=m1/(m1-m2)

else flagx[i][j]=-2

/*==================从文件读入数据======================================*/

#include "hmain.h"

void rcvda(char *flname,float *x,float *y,float *z,int *n0)

{

FILE *stream

if((stream=fopen(flname,"rt"))==NULL) /*------打开文件-------*/

{

printf("nCan’t open %s:",flname)

getch()

exit(0)

while(!feof(stream)) /*------读文件直到结束-------*/

{

fscanf(stream,"%f,",(x+*n0))

fscanf(stream,"%f,",(y+*n0))

fscanf(stream,"%f,",(z+*n0))

*n0=*n0+1/*-----指定区域变动--------*/

fclose(stream)

/*=============================================*/

/* 寻找线头,绘制等值线 /

/*=============================================*/

#include "hmain.h"

int CN1,CN2

void drawln(float a0,float b0,int n,int m,float ratox,float ratoy,char *item)

int i1,i2,j1,j2

float flagx[MAXX][MAXY],flagy[MAXX][MAXY]

void xcln(int n,int m,float ratox,float ratoy,char *item)

{

int w,w1

float a0,b0

for(w=0w<nw++) /*-------从下找起始点-------*/

if(flagx[w][0]>0)

{

i1=wi2=wj1=-1j2=0

a0=(i2+flagx[w][0])*CN1

flagx[w][0]=-2b0=0

drawln(a0,b0,n,m,ratox,ratoy,item)

for(w=0w<mw++) /*---------从左找起始点---------*/

if(flagy[0][w]>0)

{

i1=-1i2=0j1=wj2=w

b0=(j2+flagy[0][w])*CN2

flagy[0][w]=-2a0=0

drawln(a0,b0,n,m,ratox,ratoy,item)

for(w=0w<nw++) /*---------从上找起始点---------*/

if(flagx[w][m]>0)

{

i1=wi2=wj1=mj2=m

a0=(i2+flagx[i2][j2])*CN1

b0=m*CN2flagx[i2][j2]=-2

drawln(a0,b0,n,m,ratox,ratoy,item)

for(w=0w<mw++) /*---------从右找起始点---------*/

if(flagy[n][w]>0)

{

i1=ni2=nj1=wj2=w

b0=(j2+flagy[i2][j2])*CN2

a0=n*CN1flagy[i2][j2]=-2

drawln(a0,b0,n,m,ratox,ratoy,item)

for(w=1w<nw++) /*---------从网格内找起始点---------*/

for(w1=0w1<mw1++)

if(flagy[w][w1]>0)

{

i1=-1i2=wj1=w1j2=w1

a0=i2*CN1

b0=(j2+flagy[i2][j2])*CN2flagy[i2][j2]=-2

drawln(a0,b0,n,m,ratox,ratoy,item)

/*===============等值线追踪=================*/

#include "hmain.h"

float flagx[MAXX][MAXY],flagy[MAXX][MAXY]

int CN1,CN2,i1,i2,j1,j2

int zdzz(float *a1,float *b1,float *a2,float *b2)

{

int flag,i0,j0,s1

if(j2>j1) flag=1

else

if(i2>i1) flag=2

else

if(*b2==j2*CN2) flag=3

else

flag=4

switch(flag)

{

case 1:

if(flagy[i2][j2]>0) /*----判断向左走----*/

{

i0=i2j0=j2s1=0

else if(flagy[i2+1][j2]>0)

{

i0=i2+1j0=j2s1=0

else if(flagx[i2][j2+1]>0)

{

i0=i2j0=j2+1s1=1

else return 1

break

case 2:

if(flagx[i2][j2]>0) /*----判断向上走------*/

{

i0=i2j0=j2s1=1

else if(flagx[i2][j2+1]>0)

{

i0=i2j0=j2+1s1=1

else if(flagy[i2+1][j2]>0)

{

i0=i2+1j0=j2s1=0

else return 1

break

case 3:

if(flagy[i2][j2-1]>0) /*----判断向右走----*/

{

i0=i2j0=j2-1s1=0

else if(flagy[i2+1][j2-1]>0)

{

i0=i2+1j0=j2-1s1=0

else if(flagx[i2][j2-1]>0)

{

i0=i2j0=j2-1s1=1

else return 1

break

case 4:

if(flagx[i2-1][j2]>0) /*------判断向下走-----*/

{

i0=i2-1j0=j2s1=1

else if(flagx[i2-1][j2+1]>0)

{

i0=i2-1j0=j2+1s1=1

else if(flagy[i2-1][j2]>0)

{

i0=i2-1j0=j2s1=0

else return 1

break

i1=i2j1=j2i2=i0j2=j0

*a1=*a2*b1=*b2

*a2=(i2+s1*flagx[i2][j2])*CN1

*b2=(j2+(1-s1)*flagy[i2][j2])*CN2

if(s1==0) flagy[i2][j2]=-2/*----用过标志----*/

else flagx[i2][j2]=-2

return 0

不连接外网 就不可能使用在线地图的服务!

内网的话 只能使用arcgis server或超图 server 或者开源GeoServer来发布地图服务,使用Flex API调用地图服务作为底图。

flex是前台展示, GP+ArcObjects+python 只能作为后台的业务逻辑处理模块,还需要ArcGIS Server发布成服务供flex调用。