Как сделать Select на точку из точечного слоя?

0 голосов
спросил 13 Июнь, 07 от vig11 (2,220 баллов) в категории Программные продукты Esri
У меня есть точечный слой. Пользователю нужно отметить какую-либо из точек этого слоя и дальше работать с данными этой точки. Основное - узнать её координаты.Я начал писать функцию, но что-то запутался. Вот как выглядит начало написанное на С#:
 
public void OnMouseDown(int button, int shift, int x, int y)
  {
   try
   {
        m_pPoint = GlobalVar.EditUt.pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);
    } //try
   catch(Exception ex)
   {
    MessageBox.Show(ex.Message);
   } //catch(Exception ex)
  } //public void OnMouseDown(int button, int shift, int x, int y)
 
Т.е. координату на экране я получил. А как дальше? Если будут примеры на С# прекрасно, но и на VB тоже подойдёт.

10 Ответы

0 голосов
ответил 13 Июнь, 07 от sschainik (4,900 баллов)
не совсем понятен вопрос.
нужно получить информацию об объекте-точке на слоерасплоложенной по данной координате (т.е. что то вроде инструмента идентификации)?
0 голосов
ответил 17 Июнь, 07 от vig11 (2,220 баллов)
У меня есть точечный слой DTM. Предположим одна из точек имеет ошибочную Z-координату. Пользователь должен отметить эту точку, получить её координаты X, Y и затем найдя Z-координату этой точки в ASCI файле заменить её на No Data.
0 голосов
ответил 18 Июнь, 07 от sschainik (4,900 баллов)
а поиск точки с ошибочной z-координатой осуществляется в ручную и автоматичестки?
если точка (пространственный объект) получена то можно так:
dim pPoint as IPoint
dim X as Double
dim Y as Double
if pFeature.Shape.GeometryType = esriGeometryPoint then
set pPoint = pFeature.Shape
X = pPoint.X
Y = pPoint.Y
end if
0 голосов
ответил 18 Июнь, 07 от Georg (180 баллов)
Приведу примерчик на VB.
Сначала получаете координаты точки, указаннной мышью,
напр. по событию MapControl1.OnMouseDown
с помощью ToMapPoint переводите в координаты карты,
а далее ищете точку в ближайших окрестностях из точечного слоя.
 

   Set pActiveView = MapControl1.ActiveView

    Set pmap = MapControl1.Map

    Set pEnvelope = pActiveView.Extent

    searchtol = (pEnvelope.XMax - pEnvelope.XMin) / 200 ' размер окрестностей, в которых ищем точку

    Set pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y)

   

 

        Set pFeature = FindFeature(searchtol, pPoint)

 

 

Public Function FindFeature(searchtol As Double, pPoint As esriGeometry.Ipoint) As Feature

 

'*********************************************************************************************

' функция поиска точки по клику мышкой на карте

'*********************************************************************************************

 

Dim pEnvelope As IEnvelope

Dim pSpatialFilter As ISpatialFilter

Dim pFeatureClass As IFeatureClass

Dim pFeatureCursor As IFeatureCursor

Dim pFeature As IFeature

Dim ShapeFieldName As String

Dim pmap As IMap

 

Set pmap = MainForm.MapControl1.Map

Set pEnvelope = pPoint.Envelope

pEnvelope.Expand searchtol, searchtol, False

 

'Create a new spatial filter and use the new envelope as the geometry

Set pSpatialFilter = New SpatialFilter

Set pSpatialFilter.Geometry = pEnvelope

pSpatialFilter.SpatialRel = esriSpatialRelIntersects

 

Set pWorkspaceFactory = New ShapefileWorkspaceFactory

 Set pFeatureWorkspace = pWorkspaceFactory.OpenFromFile(Path_ServPoint, 0)

 Set pFeatureClass = pFeatureWorkspace.OpenFeatureClass(Theme1)

ShapeFieldName = pFeatureClass.ShapeFieldName

Set pSpatialFilter.OutputSpatialReference(ShapeFieldName) = pmap.SpatialReference

pSpatialFilter.GeometryField = pFeatureClass.ShapeFieldName

Set pFeatureCursor = pFeatureClass.Search(pSpatialFilter, False)  'Do the search

<P =Msonormal style="MAR
0 голосов
ответил 21 Июнь, 07 от vig11 (2,220 баллов)
searchtol = (pEnvelope.XMax - pEnvelope.XMin) / 200 ' размер окрестностей, в которых ищем точку
Спасибо, кажется это именно то, что я искал. Сегодня проверю как работает. Вопрос только почему берётся цифра "200" ? Чем это определяется. Просто в другом примере я видел, что делят на "750". А какую цифру в каком случае брать непонятно.
0 голосов
ответил 21 Июнь, 07 от sschainik (4,900 баллов)
можно применять цифру исходя из текущего масштаба
IMap->MapScale
0 голосов
ответил 27 Июнь, 07 от vig11 (2,220 баллов)
можно применять цифру исходя из текущего масштаба
IMap->MapScale
Поподробнее пожалуйста.
0 голосов
ответил 27 Июнь, 07 от vig11 (2,220 баллов)
Georg, огромное спасибо. Всё работает как часы. Только вот меня настораживает ,что когда я делю на 200 ища размер окрестности в которой ищу точку не получится ли размер чересчур большой при определённом масштабе?
0 голосов
ответил 27 Июнь, 07 от sschainik (4,900 баллов)
можно применять цифру исходя из текущего масштаба IMap->MapScale
Поподробнее пожалуйста.

   
что то вроде этого:
searchtol = (pEnvelope.XMax - pEnvelope.XMin) /(MapControl1.MapScale * 200)
0 голосов
ответил 27 Июнь, 07 от vig11 (2,220 баллов)
можно применять цифру исходя из текущего масштаба IMap->MapScale
Поподробнее пожалуйста.

   
что то вроде этого:
searchtol = (pEnvelope.XMax - pEnvelope.XMin) /(MapControl1.MapScale * 200)
Спасибо, попробую.
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...