Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: bikerboy am 13.04.10 - 12:17:12

Titel: Umkreissuche mit Koordinaten
Beitrag von: bikerboy am 13.04.10 - 12:17:12
Hallo,

ich arbeite gerade eine kleine GeoIntegration für unser CRM-System aus. Nun kann ich schon Adressen selektieren und mir mit der freundlichen Unterstützung von OpenStreetMap angucken.

Ich habe hier schon mal im Forum gesucht und gefunden, aber ich leider sind die meisten Downloadlinks mittlerweile hinfällig. Ulrich hat zum Beispiel seine Homepage aktualisiert und die Links auf seine Seite laufen bei mir ins Leere.

Nun zum Versuchsaufbau.

Ich habe in meinem CRM-System die Koordinaten zu jeder erfassten Addresse. Diese sind in Longitude und Latitude angegeben. Die Entfernung zwischen 2 Punkten konnte ich nach einigen Kramen in meinen Kopf wieder nachvollziehen (Zumindest meine ich dass es so geht). Die Tatsache, dass Luftlinie nicht direkt Strassenentfernung ist mal abgesehen.

Nun versuche Ich hier schon ne Weile eine SQL-Abfrage in eine @Formula zu pressen, was mir aber nicht wirklich gelingt.

Hier einmal die SQL- Abfrage.

Code
SELECT 
    zc_zip, 
    zc_location_name,
    ACOS(
         SIN(RADIANS(zc_lat)) * SIN(RADIANS(49.1)) 
         + COS(RADIANS(zc_lat)) * COS(RADIANS(49.1)) * COS(RADIANS(zc_lon)
         - RADIANS(10.75))
         ) * 6380 AS distance
FROM zip_coordinates
WHERE ACOS(
         SIN(RADIANS(zc_lat)) * SIN(RADIANS(49.1))
         + COS(RADIANS(zc_lat)) * COS(RADIANS(49.1)) * COS(RADIANS(zc_lon)
         - RADIANS(10.75))
         ) * 6380 < 10
Code
  AND zc_id <> 9024
ORDER BY distance;

Den Interessanten Teil habe ich mal hevor gehoben.

Nun zu meinem transferierten Code.

Code
Dim strQuery As String
				Dim collSearch As NotesDocumentCollection
				
				'strQuery = {@ACos( @Sin(} + FLDLATI + {/(180/@Pi)) * @Sin((} + strLati + {/ (180/@Pi)))+ @Cos(} +FLDLATI + {/(180/@Pi)) * @Cos(} + strLati + {/(180/@Pi)) * @Cos( (} + FLDLONG +  {/ (180/@Pi)) - (} + strLongi + {/ (180/@Pi))) * 6380 < 200)}
				strQuery = {@ACos( @Sin(} + FLDLATI + {*(180/@Pi)) * @Sin((} + strLati + {* (180/@Pi)))+ @Cos(} +FLDLATI + {*(180/@Pi)) * @Cos(} + strLati + {*(180/@Pi)) * @Cos( (} + FLDLONG +  {* (180/@Pi)) - (} + strLongi + {* (180/@Pi))) * 6380 < 200)}
				Set collSearch = Dbthis.Search(strQuery,Nothing,0)

Leider gibt es in den @Functions keine @Radian() oder dergleichen. Daher der diletantische Versuch RADIANS gegen
Code
/(180/@Pi)
oder
Code
*(180/@Pi)
zu ersetzen.

Naja wer hätte es gedacht die Formel findet in beiden Fällen keine Dokumente zurück. Daher die Frage. Könnt ihr aushelfen? Hat das schon jemand mal umgesetzt ?
Titel: Re: Umkreissuche mit Koordinaten
Beitrag von: Kadlec am 13.04.10 - 12:26:22
Kommt den bei Deinem "Diletantischem" Versuch ein richtiger Wert raus?
Den Du dann auch finden könntest?

Boris
Titel: Re: Umkreissuche mit Koordinaten
Beitrag von: pram am 13.04.10 - 12:50:52
Lass dir strQuery doch mal ausgeben und schreib es testweise (ohne den < 200 Vergleich) in ein berechnetes Feld und schau ob/was da überhaupt raus kommt.

Ich hab mal grob drüber gekuckt, die Formel sollte passen
http://www.koordinaten.de/informationen/formel.shtml
wobei die Umrechnung wohl falsch ist. Probier mal ... @Sin(Feldname / 180 * @pi)... (das sollte passen)

Gruß
Roland
Titel: Re: Umkreissuche mit Koordinaten
Beitrag von: bikerboy am 13.04.10 - 13:02:50
@Kadlec

Es ist ja eine Suche über eine DB werde mal zwei punkte gegeneinander rechnen lassen und dann gucken was die Formel ausgibt.

@Pram

Also wäre mein erster Query der momentan auskommentiert ist der richtige
Titel: Re: Umkreissuche mit Koordinaten
Beitrag von: pram am 13.04.10 - 13:16:11
Ja, zumindest funktionierts so bei uns.
Sind deine Felder auch echte Zahlenfelder?
Titel: Re: Umkreissuche mit Koordinaten
Beitrag von: bikerboy am 13.04.10 - 13:30:59
BAAAM *freu*

