RUS  ENG 

ElemIDByXY

Страницы: 1
RSS
ElemIDByXY
 
ElemIDByXY находит id элемента находящегося точно в точке x,y или в некоторой ее окресности? и как эта окресность зависит от маштаба карты?
 
ElemIDByXY определяет объект аналогично клику мышки на карте, т.е площадные объекты по попаданию точки в контур, а линии и символы в окрестности пяти пикселов экрана (соответственно при разных масштабах результат может быть разный). Для точного определения объектов по точке этот метод не совсем подходит. Лучше сами создайте окрестность точки, получите список объектов http://politerm.com.ru/zulu5doc/zuluax/Layer_IntersectByContour.htm и из них выбирайте.
 
GetClosestElementByXY вроде делает тоже самое. R=1. Только вот в каких еденицах указывается радиус? В пикселях или сантиметрах?
 
GetClosestElementByXY делает не совсем то же самое. Этот метод дает одного ближайшего, а IntersectByContour дает список, удовлетворивших условию.
R - радиус в тех же единицах, что и X Y (в единицах на местности)
 
Доброго времени суток!
Есть два слоя, на одном расположены типовые объекты "Потребители", а на другом примитивы "Дома".
Задача: в базе данных потребителей проставить ID дома поверх которого он нарисован.
Решение: найти объект дом в контур которого попадают координаты объекта потребитель
Вариант1. Метод слоя IntersectByLayer. Работает быстро, но есть момент, координаты потребителя, могут немного не поподать в контур дома (дрогнула рука художника :)), таким образом некоторое количество потребителей осталось без домов;
Вариант2. Метод слоя GetClosestElementByXY. Отработал на 5, но долго, отсюда и возникла идея попробовать вариант3;
Вариант3. Метод слоя IntersectByContour. Идея: беру координаты потребителя (x,y), строю квадратный контур(x-2,y-2; x+2,y-2; x+2,y+2; x-2,y+2), при помощи метода нахожу ключи всех объектов удовлетворяющих критерию пересечения eFullyOrPartialInside.
Отработал быстро, но
1.Находит далеко не все дома (значительно меньше чем вариант1);
2.При многократном запуске количество найденых домов различное.
Подскажите, что я делаю не так, очень хочется разобраться с данным методом?
 
Нужен пример, который бы работал неправильно. Без конкретных данных и конкретного кода турдно сказать. Возможно контур 2x2 сантиметра это маловато для захвата дома. Если рука художника дрогнула, то не 2 сантиметра на местности.
Если IntersectByContour дает меньше ответов чем IntersectByLayer - это подозрительно. Желательно прислать один потребитель и один дом, который бы в первом случае давал ответ, а в третьем нет. Тогда мы поанализируем.
Да, и какой номер сборки программы (Справка\О программе)
 
Версия Zulu 6.0.0.3384
Код (VB.NET)
Private Function FindPairObjectBuildingV3(ByVal ZLayer As Layer) As ObjectBuildingsList
'//ZLayer - слой содержащий объекты "Потребитель"
Dim iD As Integer = 2
Dim zpSys As ZPoint = Nothing
Dim ekSys As ElementKeys
Dim ekBuilding As ElementKeys
Dim c As New ZuluLib.Contour
Dim x(3) As Double
Dim y(3) As Double
Dim obl As New ObjectBuildingsList ' //Структура содержащая пару Потребитель - Дом
Try
ekSys = ZLayer.SelectByType(3, 0)
For i = 1 To ekSys.Count
zpSys = ZLayer.Elements(ekSys(i)).GetCenter
'//Строим контур
x(0) = zpSys.X - iD : y(0) = zpSys.Y - iD
x(1) = zpSys.X + iD : y(1) = zpSys.Y - iD
x(2) = zpSys.X + iD : y(2) = zpSys.Y + iD
x(3) = zpSys.X - iD : y(3) = zpSys.Y + iD
c.Fill(4, x(0), y(0))
'//Находим дом пересекающийся с этим контуром
'//ZuluMap.BuildingLayer - слой с домами
ekBuilding = ZuluMap.BuildingLayer.IntersectByContour(c, eCrossCriteria.eFullyOrPartialInside, 0)
If ekBuilding IsNot Nothing AndAlso ekBuilding.Count > 0 Then _
obl.Add(ekSys(i), ekBuilding(1))
Next
Catch ex As Exception
MSGErr(ex)
End Try
Return obl
End Function
Кусочек слоя подготовлю, подскажите, на какой e-mail его удобнее послать?
 
[email protected]
 
Интересно чем все закончилось =)
Страницы: 1