Изменить источники

0 голосов
спросил 01 Июнь, 06 от Progman (840 баллов) в категории Программные продукты Esri
Добрый день!
Есть mxd-файл со слоями источниками из SQL Server sde.
Нужно передать его в другое место, соответственно вместе с источниками. Возможно ли как нибудь программно докопаться до его содержимого, чтобы поменять только имя сервера у всех слоев?
Дело в том, что при открытии его аркмапом на другом месте он открывается более часа (в зависимости от количества слоев), а то и больше плюс еще время на изменение источников. Естественно, при большом количестве mxd такой подход очень неудобный.
Может есть возможность сделать это быстрее?

8 Ответы

0 голосов
ответил 01 Июнь, 06 от Alexander1 (32,520 баллов)
Посмотри пример Change Data Source Path for Layer Files
0 голосов
ответил 01 Июнь, 06 от Progman (840 баллов)
Посмотри пример Change Data Source Path for Layer Files
Да, но это работает если карта состоит из *.lyr слоев, а меня интересует как это сделать, если слои настроены внутри mxd.
0 голосов
ответил 01 Июнь, 06 от Alexander1 (32,520 баллов)
Да, но это работает если карта состоит из *.lyr слоев, а меня интересует как это сделать, если слои настроены внутри mxd.
 
Если кратко, то - АНАЛОГИЧНО Confused
0 голосов
ответил 02 Июнь, 06 от Progman (840 баллов)
Да, но это работает если карта состоит из *.lyr слоев, а меня интересует как это сделать, если слои настроены внутри mxd.
 
Если кратко, то - АНАЛОГИЧНО Confused
 
Не понял. Можно не кратко?
Я могу получить доступ к документу

IGxMap map=catalog.GetObjectFromFullName(@"D:\maps\MyTestMap1.mxd",out num);

И это все!
К его слоям я достучаться не могу! Или может быть не могу найти интерфейс, через который это возможно сделать.
0 голосов
ответил 02 Июнь, 06 от Alexander1 (32,520 баллов)
Для начала я бы не стал пользоваться IGxMap интерфейсом... Я бы использовал, например, IMapReader Interface.
Далее - IMap -> ILayer -> IDataset -> IWorkspace (ConnectionProperties Property)...
 
Все-таки  рекомендую изучить этот пример - там есть все, что нужно знать, чтобы решить данную проблему.
0 голосов
ответил 02 Июнь, 06 от Progman (840 баллов)
Для начала я бы не стал пользоваться IGxMap интерфейсом... Я бы использовал, например, IMapReader Interface.
Далее - IMap -> ILayer -> IDataset -> IWorkspace (ConnectionProperties Property)...
 
Все-таки  рекомендую изучить этот пример - там есть все, что нужно знать, чтобы решить данную проблему.
Нет, проблема не в том, какие свойства нужно менять у слоев. Это как раз несложно. Проблема в том, что добраться до них, когда они ссылаются на отсутствующий сервер - это очень долгая операция. Метод Open у MapReader может выполняться десятками минут (насколько я понял это зависит от количества слоев). А хотелось бы найти более быстрый способ.
0 голосов
ответил 02 Июнь, 06 от Alexander1 (32,520 баллов)

Надо поточнее вопрос формулировать. Если надо получить доступ к слоям карты не открывая *MXD, тогда используй IGxMapPageLayout:

Sub GetMaps()
    ' creates all the maps in memory that are in a saved MxD
    ' without opening the MxD.
   
    Dim pGxFile As IGxFile
    Set pGxFile = New GxMap
    pGxFile.Path = "D:\ambergis\Myfile.mxd"
    If Not TypeOf pGxFile Is IGxMapPageLayout Then
        Debug.Print "no pagelayout"
        Exit Sub
    End If
   
    Dim pGxLayout As IGxMapPageLayout
    Set pGxLayout = pGxFile
      
    Dim pLayout As IPageLayout
    Set pLayout = pGxLayout.PageLayout 
    
    Dim pAV As IActiveView
    Set pAV = pLayout
   
    Dim pStartMap As IMap
    Set pStartMap = pAV.FocusMap
    Do While True
        Dim l As Long
        Debug.Print pAV.FocusMap.Name
        For l = 0 To pAV.FocusMap.LayerCount - 1
            Debug.Print pAV.FocusMap.Layer(l).Name
        Next l
        pLayout.FocusNextMapFrame
        If pAV.FocusMap Is pStartMap Then
            Exit Do
        End If
    Loop
   

End Sub

http://forums.esri.com/Thread.asp?c=93&f=993&t=53381&mc=3#msgid131544

0 голосов
ответил 05 Июнь, 06 от Progman (840 баллов)

Надо поточнее вопрос формулировать. Если надо получить доступ к слоям карты не открывая *MXD, тогда используй IGxMapPageLayout:

По-моему, вопрос сформулирован точно. А приведенный код все равно не подходит. Вот эта строчка кода Set pLayout = pGxLayout.PageLayout  выполняется опять-таки десятки минут, в зависимости от количества слоев в mxd.
Неужели это такая редкая ситуация для работы с ArcGIS, когда карты создаются в одном месте, а публикуются в другом?
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...