как быть, с чего начать... разработка в ArcGIS (ArcObjects)

ArcGIS 8.x,9.x,10.x (Arcview, ArcEditor, Arcinfo).
Dido
Новоприбывший
Сообщения: 8
Зарегистрирован: 22 сен 2008, 07:19
Репутация: 0
Откуда: Astana
Контактная информация:

как быть, с чего начать... разработка в ArcGIS (ArcObjects)

Сообщение Dido » 22 сен 2008, 07:40

привет форумчане, я новичек в системе ArcGIS, раньше программировал на дельфи и немножко на ВБ, мне tools к ArcGIS надо написать, т.е, есть карты города, адресный поиск организовать надо, т.е юзер вводит имя улицы и номер дома на интерфейсе и находит обьект. Как лучше сделать, через COM или же через макросы ? как правильно загрузить атрибутивные данные, т.е с mdb или с dbf как загрузить названия улиц и номера домов ? какие компоненты или библиотеки использовать надо, мне желательно с помощью запросов SQL используя LIKEзагуризить данные
За ранее благодарен !!!

AndreyL
Завсегдатай
Сообщения: 483
Зарегистрирован: 17 авг 2006, 14:04
Репутация: 0
Откуда: Новосибирск

Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)

Сообщение AndreyL » 22 сен 2008, 10:28

Dido писал(а):Как лучше сделать, через COM или же через макросы ?
А какая разница - один черт COM, хоть через макросы, хоть через Дельфи
Dido писал(а):как правильно загрузить атрибутивные данные, т.е с mdb или с dbf как загрузить названия улиц и номера домов ?какие компоненты или библиотеки использовать надо, мне желательно с помощью запросов SQL используя LIKEзагуризить данные
Тоже без разницы, хоть на АДе, все зависит от того, как организован тот интерфейс, в который юзер вводит имя улицы и номер дома

По делу - гляньте сюда, надеюсь, разберетесь
http://www.dataplus.ru/forum/forum_posts.asp?TID=6002
По-моему, интерфейс IQueryFilter должен понимать LIKE, только формат может быть отличный от классического SQL

Dido
Новоприбывший
Сообщения: 8
Зарегистрирован: 22 сен 2008, 07:19
Репутация: 0
Откуда: Astana
Контактная информация:

Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)

Сообщение Dido » 22 сен 2008, 13:21

AndreyL спс что ответил, СОМ имеется виде dll-ку написать к ArcMap или же через макросы проще ? на счет интерфейса, 2 окна для ввода и одна кнопка :-)
IQueryFilter не понимает LIKE, юзал уже

AndreyL
Завсегдатай
Сообщения: 483
Зарегистрирован: 17 авг 2006, 14:04
Репутация: 0
Откуда: Новосибирск

Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)

Сообщение AndreyL » 22 сен 2008, 15:26

Впрочем, а какая разница, писать ДЛЛ-ку, или макрос – выборка не такая сверхскоростная задача. Если хочется скрыть код – тогда понятно.
Не понял, зачем два окна – для того чтобы задать несколько значений достаточно одного. Или под окном понимается что-то другое - с точки зрения программиста С все элементы управления окна, однако я тоже иногда делфист.
Далее, по поводу ЛайК – как пишете? А в Определяющем Запросе (Definition Query) слоя Ваша запись работает? Там еще апострофы бы не пропустить.

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)

Сообщение Denis Rykov » 23 сен 2008, 05:58

Есть книжка по программированию ArcObjects на VBA, возможно что-нибудь полезное найдёте.
Spatial is now, more than ever, just another column- The Geometry Column.

Dido
Новоприбывший
Сообщения: 8
Зарегистрирован: 22 сен 2008, 07:19
Репутация: 0
Откуда: Astana
Контактная информация:

Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)

Сообщение Dido » 23 сен 2008, 07:03

_DR_ спасибо за книжку, буду читать....
AndreyL, код скрывать не буду, че мне, жалко что-ль, пусть смотрят :shock:
на счет окон, я так условно сказал, например:юзер выбирает из комбобокса_1 улицу и из комбобокса_2 номер дома (не вводит,а выбирает), потом нажимает на кнопку "Показать"
я начал загружать данные через ADODB компоненты:

Код: Выделить всё

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim cmd As ADODB.Command
Dim str, SQL As String
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
MDB= path+'map.mdb'
'txtStreet.Text - Edit поле, где юзер вводит названия улицы
If txtStreet.Text <> "" Then
SQL = "Select НАИМЕНОВАН, ID from STREETS Where НАИМЕНОВАН LIKE '*" & Trim(txtStreet.Text) & "*'"
Else
SQL = "Select НАИМЕНОВАН, ID from STREETS"
End If
cn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=MDB;Persist Security Info=False")
rs.Open SQL, cn, , , adCmdText
If rs.RecordCount <= 0 Then Exit Sub
lstStreet.Clear 'lstStreet- куда загружаю названия улиц
 For i = 1 To rs.RecordCount
 lstStreet.AddItem (rs.Fields(0).Value)
 rs.MoveNext
 Next i
 rs.Close
 cn.Close
иначе говоря, мне получается надо найти полигональный обьект(зданий) и выделить его(Zoom) ?

AndreyL
Завсегдатай
Сообщения: 483
Зарегистрирован: 17 авг 2006, 14:04
Репутация: 0
Откуда: Новосибирск

Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)

Сообщение AndreyL » 23 сен 2008, 10:21

Пока (то, что я понял из Вашего кода) Вы пытаетесь загрузить в txtStreet все названия улиц. Вот только не помню сейчас АДО-вские определения SQL, но в Аксессе ЛАЙК пишется со скобками (подразумевается, что это функция) и кавычками (не апострофами). Про выделение пока и речи нет – это когда юзер что-то выберет из этих списков.

Dido
Новоприбывший
Сообщения: 8
Зарегистрирован: 22 сен 2008, 07:19
Репутация: 0
Откуда: Astana
Контактная информация:

Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)

Сообщение Dido » 23 сен 2008, 11:22

txtStreet.Text- сюда юзер начинает набивать по буквам
lstStreet, результат запроса LIKE заргужается
на счет ЛАЙК в Аксессе работает как есть,я ручками пробовал :!:
ваще я направильном пути :?:

AndreyL
Завсегдатай
Сообщения: 483
Зарегистрирован: 17 авг 2006, 14:04
Репутация: 0
Откуда: Новосибирск

Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)

Сообщение AndreyL » 23 сен 2008, 11:56

Ради Бога! Только ГИС пока не пахнет. Когда определитесь с улицами и домами – тогда начнется ГИС. Насколько я понимаю, тогда ЛАЙК уже не нужен, т.е. вопрос о синтаксисе ЛАЙКа относится к АДО, а не к IQueryFilter.

Dido
Новоприбывший
Сообщения: 8
Зарегистрирован: 22 сен 2008, 07:19
Репутация: 0
Откуда: Astana
Контактная информация:

Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)

Сообщение Dido » 23 сен 2008, 12:40

AndreyL писал(а):Ради Бога! Только ГИС пока не пахнет. Когда определитесь с улицами и домами – тогда начнется ГИС. Насколько я понимаю, тогда ЛАЙК уже не нужен, т.е. вопрос о синтаксисе ЛАЙКа относится к АДО, а не к IQueryFilter.
ну хотел сделать через IQueryFilter, не понимает он ЛАЙКЕ, может мне не стоит применять ADO ваще, не знаю и по этому спрашивал как правильно это сделать...советы ваши нужны мне, задача надесюь ясна вам...
За ранее спасибо !!!

AndreyL
Завсегдатай
Сообщения: 483
Зарегистрирован: 17 авг 2006, 14:04
Репутация: 0
Откуда: Новосибирск

Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)

Сообщение AndreyL » 23 сен 2008, 12:56

В принципе Вы все делаете правильно – получить список улиц и номера домов из таблицы – это не ГИС (в том же Аксессе можно решить), хотя инструменты для работы с таблицами есть и в АркГИС (хотя на АДе, по-моему, проще и компактнее). А вот когда улица и номер уже выбраны, и нужно показать объект на карте – вот это уже ГИС. Ссылку на код я Вам давал.

Dido
Новоприбывший
Сообщения: 8
Зарегистрирован: 22 сен 2008, 07:19
Репутация: 0
Откуда: Astana
Контактная информация:

Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)

Сообщение Dido » 23 сен 2008, 14:47

AndreyL писал(а):В принципе Вы все делаете правильно – получить список улиц и номера домов из таблицы – это не ГИС (в том же Аксессе можно решить), хотя инструменты для работы с таблицами есть и в АркГИС (хотя на АДе, по-моему, проще и компактнее). А вот когда улица и номер уже выбраны, и нужно показать объект на карте – вот это уже ГИС. Ссылку на код я Вам давал.
по ссылке я прошелся, там не с полигонами работаете,а с точками...или я ошибаюсь...?

AndreyL
Завсегдатай
Сообщения: 483
Зарегистрирован: 17 авг 2006, 14:04
Репутация: 0
Откуда: Новосибирск

Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)

Сообщение AndreyL » 23 сен 2008, 15:24

Dido писал(а):по ссылке я прошелся, там не с полигонами работаете,а с точками...или я ошибаюсь...?
И что? Полигоны выделяются точно так же, как точки – никакой разницы. Единственное, нужно будет определить координаты центра полигона для смещения (если это вообще нужно).

AndreyL
Завсегдатай
Сообщения: 483
Зарегистрирован: 17 авг 2006, 14:04
Репутация: 0
Откуда: Новосибирск

Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)

Сообщение AndreyL » 23 сен 2008, 16:28

Вот код - минимально передалал

Код: Выделить всё

Public Sub ShowPoint()
'On Error GoTo Err_ShowPoint
    Dim pEnumLayers As IEnumLayer
    Dim pLayer As ILayer
    Dim pMap As IMxDocument
    Dim sLayerName As String
    Set pMap = ThisDocument
    Set pEnumLayers = pMap.FocusMap.Layers
    sLayerName = ' тут присваиваем имя слоя
    spoint = ' тут присваиваем маску поиска
  If pEnumLayers Is Nothing Then Exit Sub
    ' find the requested layer:
  Set pLayer = pEnumLayers.Next
  Do While Not pLayer Is Nothing
    If UCase(pLayer.Name) = UCase(sLayerName) Then Exit Do
    Set pLayer = pEnumLayers.Next
  Loop
  If pLayer Is Nothing Then Exit Sub
  
  Dim pQueryFilter As IQueryFilter
  Set pQueryFilter = New QueryFilter
  pQueryFilter.WhereClause = spoint
 
  Dim pFeatureSelection As IFeatureSelection
  Set pFeatureSelection = pLayer
  pFeatureSelection.SelectFeatures pQueryFilter, esriSelectionResultNew, True
  
  Dim pSelectionSet As ISelectionSet
  Set pSelectionSet = pFeatureSelection.SelectionSet
  i = pSelectionSet.IDs.Next
  
  Dim pPt_FeatureClass As IFeatureClass
  Dim pPt_FeatureLayer As IFeatureLayer
  Set pPt_FeatureLayer = pLayer
  Set pPt_FeatureClass = pPt_FeatureLayer.FeatureClass
  
  Dim pFeature As IFeature
  Dim pPt_Geometry As IGeometry
  Dim pPoligon As IPolygon
  FieldIndex = pPt_FeatureClass.FindField("Shape")
  Set pFeature = pPt_FeatureClass.GetFeature(i)
  Set pPt_Geometry = pFeature.Value(FieldIndex)
  Set pPoligon = pPt_Geometry
  
  Dim pEnvelope As IEnvelope
  Dim pActiveView As IActiveView
  Dim pDisplayTransform As IDisplayTransformation
  Set pActiveView = pMap.FocusMap
  Set pDisplayTransform = pActiveView.ScreenDisplay.DisplayTransformation
  Set pEnvelope = pDisplayTransform.VisibleBounds
  Dim dXmin As Double, dYmin As Double, dXmax As Double, dYmax As Double
  Dim dX As Double, dY As Double, MyCheck As Boolean
  pEnvelope.QueryCoords dXmin, dYmin, dXmax, dYmax
  Dim pGeo As IGeometry
  Set pGeo = pPoligon
  Dim pSpRef As ISpatialReference
  Set pSpRef = pEnvelope.SpatialReference
  pGeo.Project pSpRef
  dX = pPoligon.ToPoint.X
  dY = pPoligon.ToPoint.Y
  MyCheck = (dX < dXmin) Or (dX > dXmax) Or (dY < dYmin) Or (dY > dYmax)
  If MyCheck Then
   pEnvelope.CenterAt pPoligon.ToPoint
  End If
  pDisplayTransform.VisibleBounds = pEnvelope
  
  pMap.ActiveView.Refresh
  
Err_ShowPoint:
Set app = Nothing
End Sub
Правда центрировать будет не по сентру полигона, а по первому вертексу. Если нужно, чтобы по центру полигона, то, тадеюсь, сами найдете, как это сделать, заодно поделитесь. Или можно вопрос на ДатаПлюсовком форуме задать - там есть специальная ветка для программистов.

Dido
Новоприбывший
Сообщения: 8
Зарегистрирован: 22 сен 2008, 07:19
Репутация: 0
Откуда: Astana
Контактная информация:

Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)

Сообщение Dido » 24 сен 2008, 05:30

AndreyL писал(а):Вот код - минимально передалал

Код: Выделить всё

Public Sub ShowPoint()
'On Error GoTo Err_ShowPoint
    Dim pEnumLayers As IEnumLayer
    Dim pLayer As ILayer
    Dim pMap As IMxDocument
    Dim sLayerName As String
    Set pMap = ThisDocument
    Set pEnumLayers = pMap.FocusMap.Layers
    sLayerName = ' тут присваиваем имя слоя
    spoint = ' тут присваиваем маску поиска
  If pEnumLayers Is Nothing Then Exit Sub
    ' find the requested layer:
  Set pLayer = pEnumLayers.Next
  Do While Not pLayer Is Nothing
    If UCase(pLayer.Name) = UCase(sLayerName) Then Exit Do
    Set pLayer = pEnumLayers.Next
  Loop
  If pLayer Is Nothing Then Exit Sub
  
  Dim pQueryFilter As IQueryFilter
  Set pQueryFilter = New QueryFilter
  pQueryFilter.WhereClause = spoint
 
  Dim pFeatureSelection As IFeatureSelection
  Set pFeatureSelection = pLayer
  pFeatureSelection.SelectFeatures pQueryFilter, esriSelectionResultNew, True
  
  Dim pSelectionSet As ISelectionSet
  Set pSelectionSet = pFeatureSelection.SelectionSet
  i = pSelectionSet.IDs.Next
  
  Dim pPt_FeatureClass As IFeatureClass
  Dim pPt_FeatureLayer As IFeatureLayer
  Set pPt_FeatureLayer = pLayer
  Set pPt_FeatureClass = pPt_FeatureLayer.FeatureClass
  
  Dim pFeature As IFeature
  Dim pPt_Geometry As IGeometry
  Dim pPoligon As IPolygon
  FieldIndex = pPt_FeatureClass.FindField("Shape")
  Set pFeature = pPt_FeatureClass.GetFeature(i)
  Set pPt_Geometry = pFeature.Value(FieldIndex)
  Set pPoligon = pPt_Geometry
  
  Dim pEnvelope As IEnvelope
  Dim pActiveView As IActiveView
  Dim pDisplayTransform As IDisplayTransformation
  Set pActiveView = pMap.FocusMap
  Set pDisplayTransform = pActiveView.ScreenDisplay.DisplayTransformation
  Set pEnvelope = pDisplayTransform.VisibleBounds
  Dim dXmin As Double, dYmin As Double, dXmax As Double, dYmax As Double
  Dim dX As Double, dY As Double, MyCheck As Boolean
  pEnvelope.QueryCoords dXmin, dYmin, dXmax, dYmax
  Dim pGeo As IGeometry
  Set pGeo = pPoligon
  Dim pSpRef As ISpatialReference
  Set pSpRef = pEnvelope.SpatialReference
  pGeo.Project pSpRef
  dX = pPoligon.ToPoint.X
  dY = pPoligon.ToPoint.Y
  MyCheck = (dX < dXmin) Or (dX > dXmax) Or (dY < dYmin) Or (dY > dYmax)
  If MyCheck Then
   pEnvelope.CenterAt pPoligon.ToPoint
  End If
  pDisplayTransform.VisibleBounds = pEnvelope
  
  pMap.ActiveView.Refresh
  
Err_ShowPoint:
Set app = Nothing
End Sub
Правда центрировать будет не по сентру полигона, а по первому вертексу. Если нужно, чтобы по центру полигона, то, тадеюсь, сами найдете, как это сделать, заодно поделитесь. Или можно вопрос на ДатаПлюсовком форуме задать - там есть специальная ветка для программистов.
AndreyL огромное вам спасибо, буду пробовать...
в форуме дата+ редко отвечают, и я сомневаюсь, что там есть разработчики, так как там курсы по программированию ArcObject не проводятся, нашел курс только в Новосибирске ( с 29.09 по 3.10 присоединяйтесь)
www.dataeast.ru

Ответить

Вернуться в «ArcGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость