Autor Thema: Umkreissuche mit Koordinaten  (Gelesen 4758 mal)

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Umkreissuche mit Koordinaten
« 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 ?
« Letzte Änderung: 13.04.10 - 14:28:40 von bikerboy »
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Offline Kadlec

  • Senior Mitglied
  • ****
  • Beiträge: 489
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: Umkreissuche mit Koordinaten
« Antwort #1 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

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Umkreissuche mit Koordinaten
« Antwort #2 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
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Re: Umkreissuche mit Koordinaten
« Antwort #3 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
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Umkreissuche mit Koordinaten
« Antwort #4 am: 13.04.10 - 13:16:11 »
Ja, zumindest funktionierts so bei uns.
Sind deine Felder auch echte Zahlenfelder?
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Re: Umkreissuche mit Koordinaten
« Antwort #5 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.
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Umkreissuche mit Koordinaten
« Antwort #6 am: 13.04.10 - 13:42:34 »
Achtung: 

@Sin(Feldname / 180 * @pi) ist NICHT @Sin(Feldname / (180 * @pi))
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Re: Umkreissuche mit Koordinaten
« Antwort #7 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.
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Re: Umkreissuche mit Koordinaten
« Antwort #8 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 nicht
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Re: Umkreissuche mit Koordinaten
« Antwort #9 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
							 )
							}
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Umkreissuche mit Koordinaten
« Antwort #10 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
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Re: Umkreissuche mit Koordinaten
« Antwort #11 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.
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz