1 ArcGIS中的投影方法(從一種投影轉換成另一種投影;在已有投影的情況才能用;有些轉換限制)
投影的方法可以使帶某種坐標信息數據源進行向另一坐標系統做轉換,並對源數據中的X和Y值進行修改。我們生產實踐中一個典型的例子是利用該方法修正某些舊地圖數據中X,Y值前加了帶數和分帶方法的數值。
操作方法:運行ArcGIS9中的ArcMap,打開ArcToolBox,打開 Data Management Tools ->Projections and Transformations->Feature->Project 項 打開投影對話框。
在Input DataSet or Feature Class欄中輸入或點擊旁邊的按鈕選擇相應的DataSet或Feature Class(帶有空間參考),Output DataSet or Feature Class欄中輸入或點擊旁邊的按鈕選擇目標DataSet或Feature Class,在Output Coordinate System 欄中輸入或點擊旁邊的按鈕選擇目標數據的坐標系統。最后點OK鍵即可。
例如 某點狀shape文件中 某點P的坐標為 X 40705012 Y 3478021 ,且該shape文件坐標系統為中央為東經120度的高斯克呂格投影,在數據使用過程中為了將點P的值改為真實值X 705012 Y478021,首先將源數據的投影參數中False_Easting和False_Northing值分別加上40000000和3000000作為源坐標系統,修改參數前的坐標系統作為投影操作的目標坐標系統,然后通過投影操作后生成一新的Shape文件,且與源文件中點P對應的點的坐標為X 705012 Y478021。
2 ArcGIS中坐標系統的定義(在沒有投影的圖層中定義投影系統)
一般情況下地理數據庫(如Personal GeoDatabase的 Feature DataSet 、Shape File等)在創建時都具有空間參考的屬性,空間參考定義了該數據集的地理坐標系統或投影坐標系統,沒有坐標系統的地理數據在生產應用過程中是毫無意義的,但由於在數據格式轉換、轉庫過程中可能造成坐標系統信息丟失,或創建數據庫時忽略了坐標系統的定義,因此需要對沒有坐標系統信息的數據集進行坐標系統定義。
坐標系統的定義是在不改變當前數據集中特征X Y值的情況下 對該數據集指定坐標系統信息。
操作方法:運行ArcGIS9中的ArcMap,打開ArcToolBox,打開 Data Management Tools ->Projections and Transformations->Define Projection 項 打開坐標定義對話框。介下來在Input DataSet or Feature Class欄中輸入或點擊旁邊的按鈕選擇相應的DataSet或Feature Class;在Coordinate System欄中輸入或點擊旁邊的按鈕選擇需要為上述DataSet或Feature定義的坐標系統。最后點OK鍵即可。
例如 某點狀shape文件中 某點P的坐標為 X 112.2 Y 43.3 ,且該shape文件沒有帶有相應的Prj文件,即沒有空間參考信息,也不知道X Y 的單位。通過坐標系統定義的操作定義其為Beijing1954坐標,那么點P的信息是東經112.2度 北緯43.3度。
3 編程實現坐標轉換和投影
3.1 矢量數據投影和坐標轉換
相關接口
3.1.1 IGeometry.Project方法
該方法聲明如下
public void Project (
ISpatialReference newReferenceSystem
);
該方法對實現Igeoemtry的對象進行投影操作, 參數為目標空間參考.以下代碼中實現了對Point對象從一個空間參考到另一個空間參考的投影操作:
//Create Spatial Reference Factory
ISpatialReferenceFactory srFactory = new SpatialReferenceEnvironmentClass(); 字串9
ISpatialReference sr1;
//GCS to project from
IGeographicCoordinateSystem gcs = srFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_NAD1983);
sr1 = gcs;
sr1.SetFalseOriginAndUnits(-180, -90, 1000000);
//Projected Coordinate System to project into
IProjectedCoordinateSystem pcs = srFactory.CreateProjectedCoordinateSystem((int)esriSRProjCSType.esriSRProjCS_NAD1983N_AmericaLambert);
pcs.SetFalseOriginAndUnits(0, 0, 1000);
ISpatialReference sr2;
sr2 = pcs;
//Point to project
IPoint point = new PointClass() as IPoint;
point.PutCoords(-117.17, 34.06);
//Geometry Interface to do actual project
IGeometry geometry;
geometry = point;
geometry.SpatialReference = sr1;
geometry.Project(sr2);
point = geometry as IPoint;
double x;
double y;
point.QueryCoords(out x, out y);
Debug.Print("X: " + x.ToString());
Debug.Print("Y: " + y.ToString());
IGeometry接口的Project方法提供的投影操作實現了最基本的坐標轉換功能. 實際數據處理過程中, 比較明確數據轉換前后空間參考信息情況下一般用此方法作坐標轉換,不同投影帶之間的坐標轉換就是一個典型. 字串9
3.1.2 ITransform2D接口
ITransform2D接口不僅提供了圖形平移, 旋轉和縮放,還提供了更加強大的坐標轉換方法Transform. 其定義如下:(C#語法)
public void Transform (
esriTransformDirection direction,
ITransformation transformation 字串2
);
在該方法中, 參數direction是轉換方向, transformation是一個Itransformation接口, 而Itransformation接口由很多類實現,這意味着不同的實現類,所包含的坐標轉換數學公式是不一的, 這里面包括二次多項式轉換(AffineTransformation2D), AbridgedMolodensky轉換(AbridgedMolodenskyTransformation)等。每一種實現類的轉換方法這里不再贅述,可參照ArcObjects聯機幫助獲得更詳細的信息,下面舉例來說明該方法的使用:(Delphi 代碼)
procedure Transform_(FromPtColl, ToPtColl: IPointCollection; pGeo as IGeometry); 字串3
var
pAffineTransformation2D: IAffineTransformation2D;
ControlPtCnt: integer;
FormPtArray: array of IPoint;
ToPtArray: array of IPoint;
i: integer;
pTransform2D: ITransform2D;
begin
//判斷給定的控制點是否合法 字串5
if FromPtColl.PointCount <> ToPtColl.PointCount then
begin
//控制點不成對錯誤
exit;
end;
if FromPtColl.PointCount < 4 then
begin
//控制點不能少於4個
exit;
end;
ControlPtCnt := FromPtColl.PointCount; 字串6
SetLength(FormPtArray, ControlPtCnt);
SetLength(ToPtArray, ControlPtCnt); 字串8
for i := 0 to ControlPtCnt -1 do
begin
FormPtArray[i] := CoPoint.Create as IPoint; 字串9
FormPtArray[i].PutCoords(FromPtColl.Point[i].X, FromPtColl.Point[i].Y); 字串9
ToPtArray[i] := CoPoint.Create as IPoint;
ToPtArray[i].PutCoords(ToPtColl.Point[i].X, ToPtColl.Point[i].Y); 字串4
end;
//創建 AffineTransformation2D 對象
pAffineTransformation2D := CoAffineTransformation2D.Create as IAffineTransformation2D; 字串8
//設置控制點信息
pAffineTransformation2D.DefineFromControlPoints(ControlPtCnt, FormPtArray[0], ToPtArray[0]); 字串1
//轉到ITransform2D接口
pTransform2D := pGeo as ITransform2D; 字串1
//坐標轉換
pTransform2d.Transform(esriTransformForward, pAffineTransformation2D);
end;
ITransform接口較Igeoemtry提供了更加豐富的坐標轉換方法。
3.2 影像數據糾正。
影像數據糾正可以通過IrasterGeometryProc接口實現。該接口提供了影像Clip, Filp, Merge, Mirror以及Mosaic等操作。如果通過控制點的方式對影像進行糾正處理可以通過該接口的wrap方法。該方法聲明如下:(C#語法)
public void Warp (
IPointCollection sourceControlPoints,
IPointCollection targetControlPoints,
esriGeoTransTypeEnum transformType,
IRaster ipRaster
);
參數 sourceControlPoints和targetControlPoint定義了控制點信息, transformType定義了坐標轉換方法, ipRaster是需要轉換的Raster對象. 以下代碼是該接口使用的例子:
public static void GeoreferenceRaster(IRasterDataset2 rasterDataset, IPointCollection sourcePoints, IPointCollection targetPoints)
{
//this sample show how to georeference a raster using control points
// sourcePoints: represents source control points
// targetPoints: represents target control points IRasterGeometryProc rasterPropc = new RasterGeometryProcClass();
IRaster raster = rasterDataset.CreateDefaultRaster(); //set the transformatin
rasterPropc.Warp(sourcePoints, targetPoints, esriGeoTransTypeEnum.esriGeoTransPolyOrder1, raster); //There are two ways to get the georeferenced result: to save the transformation with the input raster dataset
rasterPropc.Register(raster); //or save to another new raster dataset
rasterPropc.Rectify(@"c:\temp\georeferencing_output.img", "IMAGINE Image", raster); 字串3
}