• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

100 Zonen abfragen - auch mit Garmin kein Problem

bodenseepingu

Geomaster
Hallo,

im Rahmen einer WIG-Idee, die inzwischen auch veröffentlicht wurde kam das Problem auf, daß ich den Abstand des Players zu bis zu 100 Punkten (Zonen) überprüfen wollte und entsprechend reagieren wollte, wenn eine Mindestdistanz unterschritten ist.

Der WIG nennt sich Geo-Memory und ist unter http://coord.info/GC2MMGB veröffentlicht.

Über direkten LUA Einsatz gibt es offensichtlich auch unter GARMIN überhaupt kein Problem - das Stichwort heißt LUA-Tables.

Folgende Codefragmente habe ich verwendet

Code:
objSpielkartenlocationstbl = {}  --table für die Locations der memory-Karten

function objKartepruefen:OnTick() --timer tick
     
       local dist = Wherigo.Distance(0, 'm') 
       for i = 1, anzahlKarten, 1 do
         local d, b = Wherigo.VectorToPoint(objSpielkartenlocationstbl[i],       Player.ObjectLocation)
         local dn = d:GetValue 'm' --wichtig, das so zu machen, sonst Absturz auf WhereYouGo
        
         if dn <= objDistanzzuKarte then           
             ...tue irgendwas
         end
      end
end 

--hier werden die Positionsdaten initialisiert - in einem Quadrat...
function SetzeKartenLocations(refPt,d,b, AnzahlPaare) --d= distanz, b= bearing...
  local width = math.sqrt(2 * AnzahlPaare)
    local field_width = d / width / 2
    objDistanzzuKarte = field_width
  for i = 0.5, width, 1 do
     for j = 0.5, width, 1 do
        local winkel = math.deg(math.atan(j  / i ))
        local entfernung = j  / math.sin(math.rad(winkel)) * d / width
        local dist = Wherigo.Distance(entfernung, 'm') 
        local ZP = Wherigo.TranslatePoint(objSpielbrett.OriginalPoint, dist, (b - winkel) % 360)
       
        table.insert(objSpielkartenlocationstbl, ZP)
     end
  end   
end


Übrigens, die Abfrage der Table-Größe führte bei WhereYouGo zu einem Absturz, deshalb habe ich das Konstrukt vermieden...
 

TeamBunteBlitze

Geocacher
Hallo Bodenseepingu,

wow, da haste ja was gezaubert. :gott:

Es wäre nett, wenn du mal zeigen könntest, wie man in Urwigo derartigen Code einbindet.

VG

Sven
 
OP
B

bodenseepingu

Geomaster
Hallo,

Code:
function objKartepruefen:OnTick()

ist bereits eingebunden. Der Timer heißt in Urwigo "Karte pruefen", Urwigo entfernt Leerzeichen und fügt ein obj davor. Die :OnTick() Funktion ist genau das, was Urwigo aufruft, wenn der Timer abläuft.

D.h. in diesem Fall kann man den Timer getrost von Urwigo aus starten und stoppen wie man mag. Aber die Timer-Routine wird im User-Code aufgerufen.

Andere Funktionen kann man einfach über Urwigo-User-Code einbinden wo man
mag und die benötigten Funktionen dort aufrufen.

Bei der Verwendung von Urwigo-Variablen gilt dasselbe wie Funktionen - der Urwigo-Name ohne Leerzeichen mit einem obj davor ist die Variable.

Hier mal ein Test-Code, bei dem Orte in Urwigo angelegt werden, deren Erreichen dann per Timer überprüft wird. Die Orte können ein- und ausgeschaltet werden, sichtbar und unsichtbar sein, der Radius ab dem die Orte als besucht gelten kann eingestellt werden und es werden die 3 nächstgelegenen (natürlich nur sichtbaren und aktiven) Orte als Zonen angezeigt...
 

Anhänge

  • locations.urwigo.zip
    36,6 KB · Aufrufe: 88
OP
B

bodenseepingu

Geomaster
Ergänzung: Obfuscating muss im urwigo ausgeschaltet werden...sonst funktioniert der Zugriff auf Urwigo-Variablen nicht....
 
Ich habe mir das Beispiel angesehen und wollte es so abändern, dass on proximity funktioniert.
Leider erfolglos! Meine LUA Kenntnisse reichen nicht aus.

Kann mir hier jemand Hilfestellung geben?
Danke

bodenseepingu schrieb:
Hallo,

Code:
function objKartepruefen:OnTick()

ist bereits eingebunden. Der Timer heißt in Urwigo "Karte pruefen", Urwigo entfernt Leerzeichen und fügt ein obj davor. Die :OnTick() Funktion ist genau das, was Urwigo aufruft, wenn der Timer abläuft.

D.h. in diesem Fall kann man den Timer getrost von Urwigo aus starten und stoppen wie man mag. Aber die Timer-Routine wird im User-Code aufgerufen.

Andere Funktionen kann man einfach über Urwigo-User-Code einbinden wo man
mag und die benötigten Funktionen dort aufrufen.

Bei der Verwendung von Urwigo-Variablen gilt dasselbe wie Funktionen - der Urwigo-Name ohne Leerzeichen mit einem obj davor ist die Variable.

Hier mal ein Test-Code, bei dem Orte in Urwigo angelegt werden, deren Erreichen dann per Timer überprüft wird. Die Orte können ein- und ausgeschaltet werden, sichtbar und unsichtbar sein, der Radius ab dem die Orte als besucht gelten kann eingestellt werden und es werden die 3 nächstgelegenen (natürlich nur sichtbaren und aktiven) Orte als Zonen angezeigt...
 
OP
B

bodenseepingu

Geomaster
Was genau willst du - habe ich jetzt nicht verstanden ?

Wenn du beschreibst, was für eine Funktion bzw. was für Funktionen du brauchst, dann kann ich da schon helfen - hab sowieso grad was in der Mache für nen anderen WIG.

Das Beispiel ist ja eine einfache Ersatz-Funktion anstatt Zonen - diese Versuche habe ich relativ frühzeitig gemacht um zu testen, ob sowas wie das Geo-Memory überhaupt realisiert werden kann in dem ich bis zu 36 Positionen (6x6) jede Sekunde überprüfen muss.

Im obigen Beispiel bestimme ich ja nur, welche Positionen aus einer Menge von 100 Stück die 3 nächstgelegenen sind - dorthin schiebe ich dann entsprechend 3 Zonen - was das mit Ändern auf Proximity zu tun hat, weiß ich nicht - das ist ja bereits eine On-Proximity-Routine in LUA.

Grundsätzlich brauche ich für solche Dinge genau 2 LUA-Routinen

