Здравствуйте, попробовал реализовать поиск, пересекаемых маршрутом, линейных объектов.
Алгоритм работает, НО!
За маршрут взял "непротяженную" 15 км дорогу, объектов интереса - около 10
объекты интереса - мосты. Отрабатывает менее секунды.
объекты интереса - реки. Отрабатывает почти секунду.
За маршрут взял "протяженную" 400 км дорогу, объектов интереса - около 20
объекты интереса - мосты. Отрабатывает почти секунду.
объекты интереса - реки. Отрабатывает 50 секунд.
объекты интереса - горизонтали (10 штук) 75 секунд.
т.е. получается поиск пересечения очень сильно зависит от длины объектов!
Причем меня-то интересовал пока только факт пересечения (т.е. номера объектов).
Подскажите, может где ошибка или существуют другие пути для решения этой задачи.
Код |
---|
procedure AppendExCodeToSelect(MapHandle: HMap; sel: HSelect; exCode: Integer; aLocals: TLOCALS = []); var l: TLOCAL; ii: Integer; iIncode : Integer; _rsc: HRsc; begin _rsc := mapgetRscIdent(MapHandle, 0); if aLocals = [] then aLocals := [L_LINE, L_SQUARE, L_MARK, L_TEXT, L_VECTOR, L_PATTERN]; for l in aLocals do for ii := 1 to mapGetRscObjectsCount(_rsc, exCode, ord(l)) do begin iIncode := mapGetRscObjectCodeByNumber(_rsc, exCode, ord(l), ii); mapSelectObject(sel, iIncode, 1); end; end; function FindCrossLineObjects(CurrMapObject: TMapObj): String; var HS : HSelect; Finding: TMapObj; ZoneR: integer; exCode: integer; ZoneObj : HObj; begin Result := ''; exCode := 31410000; ZoneR:= 1; ZoneObj := mapCreateCopyObject(MapScreen.MapHandle, CurrMapObject.ObjHandle); Finding:= TMapObj.Create(nil); HS := mapCreateMapSelectContext(MapScreen.MapHandle); try Finding.MapView := MapScreen; Finding.PlaceOut := PP_PLANE; // Построить зону if mapZoneObjectEx(ZoneR, ZoneObj, 0, 1, ZoneR/10, 3, 3) > 0 then begin //найти объекты в зоне // чистим все условия mapClearSelectContext(HS); // отменяем доступ ко всем mapSelectObject(HS, -1, 0); //добавим к селекту коды AppendExCodeToSelect(MapScreen.MapHandle, HS, exCode); //добавим к селекту область поиска mapSelectSeekArea(HS, ZoneObj, 0, 1); //запускаем поиск по условиям селекта if mapSeekSelectObject(MapScreen.MapHandle, Finding.ObjHandle, HS, cWO_FIRST) <> 0 then begin //обработка найденного //... //ищем дальше while mapSeekSelectObject(MapScreen.MapHandle, Finding.ObjHandle, HS, cWO_NEXT) <> 0 do begin //обработка найденного //... end; end; end; Result := '...' finally if ZoneObj <> 0 then mapFreeObject(ZoneObj); Finding.Free; mapDeleteSelectContext(HS); end; end; |
За маршрут взял "непротяженную" 15 км дорогу, объектов интереса - около 10
объекты интереса - мосты. Отрабатывает менее секунды.
объекты интереса - реки. Отрабатывает почти секунду.
За маршрут взял "протяженную" 400 км дорогу, объектов интереса - около 20
объекты интереса - мосты. Отрабатывает почти секунду.
объекты интереса - реки. Отрабатывает 50 секунд.
объекты интереса - горизонтали (10 штук) 75 секунд.
т.е. получается поиск пересечения очень сильно зависит от длины объектов!
Причем меня-то интересовал пока только факт пересечения (т.е. номера объектов).
Подскажите, может где ошибка или существуют другие пути для решения этой задачи.