LazMapViewer: Add MarkerClickPlugin and demo.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@9685 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz 2025-03-17 12:28:13 +00:00
parent 12914ebd4b
commit a1e91b1045
5 changed files with 670 additions and 1 deletions

View File

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<SessionStorage Value="InProjectDir"/>
<Title Value="MarkerClick_Demo"/>
<Scaled Value="True"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
<XPManifest>
<DpiAware Value="True"/>
</XPManifest>
</General>
<BuildModes>
<Item Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<UseFileFilters Value="True"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
</RunParams>
<RequiredPackages>
<Item>
<PackageName Value="lazMapViewerPkg"/>
</Item>
<Item>
<PackageName Value="LCL"/>
</Item>
</RequiredPackages>
<Units>
<Unit>
<Filename Value="MarkerClick_Demo.lpr"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="main.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="MainForm"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="Main"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="MarkerClick_Demo"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf3"/>
</Debugging>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions>
<Item>
<Name Value="EAbort"/>
</Item>
<Item>
<Name Value="ECodetoolError"/>
</Item>
<Item>
<Name Value="EFOpenError"/>
</Item>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,28 @@
program MarkerClick_Demo;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}
cthreads,
{$ENDIF}
{$IFDEF HASAMIGA}
athreads,
{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, main
{ you can add units after this };
{$R *.res}
begin
RequireDerivedFormResource := True;
Application.Scaled:=True;
{$PUSH}{$WARN 5044 OFF}
Application.MainFormOnTaskbar := True;
{$POP}
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.

View File

@ -0,0 +1,355 @@
object MainForm: TMainForm
Left = 576
Height = 426
Top = 248
Width = 653
Caption = 'Marker Click Demo'
ClientHeight = 426
ClientWidth = 653
LCLVersion = '4.99.0.0'
OnCreate = FormCreate
object MapView: TMapView
Left = 0
Height = 340
Top = 0
Width = 653
Align = alClient
Cyclic = True
DownloadEngine = MapView.BuiltInDLE
DrawingEngine = MapView.BuiltInDE
Layers = <>
Font.Color = clBlack
MapProvider = 'Open Topo Map'
PluginManager = PluginManager
POIImages = POI_Images
end
object Bevel1: TBevel
AnchorSideLeft.Control = Owner
AnchorSideLeft.Side = asrCenter
Left = 323
Height = 50
Top = 108
Width = 6
Shape = bsSpacer
end
object Panel1: TPanel
Left = 0
Height = 86
Top = 340
Width = 653
Align = alBottom
AutoSize = True
BevelOuter = bvNone
ClientHeight = 86
ClientWidth = 653
TabOrder = 1
object cgPointTypes: TCheckGroup
AnchorSideLeft.Control = Panel1
AnchorSideTop.Control = Panel1
Left = 8
Height = 70
Top = 8
Width = 355
AutoFill = True
AutoSize = True
BorderSpacing.Around = 8
Caption = 'Allowed point types'
ChildSizing.LeftRightSpacing = 8
ChildSizing.TopBottomSpacing = 6
ChildSizing.HorizontalSpacing = 10
ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
ChildSizing.EnlargeVertical = crsHomogenousChildResize
ChildSizing.ShrinkHorizontal = crsScaleChilds
ChildSizing.ShrinkVertical = crsScaleChilds
ChildSizing.Layout = cclLeftToRightThenTopToBottom
ChildSizing.ControlsPerLine = 3
ClientHeight = 50
ClientWidth = 351
Columns = 3
Items.Strings = (
'GPSPointOfInterest'
'GPSTrackPoint'
'GPSAreaPoint'
'MapPointOfInterest'
'MapTrackPoint'
'MapAreaPoint'
)
TabOrder = 0
OnItemClick = cgPointTypesItemClick
Data = {
06000000020202020202
}
end
object Label2: TLabel
AnchorSideLeft.Control = cgPointTypes
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Label1
AnchorSideTop.Side = asrBottom
Left = 379
Height = 15
Top = 23
Width = 91
BorderSpacing.Left = 16
Caption = 'blue: MAP points'
Color = clBlue
Font.Color = clBlue
ParentColor = False
ParentFont = False
end
object Label1: TLabel
AnchorSideLeft.Control = cgPointTypes
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = cgPointTypes
Left = 379
Height = 15
Top = 8
Width = 80
BorderSpacing.Left = 16
Caption = 'red: GPS points'
Font.Color = clRed
ParentColor = False
ParentFont = False
end
end
object PluginManager: TMvPluginManager
Left = 401
Top = 74
end
object POI_Images: TImageList
Height = 32
Width = 32
Left = 400
Top = 136
Bitmap = {
4C7A010000002000000020000000490500000000000078DAD597678894571486
ED1515C55ED6151B566C5831D862051511DDD87ED810B104438C0D05B145412C
885D04A3464111835D443016AC089AFCB060D9154554766766676766F77B72DE
7B6759C91F677535E4C761BEF9BE7BCF7BCF39EF79EFBD4029FE27969F9F9F1E
8D461785C3E1F33939395966B1A465E99DBE151414342D695CF90C8542870CA7
20949D4DE4FE7DA2C78F13DBB387D8AE5D448F1C2172E70EFAE6C68442BFDB9C
B492C0CECBCBFBC17C86426FDF123B708060D224183204060D827EFDA04F1FE8
D1033A7726183890D8A64D84DEBCC1D610B2B913BE04DBF2F99361937BF326C1
D4A9307AB4B7912361F870183C18FAF7F76BE8DE1D3A7582B66D09EC7FEEA54B
CA05E663C167C63DC1CDBF7001C68F8771E3FCAF6CEC58BF8E1123FC1A9487DE
BDA15B37E8D0015AB786162D881E3EECD650DC3CA876CA9FE276B81919307932
4C99E26DE244B05A70F52A5CB9023B7742DFBEBE0ECA419B36D0BC39A4A7937B
F1A2AB45717869C30FABDEC1B4691E5FD8CAFF8C19307DBAC7CECD8563C7E0E8
518844C0EA4EAF5ED0A50BB46BE7E2272D8DC0D6137AFD5A6B389462ECE9E2B0
B8E672AC7C2F5C08B76E81719C7BF72091800D1BFC378D59B60CE271B87C1954
AFB3677D5D9A5AC8F5EB93B76E9DEB0BEBDFA629706E91FA2850CC85F85BB762
01C0E9D3DEB66C01E566F56A58B102468D82A54B61FF7EB09EE4C3079837CFE5
5FF88171423ECDF72F9FC2978EA8BF5D8F89E7E2DAE6CD9095E573AF1A2C5E0C
561F5703E5DEF2EB6AA43E10079F3C29C26FD0006AD52272E306E6FBDCA7F0A5
65D216D7DFEA31E560E346C8CC2CE2DFC38770FDBAE7E598319E83B76F17F540
217E32FFD4AC4974F76ED5203305FC58CCC6BA9E520DD563EBD7C3CB9745FDA7
FAABE6CABBD6B86081AF7FCF9E9E7FC29F3BD7F18F7AF51C7ECC6A25DF29E0C7
63EA27E552DAA235AC59032F5E14E9CFAB57B0776F91066DDFEED757A8418F1F
C39C39D0B831D4AD0B356A105BB54AF8F114F033A5E7AE97B506E561E54A78FE
1C860DF3B676ADCF81F5B6E3BB9E972CF1B14B7F843F7B36346C08B56B43B56A
446D9F4825FFE248E4EE5DA7E72E1ED574F97278F60C060C00D378F7ABFA9E3C
09274EC0CC99D0B52B74ECE8B5E7D1239835CBD7DEB847D5AA85FC3B9342FF2D
946606E29F72293E89EFEA29F556A189231693D33EE57FDB36DFA7D2A177EFFC
9AEAD471B90F5AB52ADC0B7E4E457B6D6C7E4CBE6C2F71F914CFCE9DF3B9FED8
CE9FF7A66F67CE786D3875CAE7455A68BC53EC799E7BF9E6BB492A1A1889440E
6A0F0DA4E9DA4B945369AAD6A21CCBF4AC77FAA63149BDA75123CF79E5DDEA1E
B46CE9F4D77CFE568C734E135B6F4EAEF4547E65D273CBA3C392E9D97CBB6FCD
9AF95E13DFC4F724B62CD7F2235FE633AD98FB6F86DB3B77ECF07D24FFD213C5
28D3B3DEE99B70C535D55B391776E5CAE4191792FB6FC6679E3FD6697E7CFE7C
1F973064D254FD2ACF7AAF1E53CCC635D59B4A9588DBFE90E4DCAF9F7BFE0982
A08CF5CC1FA1F7EFC91F3AD4C7261356E1B33015AF702D662A5420DF7813B21E
B0B9A7E4E34BCE6036BF7A7676F65F61EBFF4075AF52C563C9F42CCC8A15A17C
79285B96C06A127EFA54B1FFADB92571064D24122DCCDFBB88F69CEAE6B25C39
6F8647190BAF74691B55CAAD2772ED9ACE1AEF6D4ECB923C83C7E3F1EF45E3E8
C18345781F9BBD8BDA99456334F66BDC3F8C4BF3C5A998B4FE5FF831D3C824DF
7EFC9A7720D3913D39769649481393D8093BA724EF1EFBBEF61DCC3855C178FD
A734ADC034B0A07D7BA76FF6EEAA7DABF88DEE81752DD617613B07851F3C10DF
5EDABB7ADFF22E6AFCEEA22B824CCFFFC57DD870BF937D898F7F0027F7CB1B
}
BitmapAdv = {
4C69020000004C7A010000003000000030000000F80800000000000078DAED9A
098C54551686610454105041C40D706B3710F785CD0D10B75614DC701715A545
13F78E81A82123288B0D8A3AC608AE719498A8D161C264CCE0AE710471C1489B
89318DD82ADDB57657D53FE7BBF7DDAE47D3CE64AA179A645E725255EFDD77EF
7FCFF9CF7FCF7DAF2475D1FF2D58D76C365B66566E56615619594574AEAC1362
FE432693195F5F5FBFACAEAE6E8399FE8BD558DBA5369771DCBB357D9D4824A6
189EB5CD31D66FDCA8E4175F28F9D1474A7EF8A192AB57BB732DCC655D32999C
425F1D893D97CB95990F5735E1D8B449A90F3E50C3C30F2B7FC515D2A9A74A27
9D248D1A259D78A274DC71D231C7285F5EAE869933957AE71D774F6C1EFFA0CF
8EC06EFE9A5CE70F37767AC50AE56FBC513AF34CE98C33A4D34F97C619354E3B
4D3AF96469F46869C408E9F8E3A5A38F96860F970E3B4C796B977EF5D562CCEC
48A55293DB13BBF53FC3C62A305EA2BA5AB97BEE91CE3DB768E65F9D7DB69F0B
F3183B563AE594E21C88C3514749871F2E1D7AA85456A6DCC5172BB16E5D9847
C1C6B8B99DB04F0DBE4A7DFCB10A975F2E5D7081346952D1CE3F5F3AEF3C3F8F
B3CE92264CF0B10873804BC71E2B1D79A43474A874F0C1D20107A8603149AD5C
D9140B8BF1756D89DDB4628CF59B73D8DF7D57BAE82269F264FF69FED32597F8
CF709E79108F3007E20097468EDC9C47510CB4EFBE6E1EA937DE087368344D1B
DD46B9DAD7A8F983F3CB9A351E2B18C13BC5A4833804E337D76FB9457AE925E9
C517A5E79F97962D93C8EB31635A8EC1FEFB4B8307BB39244D07A27CF881B1DB
803755AEBF9F7E52E1861B3C4F02F62BAF94AEBE5ABAE61AFFC9EF9B8DBE3FFF
AC2D8E0D1B3CDF420C421E1C728874E081D29021D25E7BA960D7EA6B6A028FAA
5A897D88F5D3405FD9254BA48913BDEF2FBDD4FB13DCD71955AFBFDEDB4D3749
96D7EE78ED35E9BEFB24D34BBDFCB23FF7CD37D2F8F1D20927383DDD8243FBEC
230D1CA8ECDD7737F1289D4E0F6E85565605AD717909AF2FBCD0FB1E8E80F1F5
D7A537DF948CBBFAFA6B8FD3F4DDCD91B9326734E9ADB7FCB5CF3E939E7A4A7A
F249E9F1C7A5458BFC3AB1DF7E1EFF1E7B487BEEA984CDB53531C8E7F33D8C83
B5F4D1F0E8A3D239E76C8EDFB4BBC563ED5A1F17DAD0967BB8975CFEF4D396EF
59B8D0E7C0A0410EBB76DB4DD93BEF0C31A8054B099A33C1F1FEB7DF544057F0
619C3FCB97FBB15F7945AAAAF2367FBEC45A461ECC9A253DFBACF4CC33D2EDB7
7B1D625DB8F5561FBB8A0A69C102DF073108391CE12F18A7EA7FFDD5CDC1B08C
2F813B735DFC3EF9C47316FFA189E420F91BFCFFD04345FE930BD3A74B9F7FBE
A58FAD1672F7535784B58CF62DE11F3040DA651725A9333C87E6FCAFF8EDBEBF
726F06ED43BFA90DE04188017EE778F0C1CD3528602757C1F5C823D2575FF973
A68D4E43C18F86FE1E7EF33FF833E69B88437F2901FFF78EFBB367FB7A8C1810
7F7C08A783A6703DE83F7A13B01323DAB116635F7EE9AFA1C1AC01E8CFD4A99B
E38FF15F3BEFAC066B1BE1AF2E017F3DF7E66EBBCDAF9DC4000E071EB13E7180
39ACC1CF3D57C413D660F286FBE6CE2D5E0B6B70C04FEEC4F5A77F7F87BFD1FA
88F0D795803FEFF0938FD42ED430D432610E2FBCE0C746DF43FDB37469114FC0
0EEFB86FCE9CE2B550C7C1B9700EFDDF7B6FA7FFEAD74FEADB57391B2BC29F2B
017FC2E19F31C3F335CC8138505B065F575616EBCF3BEEF0E7E03BBF992BBCC3
D0550E30C39D238EF0F9C2418EC07D5B7FB5FBEED2AEBB4A7DFA28677D44F813
25E0AF76FCC7BFC43BCC012E51DB93D71C77DDE5F3829860E80C077C479BF07B
C0BE6A95CFDB503B5C755551FFE3DCB7DC55EFDE6A304D8BF0AF2F597F582BE1
2A3127EF582BD140749D83FC083EC6D02774A6F901767420B68771350807EB40
E04EC47DF5EA15D79F1525D43E7F74DAFBFEFB7E3CC6C577D42EC4E2E9A7FDD8
AC47F00A031F9FC468DA3469F1629FAFD75EEBE74F1FF086BA93BAEDB2CB7C1F
AC7B41F723EEA867CF26FD372CB34B587FC785BD6D01CD660ED4BC70172CC425
F88EBA2D6EE43CF831D6357406DEC3177C1EEAECA0B7F3E66DEEFB9D7652C1F2
A1CED6FE68FD1D5B42DDDF3DD43F59349E780F1BE6FD077FA947DBEA2047E07D
CCF759D382681F500B9612EBE7F9AEFEFCF65B8F9D988779A043D475D4904F3C
B1A5719E39628F3DE6DBC227B412BD2167E10DD8C9E54833F13D9F09AB65A3DA
615E2BF65E83AD8FAC8BC1FDF7FB7DC6410715E7018F990BE3C3AF60FCE63CD7
69477BEEE37ED629F62AAC55701EBD0CBC31CDD18E3B2A6BF55E94B759C330A8
95CF4B16B838DAFEA9405EB2CE83833D47980B7B90E6C679F686B4A33DF7B146
A1F3680DEB6CC01EE925BC29D87C192BCADB856DB0FFED6D7DFDABA9160533FE
C38F60B23DABC317E614F0729EEBB40BB8F1396B14B98AD6C099E077C3EE6ACE
68FFCB9836769FB6D8C367329911ECE5DCF32AEA36FC0716D61C70311F30C68D
735CA30DEDC11D7C1E72358E7D871D94B6FD42ECF9C388367EFE333D3C9FC93E
F080F721FC0517F89A1BE731DAD036E0C6E7F025E42AD8B7DF3EBEE725672BDA
E919D692B02634A2E1E0810760C3C019B0625CA30D1C8FE3C6E7B6BE92ABEAD1
438DB6AF08CF436D8C3FB5E373DB6EA6C77F77F95C53A33CF50498E002F8E2C6
398CEBF0045D8FE3369FAB7B77E54DA3EA7FFC31FE1CB77B3B3F7BEE1FF63609
ABCB0AF01C6CC1F06FF80E5E3802667812C3ADEDB653C1E29258B32660FFDEFA
1ED011CFA0D3E9F4B0505FA7DE7EDB63051B1883F11BB3BC74988D27EAD6CDE1
56D7AEEE7BEC7961D2F2757847BE03B01C9B189E4567584FF169730B7803E62E
5D9A2C636B6F78E66C7D4DDA1AEF606CDC9941331AA8D1C0182C86B5B935581D
D7F42C3B959AB535DF2119863FBB7CFEE517E5A853FF036E2C3772A4EA6B6B43
6DB6BCA3DF1DB590CF3D0DCB3F1D9EEA6A1558AF7E073BD7EAD7AF0FD857E7F3
F95E9DE11D6454E7B9778FACFF4E739AE3370D4ABEF75EE0CD46EEE94CEF514D
3F468567D5699E4DC473C0BEC76A03DA8CE98CEFAFE3EF98B2F7DEDB843F5B59
19CFD7699DF91DBCE15BD45463D85EBEB1BC3C5E1B2CEEECFF21A0C630AC2B43
8D11DEA558BEFE8D6BDBC2FF200C673FC3FC5DECFDF4779CDB96FECB6178871A
EE4D18DFB7C5FFA318EE81587B8EF16FEC2287AD4C7A01000000400000004000
0000CD0D00000000000078DAED9B779014F512C70DA82046CC39670CA0A062CE
3927CC09047926CCE8B3D43281145A8AFACA124B2D1FFE61499915C14C524CAF
4A0554C00088A0C0C906F6367D5F7F66B6777F37DE3D79E59E049DAAAEDB9B99
9DE96F876FF7AF6756D232FA5BFE96569262B1D8A15028EC91CBE52E983F7FFE
209311265F9BCC3169ACC89CCA3E8E0DB273CFE73B7C7709C6BD7E369BED9D4A
A5DE344CDF9A144DB490C2B953EDBB23172C58D08B6B2D21B89735CC5D1B1A1A
EE31FDD3CD614BCD9BA7F4F4E94A7FFDB5D213272A3D6142FC79DAB4E8580BF6
C8FEFAEBAFF79B2DF65C5CB1974AA5554DBFCBF19B49A909E6B973951D354A8D
8F3DA6C24D37A978D9652A5D78A14AE79CA3D25967457F8B3D7AA8D0B7AF1A07
0F56F6EDB7959A33276903AE39D5EE7119F75A5C7097CBE5E52D577737DDFED3
04F3ECD9CA7EF0810AFDFB4BA79D261D7EB874D861D2218748071F2C1D78A0B4
FFFED23EFB487BEF2DED69AEDD630FA9532769D75DA5FDF653E1FAEB957DEB2D
A57EFCB1690CA5529FC20F76EF368B1ABFC5FB19A6D3C450BFCCE79FAB70FBED
2A9F7DB674CC31D2D1474B471D251D71446C87430F6D6A837DF7ADD960F7DD63
1BECB28BB4D34E2AEFB5978A975CA2CC279F246DF015F75E847E6F6FF7EF13F2
5AFA871F947FE001E9F4D3A5134E88E5F8E36339EE38E9D863635B1C7964CD0E
071D241D7040CD065DBBC671B0DB6EB10D76DC51DA7E7B69E79D95BFE106A5A7
4C69C293702CBA2C02BFF7A9D4ADD8E75F7CA1E26DB749279D249D7C725361DF
8927C67648DA807CC0069E0BE66F75E92275EE1CE741C78ED20E3B48DB6E2B6D
BDB58AE79DA7CC471F853698830DFE44BFB7B1FB9DEE7E4F353428FBE18792E9
A5534E914E3D35CE7762C085FF39862DDC0EE40539E171E0B9D0AD5B6C036200
1B54F240DB6D276DB38DB4F9E6D1BEEC881161BD28A5D3E9EE70516BE38777C8
3DB73FD84B975E1AE303EB199692DDBB4B679E5913FE673F7648DAC0E3C0F920
CC03B82019035B6E296DB699CA162BD937DE08E36012BAB5768D33EC9F85315F
F5BBE386F3AC9EE9DC736BC2FF56E7A2E356F774E79DD2C081D28001D23DF748
77DD25F5EB17DBC4F3002E240F9C0BE1016260ABADA42DB69036DE388A8B8CD9
3FAC0BA6E36AAD85DF6AEF3F42AE2B1AC757FDEED8C17BFEF9D20517D484FFD9
CFF1175E90162CD06FB66C567AE699DFC680F30039000F9203C4C0A69B4A1B6E
A8A2DD373D7972D506F420F461ADC0775D2BBD4D749F88E7E135F21DDF3B76F0
5E749164FD4C24175F1CFFDFB3A7F4F4D335BC33674A336648D60BCAEA7B757B
F0C1980FE001AF87D402CF01C76F3910C5C0061B287FD555611E4C315DBBD41B
BFF5B403BCAFA3BE473E2797C9697C4F8CE367C76E355BBD7AC502F6871E928C
2BA3ED9B6F24AB65BAFA6AE9CA2B63B15E38DAACEFD32DB7D46A81F74456FFA2
1C8003C801C7BFFEFA11270635A164BAF6AFF75AC6FBF9D4AC59719DA3B6831F
3BC071F8FE8A2BA4471E911E7D54B25E574386C4F2E493B598FFEA2BE9BAEB62
9B613B6288BCC746D8958D73E1859B6F8E79C1FA405D7B6D6C27E2C2EA605407
36D924F2BFD65D5705E397A04FCC98CEEBD531EF7B55F9DE7ADA325CD61CFE17
5F94CA65B5B8653212B6E35CBEE331E4B5E0724BDD54AAE5EF974AD2C30FC7F8
E1C00A0780BF6CDC9809EA81E9DCB35EEB77D6A17EDD029C8DAEE89CC43F7E7C
AC672E27FDF45353318ED2FDF7C7FC90C48F2DBD16E26FEACAF7DFC7F2DD77B1
603BB6D75F8F3920C4BF9EB97AADB554E8DD3BAC0523AC1EAE598F7AEFBCC73A
2ED299FE0DFCC46E98FFF4416C5F7E29DD71475CE7A86DFCBDF1C69813C06F7C
A5A143255BE7C9D6377AE289B82E829F3502D7733B79DD1C37EE77F1B33F5837
4E31DD3BFF51FCB95CEE3CEFF5B2A347C7BD0A7D1BFD3C7D8CD77EF474FC1F7F
1CE7B3F31FB8E1C43E7DA4E1C39BAF7FF877D8B0D8AEF4C3B6FE8B72DDFBA091
23FF37FEB5D796D65843593BEE6B0374FFA3F82B33ABE89A8D70196B587C441F
EF39E03160DC106DC6C5511DA0F6791DC40ED47E7298ADB1519A3A55B2F54CF4
D9F3FBA9A7621BFFBFF8F1BFE16FB4B80B6AE1C03AE01FE1731B6617D17A05FD
C8016C400C380F788CC203C91E88BA80DFC1F8E9A7B13D881DBECF716C562CC6
7170EBADB51EC8D742D6EF2F0CFE82F9813CADE01F5E07FC51AFCFCC8AB94DD4
A7D39F90ABCE0360A00F1A3B36D6913C48F6C09E1B7019751FEC5EFBB023F620
16D8E0049F8B3487DFF99FFA97C05FB4D84CDB3D7C4D5007FCD11A97191D33AB
A83FC506C40036F05A800DC68C8975240F926B20AF6BCF3D57C30EEFFB7A989C
8213D9E893BCFFF3FE27893F51FFD5A183B4FAEA2A99DDD2C6BF15FCBFD4017F
63847FC284684E17AD4FB00131E05CE83670FCC441720D9CCFC7C71E7FBC861D
0EF55900BC426D776E08D780F4BF56DBABF8C3FE2F89DFE225FDD9678E3F5707
FCF908BFD9B4841F894B6C00473B17782E8C1A15EB881D9273107A7DB637DF8C
FD9F9C83F097DAE039929C8338FED75EABAD7F36DA28EE7FD759475AD34AFD6A
ABA964F112E06FAC03FE79117EEB5B23FFE317B889991536F03840FFF7DF8F75
A44EFADCCBE760E8CD367B76DC0B24E7607002C73C479273B010BFE73EF883DA
17E137FDD2D63F55F0CFAB03FE4911FE69D3A2197594936E03CF05E7C4F7DE8B
75240EC0475EB8C09DF4736CE9741CEB60A6171A3CB8C60FD444D6923EFFF1F9
87C7C6ABAFC6B91FC67E85FBB4CA2A2A9A3DD3769F0AFE8975AB7F56530AE88A
5E6E03CF05B7C1BBEFC63A1207F019828F9D27E9039D07A875F493ACF7F8EC79
4F6C706DB0E37BD67DACFD43FCE43EBE073FB14FEE9BEFC15F30DE09EADF1B7F
14BFF5D103BD9FC8E133B8184E223EC95178DA63E19D77621DB103DC404C84C2
3ED6881CFFF9E7D81608714FCD23BEC879E73C9FFD31F780F7D85E79A569DD23
F62BB9AF955756CE6C1CF43F03EAD0FF9E53ED7FE9D789476C401CA02B36F058
E0381B7620261038C2C5F7911BF4C2F89A3900FD31F1E3D87DE6E5330FE65E21
7E5FF73BEF57621FFC41FF5B30DDCFAAC3FAA7336B89E89AD60396F133BAE11F
62143B100BE4043EF4FA4F0EFB2CD0C5F7B15608E7A2D447FA279F8D7A6DF419
3179E4DCF2F2CBCDFBBE7D7B952D2FE6D766C2934DF74E75C0BF3A7D6475FD8B
CF88496C402C60037C86EFA86DCE6FAC77117A3A17DF9714E641A158AF1509B3
126492B57176EF2A7EAF79F09ED57CADBAAAD4AE9DF2164741EC0F47F73ACD3F
7A56E71FE60766CFD12C8AF8743B10B3CC7C7C7DD31A1BD7BEEFBE1AE7277C9F
B11E31987F5C5CC7B9F7DA76CD54540766CE5481793F9C446E120B6E0772F89A
6BE2F916332B84FC76F17D08E720CCB5F80EB5B06FDFB81EC291CC82A899F004
F7637DC07A92FB79DCE3FB4ADE172C8782F957CA74AEEBBB13994CA6BFF36086
F51B3E671609376107E2C16D41CDC21E1E1BA1F87ECEE15CBEC3779DE72ACFB9
A21ECF7B7CAF759EF3955E378A7BC3CEBE70FE69BADEDD0ACF7D78C63DB93AFF
662D8C9EAC45DD0E1E136E0BB74728BE9F73FCD926C235B8963FDFA0C67B8FEB
D8BDD6C3F760B7B8077FDE6225987B7D83AEADF4CCB377F5F987F56945D6EDF8
085FA137FA27EDD19C70CC7DCDF9D8D171733D7053E3E079AF7349BF83DD38AF
68F522F1FCA34F6B3CFFA8CC42DBDB3D3EAE3EFF220F88637C85EED8C16D0126
8F8FA4F831CEE37CC7CD7588F796B0877E37ECC444F8FCCBE423D37195567EFE
D9C9EE33A15A0F5E7A4965B81F9DF11B1810F080AB2571BC7CC73113EB8EDBE3
DD793EE1F7B27D2F6BEBA400FB97F5A8F70BF3BE8BE5C16976BF72946FBFFCA2
1CCFACD01B01070226B035271C0B317B8E7B9EBBCF5BC0AE955652EEDE7B95B2
1EBA82BDFC673DFF0EEAC1CDE13B5E796A1898F01D0216B74973E278DDD760C6
DF1EEB8EBBB2AE8978BE6DDBE873BE67CFD0EF19745904EFBF74B0FB3E59E543
EBD78AF4AF6040C08380AD39F1E38E195F3BEECA5A3EE4787CAE155754D1D651
BC3757E5A04CE6DFA6CB5A8BE21DA07C3EDFD6EACD7BD55CF8F65B9558078001
2C6072718C2E1C0FF13A66F7B7C73A3E37DC6AD34625ABAD01D773CFD1A643BB
45F9FE576363E39E6683EAFB5FD9E79F8F9EC545B18B38B6A4F8F110B3C7B9C7
3A3E5F6185087BD9722BFBECB34DDEFFB2F55DB7C5E11D40B3413766ADD51ACC
FC0A7F3B26845846C27DF8D8E3DB7D5D89F308F7F24667CB2D171D5B30746898
F373B9E7E2F4FEE7BC79F3AE878BFC9DA83CBD7C655DD6AC80D5F18698CDD755
DCCB2E1BFD9FB7FE9F6BFABBB00D0D0DFD16C3F79D57B498FC67950B6C2D82DE
1126047C8ED105AC8E37C4BCCC3255C9F7E8A1D4F4E9619DBBD5EEB5D2E2FA0E
70382B80AB4AAC75C0D59C803581379404DF91F3235BF3FDA63AC5C196E6A3B7
ABF569ECD8D8062D606C113BEF768D1E5DC56ED77C876B2F09EFC1DB1A84B562
43F5FD489EFB12EF0B8BDF72223B6C5898F3F3ED9A5D9604ECC15AF12453FBA7
EAEC78D0A0980F7F0FBB9D931B38308CF9D976AD5397B4DF7F584FD6D6F4EE57
C5316386F2BD7BFF2E7E7A5BCEADF613D9EC4D76AD764B1AFE609D30C49F21CE
9F3B377A3E1D715F12BBEDA3B70D9E5DE4ADCE3DB1A4FFFEC9FAD3CD0CCB5B55
3E1C37AE593E2C75ECA8CC9831618FF3AED96EF3A5E1376066830DFC3D8AC806
E3C7ABCCDAA7829DCFD8259C61D977365E9A7E0767BDFAC9866B66950F7917AE
D2F7C38D01F699D6DB9EB234FE16D06A1873939CBF4F941B3040B9BBEF0E733E
677CD77D29FE2D641BC3F850F5B713B36645E2736BF3FDBF386769FE3DA8F5AF
6B5A2FF778F2377EB66F08C7FE0ABF89359C1B99AF2705393F897D7FA5DF051B
DE4EE6F397103EFF157F1BCD73456451EAF05F043D2AB1
}
end
end

View File

@ -0,0 +1,158 @@
unit Main;
{$mode objfpc}{$H+}
interface
uses
SysUtils, Classes,
Graphics, Forms, Controls, StdCtrls, ExtCtrls, Dialogs, LCLType,
mvMapViewer, mvPluginCommon, mvPlugins, mvGPSObj, mvGeoMath, mvTypes;
type
{ TMainForm }
TMainForm = class(TForm)
Bevel1: TBevel;
cgPointTypes: TCheckGroup;
Label1: TLabel;
Label2: TLabel;
Panel1: TPanel;
POI_Images: TImageList;
MapView: TMapView;
PluginManager: TMvPluginManager;
procedure cgPointTypesItemClick(Sender: TObject; Index: integer);
procedure FormCreate(Sender: TObject);
private
Plugin: TMarkerClickPlugin;
procedure MarkerClickHandler({%H-}AMapView: TMapView; APoint: TGPSPoint);
public
end;
var
MainForm: TMainForm;
implementation
{$R *.lfm}
{ TMainForm }
procedure TMainForm.FormCreate(Sender: TObject);
// GPS markers are identified by the cross
procedure AddGPSMarker(const ALon, ALat: Double;
ACaption: String);
var
gpsPt: TGpsPointOfInterest;
begin
gpsPt := TGpsPointOfInterest.Create(ALon,ALat);
try
gpsPt.Name := ACaption;
gpsPt.ImageIndex := -1;
MapView.GPSItems.Add(gpsPt, 100);
gpsPt := Nil;
finally
if Assigned(gpsPt) then
gpsPt.Free;
end;
end;
// Map markers are identified by an icon.
procedure AddMapMarker(const ALon, ALat: Double; ACaption: String);
var
layer: TMapLayer;
pt: TMapPointOfInterest;
begin
if MapView.Layers.Count = 0 then
layer := MapView.Layers.Add as TMapLayer
else
layer := MapView.Layers[0];
pt := layer.PointsOfInterest.Add as TMapPointOfInterest;
pt.Latitude := ALat;
pt.Longitude := ALon;
pt.Caption := ACaption;
pt.ImageIndex := 0;
end;
procedure AddGPSTrack(const APoints: TRealPointArray);
var
track: TGPSTrack;
i: Integer;
begin
track := TGPSTrack.Create;
for i := 0 to High(APoints) do
track.Points.Add(TGPSPoint.CreateFrom(APoints[i]));
track.LineColor := clRed;
track.LineWidth := 1.0;
MapView.GPSItems.Add(track, 200);
end;
procedure AddMapTrack(const APoints: TRealPointArray);
var
layer: TMapLayer;
track: TMapTrack;
i: Integer;
begin
if MapView.Layers.Count =0 then
layer := MapView.Layers.Add as TMapLayer
else
layer := MapView.Layers[0];
track := layer.Tracks.Add as TMapTrack;
track.Caption := 'Test track';
track.LineColor := clBlue;
track.LineWidth := 0.8;
for i := 0 to High(APoints) do
TMapTrackPoint(track.Points.Add).RealPoint := APoints[i];
end;
var
i: Integer;
begin
MapView.Active := true;
AddGPSMarker( 0.0000000, 51.4825766, 'Greenwich');
AddGPSMarker( 2.2945500, 48.8582300, 'Tour d´Eiffel, Paris');
AddGPSMarker( -79.3884000, 43.6439500, 'CN Tower, Toronto');
AddMapMarker(-157.7739800, 21.2716900, 'Kahala Avenue, Honolulu');
AddMapMarker( 114.1497900, 22.2708100, 'The Peak, Hong Kong');
AddMapMarker( 13.377778, 52.5163890, 'Brandenburger Tor, Berlin');
AddGPSTrack([RealPoint(-20,20), RealPoint(20, 0), RealPoint(-20,-20)]);
AddMapTrack([RealPoint(20,20), RealPoint(-20,0), RealPoint(20,-20)]);
Plugin := TMarkerClickPlugin.Create(PluginManager);
Plugin.OnMarkerClick := @MarkerClickHandler;
for i := 0 to cgPointTypes.Items.Count-1 do
cgPointTypes.Checked[i] := true;
end;
procedure TMainForm.cgPointTypesItemClick(Sender: TObject; Index: integer);
var
pointTypes: TMvPointTypes;
begin
pointTypes := Plugin.PointTypes;
if cgPointTypes.Checked[Index] then
Include(pointTypes, TMvPointType(Index))
else
Exclude(pointtypes, TMvPointType(Index));
Plugin.PointTypes := pointTypes;
end;
procedure TMainForm.MarkerClickHandler(AMapView: TMapView; APoint: TGPSPoint);
var
s, sName, sLat, sLon: String;
begin
sName := APoint.Name;
sLat := ' Latitude ' + LatToStr(APoint.Lat, true);
sLon := ' Longitude ' + LonToStr(APoint.Lon, true);
s := sLat + Lineending + sLon;
if sName <> '' then
s := sName + LineEnding + s;
ShowMessage(s);
end;
end.

View File

@ -136,6 +136,25 @@ type
end;
{ TMarkerClickPlugin }
TMarkerClickEvent = procedure (AMapView: TMapView; APoint: TGPSPoint) of object;
TMarkerClickPlugin = class(TMvMarkerPlugin)
private
FShift: TShiftState;
FOnMarkerClick: TMarkerClickEvent;
protected
procedure MouseDown(AMapView: TMapView; {%H-}Button: TMouseButton;
AShift: TShiftState; X,Y: Integer; var Handled: Boolean); override;
public
constructor Create(AOwner: TComponent); override;
published
property Shift: TShiftState read FShift write FShift default [ssLeft];
property OnMarkerClick: TMarkerClickEvent read FOnMarkerClick write FOnMarkerClick;
end;
{ TMarkerHintPlugin }
TMarkerCreateHintWindowEvent = procedure(AMapView: TMapView;
@ -162,7 +181,7 @@ type
protected
function CreateHintWindow(AMapView: TMapView): THintWindow; virtual;
procedure HideHint; virtual;
procedure MouseMove(AMapView: TMapView; AShift: TShiftState; X,Y: Integer;
procedure MouseMove(AMapView: TMapView; {%H-}AShift: TShiftState; X,Y: Integer;
var Handled: Boolean); override;
public
constructor Create(AOwner: TComponent); override;
@ -904,6 +923,31 @@ begin
end;
{ TMarkerClickPlugin }
constructor TMarkerClickPlugin.Create(AOwner: TComponent);
begin
inherited;
FShift := [ssLeft];
end;
procedure TMarkerClickPlugin.MouseDown(AMapView: TMapView; Button: TMouseButton;
AShift: TShiftState; X, Y: Integer; var Handled: Boolean);
var
gpsPoint: TGPSPoint;
begin
if Handled then
exit;
gpsPoint := FindNearestMarker(AMapView, X, Y);
if Assigned(FOnMarkerClick) and (AShift = FShift) then
begin
FOnMarkerClick(AMapView, gpsPoint);
Handled := true;
end;
end;
{ TMarkerHintPlugin }
constructor TMarkerHintPlugin.Create(AOwner: TComponent);
@ -1286,6 +1330,7 @@ initialization
RegisterPluginClass(TTileInfoPlugin, 'Tile info');
RegisterPluginClass(TLegalNoticePlugin, 'Legal notice');
RegisterPluginClass(TLinkedMapsPlugin, 'Linked maps');
RegisterPluginClass(TMarkerClickPlugin, 'Marker click');
RegisterPluginClass(TMarkerHintPlugin, 'Marker hint');
RegisterPluginClass(TDraggableMarkerPlugin, 'Draggable marker');
RegisterPluginClass(TUserDefinedPlugin, 'User-defined');