地理坐标问题(大家多指教) (50分)

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

agangr

Unregistered / Unconfirmed
GUEST, unregistred user!
1、我想在地图上移动到某一地物的时候,能够同时显示该物体的屏幕坐标
和地理坐标(经纬度表示),问题是我如何知道地图上的经纬度坐标呢?
地理坐标是地图电子化的过程中标注上去的吗?还是有相应的计算方法?
2、做与电子地图相关的系统,比如说地图的调用、标注、分层显示、漫游,缩放
等功能一定需要矢量化的电子地图吗,用一般的扫描的光栅图形可以实现吗?

刚刚涉及该方面的系统,希望大家多多指点!
 
1. 需要地理坐标和屏幕坐标的相互转换
2. 光栅图形当然可以,例如:http://www.earthviewer.com
 
呵呵,孙老师,刚刚卖了你的《计算机地理制图》的书,正在学习中,我看你用的
图是矢量地图,数据也是按层次分类放在文件中的,我不明白假设用光栅图形来做地图的
分层显示应该怎么做呢??????
 
to:yysun
我在你的书上看见地理坐标和屏幕坐标的相互转换的公式,这是一个通用算法公式吗?


 
地球是一个不规则的东西,好象没有一个确定的公式吧.
精度低一点倒是有几个公式.
另外,我对MapX如何关联数据库一直不太清楚.比如如何使用ADO连接的数据库就一直不成功.
 
大家关注关注
 
是的,孙老师的书中所讨论的是标准的方法,如果要解决此问题的话。
其次,数据本身有其地理坐标,否则如何操作数据?:)
 
先将经度纬度投影到平面坐标,然后将平面坐标转换到屏幕坐标。
你可以看看投影方面的书先,常用的有球投影,摸卡特投影。
另外,如果你想做电子地图不妨用现成的控件组,如:
TGlobe http://www.tglobe.com
tatukGIS http://www.tatukgis.com/
CartoGIS http://www.carto.com
 
谢谢,大家继续
 
也想知道与数据库的连接问题.
 
这没有一定的,有可能你的地图数据的坐标本身就是经纬度,那自然是不用转换,就算不是经纬度,
那也得看情况,比如HK地图的HK80坐标系的坐标有可能是以米为单位或以MS为单位,
它们的算法是一样的但也需要进行单位转换,而且还是很多坐标系,它们有的转换方法是一样的,
但是转换过程的参数是不同的,而有的转换过程就差别很大.
 
栅格图当然可以用,但与矢量图的使用有很大区别,你说的地理坐标问题,要先对栅格图
进行配准,其实在小区域范围内,你可以认为投影为平面投影,这样的话,你必须先获知
几个象素点所对应的地理坐标,自己转换一下,如果区域大的话,还要考虑投影问题。
 

1、栅格地图应该是已经通过地球面投影到平面绘制而成的吧?
2、如果我有一张地图,我怎么知道它上面各点的地理坐标呢?是不是有相关的规定?!
3、如果我知道了这个地理坐标,要想知道任一点的经纬度坐标,是不是还应该知道它
当初的采用的投影方式和经纬度坐标和地理坐标之间的换算关系呢?
4、如果是采用栅格地图,对图层的调用操作怎么实现呢?
 
关注一下,怎么样与数据库(比如ADO)连接?
有谁知道?
 
mapX中ADO的数据绑定的例子(ADO)

在form上放ADO控件,如果你想用ADO的话(建议),设置好连接,方法和普通数据库程序
开发也没什么两样,然后参考一下我下面的代码,添加数据集。
有了数据集,你就可以为所欲为了 :),或查属性数据,或作专题图什么的,都可以了。

procedure TForm1.N30Click(Sender: TObject);
begin

ADOQuery1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/工程/Delphi编程实践/MapXFengTai/database/ftycdb.mdb;Persist Security Info=False';
ADOQuery1.close;
ADOQuery1.Sql.Clear;
ADOQuery1.SQL.Add('Select * from 片区');
ADOQuery1.open;

ds := map1.datasets.Add(miDataSetADO,ADOQuery1.Recordset,'dsPQ','ph',Emptyparam,'片区图',Emptyparam,true);
end;


----------

经纬度也好办,map的mouseMove事件中能得到屏幕坐标x,y,下面程序能及时显示鼠标经纬度。
procedure TfrmMain.Map1MouseMove(Sender: TObject;
Shift: TShiftState;
X,
Y: Integer);
var
ScreenX,ScreenY : single;
mapXX,mapYY :do
uble;
begin

ScreenX := X;
ScreenY := Y;
map1.ConvertCoord(ScreenX,ScreenY,MapXX,MapYY,miScreenToMap);
StatusBar1.Panels.Items[0].Text := '经度:'+ format('%3.4f',[MapXX]);
StatusBar1.Panels.Items[1].Text := '纬度:'+ format('%3.4f',[MapYY]);
end;


 
多人接受答案了。
 

Similar threads

D
回复
0
查看
744
DelphiTeacher的专栏
D
D
回复
0
查看
718
DelphiTeacher的专栏
D
D
回复
0
查看
672
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部