Hallochen,
ich mochte ein kleine Programm f. unser Funkprojekt erstellen, da soll
unter anderem grafisch auf der Landkarte zwei Funkstationen dargestellt
werden und diese mit einer Linie verbunden werden, es sind immer
verschiedene Stationen von denen ich die koordinaten erhalte oder
sie aus einer DB hole.
Es muss nicht 100% 'passen' , halt so genau wie moeglich.
Im ersten Step soll es erstmal mit Europa funktionieren, hab mir ein
paar Grafiken runtergeladen als Hi-Res Bild
Ich hab jetzt aber irgendwie als dummy nicht so die Idee wies starten
soll, koenntet ihr mir vllcht Tips geben und mich in die richtige Richtung
'stubsen' , vielen Dank!
vG
Charly
Fragen/Hilfe um die Landkarte .............
Fragen/Hilfe um die Landkarte .............
vlG Charly / PB 5.42 x86
Re: Fragen/Hilfe um die Landkarte .............
Als Vorlage kannst du folgendes nutzen: http://www.purebasic.fr/english/viewtop ... 27&t=66320
Damit kannst du auch Marker erstellen und anzeigen lassen.
Damit kannst du auch Marker erstellen und anzeigen lassen.
Re: Fragen/Hilfe um die Landkarte .............
Danke f. den Link, hab das mal ueberflogen, wenn ich das richtig
versteh ist das etwas 'oversize' , ich haeng mal ein Beispiel-Bild
an, es muessen quasi keine Details vorhanden sein und Offline
funktionieren
http://prntscr.com/chh0rj
vG
Charly
EDIT: die genaugkeit der Koordinaten ist laut Wiki: ~6,33 km in Längenrichtung und ~4,63 km in Breitenrichtung f. DL
versteh ist das etwas 'oversize' , ich haeng mal ein Beispiel-Bild
an, es muessen quasi keine Details vorhanden sein und Offline
funktionieren
http://prntscr.com/chh0rj
vG
Charly
EDIT: die genaugkeit der Koordinaten ist laut Wiki: ~6,33 km in Längenrichtung und ~4,63 km in Breitenrichtung f. DL
vlG Charly / PB 5.42 x86
- alter Mann
- Beiträge: 201
- Registriert: 29.08.2008 09:13
- Wohnort: hinterm Mond
Re: Fragen/Hilfe um die Landkarte .............
Als erstes brauchst Du eine Karte in Mercator-Projektion. Dann brauchst Du noch einen Nullpunkt(in der Karte in Pixeln z.B. London), von dem Du die Koordinaten berechnest und dazu die Längen- und Breitengrade, da die Koordinaten, die Du eintragen willst wahrscheinlich in ° ' '' in Länge und Breite sind. Und dann am besten noch einen 2.Ort mit Pixelkoordinaten und Längen und Breitengraden, damit man die Längen und Breitengrade in Pixel umrechnen kann. Und dann kann man schon loszeichnen . Wenn Du beim Zeichnen noch Probleme hast, einfach noch mal nachfragen.
Win11 64Bit / PB 6.0
Re: Fragen/Hilfe um die Landkarte .............
Danke f. die Antw. alter Mann,
genau mit dem Zeichen da haengt es noch, meine jetzige Karte hat ueber 4000 x 4000 Pixel
ich stell mir vor das ich ein Fenster entweder 640*480 oder 800*600 habe indem ich einen
Bereich meiner Karte oder auch die ganze Karte darstelle und dann die Luftlinie zw. den
zwei Funkstationen dazuzeichne. Da bin ich am testen / expirementieren, bin halt mehr
der AVR programmiere, in PB bin ich noch Frischling hihi
vG
Charly
genau mit dem Zeichen da haengt es noch, meine jetzige Karte hat ueber 4000 x 4000 Pixel
ich stell mir vor das ich ein Fenster entweder 640*480 oder 800*600 habe indem ich einen
Bereich meiner Karte oder auch die ganze Karte darstelle und dann die Luftlinie zw. den
zwei Funkstationen dazuzeichne. Da bin ich am testen / expirementieren, bin halt mehr
der AVR programmiere, in PB bin ich noch Frischling hihi
vG
Charly
vlG Charly / PB 5.42 x86
- alter Mann
- Beiträge: 201
- Registriert: 29.08.2008 09:13
- Wohnort: hinterm Mond
Re: Fragen/Hilfe um die Landkarte .............
Ich hab mal mit Deiner Karte eine Linie von Berlin nach Paris gezeichnet (einfach auf den Button Zeichnen klicken). Da sieht man, wie wichtig die Mercator-Projektion ist. Die Positionen von Rom und London sind zwar nur geschätzt, aber so daneben liegen die nicht.
Zum Spielen:
Das Fenster habe ich so groß gemacht, weil ich es auch mal mit einem Mercator-Bild versucht habe.
__________________________________________________
Leerzeichen im Code hinzugefügt
14.09.2016
RSBasic
Zum Spielen:
Code: Alles auswählen
EnableExplicit
Enumeration WINDOW
#MAIN_WINDOW
EndEnumeration
Enumeration GADGET
#IMAGE_GADGET
#TEXT_GADGET_KOORDINATEN_EINGABE
#TEXT_GADGET_KOORDINATEN_ANZEIGE
#STRING_GADGET_VON
#STRING_GADGET_BIS
#BUTTON_ZEICHNEN
EndEnumeration
Enumeration IMAGE
#IMAGE_1
EndEnumeration
Procedure.i InSekunden(iGrad.i,iMinuten.i,iSekunden.i)
ProcedureReturn 3600*iGrad+60*iMinuten+iSekunden
EndProcedure
Procedure.i Init(*dSekundenproPixelX.Double,*dSekundenproPixelY.Double,*dNullX.Double,*dNullY.Double)
Protected iGrad1x.i=0 ,iMinuten1x.i=0 ,iSekunden1x.i=0
Protected iGrad1y.i=51,iMinuten1y.i=31,iSekunden1y.i=0 ; London
Protected iGrad2x.i=12,iMinuten2x.i=29,iSekunden2x.i=0
Protected iGrad2y.i=41,iMinuten2y.i=53,iSekunden2y.i=0 ; Rom
Protected iPixel1x.i=217,iPixel1y.i=175 ; London auf dem Bild (geschätzt) - kein Mercator
Protected iPixel2x.i=346,iPixel2y.i=396 ; Rom auf dem Bild (geschätzt) - kein Mercator
; Protected iPixel1x.i=279,iPixel1y.i=310 ; London auf dem Bild (geschätzt)
; Protected iPixel2x.i=419,iPixel2y.i=471 ; Rom auf dem Bild (geschätzt)
Protected dDiffx.d=iPixel2x-iPixel1x,dDiffy.d=iPixel2y-iPixel1y
*dSekundenproPixelX\d = (InSekunden(iGrad2x,iMinuten2x,iSekunden2x)-InSekunden(iGrad1x,iMinuten1x,iSekunden1x))/dDiffx
*dSekundenproPixelY\d = (InSekunden(iGrad2y,iMinuten2y,iSekunden2y)-InSekunden(iGrad1y,iMinuten1y,iSekunden1y))/dDiffy
*dNullX\d = -iPixel1x * *dSekundenproPixelX\d + InSekunden(iGrad1x,iMinuten1x,iSekunden1x)
*dNullY\d = -iPixel1y * *dSekundenproPixelY\d + InSekunden(iGrad1y,iMinuten1y,iSekunden1y)
EndProcedure
Procedure.i IsDigit(zString.s)
If Asc(zString) >= Asc("0") And Asc(zString) <= Asc("9")
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure.i StringInSekunden(zKoordinate.s)
Protected zGrad.s,zMinute.s,zSekunde.s,zRest.s
Protected iFaktor.i
ReplaceString(zKoordinate," ","",#PB_String_InPlace)
zGrad = StringField(zKoordinate,1,"°")
zRest = StringField(zKoordinate,2,"°")
zMinute = StringField(zRest,1,"'")
zSekunde = StringField(zRest,2,"'")
If Right(UCase(zSekunde),1) = "S" Or Right(UCase(zSekunde),1) = "W" : iFaktor = -1 : Else : iFaktor = 1 : EndIf
While Len(zSekunde)>0 And IsDigit(Right(zSekunde,1))=#False
zSekunde = Left(zSekunde,Len(zSekunde)-1)
Wend
ProcedureReturn InSekunden(Val(zGrad),Val(zMinute),Val(zSekunde))*iFaktor
EndProcedure
Procedure.s SekundenInString(iSekunden.i,iX.i)
Protected zKoordinate.s = ""
Protected iSek.i = iSekunden
If iSek < 0 : iSek = -iSek : EndIf
zKoordinate = Str(iSek/3600)+"°"+Str((iSek%3600)/60)+"'"+Str(iSek%60)+Chr(34)
If iX
If iSekunden<0
zKoordinate + "W"
Else
zKoordinate + "E"
EndIf
Else
If iSekunden<0
zKoordinate + "S"
Else
zKoordinate + "N"
EndIf
EndIf
ProcedureReturn zKoordinate
EndProcedure
Procedure Main()
Protected zFileKarte.s,zKoordinaten.s,zKoordinateVon.s,zKoordinateBis.s
Protected iImageID.i=0,iEvent.i,iX,iY,iXvon.i,iYvon.i,iXbis.i,iYbis.i
Protected dNullX.Double,dNullY.Double,dFakX.Double,dFakY.Double
zFileKarte=OpenFileRequester("Karte","D:\Temp\Karte.png","Bilddateien | *.png;*.jpg",1)
If FileSize(zFileKarte)>=0
UsePNGImageDecoder()
UseJPEGImageDecoder()
If LoadImage(#IMAGE_1,zFileKarte)
iImageID = ImageID(#IMAGE_1)
EndIf
EndIf
If iImageID = 0
MessageRequester("Hinweis","Karte nicht ladbar")
End
EndIf
If OpenWindow(#MAIN_WINDOW,0,0,1200,1000,"Karte",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ImageGadget(#IMAGE_GADGET,10,10,ImageWidth(#IMAGE_1),ImageHeight(#IMAGE_1),iImageID,#PB_Image_Border)
TextGadget(#TEXT_GADGET_KOORDINATEN_EINGABE,10, GadgetY(#IMAGE_GADGET)+GadgetHeight(#IMAGE_GADGET)+10,100,15,"Koordinateneingabe")
StringGadget(#STRING_GADGET_VON,GadgetX(#TEXT_GADGET_KOORDINATEN_EINGABE)+GadgetWidth(#TEXT_GADGET_KOORDINATEN_EINGABE), GadgetY(#TEXT_GADGET_KOORDINATEN_EINGABE),200,20,"52°31'0"+Chr(34)+"N:13°24'0"+Chr(34)+"E")
StringGadget(#STRING_GADGET_BIS,GadgetX(#STRING_GADGET_VON)+GadgetWidth(#STRING_GADGET_VON)+10, GadgetY(#STRING_GADGET_VON),200,20,"48°51'0"+Chr(34)+"N:2°21'0"+Chr(34)+"E")
ButtonGadget(#BUTTON_ZEICHNEN,GadgetX(#STRING_GADGET_BIS)+GadgetWidth(#STRING_GADGET_BIS)+10, GadgetY(#STRING_GADGET_BIS),50,20,"Zeichnen")
TextGadget(#TEXT_GADGET_KOORDINATEN_ANZEIGE,10, GadgetY(#TEXT_GADGET_KOORDINATEN_EINGABE)+GadgetHeight(#TEXT_GADGET_KOORDINATEN_EINGABE)+10,200,15,"")
Init(@dFakX,@dFakY,@dNullX,@dNullY)
Repeat
iEvent = WaitWindowEvent()
iX = WindowMouseX(#MAIN_WINDOW) - GadgetX(#IMAGE_GADGET)
iY = WindowMouseY(#MAIN_WINDOW) - GadgetY(#IMAGE_GADGET)
If iX > 0 And iX < GadgetWidth(#IMAGE_GADGET) And iY > 0 And iY < GadgetHeight(#IMAGE_GADGET)
zKoordinaten = SekundenInString(Int(dNullX\d+iX*dFakX\d),#True)
zKoordinaten + ":"
zKoordinaten + SekundenInString(Int(dNullY\d+iY*dFakY\d),#False)
SetGadgetText(#TEXT_GADGET_KOORDINATEN_ANZEIGE,zKoordinaten)
EndIf
Select iEvent
Case #PB_Event_Gadget
If EventGadget() = #BUTTON_ZEICHNEN
zKoordinateVon = GetGadgetText(#STRING_GADGET_VON)
zKoordinateBis = GetGadgetText(#STRING_GADGET_BIS)
iXvon = StringInSekunden(StringField(zKoordinateVon,2,":"))
iYvon = StringInSekunden(StringField(zKoordinateVon,1,":"))
iXbis = StringInSekunden(StringField(zKoordinateBis,2,":"))
iYbis = StringInSekunden(StringField(zKoordinateBis,1,":"))
If (iXvon<>iXbis Or iYvon<>iYbis) And StartDrawing(ImageOutput(#IMAGE_GADGET))
LineXY(Int((iXvon-dNullX\d)/dFakX\d), Int((iYvon-dNullY\d)/dFakY\d), Int((iXbis-dNullX\d)/dFakX\d), Int((iYbis-dNullY\d)/dFakY\d),RGB(255,0,0))
StopDrawing()
SetGadgetState(#IMAGE_GADGET,ImageID(#IMAGE_1))
EndIf
EndIf
EndSelect
Until iEvent = #PB_Event_CloseWindow
EndIf
EndProcedure
Main()
__________________________________________________
Leerzeichen im Code hinzugefügt
14.09.2016
RSBasic
Win11 64Bit / PB 6.0
Re: Fragen/Hilfe um die Landkarte .............
DANKESCHOEN!!!
die naechsten Tage sind 'gerettet' jetzt gehts ans 'umbauen'...........
die naechsten Tage sind 'gerettet' jetzt gehts ans 'umbauen'...........
vlG Charly / PB 5.42 x86