PureBoard
https://www.purebasic.fr/german/

Fragen/Hilfe um die Landkarte .............
https://www.purebasic.fr/german/viewtopic.php?f=4&t=29815
Seite 1 von 1

Autor:  Charly [ 13.09.2016 11:55 ]
Betreff des Beitrags:  Fragen/Hilfe um die Landkarte .............

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

Autor:  RSBasic [ 13.09.2016 12:28 ]
Betreff des Beitrags:  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.

Autor:  Charly [ 13.09.2016 13:13 ]
Betreff des Beitrags:  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

Bild

EDIT: die genaugkeit der Koordinaten ist laut Wiki: ~6,33 km in Längenrichtung und ~4,63 km in Breitenrichtung f. DL

Autor:  alter Mann [ 14.09.2016 09:10 ]
Betreff des Beitrags:  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.

Autor:  Charly [ 14.09.2016 10:46 ]
Betreff des Beitrags:  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

Autor:  alter Mann [ 14.09.2016 13:00 ]
Betreff des Beitrags:  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:

Code:
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

Autor:  Charly [ 14.09.2016 14:38 ]
Betreff des Beitrags:  Re: Fragen/Hilfe um die Landkarte .............

DANKESCHOEN!!!

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

 
 
 

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/