怎么做?很难吗?(100分)

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

agangr

Unregistered / Unconfirmed
GUEST, unregistred user!
问题描述:用户在删格地图上根据已知经纬度的一条经线和一条纬线进行标注(采样点),这样我们
就有组已知值,假设Zn表示经度,Ln表示纬度,Xn, Yn表示Zn和Ln表示对应的像素点坐标
,现在要根据这些求其它点的经度和纬度,并要达到一定的精确度?该如何解决,
欢迎讨论,能给出详细的算法思路
 
你的栅格图的投影已知吗?如果知道,就可以建立原始地理坐标和屏幕坐标的投影转换关系,
后一点我可以帮你,前一点你得自己搞定,不行的话就弄到ArcInfo中去配准一下。
 
好象有过类似贴!
 
to:吕大侠
这个问题我曾经问过,有朋友采取了一种算法(好想是线性插值法)来计算两者之间的关系
这种过程就好象是ArcInfo/mapinfo中的配准过程一样,但由于本人数学功底不够,始终不能
完全明白这种方法的操作过程,希望你能帮忙看看?
请参见讨论:http://www.delphibbs.com/delphibbs/dispq.asp?lid=1438696
这是一个朋友给我的一个算法,好想是用到了线性插值法,没看很明白,另外,图象的象素坐标
该怎么获得呢?
这是从象素点到经纬度的转换函数。
注意: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
 
我没去仔细研究你的算法,但我感觉你有一个约定:地图已经是某种经纬度坐标了,比如
WGS-84 BLH,因此你需要的是把地图上的浮点坐标转换到屏幕上来,对吧?
如果是这样,用下面的坐标转换函数就可以了,
//参数dX和dY是地理坐标,比如经纬度坐标,nX和nY是屏幕坐标
//变量PlotRect是你在屏幕上想要显示的范围矩形,DrawRect是你在屏幕上要显示的地图
//的实际范围(即此范围是地图的一部分,如果全图显示的话,此范围就是整个地图的范围)
//Scale是屏幕坐标对地理坐标的内部比例尺,从下面第二个函数获得。(先计算比例尺,再
//映射坐标)
procedure XYMapToPlot(dX, dY :do
uble;
var nX, nY : integer);
var
nAX,nAY : Integer;
begin

nAX := Trunc((PlotRect.Right -(DrawRect.Right - DrawRect.Left)*Scale)/2);
nAY := Trunc((PlotRect.Bottom-(DrawRect.Bottom - DrawRect.Top)*Scale)/2);
nX := nAx+Trunc((dX-DrawRect.Left) * Scale);
nY := Trunc((DrawRect.Bottom-dY)*Scale)+nAY;
end;


procedure ReCalcScale;
var
sx, sy: single;
begin

SX := (DrawRect.Right-DrawRect.Left)/(PlotRect.Right-PlotRect.Left);
SY := (DrawRect.Bottom-DrawRect.Top)/(PlotRect.Bottom-PlotRect.Top);
if SX < SY then
Scale := 1.0/SY else
Scale := 1.0/SX;
DrawRect.Right := DrawRect.Left + (PlotRect.right-PlotRect.Left) / Scale;
DrawRect.Bottom := DrawRect.Top + (PlotRect.bottom-PlotRect.Top) / Scale;
end;

 
to: 吕雪松
我的意思是我扫描的一张地图,上面有已知的经线和纬线(例如10度间隔经线和10度
间隔纬线),现在我想通过对某条已经知道经度和纬度的经线和纬线上取点(这样每个点
就有三个值:经度(lb)或纬度值(la)及对应像素点坐标值(x,y)), 我想通过这些点
寻找出他们之间的关系, 这样通过这种关系来求出地图上其它像素点对应的经纬度值
假设不用这种方式,有其他方法来达到这样一点吗?(不用mapinfo的配准)
 
经纬线是垂直和水平的吗?
 
to: 吕雪松
应该是吧!我的目的和photoshop发的帖子要达到的目的是一样的,请参考:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1199963
 
首先要知道地图上的经纬度线是怎么画的。
是(椭)圆弧吗。半径、弧度
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
778
DelphiTeacher的专栏
D
D
回复
0
查看
832
DelphiTeacher的专栏
D
D
回复
0
查看
818
DelphiTeacher的专栏
D
D
回复
0
查看
649
DelphiTeacher的专栏
D
D
回复
0
查看
837
DelphiTeacher的专栏
D
后退
顶部