соединения и связи

0 голосов
спросил 15 Март, 10 от Corvell (1,900 баллов) в категории Программные продукты Esri
Здравствуйте!
возник такой вопрос: есть слой, у него есть несколько атрибутов, например ID, ..., Shape, Shape.Area, Shape.Len. мне нужно добавить в список атрибутов еще несколько, добавляю в ArcMap'e через "соединения и связи", добавляю соединение, ставлю галочку на сохранение всех записей. те атрибуты, что добавляю, добавляются, но при этом Shape.Area, Shape.Len исчезают. с чем это может быть связано? эти атрибуты мне в дальнейшем будут нужны.

еще, не могу разобраться на будущее, как использовать добавленные связи? т.е. добавил связь на такую-то таблицу, а как в коде к ней обращаться, т.е. к ее полям?

и еще, можно ли вычислить программно площадь или периметр выделенного объекта? существуют ли спец методы для этого?

Использую Siverlight, Web

10 Ответы

0 голосов
ответил 15 Март, 10 от TDenis (42,620 баллов)
Про связи не знаю, у меня они тоже на сервере некорректно работали. Правда чуть в другом контексте. В итоге пришлось отказаться.
А что вы с чем объединяете? Слой объектов с таблицей?

Насчёт вычисления периметров и площадей. На сервере можно поднять geometry service и считать с помощью geometry task:
http://resources.esri.com/help/9.3/arcgisserver/apis/silverlight/help/Geometry_task.htm
Правда будет небольшой лаг.
Наглядные примеры есть вот здесь, в разделе Utilities:
http://resources.esri.com/help/9.3/arcgisserver/apis/silverlight/samples/start.htm
Если решите, что лаг - это не спортивно, то можно сделать локальную функцию у клиента, которая и будет считать площади и протяженности. Как это примерно будет выглядеть, можно посмотреть вот тут (кнопки измерения расстояний и площадей):
http://resources.esri.com/arcgisserver/apis/silverlight/index.cfm?fa=codeGalleryDetails&scriptID=16504
0 голосов
ответил 15 Март, 10 от Corvell (1,900 баллов)
объединяю слой объектов с таблицей
0 голосов
ответил 15 Март, 10 от TDenis (42,620 баллов)
Мда, эти поля, похоже, пропадают уже и в ArcGIS Desktop, ещё даже до публикации на сервере.

-------------
А, пардон, вы ведь так и написали, что-то я невнимательно читаю.
В общем, у меня ровно тоже самое творится. Странно всё это.
0 голосов
ответил 15 Март, 10 от Corvell (1,900 баллов)
интересно, в чем может быть причина этой пропажи
0 голосов
ответил 15 Март, 10 от Corvell (1,900 баллов)
попробовал сделать вычисление площади так, как написано сдесь http://resources.esri.com/help/9.3/arcgisserver/apis/silverlight/help/Geometry_task.htm

.......
GraphicsLayer graphicsLayer = Map.Layers["ResultsGraphicsLayer"] as GraphicsLayer;
graphicsLayer.ClearGraphics();
Graphic selectedFeature = _lastIdentifyResult[index].Feature;
selectedFeature.Symbol = SelectedFeatureSymbol;

graphicsLayer.Graphics.Add(selectedFeature);   // здесь выделился нужный объект.
далее делаю так (нужно найти площадь этого выделенного объекта)

GeometryService geometryService = new GeometryService("...../Geometry/GeometryServer");
geometryService.AreasAndLengthsCompleted += GeometryService_AreasAndLengthsCompleted;
geometryService.Failed += GeometryService_Failed;

List<Graphic> graphicList = new List<Graphic>();
graphicList.Add(selectedFeature);

geometryService.AreasAndLengthsAsync(graphicList);

в последней строчке вылазит такая ошибка:
{System.NullReferenceException: Object reference not set to an instance of an object.
   at ESRI.ArcGIS.Client.Tasks.GeometryService.GetAreasAndLengthsParameters(IList`1 graphics)
   at ESRI.ArcGIS.Client.Tasks.GeometryService.AreasAndLengthsAsync(IList`1 graphics, Object userToken)
   at ESRI.ArcGIS.Client.Tasks.GeometryService.AreasAndLengthsAsync(IList`1 graphics)
   at smap.MainPage.IdentifyTask_ExecuteCompleted(Object sender, IdentifyEventArgs args)}

я не могу понять, откуда берется это исключение на null, что делается не так
0 голосов
ответил 15 Март, 10 от TDenis (42,620 баллов)
Да, было что-то такое. Прям сейчас у меня нет возможности проверить, но вроде бы там проблема либо в том, что SpatialReference для графического объекта не задан, либо что сериализовать хитрый символ не получается.
Могу ошибаться, надо проверять.

Напишите потом, получилось ли.
0 голосов
ответил 16 Март, 10 от Corvell (1,900 баллов)
ну что ж, буду пробовать 
0 голосов
ответил 16 Март, 10 от Corvell (1,900 баллов)
Все оказалось достаточно просто. Не хватало всего лишь строчки
selectedFeature.Geometry.SpatialReference = new SpatialReference();
добавил и все получилось
0 голосов
ответил 16 Март, 10 от TDenis (42,620 баллов)
Не забудьте ещё, что GeometryService может вернуть отрицательную площадь, если обход полигона не в ту сторону. Обычно это смущает пользователей)
0 голосов
ответил 16 Март, 10 от Corvell (1,900 баллов)
спасибо, учту)
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...