Fragen/Hilfe um die Landkarte .............

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Charly
Beiträge: 39
Registriert: 20.02.2010 20:10

Fragen/Hilfe um die Landkarte .............

Beitrag von Charly »

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
vlG Charly / PB 5.42 x86
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Fragen/Hilfe um die Landkarte .............

Beitrag von RSBasic »

Als Vorlage kannst du folgendes nutzen: http://www.purebasic.fr/english/viewtop ... 27&t=66320
Damit kannst du auch Marker erstellen und anzeigen lassen.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Charly
Beiträge: 39
Registriert: 20.02.2010 20:10

Re: Fragen/Hilfe um die Landkarte .............

Beitrag von Charly »

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

Bild

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
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Re: Fragen/Hilfe um die Landkarte .............

Beitrag von alter Mann »

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
Charly
Beiträge: 39
Registriert: 20.02.2010 20:10

Re: Fragen/Hilfe um die Landkarte .............

Beitrag von Charly »

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
vlG Charly / PB 5.42 x86
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Re: Fragen/Hilfe um die Landkarte .............

Beitrag von alter Mann »

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:

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()
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
Win11 64Bit / PB 6.0
Charly
Beiträge: 39
Registriert: 20.02.2010 20:10

Re: Fragen/Hilfe um die Landkarte .............

Beitrag von Charly »

DANKESCHOEN!!!

die naechsten Tage sind 'gerettet' jetzt gehts ans 'umbauen'...........

 
 
 
vlG Charly / PB 5.42 x86
Antworten