Code
strQuery = {@ACos( @Sin(@TextToNumber(} + FLDLATI + {)/(180*@Pi)) * @Sin((@textToNumber("} + strLati + {")/ (180*@Pi)))+ @Cos(@textToNumber(} +FLDLATI + {)/(180*@Pi)) * @Cos(@textToNumber("} + strLati + {")/(180*@Pi)) * @Cos((@textToNumber(} + FLDLONG +  {)/ (180*@Pi)) - (@textToNumber("} + strLongi + {")/ (180*@Pi)))) * 6380 <200}

Das führt zu einem Ergebnis, und da Computer keine Fehler machen sollte das wohl passen.
Titel: Re: Umkreissuche mit Koordinaten
Beitrag von: pram am 13.04.10 - 13:42:34
Achtung: 

@Sin(Feldname / 180 * @pi) ist NICHT @Sin(Feldname / (180 * @pi))
Titel: Re: Umkreissuche mit Koordinaten
Beitrag von: bikerboy am 13.04.10 - 14:25:53
Hmmm  ???

Bin auf Prams Vorschlag eingegangen. Habe leider bei der Auswertung festgestellt, dass die Suche doch nich sauber läuft.
Titel: Re: Umkreissuche mit Koordinaten
Beitrag von: bikerboy am 13.04.10 - 14:52:02
@Pram

Wenn ich deinen Vorschlag nachgehe kommt, aber nicht das Ergebnis von der http://www.koordinaten.de/informationen/formel.shtml (http://www.koordinaten.de/informationen/formel.shtml) nicht
Titel: Re: Umkreissuche mit Koordinaten
Beitrag von: bikerboy am 13.04.10 - 15:25:00
So bin der Sache mal nachgegangen. Gemerkt habe ich, dass die Koordinaten mit nem Punkt (".") getrennt ist. Die Formel erkennt diese dann aber als tausender Zahl. Also habe ich die Formel darauf angepasst.

Syntaktisch korrekt, aber irgendwo ist noch nen Knoten drin.

Code
strQuery = {!@IsAvailable(accGoogleAlert)& @LowerCase(Form) = "address" 
							& (
									@ACos(
											@Sin(@TextToNumber(@ReplaceSubString(} + FLDLATI + {;".";","))/(180*@Pi)) 
											* @Sin(@TextToNumber((@ReplaceSubString("} + strLati + {";".";","))/ (180*@Pi)))
											+ @Cos(@TextToNumber(@ReplaceSubString(} +FLDLATI + {;".";","))/(180*@Pi)) 
											* @Cos(@TextToNumber(@ReplaceSubString("} + strLati + {";".";","))/(180*@Pi)) 
											* @Cos((@TextToNumber(@ReplaceSubString(} + FLDLONG +  {;".";","))/ (180*@Pi)) - (@TextToNumber(@ReplaceSubString("} + strLongi + {";".";","))/ (180*@Pi)))
											)
											 
									* 6380 
								< 50
							 )
							}
Titel: Re: Umkreissuche mit Koordinaten
Beitrag von: pram am 13.04.10 - 17:13:26
Lass dir strQuery doch mal ausgeben und schreib es testweise (ohne den < 200 Vergleich) in ein berechnetes Feld und schau ob/was da überhaupt raus kommt.

So kannst du plausibel abschätzen ob es denn klappt. Es sollte die Entfernung in Kilometer raus kommen.
Die Konvertierung von Grad nach Rad ist nämlich immer noch falsch in deiner Formel. Die Klammern um (180 * @Pi) müssen weg. Oder das * durch ein / ersetzen, so wie du es ganz am Anfang schon mal hattest.

Zitat
So bin der Sache mal nachgegangen. Gemerkt habe ich, dass die Koordinaten mit nem Punkt (".") getrennt ist.
Speichere die Koordinaten doch als echte Zahlenfelder ab. (Zahlen als Text ist "Murks"... Datum als Text ist "totaler Murks" ;) )

Gruß
Roland
Titel: Re: Umkreissuche mit Koordinaten
Beitrag von: bikerboy am 14.04.10 - 08:24:15
So habe die Nacht noch getüffelt

Code
strQuery = {!@IsAvailable(accGoogleAlert)& @LowerCase(Form) = "address" 
			& (
					@ACos(
							@Sin(@TextToNumber(@ReplaceSubstring(} + FLDLATI + {;".";",")) /(180/@Pi)) * @Sin((@TextToNumber(@ReplaceSubstring("} + SourceLat + {";".";","))/ (180/@Pi)))
							+ 	@Cos(@TextToNumber(@ReplaceSubstring(} + FLDLATI + {;".";","))/(180/@Pi)) * @Cos(@TextToNumber(@ReplaceSubstring("} + SourceLat + {";".";","))/(180/@Pi))
							* 	@Cos( (@TextToNumber(@ReplaceSubstring(} + FLDLONG + {;".";","))/(180/@Pi)) - ( @TextToNumber(@ReplaceSubstring("} + SourceLon + {";".";","))/ (180/@Pi)))
							)* 6378,1237
				<}+ strUmkreis + {
			 )
			}
						
	Set collSearch = DBSource.Search(strQuery,Nothing,0)

Der Code funktioniert nun zuverlässig.