問題の声明
拡張子が「.shp」のファイルがあります。 このファイルには、輪郭の形のマップが含まれています。各輪郭は個別の形状で作成されます。 形状の名前は、輪郭の特徴的な高さです。 私たちのタスクは、これからのデータを配列に考慮することです。 配列は、3つの座標(x、y、z)で定義されるポイントのセットです。 さらに、この配列はデータベースに入力する必要がありますが、当面は見失うことになります。
理論のビット
私たちにとって重要な「* .shp」形式の機能を検討してください。 実際、ShapeFileには多くの情報が含まれていますが、関心は限定的です。 まず、ShapeFileがいわゆる「Shapes」(eng。Shape-Figure)に分割されていることを知る必要があります。 シェイプは、複雑なシェイプのシェイプまたはシェイプのセット(接続されていない場合もあります)です。 形状は、個々の点とそれらを結ぶ線に関する情報の形式で保存されます。 私たちの場合、各形状は、同じ高さを持つ地球の景観上の点の位置を示す連続した曲線です(形状の名前は高さの数値に対応します)。 問題の特異性を考慮して、接続点の線に関する情報ではなく、点の位置とその高さに関する情報のみに関心があります。
また、* .shp形式のファイルと一緒に、* .dbf形式のファイルが、形状に関するヘッダー情報を含んで形成されることも注目に値します。 ファイル「* .dbf」は、ファイル「.shp」と同じ名前にする必要があります。
MapWindowGIS
ネット上で数回検索した後、MapWindowGISライブラリを発見しました。 このライブラリの可能性は非常に広く、目標を達成するのに役立ちます。 次のリンクからダウンロードできます。
このライブラリをダウンロードしたら、インストールする必要があります。 インストール後、Delphi開発環境を起動します。 Component-Import AciveX Controlコマンドを実行します...その後、ウィンドウが表示されます。
ActiveXライブラリのリストでMapWinGISコンポーネントを見つけ、[インストール...]ボタンをクリックします。その後、このライブラリを通常のコンポーネントとしてインストールする必要があります。 このライブラリが正常にインストールされると、ActiveXタブにTMapコンポーネントが表示されます。
地図表示を追加
最初に、TMap型のMap1コンポーネントをフォームに追加します。 すでに述べたように、ActiveXタブの最後の位置にあります。
コンポーネントがファイルに含まれるマップを表示するには、簡単なコードで十分です。
var
shp:Shapefile; // -
HandleLayer:integr; //
begin
shp:=CoShapefile.Create; // -
shp.Open('map.shp',nil); // 'map.shp'
Map1.Focused; // ,
HandleLayer:=Map1.AddLayer(shp,true); //
Map1.ZoomToMaxExtents; // ( ) ,
end;
形状ヘッダー情報の読み取り
* .dbf形式のファイルからヘッダー情報を読み取るには、TTableおよびTDataSourceコンポーネントを使用します。 これを行うには、それぞれ「BDE」タブと「データアクセス」タブから、TDataSource型のTTable型とDataSource1型のTable1コンポーネントをフォームに追加します。 Table1コンポーネントは変更されないままで、DataSource1コンポーネントの「DataSet」パラメーターで「Table1」を選択します。
便宜上、[ダイアログ]タブからTOpenDialog型のOpenDialog1コンポーネントをフォームに追加します。 OpenDialog1コンポーネントの「Filter」パラメーターで、「Shape files(.shp)」という名前のフィルターと「* .shp」(引用符なし)をフィルターに追加します。 さらに、「開く」ボタンと「保存」ボタンを追加します。
[開く]ボタンの完全な手順コードは次のようになります。
procedure TImportForm.ShowShape;
var
nameDB:WideString; //
HandleLayer:integr;
begin
nameDB:=OpenDialog1.FileName; //
shp:=CoShapefile.Create;
shp.Open(nameDB,nil);
Map1.Focused;
HandleLayer:=Map1.AddLayer(shp,true);
Map1.ZoomToMaxExtents;
Delete(nameDB,length(nameDB)-2,3); //
nameDB:=nameDB+'dbf'; // ".dbf"
Table1.TableName:=nameDB; // "*.dbf"
Table1.Active:=True; //""
end;
shp変数をグローバル変数セクションに追加する必要があることを忘れないでください。
ファイルからポイントを読み取る
最初に、「保存」ボタンに割り当てられた手順のコードを示します。
procedure TImportForm.SaveShape;
var
i,j:integer; //
z:integer; // ,
begin
if shp<>nil then // shp
begin
Table1.First; //
k:=0;
for i:=0 to shp.NumShapes-1 do //
begin
z:=StrToInt(Table1.Fields[2].Value); //
for j:=0 to shp.Shape[i].numPoints-1 do //
begin
Mas[k].x:=shp.Shape[i].Point[j].x;
Mas[k].y:=shp.Shape[i].Point[j].y;
Mas[k].z:=z;
inc(k);
end;
Table1.Next; //
end;
..
//
..
end
else ShowMessage(' ');
end;
いくつかの機能を見てみましょう。 したがって、MasはDouble型(x、y、z)の3つのパラメーターを持つポイントの1次元配列です。 shp.NumShapesパラメーターは、ファイル内の図形の数と同じです。 パラメーターTable1.Fields [2] .Valueは、現在の形状の名前です(ファイル「* .dbf」は、名前が3列目に書き込まれるように構成されています)。 shp.Shape [i] .numPoints、おそらく既に推測したとおり-i番目の形状のポイントの数。 shp.Shape [i] .Point [j] .xおよびshp.Shape [i] .Point [j] .yは、i番目の形状のj番目の点の切望された座標です。 残りは、コメントから明らかだと思います。
おわりに
そのため、DelphiでShapeFileを使用する機能の検討を終了しました。 私たちはタスクに完全に対処しました。 もちろん、このレビューは氷山の一角にすぎませんが、この入門記事がこの方向のさらなる発展に役立つことを願っています。
使用材料:
MapWindow GISを操作します。 復習