如何确定光栅地图(如JPG)格式的地图的经纬度坐标,有没有好的算法。 (200分)

A

agangr

Unregistered / Unconfirmed
GUEST, unregistred user!
请大家多多指教!
我知道Mapinfo的中有对光栅图的配准功能,但我并不打算用
第三方工具来实现。并且我系统的很多功能,要依靠光栅图实现
(没有矢量化的地图). 现在地图上的对象的位置需要经纬度坐
标确定,那么如何来确定这些坐标呢?我的想法是自己建立一个
坐标系,取一些已经知道经纬度的坐标点,进行标定,然后依靠这
些点通过一定的算法来确定坐标系内其它点的坐标,不知道可不可行?
或者有其它更好的算法?
 
我就是这么作的:自己建立一个
坐标系,取一些已经知道经纬度的坐标点,进行标定,然后依靠这
些点通过一定的算法来确定坐标系内其它点的坐标。

效果还可以。
 
photoshop:
你这么一说,我到看到希望了 :)
能不能把你的算法告诉我,当然能把你的源程序发给我就更好了,
验收后200分一定送上。
我的Email: agang_r@sina.com
 
这是从象素点到经纬度的转换函数。
注意:pixel_x[],pixel_y[],attitude_x[],attitude_y[]
保存的是已之的象素坐标,经纬度坐标。由下标对应。
function pixel2attitude(const pixel:tfloatpoint;var Error:boolean):Tfloatpoint;
var
p:Tfloatpoint;
i:integer;
s1,s2,t1,t2:double;
begin

if (pixel.X < pixel_x[0]) or (pixel.X > pixel_x[7]) or
(pixel.y < pixel_y[0]) or (pixel.y > pixel_y[9]) then

begin

// showmessage('非法的象素坐标值!');
p.x :=0;
p.Y :=0;
result := p;
exit;
end;

//if
for i:=1 to 7do

begin

if pixel.X = pixel_x then

begin

p.X := attitude_x;
break;
end
else
if (pixel.X > pixel_x[i-1]) and (pixel.X < pixel_x) then

begin

s1 :=(attitude_x[i-1] - trunc(attitude_x[i-1])) * 100 + trunc(attitude_x[i-1])*60;
s2 :=(attitude_x - trunc(attitude_x)) * 100 + trunc(attitude_x)*60;
t1 :=(pixel.x - pixel_x[i-1]) * (s2-s1) / (pixel_x - pixel_x[i-1]);
//从前一经度占经度多少分
t2 := t1 + s1;
// 占经度多少分
p.x := trunc(t2/60) + (t2 - (trunc(t2/60) * 60))/100;
p.x := trunc(p.x*100) /100;
break;
end;
//if
end;
//for

for i:=1 to 9do

begin

if pixel.y = pixel_y then

begin

p.y := attitude_y;
break;
end
else
if (pixel.y > pixel_y[i-1]) and (pixel.y < pixel_y) then

begin

s1 :=(attitude_y[i-1] - trunc(attitude_y[i-1])) * 100 + trunc(attitude_y[i-1])*60;
s2 :=(attitude_y - trunc(attitude_y)) * 100 + trunc(attitude_y)*60;
t1 :=(pixel_y - pixel.y ) * (s1-s2) / (pixel_y - pixel_y[i-1]);
//从前一经度占经度多少分
t2 := round(t1 + s2);
// 占纬度多少分
p.y := trunc(t2/60) + (t2 - (trunc(t2/60) * 60))/100;
p.y := trunc(p.y*100) /100;
break;
end;
//if
end;
//for
result := p;
end;
//f
 
photoshop :
你在实际的应用中,算法精度怎么样? 你的经纬度坐标和象素坐标的单位采用的是什么?
Tfloatpoint是怎么定义的?,你的函数中 判断"象素坐标"的合法行,根据是什么呢?
为什么用的pixel_x[7]和pixel_y[9]呢?
还有,你这个函数是知道象素坐标的情况下转换成经纬度坐标,但是在标定的时候,
是不是要记录对应象素点的象素坐标和经纬度坐标? 我不明白它们和这个函数的关系
是怎么样的呢?是不是还有一个纬度坐标到象素坐标的转换公式?
能不能将你的实现过程(重建立坐标系到标定也知点,到最后的算法) 思路说清楚些呢?
谢谢你!

 
photoshop:
还在吗?
 
photoshop:
你好,这几天比较忙吗?我的问题你收到没有,我想急于弄明白这个问题,希望你能
够帮忙回答,谢谢
 
这段时间带一个项目,比较忙,首先经度是还可以。经过实践检验的。
如果还想提高经度可以增加取样点。同时对取样点内的坐标可以加以修正(地球的弧度)。
但是一半的不是很大比例的地图不用修正的。
pixel_x[7]和pixel_y[9] 是表示我在x方向取了8个点,y方向取了10个点。
 
to photoshop:
谢谢你在百忙中回答我的问题,我想知道你的具体的思路和实现过程(坐标系的建立,坐标原点的选取,如何取样点的过程)
还有你算法的经纬度坐标是采用分为单位吗?你能告诉我吗?
 
to All:
个人觉得直接用经纬度作为控制点是不对的。应该要知道当前光栅图像是否经过投影,如
有投影还要知道基本投影参数,如:中国地图,通常采用Albert等积圆锥投影,中央经线105度,
StandardParallel1=25度;StandardParallel2=47度。
有投影参数后,可以把图面上作为控制点的标注经纬度换算为投影系统下的地图坐标,
再用所对应的图像像元坐标和计算出的地图坐标用最小二乘法拟合出像元坐标到投影系统地图
坐标变换式(应该为线性的)。方程式的系数可以保存为ArcView、MO等许多软件可以接受的
像元坐标-地图坐标文件(TIFF文件为*.tfw,bmp文件为*.bmpw等)。
再利用已知的投影参数就可以换算出正确的经纬度坐标。



 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
892
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
顶部