欢迎数学高手参与讨论(100分)

  • 主题发起人 主题发起人 agangr
  • 开始时间 开始时间
A

agangr

Unregistered / Unconfirmed
GUEST, unregistred user!
问题描述:用户在删格地图上根据已知经纬度的一条经线和一条纬线进行标注(采样点),这样我们
就有组已知值,假设Zn表示经度,Ln表示纬度,Xn, Yn表示Zn和Ln表示对应的像素点坐标
,现在要根据这些求其它点的经度和纬度,并要达到一定的精确度?该如何解决,
欢迎讨论,能给出详细的算法思路
 
经线或纬线应该是有规律的弧线。另一条是直线。
 
你的地图是方的还是圆的

方的好办 圆的比较麻烦 而且误差大
 
如果是一个城市地图,只要考虑平面算法就可以了,理论上来说两个参照点就可以了,两个点可以
确定一个线性方程式,并确定它的斜率,如果有更多的点,可以能过程序进行两两组合,并计算出各
自的斜率,然后进行平均,取得相对最准确的斜率,再根据这个斜率来计算其他点的坐标.
 
其中rlRB,rlLT是这两个点,In_Long,In_Lat是已知的经纬度,Result是求出的点坐标.
if Round((rlRB.fLongtudge-rlLT.fLongtudge)*10000)=0 then
//如果地图经纬度左上和右下两个点相同。
Result.x:=-1000
else
Result.x:=Round((rlRB.iMapCoorX-rlLT.iMapCoorX)
/(rlRB.fLongtudge-rlLT.FLongtudge)
*(In_Long-rlLT.FLongtudge)+rlLT.iMapCoorX
);
if Round((rlRB.Flatitudge-rlLT.Flatitudge)*10000)=0 then
//如果地图经纬度左上和右下两个点相同。
Result.y:=-1000
else
Result.y:=Round((rlRB.iMapCoorY-rlLT.iMapCoorY)
/(rlRB.Flatitudge-rlLT.Flatitudge)
*(In_Lat-rlLT.Flatitudge)+rlLT.iMapCoorY
);
 
如果要考虑球面,那就比较麻烦,一般需要采用特定的投影算法,比如默卡托投影等等,关于投影算法,
老孙有一本书叫什么名字我不知道了,很详细,不过好象好难买!
 
主要还是平面的算法,并且有一条经线和纬线的度数是知道的,也就是说可以在这两条
已知道的线上取点计算
 
如果是平面好象不用复杂的数学算法,上面的例子的rlRB,rlLT是已经的两个点的结构如下:

RLocated = Packed Record //在地图上的经纬度及其所对应的地图坐标
fLatitudge :double; //地图经纬度
fLongtudge :double;
iMapCoorX :Integer; //该经纬度对应的地图坐标
iMapCoorY :Integer;
End;
 
纬度和经度都是把地球等分出来的(纬度180,精度360),根据两个半径(纬度半径和
经度半径)可以求得经线1度是多少公里(平行赤道),纬线1度是多少公里(平行经线)
知道某点的经度纬度,和离该点的距离可以求得要求点的经度纬度
 
aizb:
这是一个朋友给我的一个算法,好想是用到了线性插值法,没看很明白,另外,图象的象素坐标
该怎么获得呢?
这是从象素点到经纬度的转换函数。
注意: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 7 do
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 9 do
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
 

Similar threads

D
回复
0
查看
767
DelphiTeacher的专栏
D
D
回复
0
查看
809
DelphiTeacher的专栏
D
D
回复
0
查看
639
DelphiTeacher的专栏
D
后退
顶部