рисование в слое

0 голосов
спросил 03 Июнь, 10 от boom (1,760 баллов) в категории Программные продукты Esri
ArcGis Server, silverlight

здравствуйте,
у меня возникла такая задача, надо нарисовать какой нибудь примитивный объект (линию, точку, не важно) на слое.
т.е. есть сервер ArcGis Server, опубликован сервис с mxd. Есть страничка (написанная на silverlight),в которой отображается карта (подключаемся к тому сервису), теперь надо, нажав на какую нибудь кнопочку, отредактировать слой, нарисовать в нем объект.

на Arcgis Server есть шаблоны (добавлять web application) с различными опциями, да, это хорошо, но мне надо править в своем приложении и тут у меня возникла загвоздка с этим делом. ведь сильверлайт работает на стороне клиента и ему не добавляются ссылки типа ESRI.ARcGIS.ADF и т.д. получается надо реализовывать чтото на стороне сервера, я не могу понять самого механизма как будет происходить редактирование.

если кто может помочь, разъясните пожалуйста.

спасибо

21 Ответы

0 голосов
ответил 16 Июнь, 10 от TDenis (42,620 баллов)
Наверное стоит для начала какой-нибудь левый слой создать, чтобы не приходилось системы координат задавать/менять. И попробовать поработать с ним из обычного Console Application. Потом уже добавить смену СК, создать сервис и добавить пользовательский ввод геометрии. Возможно, так будет быстрее.
0 голосов
ответил 17 Июнь, 10 от boom (1,760 баллов)
причина обнуления действительно связана с СК. нашел  значения для WGS1984, прописал ее в коде и слой создал с этой же СК, получилось, полигон отрисовался. Теперь дело за малым, надо найти соответствующие параметры для нужной мне СК
0 голосов
ответил 17 Июнь, 10 от TDenis (42,620 баллов)
надо найти соответствующие параметры для нужной мне СК

Попробовать ISpatialReference.GetFalseOriginAndUnits для СК слоя?

Если у вас на карте СК та же, что и у источника данных (та же?), то наверное координаты тоже вводятся уже "правильные", которые не требуется перепроецировать, т.е. для созданного объекта можно просто задать СК слоя (или не указывать вовсе?) без вызовов всяких Project() и попробовать сохранить.

И, думаю, надо предварительно проверить пространственный домен слоя (ISpatialReference.GetDomain). И как-то ограничить пользователя при рисовании, чтоб он не вылез за пределы.
    
0 голосов
ответил 17 Июнь, 10 от boom (1,760 баллов)
а как можно узнать какая СК в слое?
т.е. если слой с СК взятой из списка, например Пулково 1942, делаю так

SpatialReferenceEnvironment pSpatialRefEnv = new SpatialReferenceEnvironmentClass();
            IGeographicCoordinateSystem2 pGeogCoordSys =
                                                (IGeographicCoordinateSystem2)
   pSpatialRefEnv.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_Pulkovo1942);
                                               
            IGeometry pReturnGeometry = pGeomInParam;
           
            pReturnGeometry.Project(pGeogCoordSys);

            return pReturnGeometry;

а если у меня СК берется не из списка, а из базы, то как с этим быть, надо же както спорецировать нарисованную геометрию на эту СК


а если убрать Project(), то в SpatialReference пишется что СК WGS_1984
0 голосов
ответил 17 Июнь, 10 от TDenis (42,620 баллов)
а как можно узнать какая СК в слое?

ILayer.SpatialReference
0 голосов
ответил 17 Июнь, 10 от TDenis (42,620 баллов)
а если у меня СК берется не из списка, а из базы, то как с этим быть, надо же както спорецировать нарисованную геометрию на эту СК

Насколько я понимаю, это только если координаты вы вводите в какой-то другой СК. Если сразу в той же, то переход/проецирование не требуется. Если требуется, то надо задать правильную СК для исходной фигурки. Затем спроецировать в новую (правильно задав параметры и новой СК), хотя возможно оно спроецируется само автоматом при сохранении в слой, не знаю.
Карта и слой в одной СК? Откуда берётся WGS84?
0 голосов
ответил 17 Июнь, 10 от boom (1,760 баллов)
откуда WGS84 взялся я и сам не понял, после перезапуска Visual Studio он исчез, видимо сохранилось гдето это значение.  карта и слой в одной системе.

Сейчас попробовал сделать так:

IFeature pLocalFeature = default(IFeature);
pLocalFeature = pFeatClass.CreateFeature();
sr = pLocalFeature.Shape.SpatialReference;
pReturnGeometry.Project(sr);
pGeometryOfFeature = pReturnGeometry;

try
{
       pLocalFeature.Shape = pGeometryOfFeature;
}

в pGeometryOfFeature SpetialReference тот, какой надо, и фигурка есть, т.е. 
     IsEmpty = false;

но когда доходит до pLocalFeature.Shape = pGeometryOfFeature;
вылетает ошибка

"The coordinates or measures are out of bounds"
 
0 голосов
ответил 17 Июнь, 10 от TDenis (42,620 баллов)
А не заработает, если просто написать:

IFeature pLocalFeature = pFeatClass.CreateFeature();
pLocalFeature.Shape = pReturnGeometry;

ну или ещё добавить между ними:

pReturnGeometry.SpatialReference = (pFeatClass as IGeoDataset).SpatialReference;
?

А как создаётся объект pReturnGeometry?
    
0 голосов
ответил 17 Июнь, 10 от boom (1,760 баллов)
нет, так не заработало.

IGeometry pReturnGeometry = pGeometryOfFeature;

а pGeometryOfFeature это как раз та нарисованная фигурка, получается она так

IPointCollection pObtainedCollection = new PolygonClass() as IPointCollection;
IPolygon pPoly2BInsertedIntoSDE;
pPoly2BInsertedIntoSDE = pObtainedCollection as IPolygon;
pPoly2BInsertedIntoSDE.Close();
IGeometry pGeometryFromFeature = (IGeometry)pPoly2BInsertedIntoSDE;
0 голосов
ответил 17 Июнь, 10 от boom (1,760 баллов)
на бум решил попробовать, что произойдет, если добавить еще

sr.SetDomain(-1000000, 1000000, -1000000, 1000000);
перед
pReturnGeometry.Project(sr);

проскочила, но на pLocalFeature.Store(); ругнулась

The specified coordinate exceeds the valid coordinate range
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...