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

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

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

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

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

спасибо

21 Ответы

0 голосов
ответил 03 Июнь, 10 от Alexander1 (32,520 баллов)
0 голосов
ответил 03 Июнь, 10 от TDenis (42,620 баллов)
В текущей версии ArcGIS Server нельзя штатным способом редактировать слои с помощью Silverlight API. Как и Adobe Flex, кстати. Редактировать можно только всякие графические слои, находящиеся на стороне клиента.
REST интерфейс аркгиса просто не предоставляет необходимых средств.
Вариантов вижу два (хотя наверное есть и другие).

1. Дождаться ArcGIS Server 10 и использовать Silverlight API 2.0 или выше. Появится специальный тип сервисов, поддерживающих редактирование - FeatureService. Попросите у дистрибьютора бетку и потестируйте.
http://help.arcgis.com/en/webapi/silverlight/help/?Whats_New.htm
http://help.arcgis.com/en/webapi/silverlight/help/Editing_features.htm
http://help.arcgis.com/en/webapi/silverlight/samples/start.htm#ToolkitEditorWidget

2. Поднимать на сервере свой отдельный WCF-сервис (или какой другой), который сможет взаимодействовать с приложением Silverlight (подключив соответствующие библиотеки для WPF, можно будет без проблем пересылать туда-сюда фигурки, даже ничего явно сериализовывать не потребуется), а также сможет использовать прочие .NET сборки, необходимые для редактирования данных. Чтобы редактировать напрямую или через сервер, как угодно. Но есть мнение, что к тому моменту, когда вы это отладите, ArcGIS 10 уже выйдет и ваше решение будет выглядеть непонятным костылём.
http://forums.esri.com/Thread.asp?c=158&f=2455&t=280568&mc=33#870886
http://blogs.esri.com/Dev/blogs/silverlightwpf/archive/2010/03/11/Sending-geometry-between-Silverlight-and-the-server-using-WCF.aspx
http://forums.esri.com/Thread.asp?c=158&f=2399&t=286484
0 голосов
ответил 16 Июнь, 10 от boom (1,760 баллов)
получилось нарисовать объект, например полигон, далее при нажатии кнопочки сохранит, этот полигон должен сохраниться на слое (т.е. записаться в базу)

сделал как здесь http://forums.esri.com/Thread.asp?c=158&f=2455&t=280568&mc=33#870886

передаю координаты, т.е PointCollection, в создается новый объект, но поля Shape.area и shape.len остаются нулевыми и они не доступны для редактирования. Созданный объект соответственно не виден на слое.


0 голосов
ответил 16 Июнь, 10 от TDenis (42,620 баллов)
Вот про это я и говорил)
А другие поля заполняются? Текстовые, числовые?
Проверяли, на каком этапе обнуляются данные? Уже на этапе передачи на сервис или на этапе сохранения фигуры в сде?
Сервис исключение не выбрасывает?
Покажите свой код сервиса, как вы сохраняете фигурку в сде.
0 голосов
ответил 16 Июнь, 10 от boom (1,760 баллов)
ESRI.ArcGIS.Geodatabase.IWorkspace pWorkspace = default(ESRI.ArcGIS.Geodatabase.IWorkspace);
ESRI.ArcGIS.Geodatabase.IFeatureClass pFeatClass = pFeatureLayerInParam.FeatureClass;

            ESRI.ArcGIS.Geodatabase.IDataset pDataset = (IDataset)pFeatClass;

            pWorkspace = pDataset.Workspace;

            IWorkspaceEdit pWorkspaceEdit = (IWorkspaceEdit)pWorkspace;

            if (!pWorkspaceEdit.IsBeingEdited())
            {
                pWorkspaceEdit.StartEditing(false);
                pWorkspaceEdit.StartEditOperation();
            }


            IFeature pLocalFeature = default(IFeature);

            pLocalFeature = pFeatClass.CreateFeature();
            pLocalFeature.Shape = pGeometryOfFeature;


            try
            {

                pLocalFeature.Store();
                iReturnFeatureOID = pLocalFeature.OID;

                if (pWorkspaceEdit.IsBeingEdited())
                {
                    pWorkspaceEdit.StopEditing(true);
                    pWorkspaceEdit.StopEditOperation();
                }
            }
            catch (Exception ex)
            {
                strMessage = ex.Message;
            }
вот этот кусок
pGeometryOfFeature - это геометрия фигурки, делал так

IPolygon pPoly2BInsertedIntoSDE = new PolygonClass();

pPoly2BInsertedIntoSDE = (IPolygon)pObtainedCollection; //pObtainedCollection - это pointcollection

IGeometry pGeometryOfFeature = (IGeometry)pPoly2BInsertedIntoSDE;


проверил содержание длины и площади до сохранения, еще не нулевые

а слой содержит только 4 поля, все стандартные: objectid, shape, shape.area, shape.len.  objectid и shape заполняются
0 голосов
ответил 16 Июнь, 10 от TDenis (42,620 баллов)
проверил содержание длины и площади до сохранения, еще не нулевые

Я правильно понимаю, что проверяли периметр и площадь объекта pPoly2BInsertedIntoSDE (ну или pGeometryOfFeature)?
objectid и shape заполняются

Не понял, т.е. поле Shape нормально заполняется, а shape.area, shape.len - нет?
0 голосов
ответил 16 Июнь, 10 от boom (1,760 баллов)
с площадью правильно поняли (например, dLength = pPoly2BInsertedIntoSDE.Length;)

да, т.е ид идет попорядку, как надо, в поле shape записывается "полигон", а поля area и len =0
0 голосов
ответил 16 Июнь, 10 от TDenis (42,620 баллов)
Если в этом сервисе не сохранять переданный полигон, а создавать новый (new PolygonClass()) с какими-нибудь левыми точками, такой полигон нормально сохранится?
0 голосов
ответил 16 Июнь, 10 от boom (1,760 баллов)
пока проверить не удается, вроде ничего не менял, а начала вылазить ошибка "The coordinates or measures are out of bounds" на этапе

pLocalFeature.Shape = pGeometryOfFeature;

 С ней разберусь и попробую создать полигон.
0 голосов
ответил 16 Июнь, 10 от boom (1,760 баллов)
попробовал, ситуация таже.

мне сейчас в голову пришло, а может эта проблема зависить от системы координат?

в http://forums.esri.com/Attachments/35827.txt , что собственно служило примером, написано так

private IGeometry SetSpatialRef4Point(IGeometry pGeomInParam, int iSpatialRefId)
{
SpatialReferenceEnvironment pSpatialRefEnv = new SpatialReferenceEnvironmentClass();
IGeographicCoordinateSystem2 pGeogCoordSys =
(IGeographicCoordinateSystem2)
pSpatialRefEnv.CreateGeographicCoordinateSystem(4269);

IGeometry pReturnGeometry = pGeomInParam;

pGeogCoordSys.SetFalseOriginAndUnits(-180, -90, 1000000);
pReturnGeometry.Project(pGeogCoordSys);

return pReturnGeometry;
}

здесь наверняка описана какаянибудь американская система или др. тогда если это все же изза СК, то какие цифры надо заменить.
у меня исп пулково 1945, вместо 4269 надо 4284 (может ошибаюсь), а где
pGeogCoordSys.SetFalseOriginAndUnits с этим я затрудняюсь

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