GIS二次開發(fā)第8課剖析課件_第1頁
GIS二次開發(fā)第8課剖析課件_第2頁
GIS二次開發(fā)第8課剖析課件_第3頁
GIS二次開發(fā)第8課剖析課件_第4頁
GIS二次開發(fā)第8課剖析課件_第5頁
已閱讀5頁,還剩381頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

GIS二次開發(fā)主講:張云鵬GIS二次開發(fā)主講:張云鵬第八課空間數(shù)據(jù)編輯ArcGISEngine編輯概述版本化空間數(shù)據(jù)編輯DisplayFeedback對象多邊形挖空處理分割線要素線、面要素整形(Reshape)要素合并多部分要素的處理線要素的延伸與修剪第八課空間數(shù)據(jù)編輯ArcGISEngine編輯概述8.1ArcGISEngine編輯概述ArcGIS

Engine編輯與ArcMap編輯編輯流程

EditingtargetlayerEdittasksEditsketchWorkingwiththeoperationstackSnapagentsEditeventsFeatureinspectors8.1ArcGISEngine編輯概述ArcGIS8.1.1

ArcGIS

Engine編輯與ArcMap編輯ArcGIS桌面的編輯功能通過Editor庫發(fā)布,

ArcGISEngine的編輯功能包含在Controls

庫中.

ArcGISEngine

