RUS  ENG 

Работа с пространственными данными в запросах

Страницы: 1
RSS
Работа с пространственными данными в запросах
 
В стандартный пример "Пример водопроводной сети" добавил новый слой "аварии". В слое аварии объектом символьного типа отметил на карте места аварий на участках водопровода.
Как мне кажется запрос
select a.sys, b.sys from [аварии] as a, [Пример водопроводной сети] as b
where
Geometry::STIntersects(a.Geometry.STBuffer(2), b.Geometry)
and b.type = 8
order by a.sys

должен найти участки водопровода в радиусе 2 метров от отмеченного места аварии. Однако запрос ничего не возвращает, хотя запрос вроде верный.
В функции STBuffer(<Расстояние>)- <Расстояние> в каких единицах? Или я с запросом косячу?
 
Переписал запрос так:
select b.sys, a.sys, b.Geometry.STDistance(a.Geometry) from [Пример водопроводной сети] as a, [аварии] as b
where
a.Geometry.STIntersects(
Geometry::STGeomFromText('POLYGON(('+(b.Geometry.STX()-2)+' '+(b.Geometry.STY()-2)+
','+(b.Geometry.STX()+2)+' '+(b.Geometry.STY()-2)+
','+(b.Geometry.STX()+2)+' '+(b.Geometry.STY()-2)+
','+(b.Geometry.STX()-2)+' '+(b.Geometry.STY()+2)+'))',0)
)

Внезапно оказалась что все аварии лежат рядом с одним участков водопровода.
sys sys1 F1
8 13 0.33874937
9 13 0.35036954
10 13 30.135205
11 13 29.585956
1 13 322.15565
2 13 104.13986
3 13 108.90157
4 13 200.95002
5 13 143.26196
6 13 102.65499
7 13 36.957611
12 13 192.23822
13 13 197.53386
14 13 220.58196
15 13 257.73575
16 13 293.43705
17 13 257.7498
18 13 296.38211
19 13 321.71733
20 13 340.72677
21 13 341.19614
22 13 318.29069
23 13 315.69391

Почему STIntersects выдает взаимодействие? Если от участка до аварии в некоторых случаях больше 300 метров?
 
Первый запрос тоже нормальный. Только размеры буферной зоны в сантиметрах, не 2, а 200. И скачайте обновление. Кое-что с запросами исправили.
 
Установил обновление. Теперь нормально:
sys sys1 F1
8 13 0.33874937
9 13 0.35036954
10 16 0.057727413
11 18 0.97953177
1 117 0.75189151
2 62 0.097587585
3 86 1.054043
4 74 0.5838411
5 125 0.43878018
6 31 0.107435
7 9 1.3499736
12 42 0.41547776
13 42 0.038554805
14 92 0.8479268
15 96 0.95430419
16 96 0.61483208
17 78 1.0647272
18 80 1.1228206
19 82 0.16624781
20 84 1.7977853
21 100 1.0026688
22 121 1.7996585
23 121 0.037507873

Размер буферной зоны в сантиметрах, а координаты многоугольника в метрах?
 
Да. Пока так.
 
Попробовал запрос на реальной схеме: мое терпение кончилось на 16 часах.
Загнал в схему PostGIS - посчитал за 2 минуты.((
 
Так и есть. Пока не оптимизировали. Руки дойдут только в следующей версии. Можно еще
where Geometry::STIntersects(a.Geometry.STBuffer(2), b.Geometry) заменить на

where b.Geometry.STDistance(a.Geometry)<2 т.к. с буферной зоной дольше. Но сильно ускорить не должно.
 
Данную задачу можно макросом сейчас решить:

Sub Find_Avaria()

Set Doc = ActiveDocument
Set Map = Doc.NativeDoc


Set A = Map.Layers.Item(Map.Layers.GetIndexByUserName("Пример тепловой сети"))
Set B = Map.Layers.Item(Map.Layers.GetIndexByUserName("symbols"))

Set Elems = B.EnumElements

Elems.MoveFirst

Set Out = OpenOutputChannel ("Сообщения")

Out.Clear

do

if Elems.IsEOF then exit do

Set retPnt = CreateObject("zululib.ZPoint")
Set Geom = CreateObject("zululib.ZGeometry")

Set Pnts = Elems.GetPoints

ID = A.GetClosestElementByXY(Pnts.GetX(1), Pnts.GetY(1), 200, false, retPnt)

D = Geom.Distance(retPnt.X, retPnt.Y, Pnts.GetX(1), Pnts.GetY(1))

Out.Put CStr(Elems.ElemID) + " " + CStr(ID) + " " + CStr(D/100.) + CHR(10)

Elems.MoveNext

loop

End Sub
Страницы: 1