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.
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()