Страница 1 из 2
как быть, с чего начать... разработка в ArcGIS (ArcObjects)
Добавлено: 22 сен 2008, 07:40
Dido
привет форумчане, я новичек в системе ArcGIS, раньше программировал на дельфи и немножко на ВБ, мне tools к ArcGIS надо написать, т.е, есть карты города, адресный поиск организовать надо, т.е юзер вводит имя улицы и номер дома на интерфейсе и находит обьект. Как лучше сделать, через COM или же через макросы ? как правильно загрузить атрибутивные данные, т.е с mdb или с dbf как загрузить названия улиц и номера домов ? какие компоненты или библиотеки использовать надо, мне желательно с помощью запросов SQL используя LIKEзагуризить данные
За ранее благодарен !!!
Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)
Добавлено: 22 сен 2008, 10:28
AndreyL
Dido писал(а):Как лучше сделать, через COM или же через макросы ?
А какая разница - один черт COM, хоть через макросы, хоть через Дельфи
Dido писал(а):как правильно загрузить атрибутивные данные, т.е с mdb или с dbf как загрузить названия улиц и номера домов ?какие компоненты или библиотеки использовать надо, мне желательно с помощью запросов SQL используя LIKEзагуризить данные
Тоже без разницы, хоть на АДе, все зависит от того, как организован тот
интерфейс, в который
юзер вводит имя улицы и номер дома
По делу - гляньте сюда, надеюсь, разберетесь
http://www.dataplus.ru/forum/forum_posts.asp?TID=6002
По-моему, интерфейс
IQueryFilter должен понимать
LIKE, только формат может быть отличный от классического
SQL
Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)
Добавлено: 22 сен 2008, 13:21
Dido
AndreyL спс что ответил, СОМ имеется виде dll-ку написать к ArcMap или же через макросы проще ? на счет интерфейса, 2 окна для ввода и одна кнопка

IQueryFilter не понимает LIKE, юзал уже
Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)
Добавлено: 22 сен 2008, 15:26
AndreyL
Впрочем, а какая разница, писать ДЛЛ-ку, или макрос – выборка не такая сверхскоростная задача. Если хочется скрыть код – тогда понятно.
Не понял, зачем два окна – для того чтобы задать несколько значений достаточно одного. Или под окном понимается что-то другое - с точки зрения программиста С все элементы управления окна, однако я тоже иногда делфист.
Далее, по поводу ЛайК – как пишете? А в Определяющем Запросе (Definition Query) слоя Ваша запись работает? Там еще апострофы бы не пропустить.
Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)
Добавлено: 23 сен 2008, 05:58
Denis Rykov
Есть
книжка по программированию ArcObjects на VBA, возможно что-нибудь полезное найдёте.
Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)
Добавлено: 23 сен 2008, 07:03
Dido
_DR_ спасибо за книжку, буду читать....
AndreyL, код скрывать не буду, че мне, жалко что-ль, пусть смотрят
на счет окон, я так условно сказал, например:юзер выбирает из комбобокса_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) ?
Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)
Добавлено: 23 сен 2008, 10:21
AndreyL
Пока (то, что я понял из Вашего кода) Вы пытаетесь загрузить в txtStreet все названия улиц. Вот только не помню сейчас АДО-вские определения SQL, но в Аксессе ЛАЙК пишется со скобками (подразумевается, что это функция) и кавычками (не апострофами). Про выделение пока и речи нет – это когда юзер что-то выберет из этих списков.
Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)
Добавлено: 23 сен 2008, 11:22
Dido
txtStreet.Text- сюда юзер начинает набивать по буквам
lstStreet, результат запроса LIKE заргужается
на счет ЛАЙК в Аксессе работает как есть,я ручками пробовал
ваще я направильном пути

Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)
Добавлено: 23 сен 2008, 11:56
AndreyL
Ради Бога! Только ГИС пока не пахнет. Когда определитесь с улицами и домами – тогда начнется ГИС. Насколько я понимаю, тогда ЛАЙК уже не нужен, т.е. вопрос о синтаксисе ЛАЙКа относится к АДО, а не к IQueryFilter.
Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)
Добавлено: 23 сен 2008, 12:40
Dido
AndreyL писал(а):Ради Бога! Только ГИС пока не пахнет. Когда определитесь с улицами и домами – тогда начнется ГИС. Насколько я понимаю, тогда ЛАЙК уже не нужен, т.е. вопрос о синтаксисе ЛАЙКа относится к АДО, а не к IQueryFilter.
ну хотел сделать через IQueryFilter, не понимает он ЛАЙКЕ, может мне не стоит применять ADO ваще, не знаю и по этому спрашивал как правильно это сделать...советы ваши нужны мне, задача надесюь ясна вам...
За ранее спасибо !!!
Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)
Добавлено: 23 сен 2008, 12:56
AndreyL
В принципе Вы все делаете правильно – получить список улиц и номера домов из таблицы – это не ГИС (в том же Аксессе можно решить), хотя инструменты для работы с таблицами есть и в АркГИС (хотя на АДе, по-моему, проще и компактнее). А вот когда улица и номер уже выбраны, и нужно показать объект на карте – вот это уже ГИС. Ссылку на код я Вам давал.
Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)
Добавлено: 23 сен 2008, 14:47
Dido
AndreyL писал(а):В принципе Вы все делаете правильно – получить список улиц и номера домов из таблицы – это не ГИС (в том же Аксессе можно решить), хотя инструменты для работы с таблицами есть и в АркГИС (хотя на АДе, по-моему, проще и компактнее). А вот когда улица и номер уже выбраны, и нужно показать объект на карте – вот это уже ГИС. Ссылку на код я Вам давал.
по ссылке я прошелся, там не с полигонами работаете,а с точками...или я ошибаюсь...?
Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)
Добавлено: 23 сен 2008, 15:24
AndreyL
Dido писал(а):по ссылке я прошелся, там не с полигонами работаете,а с точками...или я ошибаюсь...?
И что? Полигоны выделяются точно так же, как точки – никакой разницы. Единственное, нужно будет определить координаты центра полигона для смещения (если это вообще нужно).
Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)
Добавлено: 23 сен 2008, 16:28
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
Правда центрировать будет не по сентру полигона, а по первому вертексу. Если нужно, чтобы по центру полигона, то, тадеюсь, сами найдете, как это сделать, заодно поделитесь. Или можно вопрос на ДатаПлюсовком форуме задать - там есть специальная ветка для программистов.
Re: как быть, с чего начать... разработка в ArcGIS (ArcObjects)
Добавлено: 24 сен 2008, 05:30
Dido
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