Opis
Komponent niewidoczny, który śledzi pozycję urządzenia i zgłasza wejście do strefy i wyjście z niej. Strefy to okręgi i wielokąty z histerezą i czasem przebywania; wczytujesz je z pliku JSON albo dodajesz w kodzie. Na Androidzie i iOS może używać natywnych regionów systemu.
Moduł: pakiet GeoFencing (osobny projekt) · Klasa bazowa: TComponent · Platformy: VCL + FMX (Windows, Android, iOS)

Demo na żywo
Strefy kołowe i wielokątne, symulacja trasy, histereza i zdarzenia OnEnterZone / OnExitZone na żywo.
Funkcje
- Strefy:
Zones.AddCircle(Name, Lat, Lon, Radius, Id)iZones.AddPolygon(Name, Points, Id)(klasy TGeoCircleZone, TGeoPolygonZone). - Histereza (
DefaultHysteresis,Hysteresisstrefy) i czas przebywania (DwellSeconds). - Dokładność:
DesiredAccuracy, odrzucanie słabych odczytówMaxAccuracy. - Dostawcy pozycji: Windows (WinRT, awaryjnie TLocationSensor), Android, iOS (CLLocationManager).
- Natywne regiony systemu (
UseNativeRegions,MaxNativeRegions,RegionRefreshDistance) i tryb w tle (BackgroundMode). - Okno zgody PL/EN przed startem śledzenia (
ShowConsentDialog,ConsentTitle,ConsentText). - Plik stref JSON (
ZoneFile,AutoLoad) i edytor stref w IDE (dwuklik na komponencie). - Alerty na mapie: symbol/znak, etykieta tekstowa albo własna ikona PNG/JPG – z rozmiarem czcionki, kolorem, pulsacją i kolorem pulsu (
AlertKind,AlertSymbol,AlertFontSize,AlertColor,AlertPulse,AlertPulseColor,AlertIconFile).
TGeoFencing to osobny pakiet (projekt GeoFencing) – instalujesz go niezależnie od komponentów map. Moduły z IDE dodają się do
uses automatycznie po upuszczeniu komponentu.Dostawcy Android/iOS/WinRT i edytor stref nie były jeszcze kompilowane w Delphi ani testowane na urządzeniach; logika stref przechodzi testy Free Pascala.
Właściwości
| Właściwość | Opis |
|---|---|
| Active | Włącza śledzenie. |
| ZoneFile, AutoLoad | Plik stref JSON i automatyczne wczytanie. |
| Interval | Odstęp odczytów pozycji w ms (domyślnie 5000). |
| ProviderName | Wymuszenie dostawcy pozycji. |
| DefaultHysteresis | Histereza w metrach dla stref bez własnej. |
| MaxAccuracy, DesiredAccuracy | Odrzucanie niedokładnych odczytów, żądana dokładność. |
| ReportInitialState | Zgłoś stan stref zaraz po starcie. |
| UseNativeRegions, MaxNativeRegions, RegionRefreshDistance | Regiony systemowe Android/iOS. |
| BackgroundMode | Praca w tle. |
| ShowConsentDialog, ConsentTitle, ConsentText | Okno zgody użytkownika. |
| Zones | Lista stref TGeoZoneList (Id, Name, Enabled, Tag, Hysteresis, DwellSeconds, Radius, Points, AlertKind/Symbol/FontSize/Color/Pulse/PulseColor/IconFile). |
Zdarzenia
| Zdarzenie | Opis |
|---|---|
| OnEnterZone, OnExitZone | (Sender; Zone: TGeoZone; const Lat, Lon: Double; const Timestamp: TDateTime) |
| OnPositionChanged | Nowa pozycja (TGeoPosition). |
| OnZonesLoaded | Wczytano strefy (liczba, ostrzeżenia). |
| OnConsentResult | Decyzja użytkownika w oknie zgody. |
| OnError | Błąd dostawcy lub pliku. |
Metody
| Metoda | Opis |
|---|---|
| CheckPosition | Sprawdź pozycję teraz (np. punkt testowy). |
| LoadZones, SaveZones | Plik ZoneFile. |
| LoadFromFile, SaveToFile, LoadFromJSON, SaveToJSON | Strefy z/do pliku lub tekstu JSON. |
| InsideZones | Strefy zawierające punkt. |
| ResetStates | Wyzerowanie stanów wejścia/wyjścia. |
| RequestPermissions | Prośba o uprawnienia lokalizacji. |
Przykłady
Strefy i zdarzenia
procedure TForm1.FormCreate(Sender: TObject);
begin
GeoFencing1.Zones.AddCircle('Magazyn', 52.2297, 21.0122, 300, 'depot-1');
GeoFencing1.Zones.AddPolygon('Plac budowy',
[GeoPoint(52.2405, 20.9980), GeoPoint(52.2412, 21.0045),
GeoPoint(52.2370, 21.0060), GeoPoint(52.2362, 20.9992)], 'site-1');
GeoFencing1.DefaultHysteresis := 25; // metry – brak „migotania” na granicy
GeoFencing1.Interval := 5000;
GeoFencing1.Active := True; // najpierw okno zgody (ShowConsentDialog)
end;
procedure TForm1.GeoFencing1EnterZone(Sender: TObject; Zone: TGeoZone;
const Lat, Lon: Double; const Timestamp: TDateTime);
begin
Memo1.Lines.Add(FormatDateTime('hh:nn:ss', Timestamp) + ' wejście: ' + Zone.Name);
end;
procedure TForm1.GeoFencing1ExitZone(Sender: TObject; Zone: TGeoZone;
const Lat, Lon: Double; const Timestamp: TDateTime);
begin
Memo1.Lines.Add(FormatDateTime('hh:nn:ss', Timestamp) + ' wyjście: ' + Zone.Name);
end;Plik stref (JSON)
{
"format": "…", "version": 1,
"zones": [
{ "type": "circle", "id": "depot-1", "name": "Magazyn", "enabled": true,
"center": { "lat": 52.2297, "lon": 21.0122 }, "radius": 300,
"hysteresis": 25, "dwell": 30 },
{ "type": "polygon", "id": "site-1", "name": "Plac budowy",
"points": [ { "lat": 52.2405, "lon": 20.9980 }, { "lat": 52.2412, "lon": 21.0045 },
{ "lat": 52.2370, "lon": 21.0060 }, { "lat": 52.2362, "lon": 20.9992 } ],
"hysteresis": 20, "dwell": 0 }
]
}