CTRL Key multiselect + Multiple tracks
TODO : debunk the faulty image bug
This commit is contained in:
166
PBMap.pb
166
PBMap.pb
@@ -40,6 +40,7 @@ DeclareModule PBMap
|
|||||||
#MODE_SELECT = 2
|
#MODE_SELECT = 2
|
||||||
#MODE_EDIT = 3
|
#MODE_EDIT = 3
|
||||||
|
|
||||||
|
;-Declarations
|
||||||
Declare InitPBMap(window)
|
Declare InitPBMap(window)
|
||||||
Declare SetOption(Option.s, Value.s)
|
Declare SetOption(Option.s, Value.s)
|
||||||
Declare LoadOptions(PreferencesFile.s = "PBMap.prefs")
|
Declare LoadOptions(PreferencesFile.s = "PBMap.prefs")
|
||||||
@@ -50,7 +51,8 @@ DeclareModule PBMap
|
|||||||
Declare SetLocation(latitude.d, longitude.d, Zoom = -1, mode.i = #PB_Absolute)
|
Declare SetLocation(latitude.d, longitude.d, Zoom = -1, mode.i = #PB_Absolute)
|
||||||
Declare Drawing()
|
Declare Drawing()
|
||||||
Declare SetZoom(Zoom.i, mode.i = #PB_Relative)
|
Declare SetZoom(Zoom.i, mode.i = #PB_Relative)
|
||||||
Declare ZoomToArea()
|
Declare ZoomToArea(MinY.d, MaxY.d, MinX.d, MaxX.d)
|
||||||
|
Declare ZoomToTracks(*Tracks)
|
||||||
Declare SetCallBackLocation(*CallBackLocation)
|
Declare SetCallBackLocation(*CallBackLocation)
|
||||||
Declare SetCallBackMainPointer(CallBackMainPointer.i)
|
Declare SetCallBackMainPointer(CallBackMainPointer.i)
|
||||||
Declare SetMapScaleUnit(ScaleUnit=PBMAP::#SCALE_KM)
|
Declare SetMapScaleUnit(ScaleUnit=PBMAP::#SCALE_KM)
|
||||||
@@ -176,6 +178,10 @@ Module PBMap
|
|||||||
ServerURL.s ; Web URL ex: http://tile.openstreetmap.org/
|
ServerURL.s ; Web URL ex: http://tile.openstreetmap.org/
|
||||||
EndStructure
|
EndStructure
|
||||||
|
|
||||||
|
Structure Tracks
|
||||||
|
List Track.GeographicCoordinates() ; To display a GPX track
|
||||||
|
EndStructure
|
||||||
|
|
||||||
;-PBMap Structure
|
;-PBMap Structure
|
||||||
Structure PBMap
|
Structure PBMap
|
||||||
Window.i ; Parent Window
|
Window.i ; Parent Window
|
||||||
@@ -206,7 +212,7 @@ Module PBMap
|
|||||||
Moving.i
|
Moving.i
|
||||||
Dirty.i ; To signal that drawing need a refresh
|
Dirty.i ; To signal that drawing need a refresh
|
||||||
|
|
||||||
List track.GeographicCoordinates() ; To display a GPX track
|
List TracksList.Tracks()
|
||||||
List Markers.Marker() ; To diplay marker
|
List Markers.Marker() ; To diplay marker
|
||||||
EditMarker.l
|
EditMarker.l
|
||||||
|
|
||||||
@@ -667,21 +673,23 @@ Module PBMap
|
|||||||
Protected *MainNode,*subNode,*child,child.l
|
Protected *MainNode,*subNode,*child,child.l
|
||||||
*MainNode=MainXMLNode(0)
|
*MainNode=MainXMLNode(0)
|
||||||
*MainNode=XMLNodeFromPath(*MainNode,"/gpx/trk/trkseg")
|
*MainNode=XMLNodeFromPath(*MainNode,"/gpx/trk/trkseg")
|
||||||
ClearList(PBMap\track())
|
Protected *NewTrack.Tracks = AddElement(PBMap\TracksList())
|
||||||
|
;ClearList(PBMap\track())
|
||||||
For child = 1 To XMLChildCount(*MainNode)
|
For child = 1 To XMLChildCount(*MainNode)
|
||||||
*child = ChildXMLNode(*MainNode, child)
|
*child = ChildXMLNode(*MainNode, child)
|
||||||
AddElement(PBMap\track())
|
AddElement(*NewTrack\Track())
|
||||||
If ExamineXMLAttributes(*child)
|
If ExamineXMLAttributes(*child)
|
||||||
While NextXMLAttribute(*child)
|
While NextXMLAttribute(*child)
|
||||||
Select XMLAttributeName(*child)
|
Select XMLAttributeName(*child)
|
||||||
Case "lat"
|
Case "lat"
|
||||||
PBMap\track()\Latitude=ValD(XMLAttributeValue(*child))
|
*NewTrack\Track()\Latitude=ValD(XMLAttributeValue(*child))
|
||||||
Case "lon"
|
Case "lon"
|
||||||
PBMap\track()\Longitude=ValD(XMLAttributeValue(*child))
|
*NewTrack\Track()\Longitude=ValD(XMLAttributeValue(*child))
|
||||||
EndSelect
|
EndSelect
|
||||||
Wend
|
Wend
|
||||||
EndIf
|
EndIf
|
||||||
Next
|
Next
|
||||||
|
ZoomToTracks(LastElement(PBMap\TracksList())) ; <-To center the view, and zoom on the tracks
|
||||||
EndIf
|
EndIf
|
||||||
EndProcedure
|
EndProcedure
|
||||||
|
|
||||||
@@ -1002,47 +1010,56 @@ Module PBMap
|
|||||||
DrawVectorText(Str(dist))
|
DrawVectorText(Str(dist))
|
||||||
EndProcedure
|
EndProcedure
|
||||||
|
|
||||||
Procedure DrawTrack(*Drawing.DrawingParameters)
|
Procedure DrawTracks(*Drawing.DrawingParameters)
|
||||||
Protected Pixel.PixelCoordinates
|
Protected Pixel.PixelCoordinates
|
||||||
Protected Location.GeographicCoordinates
|
Protected Location.GeographicCoordinates
|
||||||
Protected km.f, memKm.i
|
Protected km.f, memKm.i
|
||||||
If ListSize(PBMap\track())>0
|
;Trace Track
|
||||||
;Trace Track
|
If ListSize(PBMap\TracksList()) > 0
|
||||||
ForEach PBMap\track()
|
BeginVectorLayer()
|
||||||
;If *Drawing\GeographicCoordinates\Latitude<>0 And *Drawing\GeographicCoordinates\Longitude<>0
|
ForEach PBMap\TracksList()
|
||||||
LatLon2PixelRel(@PBMap\track(), @Pixel, PBMap\Zoom)
|
If ListSize(PBMap\TracksList()\Track()) > 0
|
||||||
If ListIndex(PBMap\track())=0
|
ForEach PBMap\TracksList()\Track()
|
||||||
MovePathCursor(Pixel\X, Pixel\Y)
|
;If *Drawing\GeographicCoordinates\Latitude<>0 And *Drawing\GeographicCoordinates\Longitude<>0
|
||||||
Else
|
LatLon2PixelRel(@PBMap\TracksList()\Track(), @Pixel, PBMap\Zoom)
|
||||||
AddPathLine(Pixel\X, Pixel\Y)
|
If ListIndex(PBMap\TracksList()\Track()) = 0
|
||||||
EndIf
|
MovePathCursor(Pixel\X, Pixel\Y)
|
||||||
;EndIf
|
Else
|
||||||
Next
|
AddPathLine(Pixel\X, Pixel\Y)
|
||||||
VectorSourceColor(RGBA(0, 255, 0, 150))
|
EndIf
|
||||||
StrokePath(10, #PB_Path_RoundEnd|#PB_Path_RoundCorner)
|
;EndIf
|
||||||
;Draw Distance
|
Next
|
||||||
ForEach PBMap\track()
|
VectorSourceColor(RGBA(0, 255, 0, 150))
|
||||||
;Test Distance
|
StrokePath(10, #PB_Path_RoundEnd|#PB_Path_RoundCorner)
|
||||||
If ListIndex(PBMap\track())=0
|
|
||||||
Location\Latitude=PBMap\track()\Latitude
|
|
||||||
Location\Longitude=PBMap\track()\Longitude
|
|
||||||
Else
|
|
||||||
km=km+HaversineInKM(@Location,@PBMap\track()) ;<- display Distance
|
|
||||||
Location\Latitude=PBMap\track()\Latitude
|
|
||||||
Location\Longitude=PBMap\track()\Longitude
|
|
||||||
EndIf
|
EndIf
|
||||||
If PBMap\Options\TrackShowKms
|
Next
|
||||||
LatLon2PixelRel(@PBMap\track(),@Pixel, PBMap\Zoom)
|
EndVectorLayer()
|
||||||
If Int(km)<>memKm
|
EndIf
|
||||||
memKm=Int(km)
|
;Draw Distance
|
||||||
If PBMap\Zoom>10
|
If PBMap\Options\TrackShowKms And ListSize(PBMap\TracksList()) > 0
|
||||||
BeginVectorLayer()
|
BeginVectorLayer()
|
||||||
|
ForEach PBMap\TracksList()
|
||||||
|
km = 0
|
||||||
|
ForEach PBMap\TracksList()\Track()
|
||||||
|
;Test Distance
|
||||||
|
If ListIndex(PBMap\TracksList()\Track()) = 0
|
||||||
|
Location\Latitude = PBMap\TracksList()\Track()\Latitude
|
||||||
|
Location\Longitude = PBMap\TracksList()\Track()\Longitude
|
||||||
|
Else
|
||||||
|
km = km + HaversineInKM(@Location, @PBMap\TracksList()\Track())
|
||||||
|
Location\Latitude = PBMap\TracksList()\Track()\Latitude
|
||||||
|
Location\Longitude = PBMap\TracksList()\Track()\Longitude
|
||||||
|
EndIf
|
||||||
|
LatLon2PixelRel(@PBMap\TracksList()\Track(), @Pixel, PBMap\Zoom)
|
||||||
|
If Int(km) <> memKm
|
||||||
|
memKm = Int(km)
|
||||||
|
If PBMap\Zoom > 10
|
||||||
TrackPointer(Pixel\X , Pixel\Y, Int(km))
|
TrackPointer(Pixel\X , Pixel\Y, Int(km))
|
||||||
EndVectorLayer()
|
|
||||||
EndIf
|
EndIf
|
||||||
EndIf
|
EndIf
|
||||||
EndIf
|
Next
|
||||||
Next
|
Next
|
||||||
|
EndVectorLayer()
|
||||||
EndIf
|
EndIf
|
||||||
EndProcedure
|
EndProcedure
|
||||||
|
|
||||||
@@ -1174,7 +1191,7 @@ Module PBMap
|
|||||||
DrawTiles(*Drawing, ListIndex(PBMap\Layers()))
|
DrawTiles(*Drawing, ListIndex(PBMap\Layers()))
|
||||||
Next
|
Next
|
||||||
If PBMap\Options\ShowTrack
|
If PBMap\Options\ShowTrack
|
||||||
DrawTrack(*Drawing)
|
DrawTracks(*Drawing)
|
||||||
EndIf
|
EndIf
|
||||||
If PBMap\Options\ShowMarkers
|
If PBMap\Options\ShowMarkers
|
||||||
DrawMarkers()
|
DrawMarkers()
|
||||||
@@ -1252,24 +1269,9 @@ Module PBMap
|
|||||||
EndIf
|
EndIf
|
||||||
EndProcedure
|
EndProcedure
|
||||||
|
|
||||||
Procedure ZoomToArea()
|
Procedure ZoomToArea(MinY.d, MaxY.d, MinX.d, MaxX.d)
|
||||||
;Source => http://gis.stackexchange.com/questions/19632/how-to-calculate-the-optimal-zoom-level-to-display-two-or-more-points-on-a-map
|
;Source => http://gis.stackexchange.com/questions/19632/how-to-calculate-the-optimal-zoom-level-to-display-two-or-more-points-on-a-map
|
||||||
;bounding box in long/lat coords (x=long, y=lat)
|
;bounding box in long/lat coords (x=long, y=lat)
|
||||||
Protected MinY.d,MaxY.d,MinX.d,MaxX.d
|
|
||||||
ForEach PBMap\track()
|
|
||||||
If ListIndex(PBMap\track())=0 Or PBMap\track()\Longitude<MinX
|
|
||||||
MinX=PBMap\track()\Longitude
|
|
||||||
EndIf
|
|
||||||
If ListIndex(PBMap\track())=0 Or PBMap\track()\Longitude>MaxX
|
|
||||||
MaxX=PBMap\track()\Longitude
|
|
||||||
EndIf
|
|
||||||
If ListIndex(PBMap\track())=0 Or PBMap\track()\Latitude<MinY
|
|
||||||
MinY=PBMap\track()\Latitude
|
|
||||||
EndIf
|
|
||||||
If ListIndex(PBMap\track())=0 Or PBMap\track()\Latitude>MaxY
|
|
||||||
MaxY=PBMap\track()\Latitude
|
|
||||||
EndIf
|
|
||||||
Next
|
|
||||||
Protected DeltaX.d=MaxX-MinX ;assumption ! In original code DeltaX have no source
|
Protected DeltaX.d=MaxX-MinX ;assumption ! In original code DeltaX have no source
|
||||||
Protected centerX.d=MinX+DeltaX/2 ; assumption ! In original code CenterX have no source
|
Protected centerX.d=MinX+DeltaX/2 ; assumption ! In original code CenterX have no source
|
||||||
Protected paddingFactor.f= 1.2 ;paddingFactor: this can be used to get the "120%" effect ThomM refers to. Value of 1.2 would get you the 120%.
|
Protected paddingFactor.f= 1.2 ;paddingFactor: this can be used to get the "120%" effect ThomM refers to. Value of 1.2 would get you the 120%.
|
||||||
@@ -1294,6 +1296,31 @@ Module PBMap
|
|||||||
EndIf
|
EndIf
|
||||||
EndProcedure
|
EndProcedure
|
||||||
|
|
||||||
|
Procedure ZoomToTracks(*Tracks.Tracks)
|
||||||
|
Protected MinY.d, MaxY.d, MinX.d, MaxX.d
|
||||||
|
If ListSize(*Tracks\Track()) > 0
|
||||||
|
With *Tracks\Track()
|
||||||
|
FirstElement(*Tracks\Track())
|
||||||
|
MinX = \Longitude : MaxX = MinX : MinY = \Latitude : MaxY = MinY
|
||||||
|
ForEach *Tracks\Track()
|
||||||
|
If \Longitude < MinX
|
||||||
|
MinX = \Longitude
|
||||||
|
EndIf
|
||||||
|
If \Longitude > MaxX
|
||||||
|
MaxX = \Longitude
|
||||||
|
EndIf
|
||||||
|
If \Latitude < MinY
|
||||||
|
MinY = \Latitude
|
||||||
|
EndIf
|
||||||
|
If \Latitude > MaxY
|
||||||
|
MaxY = \Latitude
|
||||||
|
EndIf
|
||||||
|
Next
|
||||||
|
ZoomToArea(MinY.d, MaxY.d, MinX.d, MaxX.d)
|
||||||
|
EndWith
|
||||||
|
EndIf
|
||||||
|
EndProcedure
|
||||||
|
|
||||||
Procedure SetZoom(Zoom.i, mode.i = #PB_Relative)
|
Procedure SetZoom(Zoom.i, mode.i = #PB_Relative)
|
||||||
Select mode
|
Select mode
|
||||||
Case #PB_Relative
|
Case #PB_Relative
|
||||||
@@ -1401,21 +1428,22 @@ Module PBMap
|
|||||||
Procedure CanvasEvents()
|
Procedure CanvasEvents()
|
||||||
Protected MouseX.i, MouseY.i
|
Protected MouseX.i, MouseY.i
|
||||||
Protected MarkerCoords.PixelCoordinates, *Tile.Tile, MapWidth = Pow(2, PBMap\Zoom) * PBMap\TileSize
|
Protected MarkerCoords.PixelCoordinates, *Tile.Tile, MapWidth = Pow(2, PBMap\Zoom) * PBMap\TileSize
|
||||||
Protected key.s, Touch.i, CtrlKey.i
|
Protected key.s, Touch.i
|
||||||
|
Static CtrlKey
|
||||||
PBMap\Moving = #False
|
PBMap\Moving = #False
|
||||||
Select EventType()
|
Select EventType()
|
||||||
Case #PB_EventType_KeyUp
|
Case #PB_EventType_KeyUp
|
||||||
Select GetGadgetAttribute(PBMap\Gadget, #PB_Canvas_Key)
|
Select GetGadgetAttribute(PBMap\Gadget, #PB_Canvas_Key)
|
||||||
Case #PB_Shortcut_Delete
|
Case #PB_Shortcut_Delete
|
||||||
DeleteSelectedMarkers()
|
DeleteSelectedMarkers()
|
||||||
Case #PB_Canvas_Control
|
|
||||||
CtrlKey = #False
|
|
||||||
EndSelect
|
|
||||||
Case #PB_EventType_KeyDown
|
|
||||||
Select GetGadgetAttribute(PBMap\Gadget, #PB_Canvas_Key)
|
|
||||||
Case #PB_Canvas_Control
|
|
||||||
CtrlKey = #True
|
|
||||||
EndSelect
|
EndSelect
|
||||||
|
If GetGadgetAttribute(PBMap\Gadget, #PB_Canvas_Modifiers)&#PB_Canvas_Control = 0
|
||||||
|
CtrlKey = #False
|
||||||
|
EndIf
|
||||||
|
Case #PB_EventType_KeyDown
|
||||||
|
If GetGadgetAttribute(PBMap\Gadget, #PB_Canvas_Modifiers)&#PB_Canvas_Control <> 0
|
||||||
|
CtrlKey = #True
|
||||||
|
EndIf
|
||||||
Case #PB_EventType_LeftDoubleClick
|
Case #PB_EventType_LeftDoubleClick
|
||||||
If PBMap\Mode = #MODE_DEFAULT Or PBMap\Mode = #MODE_SELECT
|
If PBMap\Mode = #MODE_DEFAULT Or PBMap\Mode = #MODE_SELECT
|
||||||
;Check if the mouse touch a marker, if so, jump to it
|
;Check if the mouse touch a marker, if so, jump to it
|
||||||
@@ -1455,7 +1483,9 @@ Module PBMap
|
|||||||
PBMap\EditMarker = #False
|
PBMap\EditMarker = #False
|
||||||
;Check if we select marker(s)
|
;Check if we select marker(s)
|
||||||
ForEach PBMap\Markers()
|
ForEach PBMap\Markers()
|
||||||
PBMap\Markers()\Selected = #False
|
If CtrlKey = #False
|
||||||
|
PBMap\Markers()\Selected = #False ;If no CTRL key, deselect everything and select only the focused marker
|
||||||
|
EndIf
|
||||||
If PBMap\Markers()\Focus
|
If PBMap\Markers()\Focus
|
||||||
PBMap\Markers()\Selected = #True
|
PBMap\Markers()\Selected = #True
|
||||||
PBMap\EditMarker = #True;ListIndex(PBMap\Markers())
|
PBMap\EditMarker = #True;ListIndex(PBMap\Markers())
|
||||||
@@ -1709,7 +1739,6 @@ CompilerIf #PB_Compiler_IsMainFile
|
|||||||
PBMap::SetZoom( - 1)
|
PBMap::SetZoom( - 1)
|
||||||
Case #Gdt_LoadGpx
|
Case #Gdt_LoadGpx
|
||||||
PBMap::LoadGpxFile(OpenFileRequester("Choose a file to load", "", "Gpx|*.gpx", 0))
|
PBMap::LoadGpxFile(OpenFileRequester("Choose a file to load", "", "Gpx|*.gpx", 0))
|
||||||
PBMap::ZoomToArea() ; <-To center the view, and zoom on the tracks
|
|
||||||
Case #StringLatitude, #StringLongitude
|
Case #StringLatitude, #StringLongitude
|
||||||
Select EventType()
|
Select EventType()
|
||||||
Case #PB_EventType_LostFocus
|
Case #PB_EventType_LostFocus
|
||||||
@@ -1741,9 +1770,10 @@ CompilerIf #PB_Compiler_IsMainFile
|
|||||||
|
|
||||||
CompilerEndIf
|
CompilerEndIf
|
||||||
; IDE Options = PureBasic 5.50 (Windows - x64)
|
; IDE Options = PureBasic 5.50 (Windows - x64)
|
||||||
; CursorPosition = 1514
|
; CursorPosition = 1195
|
||||||
; FirstLine = 1487
|
; FirstLine = 1169
|
||||||
; Folding = -------------
|
; Folding = -------------
|
||||||
; EnableThread
|
; EnableThread
|
||||||
; EnableXP
|
; EnableXP
|
||||||
|
; DisableDebugger
|
||||||
; EnableUnicode
|
; EnableUnicode
|
Reference in New Issue
Block a user