вопрос про toMapPoint

0 голосов
спросил 23 Июнь, 08 от Egor (360 баллов) в категории Программные продукты Esri
Доброго времени суток всем!
Имеется вопрос: необходимо сделать выборку по карте (аналог select features), но по контуру, координаты которого задаются с клавиатуры (в градусах). Для этого я записываю необходимое количество точек Ipoint в IPointCollection, по ней потом строю IGeometry, и потом полученную геометрию использую в качестве атрибута в SelectByShape. При этом, если я записываю в IPoint x и y в градусах - результат выборки получается неправильный (map units - метры), если я в IPoint записываю DisplayTransformation.ToMapPoint(x,y), результат тоже неправильный (объекты в нужной области не подсвечиваются). Но если я в свойствах DataFrame поменяю Display Units с градусов на метры, ручками с карты сниму показания и их запишу в iPoint, результат выборки будет корректным.
Собственно, вопрос: как программным способом преобразовать десятичные градусы в метры карты?

Вот образец кода:

Dim pMxApp As IMxApplication
Dim pMxDoc As IMxDocument
Dim pGeom As IGeometry

Dim pPoint1 As IPoint
Dim pPoint2 As IPoint
Dim pPoint3 As IPoint
Dim pPoint4 As IPoint

Set pPoint1 = New Point
Set pPoint2 = New Point
Set pPoint3 = New Point
Set pPoint4 = New Point
 
Set pMxApp = Application
Set pMxDoc = ThisDocument

  '///вариант первый, правильный, координаты сняты с карты, Display Units - meters
  'pPoint1.PutCoords -2124004, 1327395
  'pPoint2.PutCoords -2299667, 989938
  'pPoint3.PutCoords -1999191, 846634
  'pPoint4.PutCoords -1897491, 1202582
  
  '///вариант второй, некорректный, возвращенные координаты отличаются от первого случая на порядок  
Set pPoint1 = pMxDoc.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(63, 56)
Set pPoint2 = pMxDoc.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(64, 53)
Set pPoint3 = pMxDoc.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(70, 53)
Set pPoint4 = pMxDoc.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(70, 56)


'///вариант третий, координаты сняты с карты, Display Units - Decimal Degrees
  'pPoint1.PutCoords 63, 56
  'pPoint2.PutCoords 64, 53
  'pPoint3.PutCoords 70, 53
  'pPoint4.PutCoords 70, 56

 
 
  Dim pPolygonPointColl As IPointCollection
  Set pPolygonPointColl = New Polygon
 
  pPolygonPointColl.AddPoint pPoint1
  pPolygonPointColl.AddPoint pPoint2
  pPolygonPointColl.AddPoint pPoint3
  pPolygonPointColl.AddPoint pPoint4
  pPolygonPointColl.AddPoint pPoint1 'Add the first point again to close
   
  Set pGeom = pPolygonPointColl
 
  pMap.SelectByShape pGeom, pMxApp.SelectionEnvironment, False
  pMxDoc.ActiveView.PartialRefresh esriViewGeoSelection, Nothing,



Подскажите пожалуйста, может, я чего пропустил?

1 Ответ

0 голосов
ответил 27 Июнь, 08 от tntman (1,360 баллов)
У геометрии необходимо определить проекцию в котрой вводятся координаты
pGeom.Set_SpatialReference(pSpatialReference)    

затем перепроецировать в проекцию карты
pGeom.Project(pSpatReference_MAP)
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...