Thu phóng từ tính năng này sang tính năng khác trong chế độ chỉnh sửa?


8

Tôi phải tự chỉnh sửa một shapefile của một vài trăm điểm.

Tôi muốn một cách nhanh chóng để nhảy từ điểm này sang điểm tiếp theo theo cả nghĩa thuộc tính và ý nghĩa hình ảnh / không gian tức là tôi muốn trong khi ở chế độ chỉnh sửa, nhảy từ đối tượng ID 1 sang Object ID 2 mà không phải mở bảng thuộc tính , chọn điểm tiếp theo, phóng to để chọn, v.v.

Một loại nút "Tiếp theo" sẽ đẩy nhanh quá trình thủ công.


Bạn có khả năng ArcObjects? Tôi đã nhận thấy sự thiếu sót này và đã viết một công cụ cho nó. Tôi rất vui khi chia sẻ mã nếu bạn có thể sử dụng nó.
Michael Promotionson

Thật không may, mặc dù tôi không vui khi học ...
user32882

Bạn cần cài đặt SDK từ phương tiện cài đặt ArcGis của mình, nhưng trước tiên bạn cần có Visual Studio (Express). Hãy xem câu trả lời của tôi gis.stackexchange.com/questions/62720/ cho các điều kiện tiên quyết. Tôi cần phải đề cập rằng các shapefile có vấn đề trong đó FID thay đổi khi lưu, vì vậy để sử dụng công cụ này trên shapefile, không nhất thiết phải lưu cho đến khi kết thúc.
Michael Promotionson

@ MichaelMiles-Stimson, bạn có bổ trợ công cụ này mà bạn có thể chia sẻ để người dùng không phải cài đặt SDK và VS không?
nghệ thuật21

một tiện ích bổ sung sẽ rất hay ....
user32882

Câu trả lời:


6

Phần đầu tiên là AddIn, công việc thực sự được thực hiện trên một biểu mẫu:

Inherits ESRI.ArcGIS.Desktop.AddIns.Button
Private pForm As fFeatureInspector
Public Shared IsFormLoaded As Boolean = False

Public Sub New()

End Sub

Protected Overrides Sub OnClick()
    'My.ArcMap.Application.CurrentTool = Nothing
    If Not IsFormLoaded Then
        pForm = New fFeatureInspector
        pForm.pApp = CType(My.ArcMap.Application, ESRI.ArcGIS.ArcMapUI.IMxApplication)
        pForm.Show()
    Else
        pForm.sResetList()
    End If

End Sub

Protected Overrides Sub OnUpdate()
    Enabled = My.ArcMap.Application IsNot Nothing
End Sub

Khi bạn tạo một addin mới, hầu hết điều này đã có sẵn cho bạn. Sau đó thêm một biểu mẫu vào dự án (tên fFeatureInspector hoặc bạn sẽ cần thay đổi nó một vài lần trong mã).

nhập mô tả hình ảnh ở đây

Điều quan trọng là phải lấy tên chính xác hoặc bạn sẽ cần phải tìm & thay thế trong mã mẫu. Hộp công cụ cho biểu mẫu có tất cả các điều khiển phổ biến: nút , hộp kiểm , hộp danh sách , hộp tổ hợp .

Cách thức hoạt động của công cụ này là công cụ nhận được tất cả các tính năng được chọn và có thể chỉnh sửa, sao chép tên và OID / FID của chúng vào hộp danh sách và sau đó khi được tô sáng, nó sẽ chọn nó (sau khi xóa lựa chọn trước) và phóng to nó. Có một nút lưu và tải để lưu kiểm tra, quay lại một và chuyển tiếp một, tự động lưu kiểm tra và nút đặt lại. Công cụ sẽ làm mới khi được tải nhưng sau đó bạn có thể làm mới bất cứ lúc nào. Tự động lưu không tương thích với chỉnh sửa shapefiles vì FID không tĩnh và được nén khi lưu.

Các điểm có phạm vi độ rộng 0, do đó, điều quan trọng là đặt tỷ lệ tối thiểu thành một cái gì đó thực tế; Thu phóng% là bao nhiêu so với đa giác / dòng bạn muốn xem xung quanh nó.

Đây là mã mẫu (xin lỗi vì thiếu ý kiến):