Controls庫中提供了內(nèi)置的編輯命令、工具、菜單等,用于地理要素的復制、剪切、粘貼和刪除、啟動編輯、停止編輯、保存編輯、編輯工具(EditTool)、繪制工具(SketchTool)、編輯的目標圖層ToolControl、屬性編輯、要素編輯過程中右鍵菜單功能和Snapping設置等功能。這些命令、工具等在開發(fā)過程中可以直接使用。8.1.1ArcGISEngine編輯與ArcMa要素的復制、剪切、粘貼和刪除ControlToolsEditing_Copy{2D7BD886-7531-4198-820D-551A5A14569E}esriControls.ControlsEditingCopyCommandControlToolsEditing_Cut{C03E7512-CA4E-4197-8386-57830425D13A}esriControls.ControlsEditingCutCommandControlToolsEditing_Paste{99FADFFD-A788-4F1F-A1B3-04909B06735A}esriControls.ControlsEditingPasteCommandControlToolsEditing_Clear{C4CB4830-8C2E-49AE-9D12-73E822BCA90E}esriControls.ControlsEditingClearCommand要素的復制、剪切、粘貼和刪除ControlToolsEditArcGISEngine環(huán)境下的EditorToolbar、EditorMenuandEditTask:ArcGISEngine環(huán)境下的EditorToolbarControlToolsEditing_Start{5CAF45CD-E3B1-4FFD-96C4-BCDD2289C1EB}esriControls.ControlsEditingStartCommandControlToolsEditing_Stop{8D03C271-BB00-4A36-9B84-AD2E1DE0DE11}esriControls.ControlsEditingStopCommandControlToolsEditing_Save{0BB6A923-6AAF-4B7A-B8A8-A7225065A0C8}esriControls.ControlsEditingSaveCommandControlToolsEditing_Edit{6F922BD8-EF26-4852-BAED-45CFF3A97121}esriControls.ControlsEditingEditToolControlToolsEditing_Sketch{13B234E8-3B30-49CA-9967-4C76F7231AD6}esriControls.ControlsEditingSketchToolControlToolsEditing_TargetToolControl{5D815B27-6A93-42DB-B2C6-1CC58B416E9F}esriControls.ControlsEditingTargetToolControlControlToolsEditing_Attribute{A554ADBC-D0DD-469A-8A95-B4CEED0794C3}esriControls.ControlsEditingAttributeCommandControlToolsEditing_SketchProperties{506ACF9B-B4B4-4A4A-A5FA-5215E4A240B2}esriControls.ControlsEditingSketchPropertiesCommandControlToolsEditing_Start{5CAF撤銷(undo)/重復(redo)ControlToolsGeneric_Redo{B0675372-0271-4680-9A2C-269B3F0C01E8}esriControls.ControlsRedoCommandControlToolsGeneric_Undo{380FB31E-6C24-4F5C-B1DF-47F33586B885}esriControls.ControlsUndoCommand撤銷(undo)/重復(redo)ControlTooArcGISEngine的“SketchToolContextMenu”ArcGISEngine的“SketchToolConGIS二次開發(fā)第8課剖析課件ControlToolsEditing_SnapToFeatureMenu{3E28536E-66EB-4812-BD8C-7AE6EA5CCB17}esriControls.ControlsEditingSnapToFeatureMenuControlToolsEditing_SnapEndpoint{B473F50B-3D6B-4718-8DE3-75D7ECACED58}esriControls.ControlsEditingSnapEndpointCommandControlToolsEditing_SnapVertex{78FF7F24-E5E6-4CA4-993E-6FAA81684441}esriControls.ControlsEditingSnapVertexCommandControlToolsEditing_SnapMidpoint{250219D8-7A0B-4017-93EF-1E893D16F742}esriControls.ControlsEditingSnapMidpointCommandControlToolsEditing_SnapEdge{5D67D843-E10C-4D0B-A69C-2DFA82B25450}esriControls.ControlsEditingSnapEdgeCommandControlToolsEditing_SnapToFeatControlToolsEditing_SketchDirection{4E6E4BB5-4B2E-4E1F-8E08-18E24FF80A13}esriControls.ControlsEditingSketchDirectionCommandControlToolsEditing_SketchDeflection{3ECE8CAB-3DAD-4B04-B586-D9B6369885C3}esriControls.ControlsEditingSketchDeflectionCommandControlToolsEditing_SketchLength{FAF9D507-97DF-4F2E-835A-35A3DECF90B9}esriControls.ControlsEditingSketchLengthCommandControlToolsEditing_SketchChangeLength{6EF1BE13-4FF4-4529-958D-46A418C99DD8}esriControls.ControlsEditingSketchChangeLengthCommandControlToolsEditing_SketchAbsoluteXY{B368783B-9BDE-46A6-A712-2969C1F21FA2}esriControls.ControlsEditingSketchAbsoluteXYCommandControlToolsEditing_SketchDeltaXY{061BD3E1-4245-4699-863C-DE478647FBE3}esriControls.ControlsEditingSketchDeltaXYCommandControlToolsEditing_SketchDirectionLength{9DB473E5-BF90-465B-8758-74C656F136EB}esriControls.ControlsEditingSketchDirectionLengthCommandControlToolsEditing_SketchParallel{798FED0C-978D-4DFA-A658-D3DADF9D414D}esriControls.ControlsEditingSketchParallelCommandControlToolsEditing_SketchPerpendicular{A9F4EAD1-622C-4BC7-857B-55ABA51D5359}esriControls.ControlsEditingSketchPerpendicularCommandControlToolsEditing_SketchDireControlToolsEditing_SketchSegmentDeflection{A1D97BFF-5B08-4852-8223-5714EC5811DB}esriControls.ControlsEditingSketchSegmentDeflectionCommandControlToolsEditing_SketchReplace{C9DFFED3-57CC-485A-A5A1-CC510CE9DC97}esriControls.ControlsEditingSketchReplaceCommandControlToolsEditing_SketchStreaming{4E8F7A0A-C3F3-462B-9632-D9981941A18E}esriControls.ControlsEditingSketchStreamingCommandControlToolsEditing_SketchDelete{E5D330C9-8E98-4148-818F-7128D152DFD5}esriControls.ControlsEditingSketchDeleteCommandControlToolsEditing_SketchFinish{2A876779-8A6A-4B73-9B89-AE0099B0571A}esriControls.ControlsEditingSketchFinishCommandControlToolsEditing_SketchFinishSquare{73883500-776E-4E99-92B2-6ED6332558DD}esriControls.ControlsEditingSketchFinishSquareCommandControlToolsEditing_SketchFinishPart{D69E981F-4FDE-4077-B224-0C58A35AF668}esriControls.ControlsEditingSketchFinishPartCommandControlToolsEditing_TaskToolControl{BEB77C7B-4257-41DC-9447-C3C5C4C8F7C7}esriControls.ControlsEditingTaskToolControlControlToolsEditing_SketchSegm在ArcGIS桌面環(huán)境中的主要編輯對象是Editor,而在ArcGISEngine開發(fā)中則是EngineEditor(單實例對象);在相應的應用程序中,它們負責管理

editsketch,currenttask,currenttargetlayer,editworkspace,editselection,editsessionproperties,andsnapenvironment.EngineEditor

主要接口:IEngineEditor、IEngineEditLayers、IEngineEditProperties、IEngineEditProperties2、IEngineEditSketch、IEngineSnapEnvironment、

IEngineEditEvents

、IExtension(System)在ArcGIS桌面環(huán)境中的主要編輯對象是Editor,而ArcMapEditor主要接口:InterfacesIEditAnnotationPropertiesIEditAttributePropertiesIEditLayersIEditor3IEditorZIEditPropertiesIEditProperties2IEditProperties3IEditProperties4IEditSketch3IEditTaskSearchIExtension(esriSystem)IExtensionAccelerators(esriSystem)IExtensionManager(esriSystem)ISnapEnvironment3ArcMapEditor主要接口:InterfacesIEthe

maineditinginterfacesArcGISEngineArcGISDesktopEditingenvironmentIEngineEditor(Newin9.3)IEditorEdittasksIEngineEditTask(Newin9.3)IEditTaskEditsketchIEngineEditSketch(Newin9.3)IEditSketchEditlayersIEngineEditLayers(Newin9.3)IEditLayersEditpropertiesIEngineEditPropertiesIEditPropertiesEditeventsIEngineEditEvents(Newin9.3)IEditEventsthe

maineditinginterfacesArcIEngineEditSketchIEngineEditorIEngineEditLayers

IEngineEditSketchIEngineEditoIEngineEditProperties

IEngineEditProperties2

IEngineEditPropertiesIEngineEIEngineEditEvents

(Newin9.3)IEngineEditEvents(Newin9.3)IEngineEditTask(newatArcGIS9.3)編輯任務使用編輯繪制幾何對象(fromIEngineEditSketch::Geometry)完成某項操作;EngineEditor一次只能有一個活動的編輯任務,使用

IEngineEditor::CurrentTask

設置當前的編輯任務.所有的Engine編輯任務都實現(xiàn)了IEngineEditTask

接口.Engine編輯任務必須注冊到‘ESRIEngineEditTasks’組件類目中,以便顯示在

ControlsEditingTaskToolControl中.IEngineEditTask(newatArcGI8.1.2編輯流程編輯會話(Editsession)建議所有的編輯操作應該一個編輯會話中完成,當應用程序使用插入游標或更新游標進行批導入或批更新要素除外。編輯會話用于實現(xiàn)封裝多個編輯和繪制操作的長事務處理。一個編輯會話中的數(shù)據(jù)變化只有執(zhí)行該編輯會話的應用程序可見,編輯會話保存之前,其它并發(fā)的應用程序是看不到這些編輯變化的。8.1.2編輯流程編輯會話(EditsessionAneditsessioncanbecreatedusingIEngineEditor(Controls)orIWorkspaceEdit(Geodatabase).

具體使用場合:UseIWorkspaceEdittoprogrammaticallyperformeditsinconsoleapplicationsorgraphicaluserinterface(GUI)-basedapplicationsthatdon'trequireanyuserinteraction.UseIEngineEditorforGUI-basededitingapplicationsthatinvolveanyofthefollowing:Usingtheout-of-the-boxeditingcommandsWorkingwiththeeditsketchControllingthesnappingenvironmentListeningtoeventsthatareraisedwhileeditingAneditsessioncanbecreatedEditandsketchoperations編輯操作用于創(chuàng)建、修改或刪除要素,而繪制操作用于修改編輯繪制

(editsketch).編輯與繪制操作可以看作是嵌套在編輯會話對應的長事務中的一系列短事務。通過把每個操作加入操作棧,實現(xiàn)編輯會話中的undo/redo功能。一旦編輯會話完成,所有操作都從操作棧刪除。Editandsketchoperations編輯操StartaneditsessionAneditsessionisstartedbycallingtheIEngineEditor.StartEditingmethodwithtwoarguments—IMapandIWorkspace.Everyeditablelayerfromthesameworkspacethatispresentinthemapcanbeeditedintheeditsession.TheIEngineEditLayers.IsEditablepropertyindicateswhetheraparticularlayeriseditable.WhenworkingwithSDEworkspaces,setIEngineEditor.EditSessionModetospecifywhetherversionedornon-versionedlayersareeditable,asitisnotpossibletoeditbothtypesinasingleeditsession.IEngineEditorStartaneditsessionAneditprivateIEngineEditorm_engineEditor=newEngineEditorClass();privatevoidStartEditing

(IMapmap,IFeatureLayerfeatureLayer)

{

if(m_engineEditor.EditState!=esriEngineEditState.esriEngineStateNotEditing)return;

IDatasetdataset=featureLayer.FeatureClassasIDataset;

IWorkspaceworkspace=dataset.Workspace;m_engineEditor.StartEditing(workspace,map);

((IEngineEditLayers)

m_engineEditor).

SetTargetLayer(featureLayer,-1);

}publicvoidSetTargetLayer(

IFeatureLayer

Layer,

int

SubType);privateIEngineEditorm_engineEditoperationsPerformalleditsmadeinaneditsessionwithinaneditoperation.IEngineEditor.StartOperation--啟動編輯操作publicvoidStartOperation();IEngineEditor.AbortOperation--取消編輯操作,不保存編輯publicvoidAbortOperation();IEngineEditor.StopOperation--結(jié)束編輯操作publicvoidStopOperation(

stringoperationName);CallingStopOperationcreatesaneditoperationthatisaddedtothetopoftheoperationstack.EditoperationsPerformallediprivatevoidcmdEditOperation()

{m_engineEditor.StartOperation();try

{//Performfeatureeditshere.

if(someEditValidationChecksMethod==true)

m_engineEditor.StopOperation(“Testeditoperation”);

else

m_engineEditor.AbortOperation();

}catch(Exceptionex)

{m_engineEditor.AbortOperation();//Addcodetohandleexception.

}

}privatevoidcmdEditOperation(Save

andstopaneditsessionEditsmadeduringtheeditsessioncanbesavedbyexecutingControlsEditingSaveCommand.Alternatively,callIEngineEditor.StopEditingwiththesaveChangesargumentsettotrue.publicvoidStopEditing(

boolsaveChanges);若saveChanges為false,則不保存編輯變化結(jié)束編輯會話。SaveandstopaneditsessiprivatevoidbtnStopEditing_Click(objectsender,EventArgse)

{if(m_engineEditor.HasEdits()==false)m_engineEditor.StopEditing(false);else

{if(MessageBox.Show("SaveEdits?","SavePrompt",MessageBoxButtons.YesNo)==DialogResult.Yes)m_engineEditor.StopEditing(true);elsem_engineEditor.StopEditing(false);

}

}privatevoidbtnStopEditing_ClIWorkspaceEdit接口IWorkspaceEdit接口是ArcObjects實現(xiàn)空間數(shù)據(jù)編輯功能的另一接口.它可以啟動或停止一個編輯流程,適用于不需要用戶交互的編輯操作。使用StartEditing方法啟動一個編輯流程publicvoid

StartEditing(boolwithUndoRedo);withUndoRedo參數(shù)用來確定是否支持“undo/redo”功能。IWorkspaceEdit接口IWorkspaceEdi在啟動編輯后,可以使用StartEditOperation方法開啟編輯操作。publicvoidStartEditOperation();如果在編輯過程中出現(xiàn)了異常,可以使用AbortEditoperation方法來取消編輯操作。publicvoidAbortEditOperation();在完成一個編輯后,用戶可以使用StopEditoperation方法來確保編輯操作的完成。publicvoidStopEditOperation();UndoEditoperation方法可以用于編輯狀態(tài)的回滾操作,如果發(fā)現(xiàn)編輯過程有誤,通過執(zhí)行這個方法可以恢復到最近變化前的狀態(tài)。在整個編輯流程完成后,可以使用StopEditing方法來完成編輯。當執(zhí)行完這個方法后,就意味著不能再進行“恢復/取消恢復”了。publicvoidStopEditing(

boolsaveEdits);在啟動編輯后,可以使用StartEditOperation方privatevoidStartEditing

(IFeatureLayerfeatureLayer){IFeatureClassfeatureClass=featureLayer.FeatureClass;

IDatasetdataset=featureClassasIDataset;

IWorkspaceEditworkspaceEdit=dataset.WorkspaceasIWorkspaceEdit;

workspaceEdit.StartEditing(true);

workspaceEdit.StartEditOperation();

IFeaturepFeature=featureClass.GetFeature(1);pFeature.Delete();

workspaceEdit.StopEditOperation();

boolbHasEdits=true;privatevoidStartEditing(IFeDialogResultiResponse=MessageBox.Show("EditOperation","Undooperation?",MessageBoxButtons.YesNo);if(iResponse==DialogResult.Yes)workspaceEdit.UndoEditOperation();workspaceEdit.HasEdits(refbHasEdits);if(bHasEdits){iResponse=MessageBox.Show("EditOperation","Saveedits?",MessageBoxButtons.YesNo);if(iResponse==DialogResult.Yes){workspaceEdit.StopEditing(true);}else{workspaceEdit.StopEditing(false);}}

}

DialogResultiResponse=Messa8.1.3Editingtargetlayer使用IEngineEditLayers.SetTargetLayer

或ControlsEditingTargetToolControl設置要編輯的目標圖層

。使用IEngineEditLayers.TargetLayer

獲得目前編輯的圖層。使用IEngineEditEvents.OnTargetLayerChanged

事件來監(jiān)聽編輯目標圖層的變化。IEngineEditLayers

8.1.3Editingtargetlayer使8.1.4Edittasks編輯任務需要使用editsketch中的幾何對象,執(zhí)行某一特定的編輯操作。Twoout-of-the-boxedittasksareprovided:CreateNewFeatureandModifyFeature.

可以通過實現(xiàn)IEngineEditTask

接口創(chuàng)建定制的編輯任務8.1.4Edittasks編輯任務需要使用ediIEngineEditTask.GroupName屬性允許編輯任務在ControlsEditingTaskToolControl

中邏輯分組.使用IEngineEditEvents.OnCurrentTaskChanged

事件監(jiān)聽編輯任務的改變。UsetheArcGISAddClassWizardtoquicklycreateaclassthatimplementsIEngineEditTask.

ChooseEngineandEditor

asthecustomizationgroup,thenchoose

EngineEditTaskasthebasecomponent.IEngineEditTask.GroupName屬性允許GIS二次開發(fā)第8課剖析課件Typically,edittasksareregisteredintheESRIEngineEditTaskscomponentcategory,althoughtheycanbeaddedprogrammaticallyusingtheIEngineEditor.AddTaskmethod.SetorreturnthecurrentedittaskusingtheIEngineEditor.CurrentTaskproperty.Alternatively,provideControlsEditingTaskToolControltoallowtheusertoselectthecurrentedittask.Typically,edittasksareregi8.1.5EditsketchIEngineEditSketch

中的geometry用于完成當前的編輯任務,如當前編輯任務為“CreateNewFeature”時,使用該geometry來創(chuàng)建一個要素;

geometry由當前編輯任務設置,其類型可以是:amultipoint,apolyline,orapolygon,與目標編輯圖層的幾何類型相同。IEngineEditSketch8.1.5EditsketchIEngineEditAE提供了2個快捷菜單幫助完成editsketchgeometry.ControlsEditingSketchContextMenuControlsEditingVertexContextMenuAE提供了2個快捷菜單幫助完成editsketchgeoCreatingasketchoperationIEngineSketchOperation.Start

啟動一繪制操作(sketchoperation),使用IEngineSketchOperation.SetMenuString

方法命名該操作,以便操作棧(operationstack)能夠識別該操作,并用作Undo/Redo的ToolTip.IEngineSketchOperation.Finish結(jié)束一繪制操作,并將該操作放入操作棧中。CreatingasketchoperationIEpublicvoidStart(IEngineEditoreditor);publicvoidSetMenuString(stringMenuString);publicvoidFinish

(IEnvelopeinvalEnv,

esriEngineSketchOperationType

opType,

objectData);Finishesthesketchoperationandputsitintotheoperationstack.ConstantValueesriEngineSketchOperationGeneral0esriEngineSketchOperationVertexAdded1esriEngineSketchOperationVertexDeleted2esriEngineSketchOperationVertexMoved3publicvoidStart(IEngineEditprivatevoidEngineSketchOperation()

{IEngineSketchOperationsketchOp=newEngineSketchOperationClass();

IEngineEditorengineEditor=newEngineEditorClass();

IEngineEditSketcheditSketch=(IEngineEditSketch)engineEditor;

IEnvelopeinvalidateEnv=((IClone)

editSketch.Geometry.Envelope).Clone()asIEnvelope;

sketchOp.Start(engineEditor);

sketchOp.SetMenuString("DeleteVertex");

IPointCollectionpointCol=(IPointCollection)editSketch.Geometry;

IClonevertexToRemove=(IClone)

pointCol.get_Point(pointCol.PointCount-1);vertexToRemove.Clone();pointCol.RemovePoints(pointCol.PointCount-1,1);editSketch.Geometry=(IGeometry)pointCol;editSketch.RefreshSketch();

sketchOp.Finish(invalidateEnv,esriEngineSketchOperationType.esriEngineSketchOperationVertexDeleted,vertexToRemoveasSystem.Object);

}privatevoidEngineSketchOperUndoorredosketchoperationsToundoorredoanindividualsketchoperation,usetheIEngineSketchOperation.Undo(derivedfromIOperationStack.Undo)orIEngineSketchOperation.Redo(derivedfromIOperationStack.Redo)methods.Toundoorredomultiplesketchoperations,accesstheoperationstackusingIToolbarControl2.OperationStack,thencalltheIOperationStack.UndoorIOperationStack.Redomethodsrespectively.SketchoperationeventsIEngineEditEvents.OnVertexAddedIEngineEditEvents.OnVertexDeletedIEngineEditEvents.OnVertexMovedIEngineEditEvents.OnSketchModifiedUndoorredosketchoperations8.1.6Workingwiththeoperationstack由EngineEditor

管理的編輯會話,如果需要undo/redo功能,那么應用程序中必須包含ToolbarControl.

IToolbarControl.OperationStack

屬性提供了對操作棧的訪問.TheIOperationStack.UndoandIOperationStack.Redomethodscanthenbeusedtosequentiallyundoandredooperationsrespectively.8.1.6WorkingwiththeoperAddingeditandsketchoperationstotheoperationstack在應用程序中添加ToolbarControl,并設置其伙伴控件;實例化ControlsOperationStack

,并將其與ToolbarControl相關聯(lián);

連接EngineEditor

到ToolbarControl

,使得操作棧包含編輯與繪制操作;DothisbyaddingacommandfromtheFeatureEditingtoolsettotheToolbarControlorbyprogrammaticallylinkingtheEngineEditortotheToolbarControlintheForm_Loadevent.StartaneditsessionandenableundoandredocapabilitiesbysettingIEngineEditor.EnableUndoRedototrue.Addingeditandsketchoperati2:IOperationStackoperationStack=newControlsOperationStackClass();axToolbarControl1.OperationStack=operationStack;axToolbarControl2.OperationStack=operationStack;3:objecttbr=(object)axToolbarControl1.Object;IExtensionengineEditorExt=m_engineEditorasIExtension;engineEditorExt.Startup(reftbr);2:UsingtheoperationstackEditoperationsareaddedtotheoperationstackwhenIEngineEditor.StopOperationiscalled,andsketchoperationsareaddedwhenIEngineSketchOperation.Finishiscalled.TheUndoandRedomethodsdonotremoveoperationsfromtheoperationstack,butrathermoveaninternalpointerupanddownthestack.IndividualoperationscanbeaccessedusingIOperationStack.ItemandperformedusingIOperationStack.Do,IOperationStack.UndoOperation,orIOperationStack.RedoOperation;however,thisisnotrecommendedforeditandsketchoperations.UsingtheoperationstackIOperationStackoperationStack=m_ToolbarControl.OperationStack;//Dothefollowingtoundothepreviousoperationonthestack.operationStack.Undo();//Dothefollowingtoredothenextoperationonthestack.operationStack.Redo();IOperationStackoperationStack8.1.7Workingwiththesnapenvironment捕捉設置:設置某個圖層中的要素是否能夠被捕捉以及設置捕捉的位置和在多大范圍內(nèi)可以捕捉到理想的位置。捕捉有助于精確定位要素及編輯繪制的頂點。ArcGIS提供了兩種類型捕捉環(huán)境:

ArcGISsnappingenvironment(NewinArcGIS8):為捕捉提供了最通用框架,對ArcGIS桌面和ArcGIS

Engine都可用,并使用相同的組件。Editingsnappingenvironment:提供了更精細的捕捉,但只在編輯會話中可用,且對ArcGIS桌面和ArcGIS

Engine使用不同的組件和接口(ISnapEnvironmentforDesktopandIEngineSnapEnvironmentforEngine)。8.1.7Workingwiththesnap兩種捕捉環(huán)境的比較ArcGISsnappingenvironmentEditingsnappingenvironmentDesktopsupportYesYesEnginesupportYesYesConfigurationofsnappingagentsYesYesAvailableoutsideaneditsessionYesNoRequiresmanagementofcacheNoYesRespectsdefinitionqueriesonlayersYesNoSupportscustomizationofsnaptipsYesNoSupportsfilteringofindividuallayersYesYesSupportscustomsnappingtypesNoYesAccesstosnapresultviatheapplicationprogramminginterface(API)YesNo兩種捕捉環(huán)境的比較ArcGISsnappingenvirArcGISsnappingenvironmentArcGIS捕捉環(huán)境可用于所有的自定義工具,而不僅僅限于編輯器中的工具。在ArcMap和ArcGISEngine中,ArcGIS捕捉環(huán)境是作為應用程序擴展來訪問的。ISnappingEnvironment是ArcGIS捕捉環(huán)境的主要接口,這個接口

用于控制捕捉是否激活、使用哪些類型的捕捉及設置捕捉容差、定義捕捉符號。

ArcGIS捕捉環(huán)境還提供了IPointSnapper、ISnappingResult和ISnappingFeedback接口。ISnappingEnvironmentArcGISsnappingenvironmentArcIPointSnapperIPointSnapperISnappingFeedbackISnappingFeedbackISnappingResultISnappingResultAccessingthesnappingenvironmentfromArcMap

ISnappingEnvironmentm_SnappingEnv=m_application.FindExtensionByName("ESRISnapping")asISnappingEnvironment;

IPointSnapperm_Snapper=m_SnappingEnv.PointSnapper;

ISnappingFeedbackm_SnappingFeedback=newSnappingFeedbackClass();m_SnappingFeedback.Initialize(hook,m_SnappingEnv,true);AccessingthesnappingenvironAccessingthesnappingenvironmentfromArcGISEngine

IExtensionManagerextensionManager=m_hookHelper2.ExtensionManager;if(extensionManager==null)return;UIDguid=newUIDClass();guid.Value="{E07B4C52-C894-4558-B8D4-D4050018D1DA}";//Snappingextension.

IExtensionextension=extensionManager.FindExtension(guid);

ISnappingEnvironmentm_SnappingEnvironment=extensionasISnappingEnvironment;AccessingthesnappingenvironesriSnappingTypeConstantValueDescriptionesriSnappingTypeNone0Nosnap.esriSnappingTypePoint1Snaptopoint.esriSnappingTypeEndpoint2Snaptoendpoint.esriSnappingTypeVertex4Snaptovertex.esriSnappingTypeEdge8Snaptoedge.esriSnappingTypeMidpoint16Snaptomidpoint.esriSnappingTypeIntersection32Intersectionsnapping.esriSnappingTypeTangent64Tangentsnapping.esriSnappingTypeConstantValueConfiguringthe

snappingenvironment//SpecifycombinationofesriSnappingTypeenumerations.m_SnappingEnvironment.SnappingType=(esriSnappingType)((int)esriSnappingType.esriSnappingTypeEdge+(int)esriSnappingType.esriSnappingTypeEndpoint);//Specifybitwisecombinationforedgeandendpointsnapping.m_SnappingEnvironment.SnappingType=(esriSnappingType)63;Configuringthe

snappingenvirSnappingprioritySnappingtypesareevaluatedinafixedorder,asfollows.esriSnappingTypePointesriSnappingTypeIntersectionesriSnappingTypeEndpointesriSnappingTypeVertexesriSnappingTypeMidpointesriSnappingTypeTangentesriSnappingTypeEdgeSnappingTypeisanapplication-levelsetting.SnappingpriorityAddingsnappingtoacustomtoolIfyourcustomtoolcallstheeditorSketchtoolforinput,youdonotneedtoenablesnappinginyourtoolbecauseitisalreadybuilt-intotheSketchtool.Forallothercaseswhereyourtoolcreatesitsowngeometry,suchasapointpickerorotherscreenfeedback,youcanenablesnapping.

AddingsnappingtoacustomtoTouseArcGISsnappinginyourtools,followthesesteps:Inthetool'sOnClickevent,ObtainareferencetothesnappingextensionAcquirereferencestoISnappingEnvironmentandIPointSnapperInitializetheSnappingFeedback(optional)Inthetool'sOnMouseMoveevent,CallIPointSnapper.SnapduringmousemoveusingthecurrentlocationIfaSnapResultisreturned:UpdatethecursorlocationUpdatethesnappingfeedback(ifusingfeedback)Inthetool'sRefreshmethod,Refreshthesnappingfeedback(ifusingfeedback)Inmostcases,thecodetoaccessthesnappingenvironmentshouldbeincludedinthetool'sOnClickmethod.TouseArcGISsnappinginyourpublicoverridevoidOnMouseMove(intButton,intShift,intX,intY){//Convertthepointfrompixelstomapunits.

m_CurrentMouseCoords=QueryMapPoint(m_screenDisplay,X,Y);

//Testthelocationagainstthesnapenvironment.

ISnappingResultsnapResult=m_Snapper.Snap(m_CurrentMouseCoords);

//Updatethesnappingfeedback.

m_SnappingFeedback.Update(snapResult,0);

//Updatethecurrentlocationtomovethecursortothesnappedlocation.

if(snapResult!=null)m_CurrentMouseCoords=snapResult.Location;

m_linefeedback.MoveTo(m_CurrentMouseCoords);}publicoverridevoidOnMouseMopublicoverridevoidRefresh(inthDC)

{

//Refreshthepreviouslocationofthesnaptip.if(m_SnappingFeedback!=null)m_SnappingFeedback.Refresh(hDC);

}publicoverridevoidRefresh(EditingsnappingenvironmentinArcGISEngine可以使用ControlsEditingSnappingCommand

或IEngineSnapEnvironment

接口來訪問捕捉設置.通過實現(xiàn)IEngineSnapAgent

接口來創(chuàng)建定制的捕捉設置。EditingsnappingenvironmentiArcGISEngine的編輯捕捉環(huán)境(IEngineSnapEnvironment)控制每一個捕捉代理IEngineSnapAgent,捕捉類型(hittype)設置,及捕捉容差.每個捕捉代理的捕捉類型由IEngineFeatureSnapAgent

管理.AllsettingscanbemanuallymodifiedorverifiedontheSnappingSettingsdialogbox.ArcGISEngine的編輯捕捉環(huán)境(IEngineSpublicvoidSnapEnvirSettings

(IEngineEditoreditor)

{IEngineSnapEnvironmentsnapEnvironment=editorasIEngineSnapEnvironment;if(snapEnvironment.SnapAgentCount==0)

{System.Windows.Forms.MessageBox.Show("Youneedtoturnonatleastonesnappingagent!!!");return;

}

doubletolerance=snapEnvironment.SnapTolerance;MessageBox.Show(Convert.ToString(tolerance));snapEnvironment.SnapToleranceUnits=esriEngineSnapToleranceUnits.esriEngineSnapToleranceMapUnits;snapEnvironment.SnapTolerance=15;((IEngineEditProperties2)editor).SnapTips=true;

}publicvoidSnapEnvirSettingsprivatevoidEditSnap

(IMapControl3mMap)

{IEngineEditorm_engineEditor=newEngineEditorClass();if(m_engineEditor.EditState==esriEngineEditState.esriEngineStateNotEditing)

{

ILayercurrentLayer=mMap.get_Layer(0);if(currentLayerisIFeatureLayer)

{IFeatureLayerfeatureLayer=currentLayerasIFeatureLayer;

IDatasetdataset=featureLayer.FeatureClassasIDataset;

IWorkspaceworkspace=dataset.Workspace;

m_engineEditor.StartEditing

(workspace,mMap.Map);((IEngineEditLayers)m_engineEditor).SetTargetLayer(

featureLayer,0);

}privatevoidEditSnap(IMapConif(mMap.LayerCount!=0)

{IEngineEditLayerseditLayers=editorasIEngineEditLayers;

IEngineSnapEnvironmentsnapEnvironment=editorasIEngineSnapEnvironment;

IEngineFeatureSnapAgentfeatureSnapAgent=newEngineFeatureSnap();featureSnapAgent.FeatureClass=((IFeatureLayer)mMap.get_Layer(0)).FeatureClass;;featureSnapAgent.HitType=esriGeometryHitPartType.esriGeometryPartVertex|esriGeometryHitPartType.esriGeometryPartBoundary|esriGeometryHitPartType.esriGeometryPartEndpoint;snapEnvironment.AddSnapAgent(featureSnapAgent);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論