比较难的问题,从数据库中读出数据作图
从数据库中读出数据(有几十万条),每一行的格式是(X,Y,Z),X是经度,Y是纬度,Z是水深值(就是大海有多深)。现在要求这样作图(在一个平面里):
X,Y分别为纵、横坐标,Z用颜色(例如蓝色)的深浅表示(地图的效果),而且颜色要连续,不能有空白的地方,即使没有足够的数据来填补空白。
请大家帮我想想办法,能提供一个算法的思路也行
问题点数:50、回复次数:11Top
1 楼xpdavis(咕嘟-不想孤独)回复于 2004-08-03 08:42:01 得分 0
是画成地球仪(可以转动的),还是世界地图的方式?去找一些开放源代码?Top
2 楼thp(老滕)回复于 2004-08-03 08:52:28 得分 0
支持一下。Top
3 楼songhtao(三十年孤独)回复于 2004-08-03 09:05:40 得分 10
建议用mapinfoTop
4 楼jeep008()回复于 2004-08-03 09:31:56 得分 0
学习一下Top
5 楼ceble(蓝色天空)回复于 2004-08-03 09:52:43 得分 0
to:xpdavis(咕嘟) :
画成地图的方式就可以了,不需要会动的
to:songhtao(三十年孤独):
mapinfo是什么东西?小弟孤陋寡闻哦
Top
6 楼yjy1001(蓝鲸--优秀得郁闷的鱼)回复于 2004-08-03 21:03:56 得分 20
这里假设你的数据库中的Z是已经排序过的(未排序,自己先排,这里不给排序代码了)
MaxNum为最大数据量
BYTE liv_r, liv_g, liv_b;//R,G,B颜色值
int buf[3][MaxNum];//里面 [0]存有x, [1]存有y, [2]存有z,值
liv_r = liv_g = liv_b = 0;
for (int i = 0; i < MaxNum - 1; i++)
{
Canvas->Pen->Color = liv_r + (liv_g << 8) + (liv_b << 16);
Canvas->MoveTo(buf[0][i], buf[1][i]);
Canvas->LineTo(buf[0][i + 1], buf[1][i + 1]);
liv_b++;//颜色超出255时,变回0
if (liv_b > 255)
{
liv_b = 0;
}
}Top
7 楼yy2001()回复于 2004-08-04 09:22:35 得分 0
gzTop
8 楼yjy1001(蓝鲸--优秀得郁闷的鱼)回复于 2004-08-04 09:27:02 得分 5
兰色灰度最多是 256级啦
当你的灰度超出时,只有循环(或不在变化)
if (liv_b > 255)
{
liv_b = 255;//这样修改为不变化……
}Top
9 楼ceble(蓝色天空)回复于 2004-08-04 12:32:41 得分 0
兰色灰度最多是 256级啦
当你的灰度超出时,只有循环(或不在变化)
to: yjy1001(蓝鲸--优秀得郁闷的鱼):
不要超出255啊,最深的地方就用B=255啊,
我的想法是先确定在屏幕上绘图的区域大小,比如在100*100(像素)的范围内,按你所说的把Z排好序,
MaxZ_Blue_Color=255;
MinZ_Blue_Color=100;//其他小于255的值也可以
d_Blue_Color=MaxZ_Blue_Color-MinZ_Blue_Color;
d_Z=MaxZ-MinZ;
dColor=d_Z/d_Blue_Color;
对于任意一个Z,这样确定它的Color;
Z_Blue_Color=MinZ_Blue_Color+(Z-MinZ)/dColor;
这样就能保证Blue不会超过255,也有水越深兰色越深的效果,空白部分一律以MinZ_Blue_Color填充。
不知道有没有更好的算法
Top
10 楼Maconel(Maconel)回复于 2004-08-04 13:37:36 得分 10
最大是256吗,好象是255哦,0xff嘛Top
11 楼lwglucky(才鸟)回复于 2004-08-04 14:20:27 得分 5
首先你要看看bmp文件的格式,然后创建一个合适大小的内存图. 然后将你Z坐标按照XY添入内存图的位置。最后使用模糊算法使图象颜色连续(简单的模糊算法就是将每一点的颜色和周围8个点颜色加权平均)Top