- eine Initialisierungsroutine (können natürlich auch andere Funktionen sein wie add_location(nordpos, ostpos)
- eine Routine, die zyklisch mit einem Timer aufgerufen wird (z.b. calc_positions)

und je nach Anwendungsfall kann man noch zusätzliche Hilfsroutinen bauen..

Also sag was du möchtest und ich kann das Beispiel bei Gelegenheit gerne auch so ändern, dass du damit genau das machen kannst was du willst.
 
Sorry, hatte mich zu ungenau ausgedrückt.

Dein Beispielcartridge locations habe ich versucht so umzuschreiben, dass die Zonen nicht bei on enter betreten werden sondern on proxy.
Dass hatte ich aber nicht hinbekommen.

Eigentlich ist die Lösung von dir genau dass was ich suche,
die nächstgelegenen Zonen um den Spieler werden aktiviert, weiter entfernte deaktiviert.
Einzig dass die Zonen nicht per Annäherung sondern mit on enter betreten werden.
 
OP
B

bodenseepingu

Geomaster
das hat aber mit LUA gar nix zu tun - in LUA gibt's kein On Proximity. Du kannst ganz einfach in Urwigo dann auf On Proximity reagieren - in LUA bleibt alles wie gehabt.

Ich hab jetzt nicht in die Cartridge geschaut, die Zonen sind doch in Urwigo definiert oder?

Für den praktischen Einsatz würde ich aber schon das ein- oder andere noch anpassen, damit es besser benutzbar wird - insbesonders auch als separates LUA-File auslagern für Urwigo ab V1.13
 
Nein die Zonen hast du beim Start über eine Funktion in eine Tabelle geladen.

function Add_Location(lat, long, distanz, active,visible, name, description)
local ZP = ZonePoint(lat,long,0)
table.insert(var_locationstbl,ZP)
table.insert(var_pointstbl,GetZonePoints(ZP,distanz))
table.insert(var_besuchttbl,false)
table.insert(var_activetbl,active)
table.insert(var_visibletbl,visible)
table.insert(var_distanztbl,distanz)
table.insert(var_nametbl,name)
table.insert(var_descriptiontbl, description)
var_locations = var_locations + 1
end


Wenn ich natürlich Zonen normal defineren könnte und dann diese in die Tabelle einfügen könnte würde mich dass einen Schritt weiter bringen.
 
Oder anders rum,

wie schalte ich mit LUA vordefinerte Zonen an und ab.
Wobei ich die an mir nächstgelegen 5 Zonen anschalten(aktiv und sichtbar) will und die anderen ausschalte (inaktiv und unsichtbar).
 
OP
B

bodenseepingu

Geomaster
nein, das sind nicht die Zonen,

das sind die PUnkte, die ich abfrage - die 3 nächstgelegenen Zonen werden
dann auf die nächstgelegenen PUnkte gesetzt - es gibt doch 3 Urwigo Zonen oder?
 
Nein dur rufst beim Starten folgende Funktion auf:

Add_Location(47.7626569236348, 9.2907476568222, 25, true,false, "Mimmenhausen", "Hier wohnt der ")

Hier wird dem Cartridge der Mittelpunkt der Zone übergeben.

Dann bildest du dir aus dem Mittelpunkt mit der Funktion
function GetZonePoints(refPt, radi)
local dist = Wherigo.Distance(radi, 'm')
local pts = {
Wherigo.TranslatePoint(refPt, dist, 0),
Wherigo.TranslatePoint(refPt, dist, 120),
Wherigo.TranslatePoint(refPt, dist, 240),
}
return pts
end

die Eckpunkte der Zone

In Urwigo definierts du selbst keine Zone sonder hohlst dir die Daten beim Start mittels Add_Location herein
 
OP
B

bodenseepingu

Geomaster
ok, ich schau es mir bei Gelegenheit an, dann ändere ich es so, dass es über
Urwigo einfacher genutzt werden kann...

ich dachte ich hätte 3 zonen - nächster Ort, zweitnächster Ort, drittnächster Ort...

kanns grad im Moment nicht anschauen. Der Code ist nur zum Verschieben der Zone, würde mich wundern, wenn ich über LUA ne Zone anlege.
 
Ja hast du, dachte dass wären nur Platzhalter die mit den richtigen Daten gefüllt werden.

var_naechste_zone = Wherigo.Zone(objlocations)
var_naechste_zone.Id = "abcf602e-d375-43da-a27c-21e7e1f99719"
var_naechste_zone.Name = "naechster "
var_naechste_zone.Description = "hier liegt der naechste Ort"
var_naechste_zone.Visible = true
var_naechste_zone.Commands = {}
var_naechste_zone.DistanceRange = Distance(-1, "feet")
var_naechste_zone.ShowObjects = "OnProximity"
var_naechste_zone.ProximityRange = Distance(60, "meters")
var_naechste_zone.AllowSetPositionTo = false
var_naechste_zone.Active = false
var_naechste_zone.Points = {}
var_naechste_zone.OriginalPoint = ZonePoint(47.4622140549551, 9.79170562267303, 0)
var_naechste_zone.DistanceRangeUOM = "Feet"
var_naechste_zone.ProximityRangeUOM = "Meters"
var_naechste_zone.OutOfRangeName = ""
var_naechste_zone.InRangeName = ""

Dachte schon dass ich den Code einigermaßen verstehe, jetzt muss ich mich aber ganz neu reindenken....
 
Dachte dass das Konstrukt mit den drei dem spieler nächstgelegenen Zonen "gefüttert" wird.

Die Zonen selbst aber werden über eine Funktion importiert.

In Urwigo selbst wird keine Zone angelegt und ist auch nicht als Zone in der linken Übersicht sichtbar.
 
OP
B

bodenseepingu

Geomaster
Anhang anzeigen locations2.zip....das sollte jetzt wesentlich einfacher sein....

Reagiert werden kann auf proximity oder auf on enter etc. siehe Code...

Wenn du sehr kleine Zonen willst kannst ihnen ne sehr kleine Ausdehnung - theoretisch müsste auch 0 gehen verpassen und nur mit onProximity arbeiten...
 
Oben