Здравствуйте, попробовал реализовать поиск, пересекаемых маршрутом, линейных объектов.
[CODE]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;
[/CODE]Алгоритм работает, НО!
За маршрут взял "непротяженную" 15 км дорогу, объектов интереса - около 10
объекты интереса - мосты. Отрабатывает менее секунды.
объекты интереса - реки. Отрабатывает почти секунду.
За маршрут взял "протяженную" 400 км дорогу, объектов интереса - около 20
объекты интереса - мосты. Отрабатывает почти секунду.
объекты интереса - реки. [B]Отрабатывает 50 секунд[/B][B].
[/B] объекты интереса - горизонтали (10 штук) 75 секунд.
т.е. получается поиск пересечения очень сильно зависит от длины объектов!
Причем меня-то интересовал пока только факт пересечения (т.е. номера объектов).
Подскажите, может где ошибка или существуют другие пути для решения этой задачи.
[CODE]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;
[/CODE]Алгоритм работает, НО!
За маршрут взял "непротяженную" 15 км дорогу, объектов интереса - около 10
объекты интереса - мосты. Отрабатывает менее секунды.
объекты интереса - реки. Отрабатывает почти секунду.
За маршрут взял "протяженную" 400 км дорогу, объектов интереса - около 20
объекты интереса - мосты. Отрабатывает почти секунду.
объекты интереса - реки. [B]Отрабатывает 50 секунд[/B][B].
[/B] объекты интереса - горизонтали (10 штук) 75 секунд.
т.е. получается поиск пересечения очень сильно зависит от длины объектов!
Причем меня-то интересовал пока только факт пересечения (т.е. номера объектов).
Подскажите, может где ошибка или существуют другие пути для решения этой задачи.