Imports ESRI.ArcGIS.Framework
Imports ESRI.ArcGIS.ArcMapUI
Imports ESRI.ArcGIS.Carto
Imports ESRI.ArcGIS.Geometry
Imports ESRI.ArcGIS.Geodatabase
Imports ESRI.ArcGIS.esriSystem
Imports ESRI.ArcGIS.Editor
Imports ESRI.ArcGIS.Display

Public Class fFeatureInspector
    Const FormCaption As String = "Feature Inspector (22 Feb 10)"
    Const FormName As String = "fFeatureClass"
    Public pApp As IApplication
    Private pDoc As IMxDocument
    Private pMap As IMap

    Dim pEd As IEditor2
    Dim pID As UID = New UID
    Dim pFeatFrom() As String
    Dim pFeatWS As IFeatureWorkspace
    Dim pWS As IWorkspace
    Dim pFeatOID() As Long
    Dim pFeatCnt As Long
    Dim pInRefresh As Boolean
    Dim pPointExtent As IEnvelope
    Dim pSaveEdits As ICommandItem
    Dim pLoadTime As Long
    Dim pNow As Date
    Dim pStartIndex As Long

    Dim vStartTime As DateTime
    Dim vCurrentTime As DateTime

    Private Sub fFeatureInspector_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed
        StartFeatureInspector.IsFormLoaded = False
    End Sub
    Private Sub fFeatureInspector_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        pEd = pApp.FindExtensionByName("Esri Object Editor")
    End Sub
    Private Sub form1_Move(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Move
        Dim pOutFile As Integer
        Dim pTempDir As String = Environ("Temp")

        If Me.Visible Then
            pOutFile = FreeFile()
            FileOpen(pOutFile, pTempDir & "\" & FormName & ".xy", OpenMode.Output)
            WriteLine(pOutFile, Me.Left & "," & Me.Top)
            FileClose(pOutFile)
        End If
    End Sub
    Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
        StartFeatureInspector.IsFormLoaded = True
        Me.Text = FormCaption
        pDoc = CType(pApp.Document, IMxDocument)

        Dim pTempDir As String = Environ("temp")
        Dim pInFile As Integer
        Dim pReadString As String = ""
        Dim pResyk As String = ""
        Dim pXpos As Integer = 0
        Dim pYpos As Integer = 0

        fZoomPercent.Items.Add(110)
        fZoomPercent.Items.Add(150)
        fZoomPercent.Items.Add(200)
        fZoomPercent.Text = "110"

        fPointScale.Items.Add(200)
        fPointScale.Items.Add(500)
        fPointScale.Items.Add(1000)
        fPointScale.Items.Add(2500)
        fPointScale.Items.Add(10000)
        fPointScale.Text = "1000"

        If My.Computer.FileSystem.FileExists(Environ("Temp" & "\" & FormName & ".xy")) Then
            pApp.StatusBar.Message(0) = "Loading position"
            pInFile = FreeFile()
            FileOpen(pInFile, pTempDir & "\" & FormName & ".xy", OpenMode.Input)
            pReadString = LineInput(pInFile)
            pReadString = Mid(pReadString, 2, Len(pReadString) - 2)
            pApp.StatusBar.Message(0) = pReadString

            pResyk = Microsoft.VisualBasic.Left(pReadString, InStr(pReadString, ",") - 1)
            pApp.StatusBar.Message(0) = pResyk
            pXpos = CInt(pResyk)

            pApp.StatusBar.Message(0) = "Xposition " & pXpos
            pResyk = Microsoft.VisualBasic.Right(pReadString, Len(pReadString) - InStr(pReadString, ","))
            pApp.StatusBar.Message(0) = pResyk
            pYpos = CInt(pResyk)
            pApp.StatusBar.Message(0) = "Yposition " & pYpos
            FileClose(pInFile)
            Me.Left = pXpos
            Me.Top = pYpos
        End If
        sResetList()
        pID.Value = "{59D2AFD2-9EA2-11D1-9165-0080C718DF97}"
        Dim pComBars As ICommandBars = pApp.Document.CommandBars
        pSaveEdits = pComBars.Find(pID, False, False)

    End Sub
    Private Sub fSaveButton_Click()
        Dim pOutfile As Integer
        Dim cnt As Long

        pOutfile = FreeFile()
        FileOpen(pOutfile, (Environ("Temp") & "\" & "FeatInspect"), OpenMode.Output, OpenAccess.Write)

        Print(pOutfile, pFeatCnt & vbNewLine)
        For cnt = 0 To pFeatCnt - 1
            Print(pOutfile, pFeatFrom(cnt) & "|" & pFeatOID(cnt) & vbNewLine)
        Next cnt
        Print(pOutfile, fFeatureList.SelectedIndex & vbNewLine)
        Print(pOutfile, fZoomPercent.Text & vbNewLine)
        Print(pOutfile, fPointScale.Text & vbNewLine)
        FileClose(pOutfile)
    End Sub
    Private Sub fSaveButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles fSaveButton.Click
        fSaveButton_Click()
    End Sub
    Private Sub fLoadButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles fLoadButton.Click
        Dim cnt As Long
        Dim pInFile As Integer
        Dim pReadString As String
        Dim pSplitString() As String

        pInRefresh = True
        fFeatureList.Items.Clear()
        pInFile = FreeFile()
        FileOpen(pInFile, (Environ("Temp") & "\" & "FeatInspect"), OpenMode.Input, OpenAccess.Read)
        pReadString = LineInput(pInFile)
        pFeatCnt = pReadString
        ReDim pFeatFrom(pFeatCnt)
        ReDim pFeatOID(pFeatCnt)

        fFeatureList.Items.Clear()

        For cnt = 0 To pFeatCnt - 1
            pReadString = LineInput(pInFile)
            pSplitString = Split(pReadString, "|")

            pFeatFrom(cnt) = pSplitString(0)
            pFeatOID(cnt) = pSplitString(1)
            fFeatureList.Items.Add(pFeatFrom(cnt) & " - " & pFeatOID(cnt))
        Next cnt
        pInRefresh = False
        pReadString = LineInput(pInFile)
        fFeatureList.SelectedIndex = pReadString
        pReadString = LineInput(pInFile)
        fZoomPercent.Text = pReadString
        pReadString = LineInput(pInFile)
        fPointScale.Text = pReadString
        FileClose()
        pStartIndex = fFeatureList.SelectedIndex
        pNow = Now()
        pLoadTime = (Hour(pNow) * 3600) + (Minute(pNow) * 60) + Second(pNow)

    End Sub

    Private Sub fBackButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles fBackButton.Click
        If fFeatureList.SelectedIndex = 0 Then
            MsgBox("But you're already at the start!")
            Exit Sub
        End If
        fFeatureList.SelectedIndex = fFeatureList.SelectedIndex - 1
    End Sub
    Private Sub fGoDown_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles fGoDown.Click
        If fFeatureList.SelectedIndex = fFeatureList.Items.Count - 1 Then
            MsgBox("That's all there is, there isn't anymore.")
            Exit Sub
        End If
        fFeatureList.SelectedIndex = fFeatureList.SelectedIndex + 1
    End Sub
    Private Sub bReset_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bReset.Click
        pInRefresh = True
        sResetList()
        pInRefresh = False
        fFeatureList_Change()
        pLoadTime = (Hour(pNow) * 3600) + (Minute(pNow) * 60) + Second(pNow)
    End Sub
    Public Sub sResetList()
        Dim pEnumFeat As IEnumFeature
        Dim pFeature As IFeature
        Dim pFeatClass As IFeatureClass

        If pEd.EditState = esriEditState.esriStateNotEditing Then Exit Sub
        pEnumFeat = pEd.EditSelection

        pFeature = pEnumFeat.Next
        If pFeature Is Nothing Then
            MsgBox("Nothing selected", vbCritical)
            Exit Sub
        End If
        pFeatCnt = pEd.SelectionCount - 1

        ReDim pFeatFrom(pFeatCnt)
        ReDim pFeatOID(pFeatCnt)

        pFeatCnt = 0

        fFeatureList.Items.Clear()

        Do Until pFeature Is Nothing
            pFeatClass = pFeature.Class
            pFeatFrom(pFeatCnt) = pFeatClass.AliasName
            pFeatOID(pFeatCnt) = pFeature.OID
            fFeatureList.Items.Add(pFeatFrom(pFeatCnt) & " - " & pFeatOID(pFeatCnt))
            pFeatCnt = pFeatCnt + 1
            pFeature = pEnumFeat.Next
        Loop

        pEd.Map.ClearSelection()
        fFeatureList.SelectedIndex = 0
        pNow = Now()
        pLoadTime = (Hour(pNow) * 3600) + (Minute(pNow) * 60) + Second(pNow)

    End Sub

    Private Sub fFeatureList_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles fFeatureList.SelectedIndexChanged
        fFeatureList_Change()
    End Sub
    Private Sub fFeatureList_Change()
        Dim pFeatClass As IFeatureClass
        Dim pFeature As IFeature
        Dim pSelection As ISelection
        Dim pLayer As ILayer
        Dim pEnumLayer As IEnumLayer
        Dim pEditLayers As IEditLayers
        Dim pFeatLayer As IFeatureLayer
        Dim pEnv As IEnvelope2
        Dim pDispTran As IDisplayTransformation
        Dim pThisTime As Long
        Dim pAvVis As Single
        Dim pTotTime As Long
        Dim pDeltaVis As Long
        Dim pLeft As Long
        Dim pTPF As Long
        Dim pAvVisStr As String
        Dim pETAstr As String
        Dim pPoint As ESRI.ArcGIS.Geometry.IPoint
        Dim cnt As Long

        If pInRefresh Then Exit Sub
        If fFeatureList.SelectedIndex < 0 Then Exit Sub

        If pEd.EditState = esriEditState.esriStateNotEditing Then
            MsgBox("This tool only works on EDIT features" & vbNewLine & "Please start editing", vbCritical)
            Exit Sub
        End If
        pFeatWS = pEd.EditWorkspace
        pFeatClass = pFeatWS.OpenFeatureClass(pFeatFrom(fFeatureList.SelectedIndex))
        On Error Resume Next
        pFeature = pFeatClass.GetFeature(pFeatOID(fFeatureList.SelectedIndex))
        If pFeature Is Nothing Then
            MsgBox("Feature not found", vbCritical) ' comment this out if you don't want to see errors
        End If
        pEd.Map.ClearSelection()
        pID.Value = "{6CA416B1-E160-11D2-9F4E-00C04F6BC78E} "
        pEnumLayer = pEd.Map.Layers(pID, True)
        pEditLayers = pEd

        pLayer = pEnumLayer.Next
        Do Until pLayer Is Nothing
            If TypeOf pLayer Is IFeatureLayer Then
                If pEditLayers.IsEditable(pLayer) And pLayer.Visible = True Then
                    pFeatLayer = pLayer
                    If pFeatLayer.Selectable Then
                        If pFeatLayer.FeatureClass.AliasName = pFeatFrom(fFeatureList.SelectedIndex) Then
                            pEd.Map.SelectFeature(pLayer, pFeature)
                            If pFeatLayer.FeatureClass.ShapeType = esriGeometryType.esriGeometryPoint Then
                                pEnv = New Envelope
                                pEnv.PutCoords(pDoc.ActiveView.Extent.XMin, pDoc.ActiveView.Extent.YMin, pDoc.ActiveView.Extent.XMax, pDoc.ActiveView.Extent.YMax)
                                pEnv.SpatialReference = pFeature.Shape.SpatialReference
                                If pEnv.SpatialReference.FactoryCode <> pDoc.FocusMap.SpatialReference.FactoryCode Then pEnv.Project(pDoc.FocusMap.SpatialReference)
                                pPoint = New ESRI.ArcGIS.Geometry.PointClass
                                pPoint = pFeature.ShapeCopy
                                pEnv.CenterAt(pPoint)
                                pDoc.ActiveView.Extent = pEnv
                                pDispTran = pDoc.ActiveView.ScreenDisplay.DisplayTransformation
                                If Len(fPointScale.Text) > 0 Then
                                    pDispTran.ScaleRatio = Int(fPointScale.Text)
                                Else
                                    pDispTran.ScaleRatio = 1000
                                End If
                                If fSaveOnNext.Checked Then
                                    pSaveEdits.Execute()
                                    fSaveButton_Click()
                                End If 'If fSaveOnNext.Checked Then
                                pDoc.ActiveView.Refresh()
                            Else

                                If Not pFeature.Shape.Envelope.IsEmpty Then
                                    pEnv = New Envelope
                                    pEnv.PutCoords(pFeature.Extent.XMin, pFeature.Extent.YMin, pFeature.Extent.XMax, pFeature.Extent.YMax)
                                    pEnv.SpatialReference = pFeature.Shape.SpatialReference
                                    If pEnv.SpatialReference.FactoryCode <> pDoc.FocusMap.SpatialReference.FactoryCode Then pEnv.Project(pDoc.FocusMap.SpatialReference)
                                    If Len(fZoomPercent.Text) > 0 Then
                                        pEnv.Expand(Int(fZoomPercent.Text) / 100, Int(fZoomPercent.Text) / 100, True)
                                    End If
                                    pDoc.ActiveView.Extent = pEnv
                                    If fPointScale.Text.Length > 0 Then
                                        If pDoc.ActiveView.ScreenDisplay.DisplayTransformation.ScaleRatio < Int(fPointScale.Text) Then pDoc.ActiveView.ScreenDisplay.DisplayTransformation.ScaleRatio = Int(fPointScale.Text)
                                    End If
                                    If fSaveOnNext.Checked Then
                                        pSaveEdits.Execute()
                                        fSaveButton_Click()
                                    End If 'If fSaveOnNext.Checked Then
                                    pDoc.ActiveView.Refresh()
                                End If 'Not pFeature.Shape.Envelope.IsEmpty
                            End If 'pFeatLayer.FeatureClass.ShapeType = esriGeometryType.esriGeometryPoint Then
                        End If 'pFeatLayer.FeatureClass.AliasName = pFeatFrom(fFeatureList.SelectedIndex) Then
                    End If 'pFeatLayer.Selectable Then
                End If 'pEditLayers.IsEditable(pLayer) And pLayer.Visible = True Then
            End If
            pLayer = pEnumLayer.Next
        Loop 'Until pLayer Is Nothing

        pNow = Now()
        pThisTime = (Hour(pNow) * 3600) + (Minute(pNow) * 60) + Second(pNow)
        pTotTime = pThisTime - pLoadTime
        pDeltaVis = fFeatureList.SelectedIndex - pStartIndex
        If pDeltaVis <= 0 Then
            fProgressLabel.Text = "Unable to Calculate"
            Exit Sub
        Else
            pAvVis = pTotTime / pDeltaVis
            pLeft = fFeatureList.Items.Count - fFeatureList.SelectedIndex + 1
            pETAstr = fLongTime_to_TimeString(pLeft * pAvVis)

            fProgressLabel.Text = pDeltaVis & " Inspected of " & fFeatureList.Items.Count & ". ETA " & pETAstr
            Me.Update()

        End If
    End Sub

    Private Function fLongTime_to_TimeString(ByVal pLongTime As Long) As String
        Dim pRemainder As Long
        Dim pHour As Integer
        Dim pMin As Integer
        Dim pSec As Integer

        pRemainder = pLongTime Mod 3600
        pHour = pLongTime - pRemainder
        If pHour > 0 Then pLongTime = pLongTime - pHour
        pRemainder = pLongTime Mod 60
        pMin = pLongTime - pRemainder
        If pMin > 0 Then pLongTime = pLongTime - pMin
        pSec = pLongTime

        pHour = pHour / 3600
        pMin = pMin / 60

        fLongTime_to_TimeString = pHour & ":" & pMin & ":" & pSec
    End Function


End Class

Nhiều như tôi không thích chia sẻ mã được biên dịch, đây là liên kết . Vui lòng đọc tài liệu Esri trên 'Chia sẻ và thêm Addins' .


Cảm ơn bạn rất nhiều vì sự hào phóng của bạn. Điều này sẽ rất hữu ích và sẽ giúp tôi tiết kiệm rất nhiều thời gian
user32882

7

Đây là phiên bản thu nhỏ của tính năng phóng to đến tính năng tiếp theo. Bạn có thể chạy nó trong cửa sổ python ArcMap của bạn:

mxd = arcpy.mapping.MapDocument("CURRENT") # currently opened map doc
df = arcpy.mapping.ListDataFrames(mxd, "Layers") [0]

# define layer you want to iterate and zoom on
for lyr in arcpy.mapping.ListLayers(mxd):
    if lyr.name == 'myTOCLayerNameHere':
        fc = lyr

# get total record count of fc
with arcpy.da.SearchCursor(fc, ["FID"]) as cursor:
    for row in cursor:
        totalCount+=1

def selectZoomNext(fc, field, record):
    if record > totalCount:
        record = 0 # reset to first feature
    expression = '{} = {}'.format(field, record)
    arcpy.SelectLayerByAttribute_management (fc, "NEW_SELECTION", expression)
    df.zoomToSelectedFeatures()
    nextRecord = record + 1
    return nextRecord

record = 0
record = selectZoomNext(fc, 'FID', record) # second argument is the field name, this could be OBJECTID too

Bạn có thể tiếp tục chạy record = selectZoomNext(fc, 'FID', record)câu lệnh để tiếp tục chọn tính năng tiếp theo trong bảng và phóng to nó. Bạn cũng có thể đưa đoạn mã này vào một công cụ tập lệnh python bổ trợ hoặc python. Ngoài ra, để làm cho mọi thứ dễ dàng hơn trong khi chỉnh sửa, bạn có thể tắt các trường không cần thiết (trong thuộc tính lớp) và cũng mở bảng Thuộc tính để truy cập thuộc tính nhanh.


Điều đó cũng làm việc. Tôi nghĩ đó là một minh họa tốt về sự khác biệt giữa ArcObjects và Python về độ dài và độ phức tạp của mã. Lưu ý rằng điều này sẽ có cùng một vấn đề với shapefiles và sẽ không hoạt động trên các lớp tính năng cơ sở dữ liệu địa lý tệp / cá nhân / SDE vì các giá trị OID / FID không được đảm bảo liền kề và dựa trên 0 - đó là một cách giải quyết định dạng shapefile.
Michael Promotionson

@ MichaelMiles-Promotionson, vâng, tôi khuyên bạn nên sử dụng phương thức AddFieldD006iter để xây dựng một biểu thức trường chính xác giữa các tệp, .mdb và .gdb
nghệ thuật21

1
Không phải vậy, trong lớp tính năng cơ sở dữ liệu địa lý, các giá trị OID không cần bắt đầu từ 0 và ngay cả khi chúng làm điều tiếp theo không cần phải là 1. Bạn cần đưa OBRIID vào danh sách hoặc từ điển khi bạn đếm lên với con trỏ, bạn cũng cần sử dụng arcpy.Describe (fc) .OIDFieldName làm trường dưới dạng cơ sở dữ liệu địa lý có OBRIID và không phải FID.
Michael Promotionson

3

Bạn có tiện ích mở rộng Data Reviewer không? Trình đánh giá dữ liệu cho phép bạn "Duyệt" qua tất cả các tính năng chỉ bằng một cú nhấp chuột đơn giản vào nút "Tiếp theo" (phóng to cả vị trí không gian và bản ghi bảng thuộc tính). Ngoài ra còn có nhiều chức năng hơn cho Người đánh giá dữ liệu ngoài vấn đề này (chẳng hạn như lỗi gắn cờ là "đã sửa", "đã đánh dấu", v.v. và đang chạy các công việc hàng loạt). Chỉ là một công cụ sẵn có, mặc dù tôi chắc rằng công cụ của bạn @Michael cũng rất tuyệt vời!

nhập mô tả hình ảnh ở đây


Trông giống như những gì tôi cần, Tuy nhiên, có vẻ như cấp độ cấp phép của tôi không bao gồm người đánh giá dữ liệu :(
user32882

Tôi đã viết công cụ của mình trước khi tôi nghe về PLTS (hiện đang lập bản đồ sản xuất), cảm hứng ban đầu được viết thành tập lệnh AML vì yêu cầu này rất cơ bản nhưng cần thiết. Tôi không ngạc nhiên khi Esri có công cụ này nhưng tại sao nó không có nguồn gốc trong ArcMap? Người đánh giá dữ liệu rất giỏi trong những gì nó làm nhưng tôi thấy rằng tôi đã viết hầu hết các công cụ mà nó đi kèm khi tôi đánh giá nó.
Michael Promotionson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.