맵인포(Mapinfo)는 미국의 맵인포(Mapinfo)사가 1986년 출시한 데스크탑 지도 정보 시스템으로, 원래의 맵인포(Mapinfo for Dos 1.0)에서 맵인포 프로페셔널(Mapinfo Professional) 6.0으로 발전했다. Mapinfo 제품은 Arc/Info와 같은 대규모 GIS 시스템에 비해 Mapinfo 메타데이터에는 위상 구조가 포함되어 있지 않기 때문에 매핑 및 공간 분석 기능이 상대적으로 약하지만 널리 사용되는 PC 데스크톱 데이터를 처리할 수 있습니다. 정보 매핑 애플리케이션 측면에서 Mapinfo는 작고 정교하며 배우기 쉽고 가격이 저렴합니다. Mapinfo는 사용자가 자신의 GIS 애플리케이션을 개발할 수 있는 자체 보조 개발 플랫폼을 제공합니다. 세 가지 보조 개발 방법이 있는데, MapBasic 기반 개발, OLE 자동화 기반 개발, MapX 컨트롤을 사용한 개발입니다. 초기 MapBasic부터 현재 MapX4.5까지 Mapinfo에서의 GIS 시스템 개발은 점점 더 효율적이고 간단해졌습니다. 다음은 MapBasic, OLE 자동화 및 MapX를 사용하여 GIS 응용 시스템을 개발하는 방법을 설명합니다.
1. MapBasic을 이용한 개발
MapBasic은 Mapinfo의 자체 보조 개발 언어로 Basic과 유사한 해석 언어이며 MapBasic 프로그래밍으로 생성된 *.mbx 파일을 사용합니다. Mapinfo 소프트웨어 플랫폼 Mapinfo의 초기 2차 개발은 MapBasic을 기반으로 했습니다. MapBasic은 배우기 쉽지만 사용 시 제약이 많습니다. 더 복잡한 사용자 정의 기능을 구현할 수 없으며, 사용자 인터페이스를 구축하는 데 사용하기에도 번거롭습니다. 현재 관점에서 보면 Mapinfo 기능을 확장하는 데에는 MapBasic이 더 적합합니다. .
2. OLE 자동화 개발 사용
1. Mapinfo 자동화 개체 설정
OLE 자동화 기반 개발은 프로그래머가 VC, VB와 같은 표준화된 프로그래밍 도구를 사용함을 의미합니다. , Delphi, PB 등은 자동화 컨트롤러를 구축한 후 MapBasic 언어와 유사한 매크로 명령을 보내 Mapinfo를 작동시킵니다. Mapinfo는 실제로 컨트롤러가 해당 속성과 메서드를 호출할 수 있도록 백그라운드에서 OLE 자동화 개체를 출력하는 out-of-process 서버로 사용됩니다.
OLE 자동화 개발의 첫 번째 단계는 Mapinfo 자동화 개체를 생성하는 것입니다. Delphi를 예로 들면(나중에 해당될 예정임) Variant 유형의 전역 변수를 설정하여 OLE 자동화를 나타낼 수 있습니다. 변수 이름이 olemapinfo라고 가정하면 다음과 같습니다.
oleMapinfo := CreateOleObject('Mapinfo.Application')
OLE 자동화 개체가 설정되면, 즉, 배경 Mapinfo가 성공적으로 시작되면 개체의 Do 메소드를 사용하여 Mapinfo에 다음과 같은 명령을 보낼 수 있습니다.
oleMapinfo.Do('Set Next Document Parent' WinHand 'Style 1')
이 명령은 Mapinfo 창을 응용 프로그램 창의 하위 창으로 만들고, WinHand는 지도 창 핸들, 스타일 1은 테두리가 없는 창 유형입니다.
자동화 개체의 Eval 메서드를 사용하여 MapBasic 식의 값을 반환할 수도 있습니다. 예를 들어 다음 문은 현재 열려 있는 테이블 수를 반환합니다.
TablesNum:=olemapinfo.eval('NumTables ()')
Mapinfo 메뉴 또는 버튼 명령을 직접 호출하여 지도 표시 확대 등 지도 창을 조작할 수도 있습니다.
oleMapinfo.RunMenuCommand(1705)
p>
2. 고객 자동화 개체가 콜백을 트리거합니다.
OLE 기반 자동화 개발의 어려움은 소위 콜백에 있습니다. 클라이언트 프로그램 맵 창에 대한 Mapinfo 서버의 응답입니다. 콜백(CallBack) 지도 창에서 지도 대상을 이동하면 Mapinfo가 지도 대상의 현재 좌표 위치를 알려주는 정보를 반환할 수 있는 것이 콜백(CallBack) 기능입니다. 자신만의 지도 작업 도구나 메뉴 명령을 사용자 정의하려면 콜백을 사용해야 합니다. 그러나 콜백 정보를 캡처하려면 클라이언트 프로그램에 콜백 정보를 수신할 수 있는 기능이 있어야 합니다. 이를 위해서는 클라이언트 프로그램에서 다음과 같은 고유한 OLE 자동화 개체를 정의해야 합니다.
/ /정의 인터페이스
IMyCallback = 인터페이스(IDispatch)
['{2F4E1FA1-6BC7-11D4-9632-913682D1E638}']
function WindowContentsChanged(var WindowID : 정수): SCODE;
function SetStatusText(var StatusText: WideString): SCODE; 인터페이스 구현 정의
TMyCallback; (TAutoObject, IMyCallback)
function SetStatusText(var StatusText: WideString): SCODE;
function WindowContentsChanged(var WindowID: Integer): SCODE; p>WindowContentsChanged 함수는 창의 ID 번호 변경을 반환하는 데 사용됩니다. 즉, 지도 창이 변경되면(예: 확대 또는 축소) Mapinfo가 지도 창의 ID 번호를 다른 클라이언트 프로그램에 반환하도록 합니다. SetStatusText 함수는 Mapinfo 상태 표시줄 변경 정보를 반환합니다. Mapinfo 서버의 콜백은 다음 세 가지 상황에서만 트리거되기 때문에 프로그래머는 이러한 기능을 마음대로 정의할 수 없습니다. (1) 지도 창이 변경되고 트리거 기능이 WindowContentsChanged입니다. (2) Mapinfo 상태 표시줄 정보가 변경되고 트리거 기능이 있습니다. is SetStatusText. (3) 사용자가 지도 창에서 선 그리기 도구와 같은 지도 창에서 작업할 사용자 정의 도구나 메뉴 명령을 선택하면 Mapinfo의 CallBack이 트리거되어 반환됩니다. 선의 좌표 위치.
고객 자동화 개체를 설정한 후 MapInfo 자동화 개체의 SetCallback 메서드를 호출하여 프로그램이 실행되자마자 고객 자동화 개체가 자동으로 Mapinfo에 등록됩니다. 그러면 다음과 같은 콜백 정보를 받을 수 있습니다:
My:=MyCallBack.Create
oleMapInfo.SetCallBack(My)
제 생각에는 위의 메커니즘을 이해하는 데 도움이 될 것입니다. 클라이언트 프로그램과 Mapinfo 간의 상호 작용은 무대 지휘자와 인형 조종자 간의 통신과 비슷합니다. 꼭두각시와 배경의 Mapinfo는 실제 인형 조종자이므로 클라이언트 프로그램은 지도 창의 그래픽 개체를 조작하기 위해 배경 Mapinfo와의 정방향 및 역방향 접촉 메커니즘을 설정해야 합니다.
3. MapX를 이용한 개발
1. MapX 사용법 익히기
MapX는 Mapinfo에서 출시한 최신 ActiveX 컨트롤 제품으로, MapX4.5. MapX는 Windows 운영 체제를 기반으로 하는 표준 컨트롤이므로 VC, VB, Delphi, PB와 같은 표준화된 프로그래밍 도구를 지원할 수 있습니다. 사용 시 컨트롤을 로드한 후 컨트롤을 로드하기만 하면 됩니다. , 개발 환경의 ActiveX 툴바에 컨트롤 버튼이 추가됩니다. Map을 폼에 드래그 앤 드롭하여 TMap 유형의 ActiveX 맵 개체를 생성합니다. Map 개체의 속성을 설정하거나 액세스하여 메서드와 이벤트를 호출합니다. 지도 개체를 사용하면 지도를 신속하게 작성할 수 있습니다. 운영 기능이 애플리케이션에 통합되어 있습니다.
MapX는 일련의 객체와 컬렉션으로 구성됩니다. 지도는 가장 기본적인 객체입니다. 각 맵은 레이어, 데이터세트, 주석으로 구성됩니다. 위의 세 가지 주요 객체의 특성을 학습한 후 다음을 수행할 수 있습니다. 단서를 따라가면 다음 단계 객체의 특성을 파악할 수 있습니다. 예를 들어 각 Layer는 Feature(점, 선, 표면, 텍스트 그래픽 객체) 객체와 객체 컬렉션(Features)으로 정의되고, 각 Dataset은 Field( 속성 데이터 필드) 객체 및 객체 컬렉션(필드) 정의...를 통해 MapX를 빠르게 학습할 수 있습니다.
2. 지도 좌표계 정의
MapX 개발에서는 지도 좌표계 문제에 특별한 주의를 기울여야 합니다. 지도 표시 좌표계와 내부 계산 좌표계는 서로 독립적입니다. 좌표계는 소프트웨어의 내부 좌표 처리에 영향을 미치기 때문에 GIS 응용 프로그램 개발 시 응용 요구에 따라 이 두 좌표계를 설정하는 것이 매우 중요합니다. 한편으로는 시스템을, 다른 한편으로는 지도의 모양을 표시합니다.
Map 개체의 좌표계와 투영은 CoordSys 개체의 Set 메서드를 통해 정의됩니다.
Set(Type, [Datum], [Units], [OriginLongitude], [OriginLatitude],
[ StandardParallelOne], [StandardParallelTwo], [Azimuth], [ScaleFactor],
[FalseEasting], [FalseNorthing], [Range], [Bounds], [AffineTransform])
여기서 주요 매개변수: 유형은 투영 유형을 나타냅니다. 지도 좌표는 경도와 위도로 표시됩니다. 여기서 Datum은 지구의 데이텀입니다. , 단위가 7인 경우 이는 미터 단위를 의미합니다. OriginLongitude, OriginLatitude는 각각 시작 경도와 위도입니다. StandardParallelOne 및 StandardParallelTwo는 지도 투영과 관련이 있습니다.
Map 객체의 DisplayCoordSys, NumericCoordSys 속성에서 반환하는 CoordSys 객체를 설정하여 지도 표시 좌표계와 내부 계산 좌표계를 설정할 수 있습니다. 예:
프로시저 TMain.DefineMapParam();
var
MapDatum: //Earth datum
start < / p>
try
MapDatum:= CreateOleObject('MapX.Datum.4'); //데이텀 객체 생성
//Beijing 54 좌표계 데이텀 정의
// (타원체, ShiftX, ShiftY, ShiftZ, RotateX, RotateY, RotateZ, ScaleAdjust, PrimeMeridian)
MapDatum.set(3, 24, -123, -94, - 0.02 , 0.25, 0.13, 1.1, 0);
//Beijing 54 좌표계의 경도와 위도를 내부 계산 좌표계로 정의합니다.
Map1.NumericCoordSys.Set_(1, MapDatum);
//베이징 54 좌표계 정의 30도 표준 위도 메르카토르 투영을 디스플레이 좌표계로, 단위는 미터입니다.
Map1.DisplayCoordSys.Set_(26, MapDatum , 7, 0, 0, 30);
마지막으로
VarClear(MapDatum)
end
GIS 시스템의 초석, 올바른 좌표계 설정은 시스템의 성공과 실패의 열쇠입니다.
3. 지도 객체 조작
GeoSet 파일을 로드하고 레이어 객체 컬렉션에 특정 콘텐츠를 제공하면 지도 객체에서 지도 표시를 볼 수 있습니다. 파일은 MapInfo의 작업공간과 유사합니다. MapX에는 Geoset 파일 편집기인 GeosetMangater.exe가 있습니다. 사용자는 편집기에서 레이어를 결합하고 설정한 다음 *.gst 파일을 저장하고 생성하여 이를 지도 객체로 직접 전송할 수 있습니다. 시간.
다음과 같이 Layers 개체의 Add 또는 Remove 메서드를 통해 지도 레이어를 추가하거나 제거할 수도 있습니다.
Map.layers.Add(FileName); // 레이어 추가, FileName은 전체 경로 이름입니다. of the file
Map.Layers.Remove(3); // 지도의 세 번째 레이어를 제거합니다.
Layer 개체는 Layer 개체 집합으로 구성됩니다. Layer 개체의 기능 및 선택 개체 컬렉션입니다. 다음과 같이 레이어의 그래픽 대상을 조작하고 선택합니다.
Map.Layers.Item(1).AddFeature(Newobj) //새 개체 추가 Newobj; 레이어 1로
4. 지도 데이터 번들링
데이터 번들링은 다양한 소스의 데이터를 지도 레이어에 매핑하는 프로세스입니다. 데이터세트 개체는 데이터세트 속성을 정의하는 데이터세트 컬렉션을 구성합니다.
데이터 세트를 사용하여 다양한 소스의 데이터를 지도에 묶어 그래픽 및 텍스트 상호 작용을 달성하거나 ODBC 액세스 데이터의 묶음 및 주제별 분석에 대한 다음 예와 같은 주제별 맵을 생성할 수 있습니다.
프로시저 TMapForm. ODBC1Click(Sender: TObject) ;
param: ODBCQueryInfo;
ds: 데이터 세트 정의
Datafields: 필드; //정의 데이터 필드
begin
param.SqlQuery:= 'select * from China' //Access 데이터베이스에서 중국 테이블 선택
param.DataSource:= 'MapChina'; //ODBC 데이터 소스 이름
param.ConnectString:= 'ODBC;' //또는 user = ... Pwd = ..., 정의 ODBC 연결
Datafields.Add('GEONAME', 'GEONAME', miAggregationAuto, miTypeString); //데이터 필드 GEONAME 추가
Datafields.Add('POPU', 'POPU' , miAggregationAuto, miTypeNumeric); / /데이터 필드 POPU 추가
//Mapinfo China 테이블에 액세스 데이터 번들
ds:= Map.Datasets.Add(miDataSetODBC, param, 할당되지 않음, 할당되지 않음, 할당되지 않음, 'CHINA', 데이터 필드, 할당되지 않음)
ds.Themes.Add(miThemeRanged, 'POPU', 'MyTheme') //범위 주제도 추가
end;
5. 사용자 정의 도구 만들기
또한 자신만의 지도 작업 도구를 사용자 정의할 수도 있습니다. 다음은 정보 버튼 도구를 사용자 정의하는 단계에 대한 간략한 설명입니다.
(1) 고객 도구 상수 정의
Const CUSTOM_INFO_TOOL = 1
(2) Map 개체의 CreateCustomTool 메서드를 사용하여 고객 도구를 정의합니다. :
CreateCustomTool ( ToolNumber, Type, Cursor, [ShiftCursor], [CtrlCursor], [InfoTips])
여기서 ToolNumber는 위에 정의된 상수인 도구 번호입니다. 는 도구 유형입니다. 커서는 커서 모양이며 다른 매개변수를 선택할 수 있습니다.
//정보 도구를 교차 커서 포인트 트리거 도구로 정의
Map.CreateCustomTool(CUSTOM_INFO_TOOL, miToolTypePoint, miCrossCursor, miArrowCursor, miArrowCursor, 할당되지 않음)
(3) Map 객체 이벤트 ToolUsed
프로시저에 도구의 핸들러(작업 내용)를 작성합니다. TMain.MapToolUsed(Sender: TObject; ToolNum: Smallint; X1, Y1, X2, Y2, Distance: Double; < /p >
Shift, Ctrl: WordBool; var EnableDefault: WordBool)
시작
Case ToolNumber of
CUSTOM_INFO_TOOL: //정보 도구 정보 < / p>
try
......
end
(4) 정보 버튼의 Click 이벤트 정의
TMain.InfoClick(Sender: TObject)
시작
Map.CurrentTool:=CUSTOM_INFO_TOOL
끝 >IV.요약
MapBasic을 기반으로 한 개발은 간단하지만 제약이 많아 Mapinfo 기능 확장 프로그래밍에 더 적합합니다. OLE 자동화를 기반으로 한 개발은 MapBasic 문자열 명령을 백그라운드 Mapinfo로 주고 받아야 하기 때문에 더 번거롭고, 생성된 애플리케이션의 실행 속도도 상대적으로 느리지만, 이 개발 방법을 사용하면 마음대로 아름답고 친숙한 인터페이스를 만들 수 있습니다. 지리 통합 작업과 비지리적 작업이 하나로 통합되어 현재 MapX4.5와 비교할 수 없는 거의 100개의 Mapinfo 기능을 실현할 수 있습니다. 전통적인 GIS 전문 개발 환경과 비교할 때 MapX와 같은 구성요소 GIS 시스템의 출현은 질적 도약이라고 할 수 있습니다. 이는 작고 유연하며 개발하기 쉽고 저렴합니다. MapX로 개발된 GIS 시스템은 Mapinfo 소프트웨어 플랫폼에서 실행할 필요가 없기 때문에 빠르게 실행됩니다. 하지만 현재 MapX4.5로 판단하면 MapX는 Mapinfo 기능을 모두 구현하지 못했다(95개 이상이라고 한다). 사용 중 지도 생성이나 편집 기능과 지리적 분석 기능이 떨어지는 것으로 나타났다. 물론, 앞으로 새 버전이 출시되면서 MapX는 점점 더 안정적이고 완벽해질 것입니다.