mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2024-11-29 07:24:13 +01:00
Addition of qmapcontrol (http://www.medieninf.de/qmapcontrol/) to GCS code base
git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@288 ebee16cc-31ac-478f-84a7-5cbb03baadba
This commit is contained in:
parent
c8ab912b75
commit
b979ff5ecb
340
ground/src/libs/qmapcontrol/COPYING
Normal file
340
ground/src/libs/qmapcontrol/COPYING
Normal file
@ -0,0 +1,340 @@
|
|||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||||
|
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Library General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
this service if you wish), that you receive source code or can get it
|
||||||
|
if you want it, that you can change the software or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if you
|
||||||
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
|
you have. You must make sure that they, too, receive or can get the
|
||||||
|
source code. And you must show them these terms so they know their
|
||||||
|
rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
|
distribute and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, so
|
||||||
|
that any problems introduced by others will not reflect on the original
|
||||||
|
authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software
|
||||||
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running the Program is not restricted, and the output from the Program
|
||||||
|
is covered only if its contents constitute a work based on the
|
||||||
|
Program (independent of having been made by running the Program).
|
||||||
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
|
source code as you receive it, in any medium, provided that you
|
||||||
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
|
notices that refer to this License and to the absence of any warranty;
|
||||||
|
and give any other recipients of the Program a copy of this License
|
||||||
|
along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
|
of it, thus forming a work based on the Program, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program
|
||||||
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
|
under Section 2) in object code or executable form under the terms of
|
||||||
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
|
source code, which must be distributed under the terms of Sections
|
||||||
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, complete source
|
||||||
|
code means all the source code for all modules it contains, plus any
|
||||||
|
associated interface definition files, plus the scripts used to
|
||||||
|
control compilation and installation of the executable. However, as a
|
||||||
|
special exception, the source code distributed need not include
|
||||||
|
anything that is normally distributed (in either source or binary
|
||||||
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component
|
||||||
|
itself accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering
|
||||||
|
access to copy from a designated place, then offering equivalent
|
||||||
|
access to copy the source code from the same place counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
|
except as expressly provided under this License. Any attempt
|
||||||
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
|
void, and will automatically terminate your rights under this License.
|
||||||
|
However, parties who have received copies, or rights, from you under
|
||||||
|
this License will not have their licenses terminated so long as such
|
||||||
|
parties remain in full compliance.
|
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
|
these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties to
|
||||||
|
this License.
|
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Program at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Program by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under
|
||||||
|
any particular circumstance, the balance of the section is intended to
|
||||||
|
apply and the section as a whole is intended to apply in other
|
||||||
|
circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system, which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Program under this License
|
||||||
|
may add an explicit geographical distribution limitation excluding
|
||||||
|
those countries, so that distribution is permitted only in or among
|
||||||
|
countries not thus excluded. In such case, this License incorporates
|
||||||
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program
|
||||||
|
specifies a version number of this License which applies to it and "any
|
||||||
|
later version", you have the option of following the terms and conditions
|
||||||
|
either of that version or of any later version published by the Free
|
||||||
|
Software Foundation. If the Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
|
programs whose distribution conditions are different, write to the author
|
||||||
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
|
of preserving the free status of all derivatives of our free software and
|
||||||
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) year name of author
|
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, the commands you use may
|
||||||
|
be called something other than `show w' and `show c'; they could even be
|
||||||
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program into
|
||||||
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
consider it more useful to permit linking proprietary applications with the
|
||||||
|
library. If this is what you want to do, use the GNU Library General
|
||||||
|
Public License instead of this License.
|
165
ground/src/libs/qmapcontrol/COPYING.LESSER
Normal file
165
ground/src/libs/qmapcontrol/COPYING.LESSER
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
|
||||||
|
This version of the GNU Lesser General Public License incorporates
|
||||||
|
the terms and conditions of version 3 of the GNU General Public
|
||||||
|
License, supplemented by the additional permissions listed below.
|
||||||
|
|
||||||
|
0. Additional Definitions.
|
||||||
|
|
||||||
|
As used herein, "this License" refers to version 3 of the GNU Lesser
|
||||||
|
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
||||||
|
General Public License.
|
||||||
|
|
||||||
|
"The Library" refers to a covered work governed by this License,
|
||||||
|
other than an Application or a Combined Work as defined below.
|
||||||
|
|
||||||
|
An "Application" is any work that makes use of an interface provided
|
||||||
|
by the Library, but which is not otherwise based on the Library.
|
||||||
|
Defining a subclass of a class defined by the Library is deemed a mode
|
||||||
|
of using an interface provided by the Library.
|
||||||
|
|
||||||
|
A "Combined Work" is a work produced by combining or linking an
|
||||||
|
Application with the Library. The particular version of the Library
|
||||||
|
with which the Combined Work was made is also called the "Linked
|
||||||
|
Version".
|
||||||
|
|
||||||
|
The "Minimal Corresponding Source" for a Combined Work means the
|
||||||
|
Corresponding Source for the Combined Work, excluding any source code
|
||||||
|
for portions of the Combined Work that, considered in isolation, are
|
||||||
|
based on the Application, and not on the Linked Version.
|
||||||
|
|
||||||
|
The "Corresponding Application Code" for a Combined Work means the
|
||||||
|
object code and/or source code for the Application, including any data
|
||||||
|
and utility programs needed for reproducing the Combined Work from the
|
||||||
|
Application, but excluding the System Libraries of the Combined Work.
|
||||||
|
|
||||||
|
1. Exception to Section 3 of the GNU GPL.
|
||||||
|
|
||||||
|
You may convey a covered work under sections 3 and 4 of this License
|
||||||
|
without being bound by section 3 of the GNU GPL.
|
||||||
|
|
||||||
|
2. Conveying Modified Versions.
|
||||||
|
|
||||||
|
If you modify a copy of the Library, and, in your modifications, a
|
||||||
|
facility refers to a function or data to be supplied by an Application
|
||||||
|
that uses the facility (other than as an argument passed when the
|
||||||
|
facility is invoked), then you may convey a copy of the modified
|
||||||
|
version:
|
||||||
|
|
||||||
|
a) under this License, provided that you make a good faith effort to
|
||||||
|
ensure that, in the event an Application does not supply the
|
||||||
|
function or data, the facility still operates, and performs
|
||||||
|
whatever part of its purpose remains meaningful, or
|
||||||
|
|
||||||
|
b) under the GNU GPL, with none of the additional permissions of
|
||||||
|
this License applicable to that copy.
|
||||||
|
|
||||||
|
3. Object Code Incorporating Material from Library Header Files.
|
||||||
|
|
||||||
|
The object code form of an Application may incorporate material from
|
||||||
|
a header file that is part of the Library. You may convey such object
|
||||||
|
code under terms of your choice, provided that, if the incorporated
|
||||||
|
material is not limited to numerical parameters, data structure
|
||||||
|
layouts and accessors, or small macros, inline functions and templates
|
||||||
|
(ten or fewer lines in length), you do both of the following:
|
||||||
|
|
||||||
|
a) Give prominent notice with each copy of the object code that the
|
||||||
|
Library is used in it and that the Library and its use are
|
||||||
|
covered by this License.
|
||||||
|
|
||||||
|
b) Accompany the object code with a copy of the GNU GPL and this license
|
||||||
|
document.
|
||||||
|
|
||||||
|
4. Combined Works.
|
||||||
|
|
||||||
|
You may convey a Combined Work under terms of your choice that,
|
||||||
|
taken together, effectively do not restrict modification of the
|
||||||
|
portions of the Library contained in the Combined Work and reverse
|
||||||
|
engineering for debugging such modifications, if you also do each of
|
||||||
|
the following:
|
||||||
|
|
||||||
|
a) Give prominent notice with each copy of the Combined Work that
|
||||||
|
the Library is used in it and that the Library and its use are
|
||||||
|
covered by this License.
|
||||||
|
|
||||||
|
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||||
|
document.
|
||||||
|
|
||||||
|
c) For a Combined Work that displays copyright notices during
|
||||||
|
execution, include the copyright notice for the Library among
|
||||||
|
these notices, as well as a reference directing the user to the
|
||||||
|
copies of the GNU GPL and this license document.
|
||||||
|
|
||||||
|
d) Do one of the following:
|
||||||
|
|
||||||
|
0) Convey the Minimal Corresponding Source under the terms of this
|
||||||
|
License, and the Corresponding Application Code in a form
|
||||||
|
suitable for, and under terms that permit, the user to
|
||||||
|
recombine or relink the Application with a modified version of
|
||||||
|
the Linked Version to produce a modified Combined Work, in the
|
||||||
|
manner specified by section 6 of the GNU GPL for conveying
|
||||||
|
Corresponding Source.
|
||||||
|
|
||||||
|
1) Use a suitable shared library mechanism for linking with the
|
||||||
|
Library. A suitable mechanism is one that (a) uses at run time
|
||||||
|
a copy of the Library already present on the user's computer
|
||||||
|
system, and (b) will operate properly with a modified version
|
||||||
|
of the Library that is interface-compatible with the Linked
|
||||||
|
Version.
|
||||||
|
|
||||||
|
e) Provide Installation Information, but only if you would otherwise
|
||||||
|
be required to provide such information under section 6 of the
|
||||||
|
GNU GPL, and only to the extent that such information is
|
||||||
|
necessary to install and execute a modified version of the
|
||||||
|
Combined Work produced by recombining or relinking the
|
||||||
|
Application with a modified version of the Linked Version. (If
|
||||||
|
you use option 4d0, the Installation Information must accompany
|
||||||
|
the Minimal Corresponding Source and Corresponding Application
|
||||||
|
Code. If you use option 4d1, you must provide the Installation
|
||||||
|
Information in the manner specified by section 6 of the GNU GPL
|
||||||
|
for conveying Corresponding Source.)
|
||||||
|
|
||||||
|
5. Combined Libraries.
|
||||||
|
|
||||||
|
You may place library facilities that are a work based on the
|
||||||
|
Library side by side in a single library together with other library
|
||||||
|
facilities that are not Applications and are not covered by this
|
||||||
|
License, and convey such a combined library under terms of your
|
||||||
|
choice, if you do both of the following:
|
||||||
|
|
||||||
|
a) Accompany the combined library with a copy of the same work based
|
||||||
|
on the Library, uncombined with any other library facilities,
|
||||||
|
conveyed under the terms of this License.
|
||||||
|
|
||||||
|
b) Give prominent notice with the combined library that part of it
|
||||||
|
is a work based on the Library, and explaining where to find the
|
||||||
|
accompanying uncombined form of the same work.
|
||||||
|
|
||||||
|
6. Revised Versions of the GNU Lesser General Public License.
|
||||||
|
|
||||||
|
The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the GNU Lesser General Public License from time to time. Such new
|
||||||
|
versions will be similar in spirit to the present version, but may
|
||||||
|
differ in detail to address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the
|
||||||
|
Library as you received it specifies that a certain numbered version
|
||||||
|
of the GNU Lesser General Public License "or any later version"
|
||||||
|
applies to it, you have the option of following the terms and
|
||||||
|
conditions either of that published version or of any later version
|
||||||
|
published by the Free Software Foundation. If the Library as you
|
||||||
|
received it does not specify a version number of the GNU Lesser
|
||||||
|
General Public License, you may choose any version of the GNU Lesser
|
||||||
|
General Public License ever published by the Free Software Foundation.
|
||||||
|
|
||||||
|
If the Library as you received it specifies that a proxy can decide
|
||||||
|
whether future versions of the GNU Lesser General Public License shall
|
||||||
|
apply, that proxy's public statement of acceptance of any version is
|
||||||
|
permanent authorization for you to choose that version for the
|
||||||
|
Library.
|
18
ground/src/libs/qmapcontrol/qmapcontrol.h
Normal file
18
ground/src/libs/qmapcontrol/qmapcontrol.h
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#include "src/mapcontrol.h"
|
||||||
|
#include "src/gps_position.h"
|
||||||
|
#include "src/wmsmapadapter.h"
|
||||||
|
#include "src/geometry.h"
|
||||||
|
#include "src/point.h"
|
||||||
|
#include "src/imagepoint.h"
|
||||||
|
#include "src/circlepoint.h"
|
||||||
|
#include "src/linestring.h"
|
||||||
|
#include "src/gps_position.h"
|
||||||
|
#include "src/osmmapadapter.h"
|
||||||
|
#include "src/maplayer.h"
|
||||||
|
#include "src/geometrylayer.h"
|
||||||
|
#include "src/yahoomapadapter.h"
|
||||||
|
#include "src/googlemapadapter.h"
|
||||||
|
#include "src/googlesatmapadapter.h"
|
||||||
|
#include "src/openaerialmapadapter.h"
|
||||||
|
#include "src/fixedimageoverlay.h"
|
||||||
|
#include "src/emptymapadapter.h"
|
1
ground/src/libs/qmapcontrol/qmapcontrol.pri
Normal file
1
ground/src/libs/qmapcontrol/qmapcontrol.pri
Normal file
@ -0,0 +1 @@
|
|||||||
|
QT += network
|
7
ground/src/libs/qmapcontrol/qmapcontrol.pro
Normal file
7
ground/src/libs/qmapcontrol/qmapcontrol.pro
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
######################################################################
|
||||||
|
# Automatically generated by qmake (2.01a) Thu Nov 22 09:50:33 2007
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
TEMPLATE = subdirs
|
||||||
|
|
||||||
|
SUBDIRS = src \
|
72
ground/src/libs/qmapcontrol/src/circlepoint.cpp
Normal file
72
ground/src/libs/qmapcontrol/src/circlepoint.cpp
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "circlepoint.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
CirclePoint::CirclePoint(qreal x, qreal y, int radius, QString name, Alignment alignment, QPen* pen)
|
||||||
|
: Point(x, y, name, alignment)
|
||||||
|
{
|
||||||
|
size = QSize(radius, radius);
|
||||||
|
mypixmap = new QPixmap(radius+1, radius+1);
|
||||||
|
mypixmap->fill(Qt::transparent);
|
||||||
|
QPainter painter(mypixmap);
|
||||||
|
if (pen != 0)
|
||||||
|
{
|
||||||
|
painter.setPen(*pen);
|
||||||
|
}
|
||||||
|
painter.drawEllipse(0,0,radius, radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
CirclePoint::CirclePoint(qreal x, qreal y, QString name, Alignment alignment, QPen* pen)
|
||||||
|
: Point(x, y, name, alignment)
|
||||||
|
{
|
||||||
|
int radius = 10;
|
||||||
|
size = QSize(radius, radius);
|
||||||
|
mypixmap = new QPixmap(radius+1, radius+1);
|
||||||
|
mypixmap->fill(Qt::transparent);
|
||||||
|
QPainter painter(mypixmap);
|
||||||
|
if (pen != 0)
|
||||||
|
{
|
||||||
|
painter.setPen(*pen);
|
||||||
|
}
|
||||||
|
painter.drawEllipse(0,0,radius, radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
CirclePoint::~CirclePoint()
|
||||||
|
{
|
||||||
|
delete mypixmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CirclePoint::setPen(QPen* pen)
|
||||||
|
{
|
||||||
|
mypen = pen;
|
||||||
|
mypixmap = new QPixmap(size.width()+1, size.height()+1);
|
||||||
|
mypixmap->fill(Qt::transparent);
|
||||||
|
QPainter painter(mypixmap);
|
||||||
|
painter.setPen(*pen);
|
||||||
|
painter.drawEllipse(0,0, size.width(), size.height());
|
||||||
|
}
|
||||||
|
}
|
77
ground/src/libs/qmapcontrol/src/circlepoint.h
Normal file
77
ground/src/libs/qmapcontrol/src/circlepoint.h
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CIRCLEPOINT_H
|
||||||
|
#define CIRCLEPOINT_H
|
||||||
|
|
||||||
|
#include "point.h"
|
||||||
|
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
//! Draws a circle into the map
|
||||||
|
/*! This is a conveniece class for Point.
|
||||||
|
* It configures the pixmap of a Point to draw a circle.
|
||||||
|
* A QPen could be used to change the color or line-width of the circle
|
||||||
|
*
|
||||||
|
* @author Kai Winter <kaiwinter@gmx.de>
|
||||||
|
*/
|
||||||
|
class CirclePoint : public Point
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//!
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
* @param x longitude
|
||||||
|
* @param y latitude
|
||||||
|
* @param name name of the circle point
|
||||||
|
* @param alignment alignment (Middle or TopLeft)
|
||||||
|
* @param pen QPen for drawing
|
||||||
|
*/
|
||||||
|
CirclePoint(qreal x, qreal y, QString name = QString(), Alignment alignment = Middle, QPen* pen=0);
|
||||||
|
|
||||||
|
//!
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
* @param x longitude
|
||||||
|
* @param y latitude
|
||||||
|
* @param radius the radius of the circle
|
||||||
|
* @param name name of the circle point
|
||||||
|
* @param alignment alignment (Middle or TopLeft)
|
||||||
|
* @param pen QPen for drawing
|
||||||
|
*/
|
||||||
|
CirclePoint(qreal x, qreal y, int radius = 10, QString name = QString(), Alignment alignment = Middle, QPen* pen=0);
|
||||||
|
virtual ~CirclePoint();
|
||||||
|
|
||||||
|
//! sets the QPen which is used for drawing the circle
|
||||||
|
/*!
|
||||||
|
* A QPen can be used to modify the look of the drawn circle
|
||||||
|
* @param pen the QPen which should be used for drawing
|
||||||
|
* @see http://doc.trolltech.com/4.3/qpen.html
|
||||||
|
*/
|
||||||
|
virtual void setPen(QPen* pen);
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
41
ground/src/libs/qmapcontrol/src/curve.cpp
Normal file
41
ground/src/libs/qmapcontrol/src/curve.cpp
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "curve.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
Curve::Curve(QString name)
|
||||||
|
: Geometry(name)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Curve::~Curve()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Geometry Curve::Clone(){}
|
||||||
|
|
||||||
|
// QRectF Curve::GetBoundingBox(){}
|
65
ground/src/libs/qmapcontrol/src/curve.h
Normal file
65
ground/src/libs/qmapcontrol/src/curve.h
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CURVE_H
|
||||||
|
#define CURVE_H
|
||||||
|
|
||||||
|
#include "geometry.h"
|
||||||
|
#include "point.h"
|
||||||
|
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
//! A Curve Geometry, implemented to fullfil OGC Spec
|
||||||
|
/*!
|
||||||
|
* The Curve class is used by LineString as parent class.
|
||||||
|
* This class could not be used directly.
|
||||||
|
*
|
||||||
|
* From the OGC Candidate Implementation Specification:
|
||||||
|
* "A Curve is a 1-dimensional geometric object usually stored as a sequence of Points, with the subtype of Curve
|
||||||
|
* specifying the form of the interpolation between Points. This specification defines only one subclass of Curve,
|
||||||
|
* LineString, which uses a linear interpolation between Points."
|
||||||
|
* @author Kai Winter <kaiwinter@gmx.de>
|
||||||
|
*/
|
||||||
|
class Curve : public Geometry
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
virtual ~Curve();
|
||||||
|
|
||||||
|
double Length;
|
||||||
|
|
||||||
|
// virtual Geometry Clone();
|
||||||
|
// virtual QRectF GetBoundingBox();
|
||||||
|
|
||||||
|
// virtual Point EndPoint() = 0;
|
||||||
|
// virtual Point StartPoint() = 0;
|
||||||
|
// virtual Point Value() = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Curve(QString name = QString());
|
||||||
|
virtual void draw(QPainter* painter, const MapAdapter* mapadapter, const QRect &screensize, const QPoint offset) = 0;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
117
ground/src/libs/qmapcontrol/src/emptymapadapter.cpp
Normal file
117
ground/src/libs/qmapcontrol/src/emptymapadapter.cpp
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "emptymapadapter.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
EmptyMapAdapter::EmptyMapAdapter(int tileSize, int minZoom, int maxZoom)
|
||||||
|
:MapAdapter("", "", 256, minZoom, maxZoom)
|
||||||
|
{
|
||||||
|
PI = acos(-1.0);
|
||||||
|
|
||||||
|
numberOfTiles = tilesonzoomlevel(minZoom);
|
||||||
|
}
|
||||||
|
|
||||||
|
EmptyMapAdapter::~EmptyMapAdapter()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void EmptyMapAdapter::zoom_in()
|
||||||
|
{
|
||||||
|
if (current_zoom < max_zoom)
|
||||||
|
{
|
||||||
|
current_zoom = current_zoom + 1;
|
||||||
|
}
|
||||||
|
numberOfTiles = tilesonzoomlevel(current_zoom);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EmptyMapAdapter::zoom_out()
|
||||||
|
{
|
||||||
|
if (current_zoom > min_zoom)
|
||||||
|
{
|
||||||
|
current_zoom = current_zoom - 1;
|
||||||
|
}
|
||||||
|
numberOfTiles = tilesonzoomlevel(current_zoom);
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal EmptyMapAdapter::deg_rad(qreal x) const
|
||||||
|
{
|
||||||
|
return x * (PI/180.0);
|
||||||
|
}
|
||||||
|
qreal EmptyMapAdapter::rad_deg(qreal x) const
|
||||||
|
{
|
||||||
|
return x * (180/PI);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString EmptyMapAdapter::query(int x, int y, int z) const
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
QPoint EmptyMapAdapter::coordinateToDisplay(const QPointF& coordinate) const
|
||||||
|
{
|
||||||
|
qreal x = (coordinate.x()+180) * (numberOfTiles*mytilesize)/360.; // coord to pixel!
|
||||||
|
qreal y = (1-(log(tan(PI/4+deg_rad(coordinate.y())/2)) /PI)) /2 * (numberOfTiles*mytilesize);
|
||||||
|
|
||||||
|
return QPoint(int(x), int(y));
|
||||||
|
}
|
||||||
|
|
||||||
|
QPointF EmptyMapAdapter::displayToCoordinate(const QPoint& point) const
|
||||||
|
{
|
||||||
|
qreal longitude = (point.x()*(360/(numberOfTiles*mytilesize)))-180;
|
||||||
|
qreal latitude = rad_deg(atan(sinh((1-point.y()*(2/(numberOfTiles*mytilesize)))*PI)));
|
||||||
|
|
||||||
|
return QPointF(longitude, latitude);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EmptyMapAdapter::isValid(int x, int y, int z) const
|
||||||
|
{
|
||||||
|
if (max_zoom < min_zoom)
|
||||||
|
{
|
||||||
|
z= min_zoom - z;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (x<0 || x>pow(2,z)-1 ||
|
||||||
|
y<0 || y>pow(2,z)-1)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
int EmptyMapAdapter::tilesonzoomlevel(int zoomlevel) const
|
||||||
|
{
|
||||||
|
return int(pow(2, zoomlevel));
|
||||||
|
}
|
||||||
|
int EmptyMapAdapter::xoffset(int x) const
|
||||||
|
{
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
int EmptyMapAdapter::yoffset(int y) const
|
||||||
|
{
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
}
|
73
ground/src/libs/qmapcontrol/src/emptymapadapter.h
Normal file
73
ground/src/libs/qmapcontrol/src/emptymapadapter.h
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef EMPTYMAPADAPTER_H
|
||||||
|
#define EMPTYMAPADAPTER_H
|
||||||
|
|
||||||
|
#include "mapadapter.h"
|
||||||
|
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
//! MapAdapter which do not load map tiles.
|
||||||
|
/*!
|
||||||
|
* The EmptyMapAdapter can be used if QMapControl should not load any map tiles. This is useful if you
|
||||||
|
* only want to display an image through a FixedImageOverlay e.g.
|
||||||
|
* @author Kai Winter <kaiwinter@gmx.de>
|
||||||
|
*/
|
||||||
|
class EmptyMapAdapter : public MapAdapter
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
//! Constructor.
|
||||||
|
/*!
|
||||||
|
* @param tileSize This parameter seems unnecessary for this type of MapAdaper on first sight. But since
|
||||||
|
* this parameter defines the size of the offscreen image it could be used for a little performance
|
||||||
|
* tuning (larger offscreen-images have to be redrawed less times).
|
||||||
|
* @param minZoom the minimum zoom level
|
||||||
|
* @param maxZoom the maximum zoom level
|
||||||
|
*/
|
||||||
|
EmptyMapAdapter(int tileSize = 256, int minZoom = 0, int maxZoom = 17);
|
||||||
|
|
||||||
|
virtual ~EmptyMapAdapter();
|
||||||
|
|
||||||
|
virtual QPoint coordinateToDisplay(const QPointF&) const;
|
||||||
|
virtual QPointF displayToCoordinate(const QPoint&) const;
|
||||||
|
|
||||||
|
qreal PI;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
qreal rad_deg(qreal) const;
|
||||||
|
qreal deg_rad(qreal) const;
|
||||||
|
|
||||||
|
virtual bool isValid(int x, int y, int z) const;
|
||||||
|
virtual void zoom_in();
|
||||||
|
virtual void zoom_out();
|
||||||
|
virtual QString query(int x, int y, int z) const;
|
||||||
|
virtual int tilesonzoomlevel(int zoomlevel) const;
|
||||||
|
virtual int xoffset(int x) const;
|
||||||
|
virtual int yoffset(int y) const;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
69
ground/src/libs/qmapcontrol/src/fixedimageoverlay.cpp
Normal file
69
ground/src/libs/qmapcontrol/src/fixedimageoverlay.cpp
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2009 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "fixedimageoverlay.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
FixedImageOverlay::FixedImageOverlay(qreal x_upperleft, qreal y_upperleft, qreal x_lowerright, qreal y_lowerright, QString filename, QString name)
|
||||||
|
: ImagePoint(x_upperleft, y_upperleft, filename, name, TopLeft),
|
||||||
|
x_lowerright(x_lowerright), y_lowerright(y_lowerright)
|
||||||
|
{
|
||||||
|
//qDebug() << "loading image: " << filename;
|
||||||
|
mypixmap = new QPixmap(filename);
|
||||||
|
size = mypixmap->size();
|
||||||
|
//qDebug() << "image size: " << size;
|
||||||
|
}
|
||||||
|
|
||||||
|
FixedImageOverlay::FixedImageOverlay(qreal x_upperleft, qreal y_upperleft, qreal x_lowerright, qreal y_lowerright, QPixmap* pixmap, QString name)
|
||||||
|
: ImagePoint(x_upperleft, y_upperleft, pixmap, name, TopLeft),
|
||||||
|
x_lowerright(x_lowerright), y_lowerright(y_lowerright)
|
||||||
|
{
|
||||||
|
mypixmap = pixmap;
|
||||||
|
size = mypixmap->size();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FixedImageOverlay::draw(QPainter* painter, const MapAdapter* mapadapter, const QRect &viewport, const QPoint offset)
|
||||||
|
{
|
||||||
|
if (!visible)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (mypixmap !=0)
|
||||||
|
{
|
||||||
|
const QPointF c = QPointF(X, Y);
|
||||||
|
QPoint topleft = mapadapter->coordinateToDisplay(c);
|
||||||
|
|
||||||
|
const QPointF c2 = QPointF(x_lowerright, y_lowerright);
|
||||||
|
QPoint lowerright = mapadapter->coordinateToDisplay(c2);
|
||||||
|
|
||||||
|
painter->drawPixmap(topleft.x(), topleft.y(), lowerright.x()-topleft.x(), lowerright.y()-topleft.y(), *mypixmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
FixedImageOverlay::~FixedImageOverlay()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
80
ground/src/libs/qmapcontrol/src/fixedimageoverlay.h
Normal file
80
ground/src/libs/qmapcontrol/src/fixedimageoverlay.h
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2009 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FIXEDIMAGEOVERLAY_H
|
||||||
|
#define FIXEDIMAGEOVERLAY_H
|
||||||
|
|
||||||
|
#include "imagepoint.h"
|
||||||
|
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
|
||||||
|
//! Draws a fixed image into the map.
|
||||||
|
/*!
|
||||||
|
* This class draws a image overlay onto a map, whose upper left and lower
|
||||||
|
* right corners lay always on the given coordinates. The methods
|
||||||
|
* setBaselevel, setMaxsize and setMinsize have no effect for this class.
|
||||||
|
*
|
||||||
|
* @author Kai Winter <kaiwinter@gmx.de>
|
||||||
|
*/
|
||||||
|
class FixedImageOverlay : public ImagePoint
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//! Creates an image overlay which loads and displays the given image file
|
||||||
|
/*!
|
||||||
|
* Use this contructor to load the given image file and let the point
|
||||||
|
* display it.
|
||||||
|
* When you want multiple points to display the same image, use the
|
||||||
|
* other contructor and pass a pointer to that image.
|
||||||
|
* @param x_upperleft the coordinate of the upper left corner where the image should be aligned
|
||||||
|
* @param y_upperleft the coordinate of the upper left corner where the image should be aligned
|
||||||
|
* @param x_lowerright the coordinate of the lower right corner where the image should be aligned
|
||||||
|
* @param y_lowerright the coordinate of the lower right corner where the image should be aligned
|
||||||
|
* @param filename the file which should be loaded and displayed
|
||||||
|
* @param name the name of the image point
|
||||||
|
*/
|
||||||
|
FixedImageOverlay(qreal x_upperleft, qreal y_upperleft, qreal x_lowerright, qreal y_lowerright, QString filename, QString name = QString());
|
||||||
|
|
||||||
|
//! Creates an image overlay which displays the given image
|
||||||
|
/*!
|
||||||
|
* Use this contructor to display the given image.
|
||||||
|
* @param x_upperleft the coordinate of the upper left corner where the image should be aligned
|
||||||
|
* @param y_upperleft the coordinate of the upper left corner where the image should be aligned
|
||||||
|
* @param x_lowerright the coordinate of the lower right corner where the image should be aligned
|
||||||
|
* @param y_lowerright the coordinate of the lower right corner where the image should be aligned
|
||||||
|
* @param pixmap pointer to the image pixmap
|
||||||
|
* @param name the name of the image point
|
||||||
|
*/
|
||||||
|
FixedImageOverlay(qreal x_upperleft, qreal y_upperleft, qreal x_lowerright, qreal y_lowerright, QPixmap* pixmap, QString name = QString());
|
||||||
|
|
||||||
|
virtual void draw(QPainter* painter, const MapAdapter* mapadapter, const QRect &viewport, const QPoint offset);
|
||||||
|
virtual ~FixedImageOverlay();
|
||||||
|
|
||||||
|
private:
|
||||||
|
qreal x_lowerright;
|
||||||
|
qreal y_lowerright;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
88
ground/src/libs/qmapcontrol/src/geometry.cpp
Normal file
88
ground/src/libs/qmapcontrol/src/geometry.cpp
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "geometry.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
Geometry::Geometry(QString name)
|
||||||
|
: GeometryType("Geometry"), myparentGeometry(0), mypen(0), visible(true), myname(name)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Geometry::~Geometry()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Geometry::name() const
|
||||||
|
{
|
||||||
|
return myname;
|
||||||
|
}
|
||||||
|
Geometry* Geometry::parentGeometry() const
|
||||||
|
{
|
||||||
|
return myparentGeometry;
|
||||||
|
}
|
||||||
|
void Geometry::setParentGeometry(Geometry* geom)
|
||||||
|
{
|
||||||
|
myparentGeometry = geom;
|
||||||
|
}
|
||||||
|
bool Geometry::hasPoints() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
bool Geometry::hasClickedPoints() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
QList<Geometry*> Geometry::clickedPoints()
|
||||||
|
{
|
||||||
|
QList<Geometry*> tmp;
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Geometry::isVisible() const
|
||||||
|
{
|
||||||
|
return visible;
|
||||||
|
}
|
||||||
|
void Geometry::setVisible(bool visible)
|
||||||
|
{
|
||||||
|
this->visible = visible;
|
||||||
|
emit(updateRequest(boundingBox()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Geometry::setName(QString name)
|
||||||
|
{
|
||||||
|
myname = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Geometry::setPen(QPen* pen)
|
||||||
|
{
|
||||||
|
mypen = pen;
|
||||||
|
}
|
||||||
|
QPen* Geometry::pen() const
|
||||||
|
{
|
||||||
|
return mypen;
|
||||||
|
}
|
||||||
|
}
|
154
ground/src/libs/qmapcontrol/src/geometry.h
Normal file
154
ground/src/libs/qmapcontrol/src/geometry.h
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GEOMETRY_H
|
||||||
|
#define GEOMETRY_H
|
||||||
|
#include <QObject>
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QDebug>
|
||||||
|
#include "mapadapter.h"
|
||||||
|
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
class Point;
|
||||||
|
//! Main class for objects that should be painted in maps
|
||||||
|
/*!
|
||||||
|
* Geometry is the root class of the hierarchy. Geometry is an abstract (non-instantiable) class.
|
||||||
|
*
|
||||||
|
* This class and the derived classes Point, Curve and LineString are leant on the Simple
|
||||||
|
* Feature Specification of the Open Geospatial Consortium.
|
||||||
|
* @see www.opengeospatial.com
|
||||||
|
*
|
||||||
|
* @author Kai Winter <kaiwinter@gmx.de>
|
||||||
|
*/
|
||||||
|
class Geometry : public QObject
|
||||||
|
{
|
||||||
|
friend class LineString;
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit Geometry(QString name = QString());
|
||||||
|
virtual ~Geometry();
|
||||||
|
|
||||||
|
QString GeometryType;
|
||||||
|
|
||||||
|
//!
|
||||||
|
/*! returns true if the given Geometry is equal to this Geometry
|
||||||
|
* not implemented yet!
|
||||||
|
* @param geom The Geometry to be tested
|
||||||
|
* @return true if the given Geometry is equal to this
|
||||||
|
*/
|
||||||
|
bool Equals(Geometry* geom);
|
||||||
|
|
||||||
|
//! returns a String representation of this Geometry
|
||||||
|
/*!
|
||||||
|
* not implemented yet!
|
||||||
|
* @return a String representation of this Geometry
|
||||||
|
*/
|
||||||
|
QString toString();
|
||||||
|
|
||||||
|
//! returns the name of this Geometry
|
||||||
|
/*!
|
||||||
|
* @return the name of this Geometry
|
||||||
|
*/
|
||||||
|
QString name() const;
|
||||||
|
|
||||||
|
//! returns the parent Geometry of this Geometry
|
||||||
|
/*!
|
||||||
|
* A LineString is a composition of many Points. This methods returns the parent (the LineString) of a Point
|
||||||
|
* @return the parent Geometry of this Geometry
|
||||||
|
*/
|
||||||
|
Geometry* parentGeometry() const;
|
||||||
|
|
||||||
|
//! returns true if this Geometry is visible
|
||||||
|
/*!
|
||||||
|
* @return true if this Geometry is visible
|
||||||
|
*/
|
||||||
|
bool isVisible() const;
|
||||||
|
|
||||||
|
//! sets the name of the geometry
|
||||||
|
/*!
|
||||||
|
* @param name the new name of the geometry
|
||||||
|
*/
|
||||||
|
void setName(QString name);
|
||||||
|
|
||||||
|
//! returns the QPen which is used on drawing
|
||||||
|
/*!
|
||||||
|
* The pen is set depending on the Geometry. A CirclePoint for example takes one with the constructor.
|
||||||
|
* @return the QPen which is used for drawing
|
||||||
|
*/
|
||||||
|
QPen* pen() const;
|
||||||
|
|
||||||
|
//! returns the BoundingBox
|
||||||
|
/*!
|
||||||
|
* The bounding box in world coordinates
|
||||||
|
* @return the BoundingBox
|
||||||
|
*/
|
||||||
|
virtual QRectF boundingBox()=0;
|
||||||
|
virtual bool Touches(Point* geom, const MapAdapter* mapadapter)=0;
|
||||||
|
virtual void draw(QPainter* painter, const MapAdapter* mapadapter, const QRect &viewport, const QPoint offset)=0;
|
||||||
|
virtual bool hasPoints() const;
|
||||||
|
virtual bool hasClickedPoints() const;
|
||||||
|
virtual void setPen(QPen* pen);
|
||||||
|
virtual QList<Geometry*> clickedPoints();
|
||||||
|
virtual QList<Point*> points()=0;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Geometry* myparentGeometry;
|
||||||
|
Geometry(const Geometry& old);
|
||||||
|
Geometry& operator=(const Geometry& rhs);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QPen* mypen;
|
||||||
|
bool visible;
|
||||||
|
QString myname;
|
||||||
|
void setParentGeometry(Geometry* geom);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void updateRequest(Geometry* geom);
|
||||||
|
void updateRequest(QRectF rect);
|
||||||
|
//! This signal is emitted when a Geometry is clicked
|
||||||
|
/*!
|
||||||
|
* A Geometry is clickable, if the containing layer is clickable.
|
||||||
|
* The objects emits a signal if it gets clicked
|
||||||
|
* @param geometry The clicked Geometry
|
||||||
|
* @param point -unused-
|
||||||
|
*/
|
||||||
|
void geometryClicked(Geometry* geometry, QPoint point);
|
||||||
|
|
||||||
|
//! A Geometry emits this signal, when its position gets changed
|
||||||
|
/*!
|
||||||
|
* @param geom the Geometry
|
||||||
|
*/
|
||||||
|
void positionChanged(Geometry* geom);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
//! if visible is true, the layer is made visible
|
||||||
|
/*!
|
||||||
|
* @param visible if the layer should be visible
|
||||||
|
*/
|
||||||
|
virtual void setVisible(bool visible);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
38
ground/src/libs/qmapcontrol/src/geometrylayer.cpp
Normal file
38
ground/src/libs/qmapcontrol/src/geometrylayer.cpp
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "geometrylayer.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
GeometryLayer::GeometryLayer(QString layername, MapAdapter* mapadapter, bool takeevents)
|
||||||
|
: Layer(layername, mapadapter, Layer::GeometryLayer, takeevents)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GeometryLayer::~GeometryLayer()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
65
ground/src/libs/qmapcontrol/src/geometrylayer.h
Normal file
65
ground/src/libs/qmapcontrol/src/geometrylayer.h
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GEOMETRYLAYER_H
|
||||||
|
#define GEOMETRYLAYER_H
|
||||||
|
|
||||||
|
#include "layer.h"
|
||||||
|
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
//! GeometryLayer class
|
||||||
|
/*!
|
||||||
|
* There are two different layer types:
|
||||||
|
* - MapLayer: Displays Maps, but also Geometries. The configuration for displaying maps have to be done in the MapAdapter
|
||||||
|
* - GeometryLayer: Only displays Geometry objects.
|
||||||
|
*
|
||||||
|
* MapLayers also can display Geometry objects. The difference to the GeometryLayer is the repainting. Objects that are
|
||||||
|
* added to a MapLayer are "baken" on the map. This means, when you change it´s position for example the changes are
|
||||||
|
* not visible until a new offscreen image has been drawn. If you have "static" Geometries which won´t change their
|
||||||
|
* position this is fine. But if you want to change the objects position or pen you should use a GeometryLayer. Those
|
||||||
|
* are repainted immediately on changes.
|
||||||
|
*
|
||||||
|
* @author Kai Winter <kaiwinter@gmx.de>
|
||||||
|
*/
|
||||||
|
class GeometryLayer : public Layer
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
//! GeometryLayer constructor
|
||||||
|
/*!
|
||||||
|
* This is used to construct a map layer.
|
||||||
|
*
|
||||||
|
* @param layername The name of the Layer
|
||||||
|
* @param mapadapter The MapAdapter which does coordinate translation and Query-String-Forming
|
||||||
|
* @param takeevents Should the Layer receive MouseEvents? This is set to true by default. Setting it to false could
|
||||||
|
* be something like a "speed up hint"
|
||||||
|
*/
|
||||||
|
GeometryLayer(QString layername, MapAdapter* mapadapter, bool takeevents=true);
|
||||||
|
virtual ~GeometryLayer();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
38
ground/src/libs/qmapcontrol/src/googlemapadapter.cpp
Normal file
38
ground/src/libs/qmapcontrol/src/googlemapadapter.cpp
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "googlemapadapter.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
GoogleMapAdapter::GoogleMapAdapter()
|
||||||
|
: TileMapAdapter("mt2.google.com", "/mt?n=404&x=%2&y=%3&zoom=%1", 256, 17, 0)
|
||||||
|
//: TileMapAdapter("tile.openstreetmap.org", "/%1/%2/%3.png", 256, 0, 17)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
GoogleMapAdapter::~GoogleMapAdapter()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
51
ground/src/libs/qmapcontrol/src/googlemapadapter.h
Normal file
51
ground/src/libs/qmapcontrol/src/googlemapadapter.h
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GOOGLEMAPADAPTER_H
|
||||||
|
#define GOOGLEMAPADAPTER_H
|
||||||
|
|
||||||
|
#include "tilemapadapter.h"
|
||||||
|
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
//! MapAdapter for Google
|
||||||
|
/*!
|
||||||
|
* This is a conveniece class, which extends and configures a TileMapAdapter
|
||||||
|
* @author Kai Winter <kaiwinter@gmx.de>
|
||||||
|
*/
|
||||||
|
class GoogleMapAdapter : public TileMapAdapter
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
//! constructor
|
||||||
|
/*!
|
||||||
|
* This construct a Google Adapter
|
||||||
|
*/
|
||||||
|
GoogleMapAdapter();
|
||||||
|
virtual ~GoogleMapAdapter();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
181
ground/src/libs/qmapcontrol/src/googlesatmapadapter.cpp
Normal file
181
ground/src/libs/qmapcontrol/src/googlesatmapadapter.cpp
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "googlesatmapadapter.h"
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
GoogleSatMapAdapter::GoogleSatMapAdapter()
|
||||||
|
: TileMapAdapter("kh2.google.com", "/kh?n=404&v=8&t=trtqtt", 256, 0, 19)
|
||||||
|
{
|
||||||
|
// name = "googlesat";
|
||||||
|
|
||||||
|
numberOfTiles = pow(2, current_zoom+0.0);
|
||||||
|
coord_per_x_tile = 360. / numberOfTiles;
|
||||||
|
coord_per_y_tile = 180. / numberOfTiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
GoogleSatMapAdapter::~GoogleSatMapAdapter()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QString GoogleSatMapAdapter::getHost() const
|
||||||
|
{
|
||||||
|
int random = qrand() % 4;
|
||||||
|
return QString("kh%1.google.com").arg(random);
|
||||||
|
}
|
||||||
|
|
||||||
|
QPoint GoogleSatMapAdapter::coordinateToDisplay(const QPointF& coordinate) const
|
||||||
|
{
|
||||||
|
//double x = ((coordinate.x()+180)*(tilesize*numberOfTiles/360));
|
||||||
|
//double y = (((coordinate.y()*-1)+90)*(tilesize*numberOfTiles/180));
|
||||||
|
|
||||||
|
qreal x = (coordinate.x()+180.) * (numberOfTiles*mytilesize)/360.; // coord to pixel!
|
||||||
|
//double y = -1*(coordinate.y()-90) * (numberOfTiles*tilesize)/180.; // coord to pixel!
|
||||||
|
qreal y = (getMercatorYCoord(coordinate.y())-M_PI) * -1 * (numberOfTiles*mytilesize)/(2*M_PI); // coord to pixel!
|
||||||
|
return QPoint(int(x), int(y));
|
||||||
|
}
|
||||||
|
|
||||||
|
QPointF GoogleSatMapAdapter::displayToCoordinate(const QPoint& point) const
|
||||||
|
{
|
||||||
|
//double lon = ((point.x()/tilesize*numberOfTiles)*360)-180;
|
||||||
|
//double lat = (((point.y()/tilesize*numberOfTiles)*180)-90)*-1;
|
||||||
|
|
||||||
|
qreal lon = (point.x()*(360./(numberOfTiles*mytilesize)))-180.;
|
||||||
|
//double lat = -(point.y()*(180./(numberOfTiles*tilesize)))+90;
|
||||||
|
//qreal lat = getMercatorLatitude(point.y()*-1*(2*M_PI/(numberOfTiles*tilesize)) + M_PI);
|
||||||
|
qreal lat = lat *180./M_PI;
|
||||||
|
return QPointF(lon, lat);
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal GoogleSatMapAdapter::getMercatorLatitude(qreal YCoord) const
|
||||||
|
{
|
||||||
|
//http://welcome.warnercnr.colostate.edu/class_info/nr502/lg4/projection_mathematics/converting.html
|
||||||
|
if (YCoord > M_PI) return 9999.;
|
||||||
|
if (YCoord < -M_PI) return -9999.;
|
||||||
|
|
||||||
|
qreal t = atan(exp(YCoord));
|
||||||
|
qreal res = (2.*(t))-(M_PI/2.);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal GoogleSatMapAdapter::getMercatorYCoord(qreal lati) const
|
||||||
|
{
|
||||||
|
qreal lat = lati;
|
||||||
|
|
||||||
|
// conversion degre=>radians
|
||||||
|
qreal phi = M_PI * lat / 180;
|
||||||
|
|
||||||
|
qreal res;
|
||||||
|
//double temp = Math.Tan(Math.PI / 4 - phi / 2);
|
||||||
|
//res = Math.Log(temp);
|
||||||
|
res = 0.5 * log((1 + sin(phi)) / (1 - sin(phi)));
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GoogleSatMapAdapter::zoom_in()
|
||||||
|
{
|
||||||
|
current_zoom+=1;
|
||||||
|
numberOfTiles = pow(2, current_zoom+0.0);
|
||||||
|
coord_per_x_tile = 360. / numberOfTiles;
|
||||||
|
coord_per_y_tile = 180. / numberOfTiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GoogleSatMapAdapter::zoom_out()
|
||||||
|
{
|
||||||
|
current_zoom-=1;
|
||||||
|
numberOfTiles = pow(2, current_zoom+0.0);
|
||||||
|
coord_per_x_tile = 360. / numberOfTiles;
|
||||||
|
coord_per_y_tile = 180. / numberOfTiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GoogleSatMapAdapter::isValid(int x, int y, int z) const
|
||||||
|
{
|
||||||
|
if ((x>=0 && x < numberOfTiles) && (y>=0 && y < numberOfTiles) && z>=0)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
QString GoogleSatMapAdapter::query(int i, int j, int z) const
|
||||||
|
{
|
||||||
|
return getQ(-180+i*coord_per_x_tile,
|
||||||
|
90-(j+1)*coord_per_y_tile, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString GoogleSatMapAdapter::getQ(qreal longitude, qreal latitude, int zoom) const
|
||||||
|
{
|
||||||
|
qreal xmin=-180;
|
||||||
|
qreal xmax=180;
|
||||||
|
qreal ymin=-90;
|
||||||
|
qreal ymax=90;
|
||||||
|
|
||||||
|
qreal xmoy=0;
|
||||||
|
qreal ymoy=0;
|
||||||
|
QString location="t";
|
||||||
|
|
||||||
|
//Google uses a latitude divided by 2;
|
||||||
|
qreal halflat = latitude;
|
||||||
|
|
||||||
|
for (int i = 0; i < zoom; i++)
|
||||||
|
{
|
||||||
|
xmoy = (xmax + xmin) / 2;
|
||||||
|
ymoy = (ymax + ymin) / 2;
|
||||||
|
if (halflat >= ymoy) //upper part (q or r)
|
||||||
|
{
|
||||||
|
ymin = ymoy;
|
||||||
|
if (longitude < xmoy)
|
||||||
|
{ /*q*/
|
||||||
|
location+= "q";
|
||||||
|
xmax = xmoy;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{/*r*/
|
||||||
|
location+= "r";
|
||||||
|
xmin = xmoy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else //lower part (t or s)
|
||||||
|
{
|
||||||
|
ymax = ymoy;
|
||||||
|
if (longitude < xmoy)
|
||||||
|
{ /*t*/
|
||||||
|
|
||||||
|
location+= "t";
|
||||||
|
xmax = xmoy;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{/*s*/
|
||||||
|
location+= "s";
|
||||||
|
xmin = xmoy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return QString("/kh?n=404&v=24&t=%1").arg(location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
74
ground/src/libs/qmapcontrol/src/googlesatmapadapter.h
Normal file
74
ground/src/libs/qmapcontrol/src/googlesatmapadapter.h
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GOOGLESATMAPADAPTER_H
|
||||||
|
#define GOOGLESATMAPADAPTER_H
|
||||||
|
|
||||||
|
#include "tilemapadapter.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
//! MapAdapter for Google
|
||||||
|
/*!
|
||||||
|
* This is a conveniece class, which extends and configures a TileMapAdapter
|
||||||
|
* @author Kai Winter <kaiwinter@gmx.de>
|
||||||
|
*/
|
||||||
|
class GoogleSatMapAdapter : public TileMapAdapter
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
//! constructor
|
||||||
|
/*!
|
||||||
|
* This construct a Google Adapter
|
||||||
|
*/
|
||||||
|
GoogleSatMapAdapter();
|
||||||
|
virtual ~GoogleSatMapAdapter();
|
||||||
|
|
||||||
|
virtual QPoint coordinateToDisplay(const QPointF&) const;
|
||||||
|
virtual QPointF displayToCoordinate(const QPoint&) const;
|
||||||
|
|
||||||
|
//! returns the host of this MapAdapter
|
||||||
|
/*!
|
||||||
|
* @return the host of this MapAdapter
|
||||||
|
*/
|
||||||
|
QString getHost () const;
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void zoom_in();
|
||||||
|
virtual void zoom_out();
|
||||||
|
virtual QString query(int x, int y, int z) const;
|
||||||
|
virtual bool isValid(int x, int y, int z) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual QString getQ(qreal longitude, qreal latitude, int zoom) const;
|
||||||
|
qreal getMercatorLatitude(qreal YCoord) const;
|
||||||
|
qreal getMercatorYCoord(qreal lati) const;
|
||||||
|
|
||||||
|
qreal coord_per_x_tile;
|
||||||
|
qreal coord_per_y_tile;
|
||||||
|
int srvNum;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
33
ground/src/libs/qmapcontrol/src/gps_position.cpp
Normal file
33
ground/src/libs/qmapcontrol/src/gps_position.cpp
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "gps_position.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
GPS_Position::GPS_Position(float time, float longitude, QString longitude_dir, float latitude, QString latitude_dir)
|
||||||
|
:time(time), longitude(longitude), latitude(latitude), longitude_dir(longitude_dir), latitude_dir(latitude_dir)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
52
ground/src/libs/qmapcontrol/src/gps_position.h
Normal file
52
ground/src/libs/qmapcontrol/src/gps_position.h
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GPS_POSITION_H
|
||||||
|
#define GPS_POSITION_H
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
//! Represents a coordinate from a GPS receiver
|
||||||
|
/*!
|
||||||
|
* This class is used to represent a coordinate which has been parsed from a NMEA string.
|
||||||
|
* This is not fully integrated in the API. An example which uses this data type can be found under Samples.
|
||||||
|
* @author Kai Winter
|
||||||
|
*/
|
||||||
|
class GPS_Position
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GPS_Position(float time, float longitude, QString longitude_dir, float latitude, QString latitude_dir);
|
||||||
|
float time; /*!< time of the string*/
|
||||||
|
float longitude; /*!< longitude coordinate*/
|
||||||
|
float latitude; /*!< latitude coordinate*/
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString longitude_dir;
|
||||||
|
QString latitude_dir;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
182
ground/src/libs/qmapcontrol/src/imagemanager.cpp
Normal file
182
ground/src/libs/qmapcontrol/src/imagemanager.cpp
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "imagemanager.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
ImageManager* ImageManager::m_Instance = 0;
|
||||||
|
ImageManager::ImageManager(QObject* parent)
|
||||||
|
:QObject(parent), emptyPixmap(QPixmap(1,1)), net(new MapNetwork(this)), doPersistentCaching(false)
|
||||||
|
{
|
||||||
|
emptyPixmap.fill(Qt::transparent);
|
||||||
|
|
||||||
|
if (QPixmapCache::cacheLimit() <= 20000)
|
||||||
|
{
|
||||||
|
QPixmapCache::setCacheLimit(20000); // in kb
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ImageManager::~ImageManager()
|
||||||
|
{
|
||||||
|
if (ImageManager::m_Instance != 0)
|
||||||
|
{
|
||||||
|
delete ImageManager::m_Instance;
|
||||||
|
}
|
||||||
|
delete net;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPixmap ImageManager::getImage(const QString& host, const QString& url)
|
||||||
|
{
|
||||||
|
//qDebug() << "ImageManager::getImage";
|
||||||
|
QPixmap pm;
|
||||||
|
//pm.fill(Qt::black);
|
||||||
|
|
||||||
|
//is image cached (memory) or currently loading?
|
||||||
|
if (!QPixmapCache::find(url, pm) && !net->imageIsLoading(url))
|
||||||
|
// if (!images.contains(url) && !net->imageIsLoading(url))
|
||||||
|
{
|
||||||
|
//image cached (persistent)?
|
||||||
|
if (doPersistentCaching && tileExist(url))
|
||||||
|
{
|
||||||
|
loadTile(url,pm);
|
||||||
|
QPixmapCache::insert(url.toAscii().toBase64(), pm);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//load from net, add empty image
|
||||||
|
net->loadImage(host, url);
|
||||||
|
//QPixmapCache::insert(url, emptyPixmap);
|
||||||
|
return emptyPixmap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return pm;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPixmap ImageManager::prefetchImage(const QString& host, const QString& url)
|
||||||
|
{
|
||||||
|
#ifdef Q_WS_QWS
|
||||||
|
// on mobile devices we don´t want the display resfreshing when tiles are received which are
|
||||||
|
// prefetched... This is a performance issue, because mobile devices are very slow in
|
||||||
|
// repainting the screen
|
||||||
|
prefetch.append(url);
|
||||||
|
#endif
|
||||||
|
return getImage(host, url);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageManager::receivedImage(const QPixmap pixmap, const QString& url)
|
||||||
|
{
|
||||||
|
//qDebug() << "ImageManager::receivedImage";
|
||||||
|
QPixmapCache::insert(url, pixmap);
|
||||||
|
//images[url] = pixmap;
|
||||||
|
|
||||||
|
// needed?
|
||||||
|
if (doPersistentCaching && !tileExist(url) )
|
||||||
|
saveTile(url,pixmap);
|
||||||
|
|
||||||
|
//((Layer*)this->parent())->imageReceived();
|
||||||
|
|
||||||
|
if (!prefetch.contains(url))
|
||||||
|
{
|
||||||
|
emit(imageReceived());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifdef Q_WS_QWS
|
||||||
|
prefetch.remove(prefetch.indexOf(url));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageManager::loadingQueueEmpty()
|
||||||
|
{
|
||||||
|
emit(loadingFinished());
|
||||||
|
//((Layer*)this->parent())->removeZoomImage();
|
||||||
|
//qDebug() << "size of image-map: " << images.size();
|
||||||
|
//qDebug() << "size: " << QPixmapCache::cacheLimit();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageManager::abortLoading()
|
||||||
|
{
|
||||||
|
net->abortLoading();
|
||||||
|
}
|
||||||
|
void ImageManager::setProxy(QString host, int port)
|
||||||
|
{
|
||||||
|
net->setProxy(host, port);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageManager::setCacheDir(const QDir& path)
|
||||||
|
{
|
||||||
|
doPersistentCaching = true;
|
||||||
|
cacheDir = path;
|
||||||
|
if (!cacheDir.exists())
|
||||||
|
{
|
||||||
|
cacheDir.mkpath(cacheDir.absolutePath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ImageManager::saveTile(QString tileName,QPixmap tileData)
|
||||||
|
{
|
||||||
|
tileName.replace("/","-");
|
||||||
|
|
||||||
|
QFile file(cacheDir.absolutePath() + "/" + tileName.toAscii().toBase64());
|
||||||
|
|
||||||
|
//qDebug() << "writing: " << file.fileName();
|
||||||
|
if (!file.open(QIODevice::ReadWrite )){
|
||||||
|
qDebug()<<"error reading file";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
QByteArray bytes;
|
||||||
|
QBuffer buffer(&bytes);
|
||||||
|
buffer.open(QIODevice::WriteOnly);
|
||||||
|
tileData.save(&buffer, "PNG");
|
||||||
|
|
||||||
|
file.write(bytes);
|
||||||
|
file.close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
bool ImageManager::loadTile(QString tileName,QPixmap &tileData)
|
||||||
|
{
|
||||||
|
tileName.replace("/","-");
|
||||||
|
QFile file(cacheDir.absolutePath() + "/" + tileName.toAscii().toBase64());
|
||||||
|
if (!file.open(QIODevice::ReadOnly )) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
tileData.loadFromData( file.readAll() );
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
bool ImageManager::tileExist(QString tileName)
|
||||||
|
{
|
||||||
|
tileName.replace("/","-");
|
||||||
|
QFile file(cacheDir.absolutePath() + "/" + tileName.toAscii().toBase64());
|
||||||
|
if (file.exists())
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
125
ground/src/libs/qmapcontrol/src/imagemanager.h
Normal file
125
ground/src/libs/qmapcontrol/src/imagemanager.h
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef IMAGEMANAGER_H
|
||||||
|
#define IMAGEMANAGER_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QPixmapCache>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QMutex>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QBuffer>
|
||||||
|
#include <QDir>
|
||||||
|
#include "mapnetwork.h"
|
||||||
|
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
class MapNetwork;
|
||||||
|
/**
|
||||||
|
@author Kai Winter <kaiwinter@gmx.de>
|
||||||
|
*/
|
||||||
|
class ImageManager : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static ImageManager* instance()
|
||||||
|
{
|
||||||
|
if(!m_Instance)
|
||||||
|
{
|
||||||
|
m_Instance = new ImageManager;
|
||||||
|
}
|
||||||
|
return m_Instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
~ImageManager();
|
||||||
|
|
||||||
|
//! returns a QPixmap of the asked image
|
||||||
|
/*!
|
||||||
|
* If this component doesn´t have the image a network query gets started to load it.
|
||||||
|
* @param host the host of the image
|
||||||
|
* @param path the path to the image
|
||||||
|
* @return the pixmap of the asked image
|
||||||
|
*/
|
||||||
|
QPixmap getImage(const QString& host, const QString& path);
|
||||||
|
|
||||||
|
QPixmap prefetchImage(const QString& host, const QString& path);
|
||||||
|
|
||||||
|
void receivedImage(const QPixmap pixmap, const QString& url);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* This method is called by MapNetwork, after all images in its queue were loaded.
|
||||||
|
* The ImageManager emits a signal, which is used in MapControl to remove the zoom image.
|
||||||
|
* The zoom image should be removed on Tile Images with transparency.
|
||||||
|
* Else the zoom image stay visible behind the newly loaded tiles.
|
||||||
|
*/
|
||||||
|
void loadingQueueEmpty();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Aborts all current loading threads.
|
||||||
|
* This is useful when changing the zoom-factor, though newly needed images loads faster
|
||||||
|
*/
|
||||||
|
void abortLoading();
|
||||||
|
|
||||||
|
//! sets the proxy for HTTP connections
|
||||||
|
/*!
|
||||||
|
* This method sets the proxy for HTTP connections.
|
||||||
|
* This is not provided by the current Qtopia version!
|
||||||
|
* @param host the proxy´s hostname or ip
|
||||||
|
* @param port the proxy´s port
|
||||||
|
*/
|
||||||
|
void setProxy(QString host, int port);
|
||||||
|
|
||||||
|
//! sets the cache directory for persistently saving map tiles
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
* @param path the path where map tiles should be stored
|
||||||
|
* @todo add maximum size
|
||||||
|
*/
|
||||||
|
void setCacheDir(const QDir& path);
|
||||||
|
|
||||||
|
private:
|
||||||
|
ImageManager(QObject* parent = 0);
|
||||||
|
ImageManager(const ImageManager&);
|
||||||
|
ImageManager& operator=(const ImageManager&);
|
||||||
|
QPixmap emptyPixmap;
|
||||||
|
MapNetwork* net;
|
||||||
|
QVector<QString> prefetch;
|
||||||
|
QDir cacheDir;
|
||||||
|
bool doPersistentCaching;
|
||||||
|
|
||||||
|
static ImageManager* m_Instance;
|
||||||
|
|
||||||
|
bool saveTile(QString tileName,QPixmap tileData);
|
||||||
|
bool loadTile(QString tileName,QPixmap &tileData);
|
||||||
|
bool tileExist(QString tileName);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void imageReceived();
|
||||||
|
void loadingFinished();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
49
ground/src/libs/qmapcontrol/src/imagepoint.cpp
Normal file
49
ground/src/libs/qmapcontrol/src/imagepoint.cpp
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "imagepoint.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
ImagePoint::ImagePoint(qreal x, qreal y, QString filename, QString name, Alignment alignment)
|
||||||
|
: Point(x, y, name, alignment)
|
||||||
|
{
|
||||||
|
//qDebug() << "loading image: " << filename;
|
||||||
|
mypixmap = new QPixmap(filename);
|
||||||
|
size = mypixmap->size();
|
||||||
|
//qDebug() << "image size: " << size;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImagePoint::ImagePoint(qreal x, qreal y, QPixmap* pixmap, QString name, Alignment alignment)
|
||||||
|
: Point(x, y, name, alignment)
|
||||||
|
{
|
||||||
|
mypixmap = pixmap;
|
||||||
|
size = mypixmap->size();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ImagePoint::~ImagePoint()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
70
ground/src/libs/qmapcontrol/src/imagepoint.h
Normal file
70
ground/src/libs/qmapcontrol/src/imagepoint.h
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef IMAGEPOINT_H
|
||||||
|
#define IMAGEPOINT_H
|
||||||
|
|
||||||
|
#include "point.h"
|
||||||
|
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
|
||||||
|
//! Draws an image into the map
|
||||||
|
/*! This is a convenience class for Point.
|
||||||
|
* It configures the pixmap of a Point to draw the given image.
|
||||||
|
* The image will be loaded from the given path and written in the points pixmap.
|
||||||
|
*
|
||||||
|
* @author Kai Winter <kaiwinter@gmx.de>
|
||||||
|
*/
|
||||||
|
class ImagePoint : public Point
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//! Creates a point which loads and displays the given image file
|
||||||
|
/*!
|
||||||
|
* Use this contructor to load the given image file and let the point display it.
|
||||||
|
* When you want multiple points to display the same image, use the other contructor and pass a pointer to that image.
|
||||||
|
* @param x longitude
|
||||||
|
* @param y latitude
|
||||||
|
* @param filename the file which should be loaded and displayed
|
||||||
|
* @param name the name of the image point
|
||||||
|
* @param alignment alignment (Middle or TopLeft)
|
||||||
|
*/
|
||||||
|
ImagePoint(qreal x, qreal y, QString filename, QString name = QString(), Alignment alignment = Middle);
|
||||||
|
|
||||||
|
//! Creates a point which displays the given image
|
||||||
|
/*!
|
||||||
|
* Use this contructor to display the given image.
|
||||||
|
* You have to load that image yourself, but can use it for multiple points.
|
||||||
|
* @param x longitude
|
||||||
|
* @param y latitude
|
||||||
|
* @param pixmap pointer to the image pixmap
|
||||||
|
* @param name the name of the image point
|
||||||
|
* @param alignment alignment (Middle or TopLeft)
|
||||||
|
*/
|
||||||
|
ImagePoint(qreal x, qreal y, QPixmap* pixmap, QString name = QString(), Alignment alignment = Middle);
|
||||||
|
virtual ~ImagePoint();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
BIN
ground/src/libs/qmapcontrol/src/images/marker1.png
Normal file
BIN
ground/src/libs/qmapcontrol/src/images/marker1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 238 B |
BIN
ground/src/libs/qmapcontrol/src/images/marker2.png
Normal file
BIN
ground/src/libs/qmapcontrol/src/images/marker2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 226 B |
BIN
ground/src/libs/qmapcontrol/src/images/marker3.png
Normal file
BIN
ground/src/libs/qmapcontrol/src/images/marker3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
307
ground/src/libs/qmapcontrol/src/layer.cpp
Normal file
307
ground/src/libs/qmapcontrol/src/layer.cpp
Normal file
@ -0,0 +1,307 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "layer.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
Layer::Layer(QString layername, MapAdapter* mapadapter, enum LayerType layertype, bool takeevents)
|
||||||
|
:visible(true), mylayername(layername), mylayertype(layertype), mapAdapter(mapadapter), takeevents(takeevents), myoffscreenViewport(QRect(0,0,0,0))
|
||||||
|
{
|
||||||
|
//qDebug() << "creating new Layer: " << layername << ", type: " << contents;
|
||||||
|
//qDebug() << this->layertype;
|
||||||
|
}
|
||||||
|
|
||||||
|
Layer::~Layer()
|
||||||
|
{
|
||||||
|
delete mapAdapter;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Layer::setSize(QSize size)
|
||||||
|
{
|
||||||
|
this->size = size;
|
||||||
|
screenmiddle = QPoint(size.width()/2, size.height()/2);
|
||||||
|
//QMatrix mat;
|
||||||
|
//mat.translate(480/2, 640/2);
|
||||||
|
//mat.rotate(45);
|
||||||
|
//mat.translate(-480/2,-640/2);
|
||||||
|
//screenmiddle = mat.map(screenmiddle);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Layer::layername() const
|
||||||
|
{
|
||||||
|
return mylayername;
|
||||||
|
}
|
||||||
|
|
||||||
|
const MapAdapter* Layer::mapadapter() const
|
||||||
|
{
|
||||||
|
return mapAdapter;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Layer::setVisible(bool visible)
|
||||||
|
{
|
||||||
|
this->visible = visible;
|
||||||
|
emit(updateRequest());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Layer::addGeometry(Geometry* geom)
|
||||||
|
{
|
||||||
|
//qDebug() << geom->getName() << ", " << geom->getPoints().at(0)->getWidget();
|
||||||
|
|
||||||
|
geometries.append(geom);
|
||||||
|
emit(updateRequest(geom->boundingBox()));
|
||||||
|
//a geometry can request a redraw, e.g. when its position has been changed
|
||||||
|
connect(geom, SIGNAL(updateRequest(QRectF)),
|
||||||
|
this, SIGNAL(updateRequest(QRectF)));
|
||||||
|
}
|
||||||
|
void Layer::removeGeometry(Geometry* geometry)
|
||||||
|
{
|
||||||
|
for (int i=0; i<geometries.count(); i++)
|
||||||
|
{
|
||||||
|
if (geometry == geometries.at(i))
|
||||||
|
{
|
||||||
|
disconnect(geometry);
|
||||||
|
geometries.removeAt(i);
|
||||||
|
//delete geometry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Layer::clearGeometries()
|
||||||
|
{
|
||||||
|
foreach(Geometry *geometry, geometries){
|
||||||
|
disconnect(geometry);
|
||||||
|
}
|
||||||
|
geometries.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Layer::isVisible() const
|
||||||
|
{
|
||||||
|
return visible;
|
||||||
|
}
|
||||||
|
void Layer::zoomIn() const
|
||||||
|
{
|
||||||
|
mapAdapter->zoom_in();
|
||||||
|
}
|
||||||
|
void Layer::zoomOut() const
|
||||||
|
{
|
||||||
|
mapAdapter->zoom_out();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Layer::mouseEvent(const QMouseEvent* evnt, const QPoint mapmiddle_px)
|
||||||
|
{
|
||||||
|
if (takesMouseEvents())
|
||||||
|
{
|
||||||
|
if (evnt->button() == Qt::LeftButton && evnt->type() == QEvent::MouseButtonPress)
|
||||||
|
{
|
||||||
|
// check for collision
|
||||||
|
QPointF c = mapAdapter->displayToCoordinate(QPoint(evnt->x()-screenmiddle.x()+mapmiddle_px.x(),
|
||||||
|
evnt->y()-screenmiddle.y()+mapmiddle_px.y()));
|
||||||
|
Point* tmppoint = new Point(c.x(), c.y());
|
||||||
|
for (int i=0; i<geometries.count(); i++)
|
||||||
|
{
|
||||||
|
if (geometries.at(i)->isVisible() && geometries.at(i)->Touches(tmppoint, mapAdapter))
|
||||||
|
|
||||||
|
//if (geometries.at(i)->Touches(c, mapAdapter))
|
||||||
|
{
|
||||||
|
emit(geometryClicked(geometries.at(i), QPoint(evnt->x(), evnt->y())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete tmppoint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Layer::takesMouseEvents() const
|
||||||
|
{
|
||||||
|
return takeevents;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Layer::drawYourImage(QPainter* painter, const QPoint mapmiddle_px) const
|
||||||
|
{
|
||||||
|
if (mylayertype == MapLayer)
|
||||||
|
{
|
||||||
|
//qDebug() << ":: " << mapmiddle_px;
|
||||||
|
//QMatrix mat;
|
||||||
|
//mat.translate(480/2, 640/2);
|
||||||
|
//mat.rotate(45);
|
||||||
|
//mat.translate(-480/2,-640/2);
|
||||||
|
|
||||||
|
//mapmiddle_px = mat.map(mapmiddle_px);
|
||||||
|
//qDebug() << ":: " << mapmiddle_px;
|
||||||
|
_draw(painter, mapmiddle_px);
|
||||||
|
}
|
||||||
|
|
||||||
|
drawYourGeometries(painter, QPoint(mapmiddle_px.x()-screenmiddle.x(), mapmiddle_px.y()-screenmiddle.y()), myoffscreenViewport);
|
||||||
|
}
|
||||||
|
void Layer::drawYourGeometries(QPainter* painter, const QPoint mapmiddle_px, QRect viewport) const
|
||||||
|
{
|
||||||
|
QPoint offset;
|
||||||
|
if (mylayertype == MapLayer)
|
||||||
|
offset = mapmiddle_px;
|
||||||
|
else
|
||||||
|
offset = mapmiddle_px-screenmiddle;
|
||||||
|
|
||||||
|
painter->translate(-mapmiddle_px+screenmiddle);
|
||||||
|
for (int i=0; i<geometries.count(); i++)
|
||||||
|
{
|
||||||
|
geometries.at(i)->draw(painter, mapAdapter, viewport, offset);
|
||||||
|
}
|
||||||
|
painter->translate(mapmiddle_px-screenmiddle);
|
||||||
|
|
||||||
|
}
|
||||||
|
void Layer::_draw(QPainter* painter, const QPoint mapmiddle_px) const
|
||||||
|
{
|
||||||
|
// screen middle rotieren...
|
||||||
|
|
||||||
|
int tilesize = mapAdapter->tilesize();
|
||||||
|
int cross_x = int(mapmiddle_px.x())%tilesize; // position on middle tile
|
||||||
|
int cross_y = int(mapmiddle_px.y())%tilesize;
|
||||||
|
//qDebug() << screenmiddle << " - " << cross_x << ", " << cross_y;
|
||||||
|
|
||||||
|
// calculate how many surrounding tiles have to be drawn to fill the display
|
||||||
|
int space_left = screenmiddle.x() - cross_x;
|
||||||
|
int tiles_left = space_left/tilesize;
|
||||||
|
if (space_left>0)
|
||||||
|
tiles_left+=1;
|
||||||
|
|
||||||
|
int space_above = screenmiddle.y() - cross_y;
|
||||||
|
int tiles_above = space_above/tilesize;
|
||||||
|
if (space_above>0)
|
||||||
|
tiles_above+=1;
|
||||||
|
|
||||||
|
int space_right = screenmiddle.x() - (tilesize-cross_x);
|
||||||
|
int tiles_right = space_right/tilesize;
|
||||||
|
if (space_right>0)
|
||||||
|
tiles_right+=1;
|
||||||
|
|
||||||
|
int space_bottom = screenmiddle.y() - (tilesize-cross_y);
|
||||||
|
int tiles_bottom = space_bottom/tilesize;
|
||||||
|
if (space_bottom>0)
|
||||||
|
tiles_bottom+=1;
|
||||||
|
|
||||||
|
//int tiles_displayed = 0;
|
||||||
|
int mapmiddle_tile_x = mapmiddle_px.x()/tilesize;
|
||||||
|
int mapmiddle_tile_y = mapmiddle_px.y()/tilesize;
|
||||||
|
|
||||||
|
const QPoint from = QPoint((-tiles_left+mapmiddle_tile_x)*tilesize, (-tiles_above+mapmiddle_tile_y)*tilesize);
|
||||||
|
const QPoint to = QPoint((tiles_right+mapmiddle_tile_x+1)*tilesize, (tiles_bottom+mapmiddle_tile_y+1)*tilesize);
|
||||||
|
|
||||||
|
myoffscreenViewport = QRect(from, to);
|
||||||
|
|
||||||
|
// for the EmptyMapAdapter no tiles should be loaded and painted.
|
||||||
|
if (mapAdapter->host() == "")
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mapAdapter->isValid(mapmiddle_tile_x, mapmiddle_tile_y, mapAdapter->currentZoom()))
|
||||||
|
{
|
||||||
|
painter->drawPixmap(-cross_x+size.width(),
|
||||||
|
-cross_y+size.height(),
|
||||||
|
ImageManager::instance()->getImage(mapAdapter->host(), mapAdapter->query(mapmiddle_tile_x, mapmiddle_tile_y, mapAdapter->currentZoom())));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i=-tiles_left+mapmiddle_tile_x; i<=tiles_right+mapmiddle_tile_x; i++)
|
||||||
|
{
|
||||||
|
for (int j=-tiles_above+mapmiddle_tile_y; j<=tiles_bottom+mapmiddle_tile_y; j++)
|
||||||
|
{
|
||||||
|
// check if image is valid
|
||||||
|
if (!(i==mapmiddle_tile_x && j==mapmiddle_tile_y))
|
||||||
|
if (mapAdapter->isValid(i, j, mapAdapter->currentZoom()))
|
||||||
|
{
|
||||||
|
|
||||||
|
painter->drawPixmap(((i-mapmiddle_tile_x)*tilesize)-cross_x+size.width(),
|
||||||
|
((j-mapmiddle_tile_y)*tilesize)-cross_y+size.height(),
|
||||||
|
ImageManager::instance()->getImage(mapAdapter->host(), mapAdapter->query(i, j, mapAdapter->currentZoom())));
|
||||||
|
//if (QCoreApplication::hasPendingEvents())
|
||||||
|
// QCoreApplication::processEvents();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// PREFETCHING
|
||||||
|
int upper = mapmiddle_tile_y-tiles_above-1;
|
||||||
|
int right = mapmiddle_tile_x+tiles_right+1;
|
||||||
|
int left = mapmiddle_tile_x-tiles_right-1;
|
||||||
|
int lower = mapmiddle_tile_y+tiles_bottom+1;
|
||||||
|
|
||||||
|
int j = upper;
|
||||||
|
for (int i=left; i<=right; i++)
|
||||||
|
{
|
||||||
|
if (mapAdapter->isValid(i, j, mapAdapter->currentZoom()))
|
||||||
|
ImageManager::instance()->prefetchImage(mapAdapter->host(), mapAdapter->query(i, j, mapAdapter->currentZoom()));
|
||||||
|
}
|
||||||
|
j = lower;
|
||||||
|
for (int i=left; i<=right; i++)
|
||||||
|
{
|
||||||
|
if (mapAdapter->isValid(i, j, mapAdapter->currentZoom()))
|
||||||
|
ImageManager::instance()->prefetchImage(mapAdapter->host(), mapAdapter->query(i, j, mapAdapter->currentZoom()));
|
||||||
|
}
|
||||||
|
int i = left;
|
||||||
|
for (int j=upper+1; j<=lower-1; j++)
|
||||||
|
{
|
||||||
|
if (mapAdapter->isValid(i, j, mapAdapter->currentZoom()))
|
||||||
|
ImageManager::instance()->prefetchImage(mapAdapter->host(), mapAdapter->query(i, j, mapAdapter->currentZoom()));
|
||||||
|
}
|
||||||
|
i = right;
|
||||||
|
for (int j=upper+1; j<=lower-1; j++)
|
||||||
|
{
|
||||||
|
if (mapAdapter->isValid(i, j, mapAdapter->currentZoom()))
|
||||||
|
ImageManager::instance()->prefetchImage(mapAdapter->host(), mapAdapter->query(i, j, mapAdapter->currentZoom()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QRect Layer::offscreenViewport() const
|
||||||
|
{
|
||||||
|
return myoffscreenViewport;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Layer::moveWidgets(const QPoint mapmiddle_px) const
|
||||||
|
{
|
||||||
|
for (int i=0; i<geometries.count(); i++)
|
||||||
|
{
|
||||||
|
const Geometry* geom = geometries.at(i);
|
||||||
|
if (geom->GeometryType == "Point")
|
||||||
|
{
|
||||||
|
if (((Point*)geom)->widget()!=0)
|
||||||
|
{
|
||||||
|
QPoint topleft_relative = QPoint(mapmiddle_px-screenmiddle);
|
||||||
|
((Point*)geom)->drawWidget(mapAdapter, topleft_relative);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Layer::LayerType Layer::layertype() const
|
||||||
|
{
|
||||||
|
return mylayertype;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Layer::setMapAdapter(MapAdapter* mapadapter)
|
||||||
|
{
|
||||||
|
|
||||||
|
mapAdapter = mapadapter;
|
||||||
|
}
|
||||||
|
}
|
182
ground/src/libs/qmapcontrol/src/layer.h
Normal file
182
ground/src/libs/qmapcontrol/src/layer.h
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LAYER_H
|
||||||
|
#define LAYER_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QMouseEvent>
|
||||||
|
|
||||||
|
#include "mapadapter.h"
|
||||||
|
#include "layermanager.h"
|
||||||
|
#include "geometry.h"
|
||||||
|
#include "point.h"
|
||||||
|
|
||||||
|
#include "wmsmapadapter.h"
|
||||||
|
#include "tilemapadapter.h"
|
||||||
|
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
//! Layer class
|
||||||
|
/*!
|
||||||
|
* There are two different layer types:
|
||||||
|
* - MapLayer: Displays Maps, but also Geometries. The configuration for displaying maps have to be done in the MapAdapter
|
||||||
|
* - GeometryLayer: Only displays Geometry objects.
|
||||||
|
*
|
||||||
|
* MapLayers also can display Geometry objects. The difference to the GeometryLayer is the repainting. Objects that are
|
||||||
|
* added to a MapLayer are "baken" on the map. This means, when you change it´s position for example the changes are
|
||||||
|
* not visible until a new offscreen image has been drawn. If you have "static" Geometries which won´t change their
|
||||||
|
* position this is fine. But if you want to change the objects position or pen you should use a GeometryLayer. Those
|
||||||
|
* are repainted immediately on changes.
|
||||||
|
* You can either use this class and give a layertype on creation or you can use the classes MapLayer and GeometryLayer.
|
||||||
|
*
|
||||||
|
* @author Kai Winter <kaiwinter@gmx.de>
|
||||||
|
*/
|
||||||
|
class Layer : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
friend class LayerManager;
|
||||||
|
|
||||||
|
//! sets the type of a layer, see Layer class doc for further information
|
||||||
|
enum LayerType
|
||||||
|
{
|
||||||
|
MapLayer, /*!< uses the MapAdapter to display maps, only gets refreshed when a new offscreen image is needed */
|
||||||
|
GeometryLayer /*!< gets refreshed everytime when a geometry changes */
|
||||||
|
};
|
||||||
|
|
||||||
|
//! Layer constructor
|
||||||
|
/*!
|
||||||
|
* This is used to construct a layer.
|
||||||
|
*
|
||||||
|
* @param layername The name of the Layer
|
||||||
|
* @param mapadapter The MapAdapter which does coordinate translation and Query-String-Forming
|
||||||
|
* @param layertype The above explained LayerType
|
||||||
|
* @param takeevents Should the Layer receive MouseEvents? This is set to true by default. Setting it to false could
|
||||||
|
* be something like a "speed up hint"
|
||||||
|
*/
|
||||||
|
Layer(QString layername, MapAdapter* mapadapter, enum LayerType layertype, bool takeevents=true);
|
||||||
|
virtual ~Layer();
|
||||||
|
|
||||||
|
//! returns the layer's name
|
||||||
|
/*!
|
||||||
|
* @return the name of this layer
|
||||||
|
*/
|
||||||
|
QString layername() const;
|
||||||
|
|
||||||
|
//! returns the layer´s MapAdapter
|
||||||
|
/*!
|
||||||
|
* This method returns the MapAdapter of this Layer, which can be useful
|
||||||
|
* to do coordinate transformations.
|
||||||
|
* @return the MapAdapter which us used by this Layer
|
||||||
|
*/
|
||||||
|
const MapAdapter* mapadapter() const;
|
||||||
|
|
||||||
|
//! adds a Geometry object to this Layer
|
||||||
|
/*!
|
||||||
|
* Please notice the different LayerTypes (MapLayer and GeometryLayer) and the differences
|
||||||
|
* @param geometry the new Geometry
|
||||||
|
*/
|
||||||
|
void addGeometry(Geometry* geometry);
|
||||||
|
|
||||||
|
//! removes the Geometry object from this Layer
|
||||||
|
/*!
|
||||||
|
* This method removes a Geometry object from this Layer.
|
||||||
|
*/
|
||||||
|
void removeGeometry(Geometry* geometry);
|
||||||
|
|
||||||
|
//! removes all Geometry objects from this Layer
|
||||||
|
/*!
|
||||||
|
* This method removes all Geometry objects from this Layer.
|
||||||
|
*/
|
||||||
|
void clearGeometries();
|
||||||
|
|
||||||
|
//! return true if the layer is visible
|
||||||
|
/*!
|
||||||
|
* @return if the layer is visible
|
||||||
|
*/
|
||||||
|
bool isVisible() const;
|
||||||
|
|
||||||
|
//! returns the LayerType of the Layer
|
||||||
|
/*!
|
||||||
|
* There are two LayerTypes: MapLayer and GeometryLayer
|
||||||
|
* @return the LayerType of this Layer
|
||||||
|
*/
|
||||||
|
Layer::LayerType layertype() const;
|
||||||
|
|
||||||
|
void setMapAdapter(MapAdapter* mapadapter);
|
||||||
|
|
||||||
|
Layer& operator=(const Layer& rhs);
|
||||||
|
Layer(const Layer& old);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void moveWidgets(const QPoint mapmiddle_px) const;
|
||||||
|
void drawYourImage(QPainter* painter, const QPoint mapmiddle_px) const;
|
||||||
|
void drawYourGeometries(QPainter* painter, const QPoint mapmiddle_px, QRect viewport) const;
|
||||||
|
void setSize(QSize size);
|
||||||
|
QRect offscreenViewport() const;
|
||||||
|
bool takesMouseEvents() const;
|
||||||
|
void mouseEvent(const QMouseEvent*, const QPoint mapmiddle_px);
|
||||||
|
void zoomIn() const;
|
||||||
|
void zoomOut() const;
|
||||||
|
void _draw(QPainter* painter, const QPoint mapmiddle_px) const;
|
||||||
|
|
||||||
|
bool visible;
|
||||||
|
QString mylayername;
|
||||||
|
LayerType mylayertype;
|
||||||
|
QSize size;
|
||||||
|
QPoint screenmiddle;
|
||||||
|
|
||||||
|
QList<Geometry*> geometries;
|
||||||
|
MapAdapter* mapAdapter;
|
||||||
|
bool takeevents;
|
||||||
|
mutable QRect myoffscreenViewport;
|
||||||
|
|
||||||
|
signals:
|
||||||
|
//! This signal is emitted when a Geometry is clicked
|
||||||
|
/*!
|
||||||
|
* A Geometry is clickable, if the containing layer is clickable.
|
||||||
|
* The layer emits a signal for every clicked geometry
|
||||||
|
* @param geometry The clicked Geometry
|
||||||
|
* @param point The coordinate (in widget coordinates) of the click
|
||||||
|
*/
|
||||||
|
void geometryClicked(Geometry* geometry, QPoint point);
|
||||||
|
|
||||||
|
void updateRequest(QRectF rect);
|
||||||
|
void updateRequest();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
//! if visible is true, the layer is made visible
|
||||||
|
/*!
|
||||||
|
* @param visible if the layer should be visible
|
||||||
|
*/
|
||||||
|
void setVisible(bool visible);
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
456
ground/src/libs/qmapcontrol/src/layermanager.cpp
Normal file
456
ground/src/libs/qmapcontrol/src/layermanager.cpp
Normal file
@ -0,0 +1,456 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "layermanager.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
LayerManager::LayerManager(MapControl* mapcontrol, QSize size)
|
||||||
|
:mapcontrol(mapcontrol), scroll(QPoint(0,0)), size(size), whilenewscroll(QPoint(0,0))
|
||||||
|
{
|
||||||
|
// genauer berechnen?
|
||||||
|
offSize = size *2;
|
||||||
|
composedOffscreenImage = QPixmap(offSize);
|
||||||
|
composedOffscreenImage2 = QPixmap(offSize);
|
||||||
|
zoomImage = QPixmap(size);
|
||||||
|
zoomImage.fill(Qt::white);
|
||||||
|
screenmiddle = QPoint(size.width()/2, size.height()/2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LayerManager::~LayerManager()
|
||||||
|
{
|
||||||
|
mylayers.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
QPointF LayerManager::currentCoordinate() const
|
||||||
|
{
|
||||||
|
return mapmiddle;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPixmap LayerManager::getImage() const
|
||||||
|
{
|
||||||
|
return composedOffscreenImage;
|
||||||
|
}
|
||||||
|
|
||||||
|
Layer* LayerManager::layer() const
|
||||||
|
{
|
||||||
|
Q_ASSERT_X(mylayers.size()>0, "LayerManager::getLayer()", "No layers were added!");
|
||||||
|
return mylayers.first();
|
||||||
|
}
|
||||||
|
|
||||||
|
Layer* LayerManager::layer(const QString& layername) const
|
||||||
|
{
|
||||||
|
QListIterator<Layer*> layerit(mylayers);
|
||||||
|
while (layerit.hasNext())
|
||||||
|
{
|
||||||
|
Layer* l = layerit.next();
|
||||||
|
if (l->layername() == layername)
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<QString> LayerManager::layers() const
|
||||||
|
{
|
||||||
|
QList<QString> keys;
|
||||||
|
QListIterator<Layer*> layerit(mylayers);
|
||||||
|
while (layerit.hasNext())
|
||||||
|
{
|
||||||
|
keys.append(layerit.next()->layername());
|
||||||
|
}
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LayerManager::scrollView(const QPoint& point)
|
||||||
|
{
|
||||||
|
scroll += point;
|
||||||
|
zoomImageScroll+=point;
|
||||||
|
mapmiddle_px += point;
|
||||||
|
|
||||||
|
mapmiddle = layer()->mapadapter()->displayToCoordinate(mapmiddle_px);
|
||||||
|
if (!checkOffscreen())
|
||||||
|
{
|
||||||
|
newOffscreenImage();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
moveWidgets();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LayerManager::moveWidgets()
|
||||||
|
{
|
||||||
|
QListIterator<Layer*> it(mylayers);
|
||||||
|
while (it.hasNext())
|
||||||
|
{
|
||||||
|
it.next()->moveWidgets(mapmiddle_px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LayerManager::setView(const QPointF& coordinate)
|
||||||
|
{
|
||||||
|
mapmiddle_px = layer()->mapadapter()->coordinateToDisplay(coordinate);
|
||||||
|
mapmiddle = coordinate;
|
||||||
|
|
||||||
|
//TODO: muss wegen moveTo() raus
|
||||||
|
if (!checkOffscreen())
|
||||||
|
{
|
||||||
|
newOffscreenImage();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//TODO:
|
||||||
|
// verschiebung ausrechnen
|
||||||
|
// oder immer neues offscreenimage
|
||||||
|
newOffscreenImage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LayerManager::setView(QList<QPointF> coordinates)
|
||||||
|
{
|
||||||
|
setMiddle(coordinates);
|
||||||
|
// mapcontrol->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LayerManager::setViewAndZoomIn(const QList<QPointF> coordinates)
|
||||||
|
{
|
||||||
|
while (containsAll(coordinates))
|
||||||
|
{
|
||||||
|
setMiddle(coordinates);
|
||||||
|
zoomIn();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (!containsAll(coordinates))
|
||||||
|
{
|
||||||
|
zoomOut();
|
||||||
|
}
|
||||||
|
|
||||||
|
mapcontrol->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LayerManager::setMiddle(QList<QPointF> coordinates)
|
||||||
|
{
|
||||||
|
int sum_x = 0;
|
||||||
|
int sum_y = 0;
|
||||||
|
for (int i=0; i<coordinates.size(); i++)
|
||||||
|
{
|
||||||
|
// mitte muss in px umgerechnet werden, da aufgrund der projektion die mittebestimmung aus koordinaten ungenau ist
|
||||||
|
QPoint p = layer()->mapadapter()->coordinateToDisplay(coordinates.at(i));
|
||||||
|
sum_x += p.x();
|
||||||
|
sum_y += p.y();
|
||||||
|
}
|
||||||
|
QPointF middle = layer()->mapadapter()->displayToCoordinate(QPoint(sum_x/coordinates.size(), sum_y/coordinates.size()));
|
||||||
|
// middle in px rechnen!
|
||||||
|
|
||||||
|
setView(middle);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool LayerManager::containsAll(QList<QPointF> coordinates) const
|
||||||
|
{
|
||||||
|
QRectF bb = getViewport();
|
||||||
|
bool containsall = true;
|
||||||
|
for (int i=0; i<coordinates.size(); i++)
|
||||||
|
{
|
||||||
|
if (!bb.contains(coordinates.at(i)))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return containsall;
|
||||||
|
}
|
||||||
|
QPoint LayerManager::getMapmiddle_px() const
|
||||||
|
{
|
||||||
|
return mapmiddle_px;
|
||||||
|
}
|
||||||
|
|
||||||
|
QRectF LayerManager::getViewport() const
|
||||||
|
{
|
||||||
|
QPoint upperLeft = QPoint(mapmiddle_px.x()-screenmiddle.x(), mapmiddle_px.y()+screenmiddle.y());
|
||||||
|
QPoint lowerRight = QPoint(mapmiddle_px.x()+screenmiddle.x(), mapmiddle_px.y()-screenmiddle.y());
|
||||||
|
|
||||||
|
QPointF ulCoord = layer()->mapadapter()->displayToCoordinate(upperLeft);
|
||||||
|
QPointF lrCoord = layer()->mapadapter()->displayToCoordinate(lowerRight);
|
||||||
|
|
||||||
|
QRectF coordinateBB = QRectF(ulCoord, QSizeF( (lrCoord-ulCoord).x(), (lrCoord-ulCoord).y()));
|
||||||
|
return coordinateBB;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LayerManager::addLayer(Layer* layer)
|
||||||
|
{
|
||||||
|
mylayers.append(layer);
|
||||||
|
|
||||||
|
layer->setSize(size);
|
||||||
|
|
||||||
|
connect(layer, SIGNAL(updateRequest(QRectF)),
|
||||||
|
this, SLOT(updateRequest(QRectF)));
|
||||||
|
connect(layer, SIGNAL(updateRequest()),
|
||||||
|
this, SLOT(updateRequest()));
|
||||||
|
|
||||||
|
if (mylayers.size()==1)
|
||||||
|
{
|
||||||
|
setView(QPointF(0,0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LayerManager::newOffscreenImage(bool clearImage, bool showZoomImage)
|
||||||
|
{
|
||||||
|
// qDebug() << "LayerManager::newOffscreenImage()";
|
||||||
|
whilenewscroll = mapmiddle_px;
|
||||||
|
|
||||||
|
if (clearImage)
|
||||||
|
{
|
||||||
|
composedOffscreenImage2.fill(Qt::white);
|
||||||
|
}
|
||||||
|
|
||||||
|
QPainter painter(&composedOffscreenImage2);
|
||||||
|
if (showZoomImage)
|
||||||
|
{
|
||||||
|
painter.drawPixmap(screenmiddle.x()-zoomImageScroll.x(), screenmiddle.y()-zoomImageScroll.y(),zoomImage);
|
||||||
|
}
|
||||||
|
//only draw basemaps
|
||||||
|
for (int i=0; i<mylayers.count(); i++)
|
||||||
|
{
|
||||||
|
Layer* l = mylayers.at(i);
|
||||||
|
if (l->isVisible())
|
||||||
|
{
|
||||||
|
if (l->layertype() == Layer::MapLayer)
|
||||||
|
{
|
||||||
|
l->drawYourImage(&painter, whilenewscroll);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
composedOffscreenImage = composedOffscreenImage2;
|
||||||
|
scroll = mapmiddle_px-whilenewscroll;
|
||||||
|
|
||||||
|
mapcontrol->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LayerManager::zoomIn()
|
||||||
|
{
|
||||||
|
QCoreApplication::processEvents();
|
||||||
|
|
||||||
|
ImageManager::instance()->abortLoading();
|
||||||
|
// layer rendern abbrechen?
|
||||||
|
zoomImageScroll = QPoint(0,0);
|
||||||
|
|
||||||
|
zoomImage.fill(Qt::white);
|
||||||
|
QPixmap tmpImg = composedOffscreenImage.copy(screenmiddle.x()+scroll.x(),screenmiddle.y()+scroll.y(), size.width(), size.height());
|
||||||
|
|
||||||
|
QPainter painter(&zoomImage);
|
||||||
|
painter.translate(screenmiddle);
|
||||||
|
painter.scale(2, 2);
|
||||||
|
painter.translate(-screenmiddle);
|
||||||
|
|
||||||
|
painter.drawPixmap(0,0,tmpImg);
|
||||||
|
|
||||||
|
QListIterator<Layer*> it(mylayers);
|
||||||
|
//TODO: remove hack, that mapadapters wont get set zoom multiple times
|
||||||
|
QList<const MapAdapter*> doneadapters;
|
||||||
|
while (it.hasNext())
|
||||||
|
{
|
||||||
|
Layer* l = it.next();
|
||||||
|
if (!doneadapters.contains(l->mapadapter()))
|
||||||
|
{
|
||||||
|
l->zoomIn();
|
||||||
|
doneadapters.append(l->mapadapter());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mapmiddle_px = layer()->mapadapter()->coordinateToDisplay(mapmiddle);
|
||||||
|
whilenewscroll = mapmiddle_px;
|
||||||
|
|
||||||
|
newOffscreenImage();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool LayerManager::checkOffscreen() const
|
||||||
|
{
|
||||||
|
// calculate offscreenImage dimension (px)
|
||||||
|
QPoint upperLeft = mapmiddle_px - screenmiddle;
|
||||||
|
QPoint lowerRight = mapmiddle_px + screenmiddle;
|
||||||
|
QRect viewport = QRect(upperLeft, lowerRight);
|
||||||
|
|
||||||
|
QRect testRect = layer()->offscreenViewport();
|
||||||
|
|
||||||
|
if (!testRect.contains(viewport))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
void LayerManager::zoomOut()
|
||||||
|
{
|
||||||
|
QCoreApplication::processEvents();
|
||||||
|
ImageManager::instance()->abortLoading();
|
||||||
|
zoomImageScroll = QPoint(0,0);
|
||||||
|
zoomImage.fill(Qt::white);
|
||||||
|
QPixmap tmpImg = composedOffscreenImage.copy(screenmiddle.x()+scroll.x(),screenmiddle.y()+scroll.y(), size.width(), size.height());
|
||||||
|
QPainter painter(&zoomImage);
|
||||||
|
painter.translate(screenmiddle);
|
||||||
|
painter.scale(0.500001,0.500001);
|
||||||
|
painter.translate(-screenmiddle);
|
||||||
|
painter.drawPixmap(0,0,tmpImg);
|
||||||
|
|
||||||
|
painter.translate(screenmiddle);
|
||||||
|
painter.scale(2,2);
|
||||||
|
painter.translate(-screenmiddle);
|
||||||
|
|
||||||
|
QListIterator<Layer*> it(mylayers);
|
||||||
|
//TODO: remove hack, that mapadapters wont get set zoom multiple times
|
||||||
|
QList<const MapAdapter*> doneadapters;
|
||||||
|
while (it.hasNext())
|
||||||
|
{
|
||||||
|
Layer* l = it.next();
|
||||||
|
if (!doneadapters.contains(l->mapadapter()))
|
||||||
|
{
|
||||||
|
l->zoomOut();
|
||||||
|
doneadapters.append(l->mapadapter());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mapmiddle_px = layer()->mapadapter()->coordinateToDisplay(mapmiddle);
|
||||||
|
whilenewscroll = mapmiddle_px;
|
||||||
|
newOffscreenImage();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LayerManager::setZoom(int zoomlevel)
|
||||||
|
{
|
||||||
|
int current_zoom;
|
||||||
|
if (layer()->mapadapter()->minZoom() < layer()->mapadapter()->maxZoom())
|
||||||
|
{
|
||||||
|
current_zoom = layer()->mapadapter()->currentZoom();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
current_zoom = layer()->mapadapter()->minZoom() - layer()->mapadapter()->currentZoom();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (zoomlevel < current_zoom)
|
||||||
|
{
|
||||||
|
for (int i=current_zoom; i>zoomlevel; i--)
|
||||||
|
{
|
||||||
|
zoomOut();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int i=current_zoom; i<zoomlevel; i++)
|
||||||
|
{
|
||||||
|
zoomIn();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LayerManager::mouseEvent(const QMouseEvent* evnt)
|
||||||
|
{
|
||||||
|
QListIterator<Layer*> it(mylayers);
|
||||||
|
while (it.hasNext())
|
||||||
|
{
|
||||||
|
Layer* l = it.next();
|
||||||
|
if (l->isVisible())
|
||||||
|
{
|
||||||
|
l->mouseEvent(evnt, mapmiddle_px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LayerManager::updateRequest(QRectF rect)
|
||||||
|
{
|
||||||
|
const QPoint topleft = mapmiddle_px - screenmiddle;
|
||||||
|
|
||||||
|
QPointF c = rect.topLeft();
|
||||||
|
|
||||||
|
if (getViewport().contains(c) || getViewport().contains(rect.bottomRight()))
|
||||||
|
{
|
||||||
|
// QPoint point = getLayer()->getMapAdapter()->coordinateToDisplay(c);
|
||||||
|
// QPoint finalpoint = point-topleft;
|
||||||
|
// QRect rect_px = QRect(int(finalpoint.x()-(rect.width()-1)/2), int(finalpoint.y()-(rect.height()-1)/2),
|
||||||
|
// int(rect.width()+1), int(rect.height()+1));
|
||||||
|
//
|
||||||
|
// mapcontrol->updateRequest(rect_px);
|
||||||
|
mapcontrol->update();
|
||||||
|
// newOffscreenImage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void LayerManager::updateRequest()
|
||||||
|
{
|
||||||
|
newOffscreenImage();
|
||||||
|
}
|
||||||
|
void LayerManager::forceRedraw()
|
||||||
|
{
|
||||||
|
newOffscreenImage();
|
||||||
|
}
|
||||||
|
void LayerManager::removeZoomImage()
|
||||||
|
{
|
||||||
|
zoomImage.fill(Qt::white);
|
||||||
|
forceRedraw();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LayerManager::drawGeoms(QPainter* painter)
|
||||||
|
{
|
||||||
|
QListIterator<Layer*> it(mylayers);
|
||||||
|
while (it.hasNext())
|
||||||
|
{
|
||||||
|
Layer* l = it.next();
|
||||||
|
if (l->layertype() == Layer::GeometryLayer && l->isVisible())
|
||||||
|
{
|
||||||
|
l->drawYourGeometries(painter, mapmiddle_px, layer()->offscreenViewport());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void LayerManager::drawImage(QPainter* painter)
|
||||||
|
{
|
||||||
|
painter->drawPixmap(-scroll.x()-screenmiddle.x(),
|
||||||
|
-scroll.y()-screenmiddle.y(),
|
||||||
|
composedOffscreenImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
int LayerManager::currentZoom() const
|
||||||
|
{
|
||||||
|
return layer()->mapadapter()->currentZoom();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LayerManager::resize(QSize newSize)
|
||||||
|
{
|
||||||
|
size = newSize;
|
||||||
|
offSize = newSize *2;
|
||||||
|
composedOffscreenImage = QPixmap(offSize);
|
||||||
|
composedOffscreenImage2 = QPixmap(offSize);
|
||||||
|
zoomImage = QPixmap(newSize);
|
||||||
|
zoomImage.fill(Qt::white);
|
||||||
|
|
||||||
|
screenmiddle = QPoint(newSize.width()/2, newSize.height()/2);
|
||||||
|
|
||||||
|
QListIterator<Layer*> it(mylayers);
|
||||||
|
while (it.hasNext())
|
||||||
|
{
|
||||||
|
Layer* l = it.next();
|
||||||
|
l->setSize(newSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
newOffscreenImage();
|
||||||
|
}
|
||||||
|
}
|
211
ground/src/libs/qmapcontrol/src/layermanager.h
Normal file
211
ground/src/libs/qmapcontrol/src/layermanager.h
Normal file
@ -0,0 +1,211 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LAYERMANAGER_H
|
||||||
|
#define LAYERMANAGER_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QMap>
|
||||||
|
#include <QListIterator>
|
||||||
|
#include "layer.h"
|
||||||
|
#include "mapadapter.h"
|
||||||
|
#include "mapcontrol.h"
|
||||||
|
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
class Layer;
|
||||||
|
class MapAdapter;
|
||||||
|
class MapControl;
|
||||||
|
|
||||||
|
class LayerManager;
|
||||||
|
|
||||||
|
//! Handles Layers and viewport related settings
|
||||||
|
/*!
|
||||||
|
* This class handles internally all layers which were added to the MapControl.
|
||||||
|
* It also stores values for scrolling.
|
||||||
|
* It initiates the creation of a new offscreen image and on zooming the zoom images gets here created.
|
||||||
|
* @author Kai Winter <kaiwinter@gmx.de>
|
||||||
|
*/
|
||||||
|
class LayerManager : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
LayerManager(MapControl*, QSize);
|
||||||
|
~LayerManager();
|
||||||
|
|
||||||
|
//! returns the coordinate of the center of the map
|
||||||
|
/*!
|
||||||
|
* @return returns the coordinate of the middle of the screen
|
||||||
|
*/
|
||||||
|
QPointF currentCoordinate() const;
|
||||||
|
|
||||||
|
//! returns the current offscreen image
|
||||||
|
/*!
|
||||||
|
* @return the current offscreen image
|
||||||
|
*/
|
||||||
|
QPixmap getImage() const;
|
||||||
|
|
||||||
|
//! returns the layer with the given name
|
||||||
|
/*!
|
||||||
|
* @param layername name of the wanted layer
|
||||||
|
* @return the layer with the given name
|
||||||
|
*/
|
||||||
|
Layer* layer(const QString&) const;
|
||||||
|
|
||||||
|
//! returns the base layer
|
||||||
|
/*!
|
||||||
|
* This will return the base layer of the LayerManager.
|
||||||
|
* The base layer is the one which is used to do internal coordinate calculations.
|
||||||
|
* @return the base layer
|
||||||
|
*/
|
||||||
|
Layer* layer() const;
|
||||||
|
|
||||||
|
//! returns the names of all layers
|
||||||
|
/*!
|
||||||
|
* @return returns a QList with the names of all layers
|
||||||
|
*/
|
||||||
|
QList<QString> layers() const;
|
||||||
|
|
||||||
|
//! sets the middle of the map to the given coordinate
|
||||||
|
/*!
|
||||||
|
* @param coordinate the coordinate which the view´s middle should be set to
|
||||||
|
*/
|
||||||
|
void setView(const QPointF& coordinate);
|
||||||
|
|
||||||
|
//! sets the view, so all coordinates are visible
|
||||||
|
/*!
|
||||||
|
* @param coordinates the Coorinates which should be visible
|
||||||
|
*/
|
||||||
|
void setView(const QList<QPointF> coordinates);
|
||||||
|
|
||||||
|
//! sets the view and zooms in, so all coordinates are visible
|
||||||
|
/*!
|
||||||
|
* The code of setting the view to multiple coordinates is "brute force" and pretty slow.
|
||||||
|
* Have to be reworked.
|
||||||
|
* @param coordinates the Coorinates which should be visible
|
||||||
|
*/
|
||||||
|
void setViewAndZoomIn (const QList<QPointF> coordinates);
|
||||||
|
|
||||||
|
//! zooms in one step
|
||||||
|
void zoomIn();
|
||||||
|
|
||||||
|
//! zooms out one step
|
||||||
|
void zoomOut();
|
||||||
|
|
||||||
|
//! sets the given zoomlevel
|
||||||
|
/*!
|
||||||
|
* @param zoomlevel the zoomlevel
|
||||||
|
*/
|
||||||
|
void setZoom(int zoomlevel);
|
||||||
|
|
||||||
|
//! The Viewport of the display
|
||||||
|
/*!
|
||||||
|
* Returns the visible viewport in world coordinates
|
||||||
|
* @return the visible viewport in world coordinates
|
||||||
|
*/
|
||||||
|
QRectF getViewport() const;
|
||||||
|
|
||||||
|
//! scrolls the view
|
||||||
|
/*!
|
||||||
|
* Scrolls the view by the given value in pixels and in display coordinates
|
||||||
|
* @param offset the distance which the view should be scrolled
|
||||||
|
*/
|
||||||
|
void scrollView(const QPoint& offset);
|
||||||
|
|
||||||
|
//! forwards mouseevents to the layers
|
||||||
|
/*!
|
||||||
|
* This method is invoked by the MapControl which receives Mouse Events.
|
||||||
|
* These events are forwarded to the layers, so they can check for clicked geometries.
|
||||||
|
* @param evnt the mouse event
|
||||||
|
*/
|
||||||
|
void mouseEvent(const QMouseEvent* evnt);
|
||||||
|
|
||||||
|
//! returns the middle of the map in projection coordinates
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
* @return the middle of the map in projection coordinates
|
||||||
|
*/
|
||||||
|
QPoint getMapmiddle_px() const;
|
||||||
|
|
||||||
|
void forceRedraw();
|
||||||
|
void removeZoomImage();
|
||||||
|
|
||||||
|
//! adds a layer
|
||||||
|
/*!
|
||||||
|
* If multiple layers are added, they are painted in the added order.
|
||||||
|
* @param layer the layer which should be added
|
||||||
|
*/
|
||||||
|
void addLayer(Layer* layer);
|
||||||
|
|
||||||
|
//! returns the current zoom level
|
||||||
|
/*!
|
||||||
|
* @return returns the current zoom level
|
||||||
|
*/
|
||||||
|
int currentZoom() const;
|
||||||
|
|
||||||
|
void drawGeoms(QPainter* painter);
|
||||||
|
void drawImage(QPainter* painter);
|
||||||
|
|
||||||
|
private:
|
||||||
|
LayerManager& operator=(const LayerManager& rhs);
|
||||||
|
LayerManager(const LayerManager& old);
|
||||||
|
//! This method have to be invoked to draw a new offscreen image
|
||||||
|
/*!
|
||||||
|
* @param clearImage if the current offscreeen image should be cleared
|
||||||
|
* @param showZoomImage if a zoom image should be painted
|
||||||
|
*/
|
||||||
|
void newOffscreenImage(bool clearImage=true, bool showZoomImage=true);
|
||||||
|
inline bool checkOffscreen() const;
|
||||||
|
inline bool containsAll(QList<QPointF> coordinates) const;
|
||||||
|
inline void moveWidgets();
|
||||||
|
inline void setMiddle(QList<QPointF> coordinates);
|
||||||
|
|
||||||
|
MapControl* mapcontrol;
|
||||||
|
QPoint screenmiddle; // middle of the screen
|
||||||
|
QPoint scroll; // scrollvalue of the offscreen image
|
||||||
|
QPoint zoomImageScroll; // scrollvalue of the zoom image
|
||||||
|
|
||||||
|
QSize size; // widget size
|
||||||
|
QSize offSize; // size of the offscreen image
|
||||||
|
|
||||||
|
QPixmap composedOffscreenImage;
|
||||||
|
QPixmap composedOffscreenImage2;
|
||||||
|
QPixmap zoomImage;
|
||||||
|
|
||||||
|
QList<Layer*> mylayers;
|
||||||
|
|
||||||
|
QPoint mapmiddle_px; // projection-display coordinates
|
||||||
|
QPointF mapmiddle; // world coordinate
|
||||||
|
|
||||||
|
QPoint whilenewscroll;
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void updateRequest(QRectF rect);
|
||||||
|
void updateRequest();
|
||||||
|
void resize(QSize newSize);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
170
ground/src/libs/qmapcontrol/src/linestring.cpp
Normal file
170
ground/src/libs/qmapcontrol/src/linestring.cpp
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "linestring.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
LineString::LineString()
|
||||||
|
: Curve()
|
||||||
|
{
|
||||||
|
GeometryType = "LineString";
|
||||||
|
}
|
||||||
|
|
||||||
|
LineString::LineString(QList<Point*> const points, QString name, QPen* pen)
|
||||||
|
:Curve(name)
|
||||||
|
{
|
||||||
|
mypen = pen;
|
||||||
|
LineString();
|
||||||
|
setPoints(points);
|
||||||
|
}
|
||||||
|
|
||||||
|
LineString::~LineString()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Geometry LineString::Clone(){}
|
||||||
|
|
||||||
|
// Point LineString::EndPoint(){}
|
||||||
|
// Point LineString::StartPoint(){}
|
||||||
|
// Point LineString::Value(){}
|
||||||
|
|
||||||
|
|
||||||
|
void LineString::addPoint(Point* point)
|
||||||
|
{
|
||||||
|
vertices.append(point);
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<Point*> LineString::points()
|
||||||
|
{
|
||||||
|
return vertices;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LineString::setPoints(QList<Point*> points)
|
||||||
|
{
|
||||||
|
for (int i=0; i<points.size(); i++)
|
||||||
|
{
|
||||||
|
points.at(i)->setParentGeometry(this);
|
||||||
|
}
|
||||||
|
vertices = points;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LineString::draw(QPainter* painter, const MapAdapter* mapadapter, const QRect &screensize, const QPoint offset)
|
||||||
|
{
|
||||||
|
if (!visible)
|
||||||
|
return;
|
||||||
|
|
||||||
|
QPolygon p = QPolygon();
|
||||||
|
|
||||||
|
QPointF c;
|
||||||
|
for (int i=0; i<vertices.size(); i++)
|
||||||
|
{
|
||||||
|
c = vertices[i]->coordinate();
|
||||||
|
p.append(mapadapter->coordinateToDisplay(c));
|
||||||
|
}
|
||||||
|
if (mypen != 0)
|
||||||
|
{
|
||||||
|
painter->save();
|
||||||
|
painter->setPen(*mypen);
|
||||||
|
}
|
||||||
|
painter->drawPolyline(p);
|
||||||
|
if (mypen != 0)
|
||||||
|
{
|
||||||
|
painter->restore();
|
||||||
|
}
|
||||||
|
for (int i=0; i<vertices.size(); i++)
|
||||||
|
{
|
||||||
|
vertices[i]->draw(painter, mapadapter, screensize, offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int LineString::numberOfPoints() const
|
||||||
|
{
|
||||||
|
return vertices.count();
|
||||||
|
}
|
||||||
|
bool LineString::Touches(Point* geom, const MapAdapter* mapadapter)
|
||||||
|
{
|
||||||
|
// qDebug() << "LineString::Touches Point";
|
||||||
|
touchedPoints.clear();
|
||||||
|
bool touches = false;
|
||||||
|
for (int i=0; i<vertices.count(); i++)
|
||||||
|
{
|
||||||
|
// use implementation from Point
|
||||||
|
if (vertices.at(i)->Touches(geom, mapadapter))
|
||||||
|
{
|
||||||
|
touchedPoints.append(vertices.at(i));
|
||||||
|
|
||||||
|
touches = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (touches)
|
||||||
|
{
|
||||||
|
emit(geometryClicked(this, QPoint(0,0)));
|
||||||
|
}
|
||||||
|
return touches;
|
||||||
|
}
|
||||||
|
bool LineString::Touches(Geometry* /*geom*/, const MapAdapter* /*mapadapter*/)
|
||||||
|
{
|
||||||
|
// qDebug() << "LineString::Touches Geom";
|
||||||
|
touchedPoints.clear();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<Geometry*> LineString::clickedPoints()
|
||||||
|
{
|
||||||
|
return touchedPoints;
|
||||||
|
}
|
||||||
|
bool LineString::hasPoints() const
|
||||||
|
{
|
||||||
|
return vertices.size() > 0 ? true : false;
|
||||||
|
}
|
||||||
|
bool LineString::hasClickedPoints() const
|
||||||
|
{
|
||||||
|
return touchedPoints.size() > 0 ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QRectF LineString::boundingBox()
|
||||||
|
{
|
||||||
|
qreal minlon=180;
|
||||||
|
qreal maxlon=-180;
|
||||||
|
qreal minlat=90;
|
||||||
|
qreal maxlat=-90;
|
||||||
|
for (int i=0; i<vertices.size(); i++)
|
||||||
|
{
|
||||||
|
Point* tmp = vertices.at(i);
|
||||||
|
if (tmp->longitude() < minlon) minlon = tmp->longitude();
|
||||||
|
if (tmp->longitude() > maxlon) maxlon = tmp->longitude();
|
||||||
|
if (tmp->latitude() < minlat) minlat = tmp->latitude();
|
||||||
|
if (tmp->latitude() > maxlat) maxlat = tmp->latitude();
|
||||||
|
}
|
||||||
|
QPointF min = QPointF(minlon, minlat);
|
||||||
|
QPointF max = QPointF(maxlon, maxlat);
|
||||||
|
QPointF dist = max - min;
|
||||||
|
QSizeF si = QSizeF(dist.x(), dist.y());
|
||||||
|
|
||||||
|
return QRectF(min, si);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
120
ground/src/libs/qmapcontrol/src/linestring.h
Normal file
120
ground/src/libs/qmapcontrol/src/linestring.h
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LINESTRING_H
|
||||||
|
#define LINESTRING_H
|
||||||
|
|
||||||
|
#include "curve.h"
|
||||||
|
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
//! A collection of Point objects to describe a line
|
||||||
|
/*!
|
||||||
|
* A LineString is a Curve with linear interpolation between Points. Each consecutive pair of Points defines a Line segment.
|
||||||
|
* @author Kai Winter <kaiwinter@gmx.de>
|
||||||
|
*/
|
||||||
|
class LineString : public Curve
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
LineString();
|
||||||
|
//! constructor
|
||||||
|
/*!
|
||||||
|
* The constructor of a LineString takes a list of Points to form a line.
|
||||||
|
* @param points a list of points
|
||||||
|
* @param name the name of the LineString
|
||||||
|
* @param pen a QPen can be used to modify the look of the line.
|
||||||
|
* @see http://doc.trolltech.com/4.3/qpen.html
|
||||||
|
*/
|
||||||
|
LineString ( QList<Point*> const points, QString name = QString(), QPen* pen = 0 );
|
||||||
|
virtual ~LineString();
|
||||||
|
|
||||||
|
//! returns the points of the LineString
|
||||||
|
/*!
|
||||||
|
* @return a list with the points of the LineString
|
||||||
|
*/
|
||||||
|
QList<Point*> points();
|
||||||
|
|
||||||
|
//! adds a point at the end of the LineString
|
||||||
|
/*!
|
||||||
|
* @param point the point which should be added to the LineString
|
||||||
|
*/
|
||||||
|
void addPoint ( Point* point );
|
||||||
|
|
||||||
|
//! sets the given list as points of the LineString
|
||||||
|
/*!
|
||||||
|
* @param points the points which should be set for the LineString
|
||||||
|
*/
|
||||||
|
void setPoints ( QList<Point*> points );
|
||||||
|
|
||||||
|
//! returns the number of Points the LineString consists of
|
||||||
|
/*!
|
||||||
|
* @return the number of the LineString´s Points
|
||||||
|
*/
|
||||||
|
int numberOfPoints() const;
|
||||||
|
|
||||||
|
// virtual Geometry Clone();
|
||||||
|
virtual QRectF boundingBox();
|
||||||
|
// virtual Point EndPoint();
|
||||||
|
// virtual Point StartPoint();
|
||||||
|
// virtual Point Value();
|
||||||
|
|
||||||
|
//! returns true if the LineString has Childs
|
||||||
|
/*!
|
||||||
|
* This is equal to: numberOfPoints() > 0
|
||||||
|
* @return true it the LineString has Childs (=Points)
|
||||||
|
* @see clickedPoints()
|
||||||
|
*/
|
||||||
|
virtual bool hasPoints() const;
|
||||||
|
|
||||||
|
//! returns true if the LineString has clicked Points
|
||||||
|
/*!
|
||||||
|
* @return true if childs of a LineString were clicked
|
||||||
|
* @see clickedPoints()
|
||||||
|
*/
|
||||||
|
virtual bool hasClickedPoints() const;
|
||||||
|
|
||||||
|
//! returns the clicked Points
|
||||||
|
/*!
|
||||||
|
* If a LineString was clicked it could be neccessary to figure out which of its points where clicked.
|
||||||
|
* Do do so the methods hasPoints() and clickedPoints() can be used.
|
||||||
|
* When a point is added to a LineString the Point becomes its child.
|
||||||
|
* It is possible (depending on the zoomfactor) to click more than one Point of a LineString, so this method returns a list.
|
||||||
|
* @return the clicked Points of the LineString
|
||||||
|
*/
|
||||||
|
virtual QList<Geometry*> clickedPoints();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual bool Touches ( Geometry* geom, const MapAdapter* mapadapter );
|
||||||
|
virtual bool Touches ( Point* geom, const MapAdapter* mapadapter );
|
||||||
|
virtual void draw ( QPainter* painter, const MapAdapter* mapadapter, const QRect &screensize, const QPoint offset );
|
||||||
|
|
||||||
|
private:
|
||||||
|
QList<Point*> vertices;
|
||||||
|
QList<Geometry*> touchedPoints;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
69
ground/src/libs/qmapcontrol/src/mapadapter.cpp
Normal file
69
ground/src/libs/qmapcontrol/src/mapadapter.cpp
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mapadapter.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
MapAdapter::MapAdapter(const QString& host, const QString& serverPath, int tilesize, int minZoom, int maxZoom)
|
||||||
|
:myhost(host), serverPath(serverPath), mytilesize(tilesize), min_zoom(minZoom), max_zoom(maxZoom)
|
||||||
|
{
|
||||||
|
current_zoom = min_zoom;
|
||||||
|
loc = QLocale(QLocale::English);
|
||||||
|
}
|
||||||
|
|
||||||
|
MapAdapter::~MapAdapter()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QString MapAdapter::host() const
|
||||||
|
{
|
||||||
|
return myhost;
|
||||||
|
}
|
||||||
|
|
||||||
|
int MapAdapter::tilesize() const
|
||||||
|
{
|
||||||
|
return mytilesize;
|
||||||
|
}
|
||||||
|
|
||||||
|
int MapAdapter::minZoom() const
|
||||||
|
{
|
||||||
|
return min_zoom;
|
||||||
|
}
|
||||||
|
|
||||||
|
int MapAdapter::maxZoom() const
|
||||||
|
{
|
||||||
|
return max_zoom;
|
||||||
|
}
|
||||||
|
|
||||||
|
int MapAdapter::currentZoom() const
|
||||||
|
{
|
||||||
|
return current_zoom;
|
||||||
|
}
|
||||||
|
|
||||||
|
int MapAdapter::adaptedZoom() const
|
||||||
|
{
|
||||||
|
return max_zoom < min_zoom ? min_zoom - current_zoom : current_zoom;
|
||||||
|
}
|
||||||
|
}
|
151
ground/src/libs/qmapcontrol/src/mapadapter.h
Normal file
151
ground/src/libs/qmapcontrol/src/mapadapter.h
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MAPADAPTER_H
|
||||||
|
#define MAPADAPTER_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QSize>
|
||||||
|
#include <QPoint>
|
||||||
|
#include <QPointF>
|
||||||
|
#include <QLocale>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
//! Used to fit map servers into QMapControl
|
||||||
|
/*!
|
||||||
|
* MapAdapters are needed to convert between world- and display coordinates.
|
||||||
|
* This calculations depend on the used map projection.
|
||||||
|
* There are two ready-made MapAdapters:
|
||||||
|
* - TileMapAdapter, which is ready to use for OpenStreetMap or Google (Mercator projection)
|
||||||
|
* - WMSMapAdapter, which could be used for the most WMS-Server (some servers show errors, because of image ratio)
|
||||||
|
*
|
||||||
|
* MapAdapters are also needed to form the HTTP-Queries to load the map tiles.
|
||||||
|
* The maps from WMS Servers are also divided into tiles, because those can be better cached.
|
||||||
|
*
|
||||||
|
* @see TileMapAdapter, @see WMSMapAdapter
|
||||||
|
*
|
||||||
|
* @author Kai Winter <kaiwinter@gmx.de>
|
||||||
|
*/
|
||||||
|
class MapAdapter : public QObject
|
||||||
|
{
|
||||||
|
friend class Layer;
|
||||||
|
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual ~MapAdapter();
|
||||||
|
|
||||||
|
//! returns the host of this MapAdapter
|
||||||
|
/*!
|
||||||
|
* @return the host of this MapAdapter
|
||||||
|
*/
|
||||||
|
QString host() const;
|
||||||
|
|
||||||
|
//! returns the size of the tiles
|
||||||
|
/*!
|
||||||
|
* @return the size of the tiles
|
||||||
|
*/
|
||||||
|
int tilesize() const;
|
||||||
|
|
||||||
|
//! returns the min zoom value
|
||||||
|
/*!
|
||||||
|
* @return the min zoom value
|
||||||
|
*/
|
||||||
|
int minZoom() const;
|
||||||
|
|
||||||
|
//! returns the max zoom value
|
||||||
|
/*!
|
||||||
|
* @return the max zoom value
|
||||||
|
*/
|
||||||
|
int maxZoom() const;
|
||||||
|
|
||||||
|
//! returns the current zoom
|
||||||
|
/*!
|
||||||
|
* @return the current zoom
|
||||||
|
*/
|
||||||
|
int currentZoom() const;
|
||||||
|
|
||||||
|
virtual int adaptedZoom()const;
|
||||||
|
|
||||||
|
//! translates a world coordinate to display coordinate
|
||||||
|
/*!
|
||||||
|
* The calculations also needs the current zoom. The current zoom is managed by the MapAdapter, so this is no problem.
|
||||||
|
* To divide model from view the current zoom should be moved to the layers.
|
||||||
|
* @param coordinate the world coordinate
|
||||||
|
* @return the display coordinate (in widget coordinates)
|
||||||
|
*/
|
||||||
|
virtual QPoint coordinateToDisplay(const QPointF& coordinate) const = 0;
|
||||||
|
|
||||||
|
//! translates display coordinate to world coordinate
|
||||||
|
/*!
|
||||||
|
* The calculations also needs the current zoom. The current zoom is managed by the MapAdapter, so this is no problem.
|
||||||
|
* To divide model from view the current zoom should be moved to the layers.
|
||||||
|
* @param point the display coordinate
|
||||||
|
* @return the world coordinate
|
||||||
|
*/
|
||||||
|
virtual QPointF displayToCoordinate(const QPoint& point) const = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
MapAdapter(const QString& host, const QString& serverPath, int tilesize, int minZoom = 0, int maxZoom = 0);
|
||||||
|
virtual void zoom_in() = 0;
|
||||||
|
virtual void zoom_out() = 0;
|
||||||
|
virtual bool isValid(int x, int y, int z) const = 0;
|
||||||
|
virtual QString query(int x, int y, int z) const = 0;
|
||||||
|
|
||||||
|
QSize size;
|
||||||
|
QString myhost;
|
||||||
|
QString serverPath;
|
||||||
|
int mytilesize;
|
||||||
|
int min_zoom;
|
||||||
|
int max_zoom;
|
||||||
|
int current_zoom;
|
||||||
|
|
||||||
|
int param1;
|
||||||
|
int param2;
|
||||||
|
int param3;
|
||||||
|
int param4;
|
||||||
|
int param5;
|
||||||
|
int param6;
|
||||||
|
|
||||||
|
QString sub1;
|
||||||
|
QString sub2;
|
||||||
|
QString sub3;
|
||||||
|
QString sub4;
|
||||||
|
QString sub5;
|
||||||
|
QString sub6;
|
||||||
|
|
||||||
|
int order[3][2];
|
||||||
|
|
||||||
|
int middle_x;
|
||||||
|
int middle_y;
|
||||||
|
|
||||||
|
qreal numberOfTiles;
|
||||||
|
QLocale loc;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
414
ground/src/libs/qmapcontrol/src/mapcontrol.cpp
Normal file
414
ground/src/libs/qmapcontrol/src/mapcontrol.cpp
Normal file
@ -0,0 +1,414 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mapcontrol.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
MapControl::MapControl(QSize size, MouseMode mousemode)
|
||||||
|
: size(size), mymousemode(mousemode), scaleVisible(false)
|
||||||
|
{
|
||||||
|
layermanager = new LayerManager(this, size);
|
||||||
|
screen_middle = QPoint(size.width()/2, size.height()/2);
|
||||||
|
|
||||||
|
mousepressed = false;
|
||||||
|
|
||||||
|
connect(ImageManager::instance(), SIGNAL(imageReceived()),
|
||||||
|
this, SLOT(updateRequestNew()));
|
||||||
|
|
||||||
|
connect(ImageManager::instance(), SIGNAL(loadingFinished()),
|
||||||
|
this, SLOT(loadingFinished()));
|
||||||
|
|
||||||
|
this->setMaximumSize(size.width()+1, size.height()+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
MapControl::~MapControl()
|
||||||
|
{
|
||||||
|
delete layermanager;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPointF MapControl::currentCoordinate() const
|
||||||
|
{
|
||||||
|
return layermanager->currentCoordinate();
|
||||||
|
}
|
||||||
|
|
||||||
|
Layer* MapControl::layer(const QString& layername) const
|
||||||
|
{
|
||||||
|
return layermanager->layer(layername);
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<QString> MapControl::layers() const
|
||||||
|
{
|
||||||
|
return layermanager->layers();
|
||||||
|
}
|
||||||
|
|
||||||
|
int MapControl::numberOfLayers() const
|
||||||
|
{
|
||||||
|
return layermanager->layers().size();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapControl::followGeometry(const Geometry* geom) const
|
||||||
|
{
|
||||||
|
connect(geom, SIGNAL(positionChanged(Geometry*)),
|
||||||
|
this, SLOT(positionChanged(Geometry*)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapControl::positionChanged(Geometry* geom)
|
||||||
|
{
|
||||||
|
QPoint start = layermanager->layer()->mapadapter()->coordinateToDisplay(currentCoordinate());
|
||||||
|
QPoint dest = layermanager->layer()->mapadapter()->coordinateToDisplay(((Point*)geom)->coordinate());
|
||||||
|
|
||||||
|
QPoint step = (dest-start);
|
||||||
|
|
||||||
|
layermanager->scrollView(step);
|
||||||
|
|
||||||
|
// setView(geom);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapControl::moveTo(QPointF coordinate)
|
||||||
|
{
|
||||||
|
target = coordinate;
|
||||||
|
steps = 25;
|
||||||
|
if (moveMutex.tryLock())
|
||||||
|
{
|
||||||
|
QTimer::singleShot(40, this, SLOT(tick()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// stopMove(coordinate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void MapControl::tick()
|
||||||
|
{
|
||||||
|
QPoint start = layermanager->layer()->mapadapter()->coordinateToDisplay(currentCoordinate());
|
||||||
|
QPoint dest = layermanager->layer()->mapadapter()->coordinateToDisplay(target);
|
||||||
|
|
||||||
|
QPoint step = (dest-start)/steps;
|
||||||
|
QPointF next = currentCoordinate()- step;
|
||||||
|
|
||||||
|
// setView(Coordinate(next.x(), next.y()));
|
||||||
|
layermanager->scrollView(step);
|
||||||
|
|
||||||
|
update();
|
||||||
|
steps--;
|
||||||
|
if (steps>0)
|
||||||
|
{
|
||||||
|
QTimer::singleShot(40, this, SLOT(tick()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
moveMutex.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapControl::paintEvent(QPaintEvent* evnt)
|
||||||
|
{
|
||||||
|
QWidget::paintEvent(evnt);
|
||||||
|
QPainter painter(this);
|
||||||
|
|
||||||
|
// painter.translate(150,190);
|
||||||
|
// painter.scale(0.5,0.5);
|
||||||
|
|
||||||
|
// painter.setClipRect(0,0, size.width(), size.height());
|
||||||
|
|
||||||
|
// painter.setViewport(10000000000,0,size.width(),size.height());
|
||||||
|
|
||||||
|
/*
|
||||||
|
// rotating
|
||||||
|
rotation = 45;
|
||||||
|
painter.translate(256,256);
|
||||||
|
painter.rotate(rotation);
|
||||||
|
painter.translate(-256,-256);
|
||||||
|
*/
|
||||||
|
|
||||||
|
layermanager->drawImage(&painter);
|
||||||
|
layermanager->drawGeoms(&painter);
|
||||||
|
|
||||||
|
// added by wolf
|
||||||
|
// draw scale
|
||||||
|
if (scaleVisible)
|
||||||
|
{
|
||||||
|
QList<double> distanceList;
|
||||||
|
distanceList<<5000000<<2000000<<1000000<<1000000<<1000000<<100000<<100000<<50000<<50000<<10000<<10000<<10000<<1000<<1000<<500<<200<<100<<50<<25;
|
||||||
|
if (currentZoom() >= 0 && distanceList.size() > currentZoom())
|
||||||
|
{
|
||||||
|
double line;
|
||||||
|
line = distanceList.at( currentZoom() ) / pow(2, 18-currentZoom() ) / 0.597164;
|
||||||
|
|
||||||
|
// draw the scale
|
||||||
|
painter.setPen(Qt::black);
|
||||||
|
QPoint p1(10,size.height()-20);
|
||||||
|
QPoint p2((int)line,size.height()-20);
|
||||||
|
painter.drawLine(p1,p2);
|
||||||
|
|
||||||
|
painter.drawLine(10,size.height()-15, 10,size.height()-25);
|
||||||
|
painter.drawLine((int)line,size.height()-15, (int)line,size.height()-25);
|
||||||
|
|
||||||
|
QString distance;
|
||||||
|
if (distanceList.at(currentZoom()) >= 1000)
|
||||||
|
{
|
||||||
|
distance = QVariant( distanceList.at(currentZoom())/1000 ) .toString()+ " km";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
distance = QVariant( distanceList.at(currentZoom()) ).toString() + " m";
|
||||||
|
}
|
||||||
|
|
||||||
|
painter.drawText(QPoint((int)line+10,size.height()-15), distance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
painter.drawLine(screen_middle.x(), screen_middle.y()-10,
|
||||||
|
screen_middle.x(), screen_middle.y()+10); // |
|
||||||
|
painter.drawLine(screen_middle.x()-10, screen_middle.y(),
|
||||||
|
screen_middle.x()+10, screen_middle.y()); // -
|
||||||
|
|
||||||
|
// int cross_x = int(layermanager->getMapmiddle_px().x())%256;
|
||||||
|
// int cross_y = int(layermanager->getMapmiddle_px().y())%256;
|
||||||
|
// painter.drawLine(screen_middle.x()-cross_x+cross_x, screen_middle.y()-cross_y+0,
|
||||||
|
// screen_middle.x()-cross_x+cross_x, screen_middle.y()-cross_y+256); // |
|
||||||
|
// painter.drawLine(screen_middle.x()-cross_x+0, screen_middle.y()-cross_y+cross_y,
|
||||||
|
// screen_middle.x()-cross_x+256, screen_middle.y()-cross_y+cross_y); // -
|
||||||
|
|
||||||
|
painter.drawRect(0,0, size.width(), size.height());
|
||||||
|
/*
|
||||||
|
// rotating
|
||||||
|
painter.setMatrix(painter.matrix().inverted());
|
||||||
|
//qt = painter.transform();
|
||||||
|
qm = painter.combinedMatrix();
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (mousepressed && mymousemode == Dragging)
|
||||||
|
{
|
||||||
|
QRect rect = QRect(pre_click_px, current_mouse_pos);
|
||||||
|
painter.drawRect(rect);
|
||||||
|
}
|
||||||
|
emit viewChanged(currentCoordinate(), currentZoom());
|
||||||
|
}
|
||||||
|
|
||||||
|
// mouse events
|
||||||
|
void MapControl::mousePressEvent(QMouseEvent* evnt)
|
||||||
|
{
|
||||||
|
//rotating (experimental)
|
||||||
|
// QMouseEvent* me = new QMouseEvent(evnt->type(), qm.map(QPoint(evnt->x(),evnt->y())), evnt->button(), evnt->buttons(), evnt->modifiers());
|
||||||
|
// evnt = me;
|
||||||
|
// qDebug() << "evnt: " << evnt->x() << ", " << evnt->y() << ", " << evnt->pos();
|
||||||
|
|
||||||
|
layermanager->mouseEvent(evnt);
|
||||||
|
|
||||||
|
if (layermanager->layers().size()>0)
|
||||||
|
{
|
||||||
|
if (evnt->button() == 1)
|
||||||
|
{
|
||||||
|
mousepressed = true;
|
||||||
|
pre_click_px = QPoint(evnt->x(), evnt->y());
|
||||||
|
}
|
||||||
|
else if (evnt->button() == 2 && mymousemode != None) // zoom in
|
||||||
|
{
|
||||||
|
zoomIn();
|
||||||
|
} else if (evnt->button() == 4 && mymousemode != None) // zoom out
|
||||||
|
{
|
||||||
|
zoomOut();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// emit(mouseEvent(evnt));
|
||||||
|
emit(mouseEventCoordinate(evnt, clickToWorldCoordinate(evnt->pos())));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapControl::mouseReleaseEvent(QMouseEvent* evnt)
|
||||||
|
{
|
||||||
|
mousepressed = false;
|
||||||
|
if (mymousemode == Dragging)
|
||||||
|
{
|
||||||
|
QPointF ulCoord = clickToWorldCoordinate(pre_click_px);
|
||||||
|
QPointF lrCoord = clickToWorldCoordinate(current_mouse_pos);
|
||||||
|
|
||||||
|
QRectF coordinateBB = QRectF(ulCoord, QSizeF( (lrCoord-ulCoord).x(), (lrCoord-ulCoord).y()));
|
||||||
|
|
||||||
|
emit(boxDragged(coordinateBB));
|
||||||
|
}
|
||||||
|
|
||||||
|
emit(mouseEventCoordinate(evnt, clickToWorldCoordinate(evnt->pos())));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapControl::mouseMoveEvent(QMouseEvent* evnt)
|
||||||
|
{
|
||||||
|
// emit(mouseEvent(evnt));
|
||||||
|
|
||||||
|
/*
|
||||||
|
// rotating
|
||||||
|
QMouseEvent* me = new QMouseEvent(evnt->type(), qm.map(QPoint(evnt->x(),evnt->y())), evnt->button(), evnt->buttons(), evnt->modifiers());
|
||||||
|
evnt = me;
|
||||||
|
*/
|
||||||
|
if (mousepressed && mymousemode == Panning)
|
||||||
|
{
|
||||||
|
QPoint offset = pre_click_px - QPoint(evnt->x(), evnt->y());
|
||||||
|
layermanager->scrollView(offset);
|
||||||
|
pre_click_px = QPoint(evnt->x(), evnt->y());
|
||||||
|
}
|
||||||
|
else if (mousepressed && mymousemode == Dragging)
|
||||||
|
{
|
||||||
|
current_mouse_pos = QPoint(evnt->x(), evnt->y());
|
||||||
|
}
|
||||||
|
// emit(mouseEventCoordinate(evnt, clickToWorldCoordinate(evnt->pos())));
|
||||||
|
|
||||||
|
update();
|
||||||
|
// emit(mouseEventCoordinate(evnt, clickToWorldCoordinate(evnt->pos())));
|
||||||
|
}
|
||||||
|
|
||||||
|
QPointF MapControl::clickToWorldCoordinate(QPoint click)
|
||||||
|
{
|
||||||
|
// click coordinate to image coordinate
|
||||||
|
QPoint displayToImage= QPoint(click.x()-screen_middle.x()+layermanager->getMapmiddle_px().x(),
|
||||||
|
click.y()-screen_middle.y()+layermanager->getMapmiddle_px().y());
|
||||||
|
// image coordinate to world coordinate
|
||||||
|
return layermanager->layer()->mapadapter()->displayToCoordinate(displayToImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapControl::updateRequest(QRect rect)
|
||||||
|
{
|
||||||
|
update(rect);
|
||||||
|
}
|
||||||
|
void MapControl::updateRequestNew()
|
||||||
|
{
|
||||||
|
// qDebug() << "MapControl::updateRequestNew()";
|
||||||
|
layermanager->forceRedraw();
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
// slots
|
||||||
|
void MapControl::zoomIn()
|
||||||
|
{
|
||||||
|
layermanager->zoomIn();
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
void MapControl::zoomOut()
|
||||||
|
{
|
||||||
|
layermanager->zoomOut();
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
void MapControl::setZoom(int zoomlevel)
|
||||||
|
{
|
||||||
|
layermanager->setZoom(zoomlevel);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
int MapControl::currentZoom() const
|
||||||
|
{
|
||||||
|
return layermanager->currentZoom();
|
||||||
|
}
|
||||||
|
void MapControl::scrollLeft(int pixel)
|
||||||
|
{
|
||||||
|
layermanager->scrollView(QPoint(-pixel,0));
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
void MapControl::scrollRight(int pixel)
|
||||||
|
{
|
||||||
|
layermanager->scrollView(QPoint(pixel,0));
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
void MapControl::scrollUp(int pixel)
|
||||||
|
{
|
||||||
|
layermanager->scrollView(QPoint(0,-pixel));
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
void MapControl::scrollDown(int pixel)
|
||||||
|
{
|
||||||
|
layermanager->scrollView(QPoint(0,pixel));
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
void MapControl::scroll(const QPoint scroll)
|
||||||
|
{
|
||||||
|
layermanager->scrollView(scroll);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapControl::setView(const QPointF& coordinate) const
|
||||||
|
{
|
||||||
|
layermanager->setView(coordinate);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapControl::setView(const QList<QPointF> coordinates) const
|
||||||
|
{
|
||||||
|
layermanager->setView(coordinates);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapControl::setViewAndZoomIn(const QList<QPointF> coordinates) const
|
||||||
|
{
|
||||||
|
layermanager->setViewAndZoomIn(coordinates);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapControl::setView(const Point* point) const
|
||||||
|
{
|
||||||
|
layermanager->setView(point->coordinate());
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapControl::loadingFinished()
|
||||||
|
{
|
||||||
|
// qDebug() << "MapControl::loadingFinished()";
|
||||||
|
layermanager->removeZoomImage();
|
||||||
|
}
|
||||||
|
void MapControl::addLayer(Layer* layer)
|
||||||
|
{
|
||||||
|
layermanager->addLayer(layer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapControl::setMouseMode(MouseMode mousemode)
|
||||||
|
{
|
||||||
|
mymousemode = mousemode;
|
||||||
|
}
|
||||||
|
MapControl::MouseMode MapControl::mouseMode()
|
||||||
|
{
|
||||||
|
return mymousemode;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapControl::stopFollowing(Geometry* geom)
|
||||||
|
{
|
||||||
|
geom->disconnect(SIGNAL(positionChanged(Geometry*)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapControl::enablePersistentCache(const QDir& path)
|
||||||
|
{
|
||||||
|
ImageManager::instance()->setCacheDir(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapControl::setProxy(QString host, int port)
|
||||||
|
{
|
||||||
|
ImageManager::instance()->setProxy(host, port);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapControl::showScale(bool show)
|
||||||
|
{
|
||||||
|
scaleVisible = show;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapControl::resize(const QSize newSize)
|
||||||
|
{
|
||||||
|
this->size = newSize;
|
||||||
|
screen_middle = QPoint(newSize.width()/2, newSize.height()/2);
|
||||||
|
|
||||||
|
this->setMaximumSize(newSize.width()+1, newSize.height()+1);
|
||||||
|
layermanager->resize(newSize);
|
||||||
|
}
|
||||||
|
}
|
333
ground/src/libs/qmapcontrol/src/mapcontrol.h
Normal file
333
ground/src/libs/qmapcontrol/src/mapcontrol.h
Normal file
@ -0,0 +1,333 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MAPCONTROL_H
|
||||||
|
#define MAPCONTROL_H
|
||||||
|
|
||||||
|
#include <QtGui>
|
||||||
|
|
||||||
|
#include "layermanager.h"
|
||||||
|
#include "layer.h"
|
||||||
|
#include "mapadapter.h"
|
||||||
|
#include "geometry.h"
|
||||||
|
#include "imagemanager.h"
|
||||||
|
|
||||||
|
//! QMapControl namespace
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
class LayerManager;
|
||||||
|
class MapAdapter;
|
||||||
|
class Layer;
|
||||||
|
|
||||||
|
//! The control element of the widget and also the widget itself
|
||||||
|
/*!
|
||||||
|
* This is the main widget.
|
||||||
|
* To this control layers can be added.
|
||||||
|
* A MapControl have to be instantiated with a QSize which sets the size the widget takes in a layout.
|
||||||
|
* The given size is also the size, which is asured to be filled with map images.
|
||||||
|
*
|
||||||
|
* @author Kai Winter <kaiwinter@gmx.de>
|
||||||
|
*/
|
||||||
|
class MapControl : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
//! Declares what actions the mouse move has on the map
|
||||||
|
enum MouseMode
|
||||||
|
{
|
||||||
|
Panning, /*!< The map is moved */
|
||||||
|
Dragging, /*!< A rectangular can be drawn */
|
||||||
|
None, /*!< Mouse move events have no efect to the map */
|
||||||
|
};
|
||||||
|
|
||||||
|
//! The constructor of MapControl
|
||||||
|
/*!
|
||||||
|
* The MapControl is the widget which displays the maps.
|
||||||
|
* The size describes the area, which gets filled with map data
|
||||||
|
* When you give no MouseMode, the mouse is moving the map.
|
||||||
|
* You can change the MouseMode on runtime, to e.g. Dragging, which lets the user drag a rectangular box.
|
||||||
|
* After the dragging a signal with the size of the box is emitted.
|
||||||
|
* The mousemode ´None´ can be used, to completely define the control of the map yourself.
|
||||||
|
* @param size the size which the widget should fill with map data
|
||||||
|
* @param mousemode the way mouseevents are handled
|
||||||
|
*/
|
||||||
|
MapControl ( QSize size, MouseMode mousemode = Panning );
|
||||||
|
|
||||||
|
~MapControl();
|
||||||
|
|
||||||
|
//! adds a layer
|
||||||
|
/*!
|
||||||
|
* If multiple layers are added, they are painted in the added order.
|
||||||
|
* @param layer the layer which should be added
|
||||||
|
*/
|
||||||
|
void addLayer ( Layer* layer );
|
||||||
|
|
||||||
|
//! returns the layer with the given name
|
||||||
|
/*!
|
||||||
|
* @param layername name of the wanted layer
|
||||||
|
* @return the layer with the given name
|
||||||
|
*/
|
||||||
|
Layer* layer ( const QString& layername ) const;
|
||||||
|
|
||||||
|
//! returns the names of all layers
|
||||||
|
/*!
|
||||||
|
* @return returns a QList with the names of all layers
|
||||||
|
*/
|
||||||
|
QList<QString> layers() const;
|
||||||
|
|
||||||
|
//! returns the number of existing layers
|
||||||
|
/*!
|
||||||
|
* @return returns the number of existing layers
|
||||||
|
*/
|
||||||
|
int numberOfLayers() const;
|
||||||
|
|
||||||
|
//! returns the coordinate of the center of the map
|
||||||
|
/*!
|
||||||
|
* @return returns the coordinate of the middle of the screen
|
||||||
|
*/
|
||||||
|
QPointF currentCoordinate() const;
|
||||||
|
|
||||||
|
//! returns the current zoom level
|
||||||
|
/*!
|
||||||
|
* @return returns the current zoom level
|
||||||
|
*/
|
||||||
|
int currentZoom() const;
|
||||||
|
|
||||||
|
//! sets the middle of the map to the given coordinate
|
||||||
|
/*!
|
||||||
|
* @param coordinate the coordinate which the view´s middle should be set to
|
||||||
|
*/
|
||||||
|
void setView ( const QPointF& coordinate ) const;
|
||||||
|
|
||||||
|
//! sets the view, so all coordinates are visible
|
||||||
|
/*!
|
||||||
|
* @param coordinates the Coorinates which should be visible
|
||||||
|
*/
|
||||||
|
void setView ( const QList<QPointF> coordinates ) const;
|
||||||
|
|
||||||
|
//! sets the view and zooms in, so all coordinates are visible
|
||||||
|
/*!
|
||||||
|
* The code of setting the view to multiple coordinates is "brute force" and pretty slow.
|
||||||
|
* Have to be reworked.
|
||||||
|
* @param coordinates the Coorinates which should be visible
|
||||||
|
*/
|
||||||
|
void setViewAndZoomIn ( const QList<QPointF> coordinates ) const;
|
||||||
|
|
||||||
|
//! sets the view to the given Point
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
* @param point the geometric point the view should be set to
|
||||||
|
*/
|
||||||
|
void setView ( const Point* point ) const;
|
||||||
|
|
||||||
|
//! Keeps the center of the map on the Geometry, even when it moves
|
||||||
|
/*!
|
||||||
|
* To stop the following the method stopFollowing() have to be called
|
||||||
|
* @param geometry the Geometry which should stay centered.
|
||||||
|
*/
|
||||||
|
void followGeometry ( const Geometry* geometry ) const;
|
||||||
|
|
||||||
|
//TODO:
|
||||||
|
// void followGeometry(const QList<Geometry*>) const;
|
||||||
|
|
||||||
|
//! Stops the following of a Geometry
|
||||||
|
/*!
|
||||||
|
* if the view is set to follow a Geometry this method stops the trace.
|
||||||
|
* See followGeometry().
|
||||||
|
* @param geometry the Geometry which should not followed anymore
|
||||||
|
*/
|
||||||
|
void stopFollowing ( Geometry* geometry );
|
||||||
|
|
||||||
|
//! Smoothly moves the center of the view to the given Coordinate
|
||||||
|
/*!
|
||||||
|
* @param coordinate the Coordinate which the center of the view should moved to
|
||||||
|
*/
|
||||||
|
void moveTo ( QPointF coordinate );
|
||||||
|
|
||||||
|
//! sets the Mouse Mode of the MapControl
|
||||||
|
/*!
|
||||||
|
* There are three MouseModes declard by an enum.
|
||||||
|
* The MouesMode Dragging draws an rectangular in the map while the MouseButton is pressed.
|
||||||
|
* When the Button is released a boxDragged() signal is emitted.
|
||||||
|
*
|
||||||
|
* The second MouseMode (the default) is Panning, which allows to drag the map around.
|
||||||
|
* @param mousemode the MouseMode
|
||||||
|
*/
|
||||||
|
void setMouseMode ( MouseMode mousemode );
|
||||||
|
|
||||||
|
//! returns the current MouseMode
|
||||||
|
/*!
|
||||||
|
* For a explanation for the MouseModes see setMouseMode()
|
||||||
|
* @return the current MouseMode
|
||||||
|
*/
|
||||||
|
MapControl::MouseMode mouseMode();
|
||||||
|
|
||||||
|
//int rotation;
|
||||||
|
|
||||||
|
//! Enable persistent caching of map tiles
|
||||||
|
/*!
|
||||||
|
* Call this method to allow the QMapControl widget to save map tiles
|
||||||
|
* persistent (also over application restarts).
|
||||||
|
* Tiles are stored in the subdirectory "QMapControl.cache" within the
|
||||||
|
* user's home directory. This can be changed by giving a path.
|
||||||
|
* @param path the path to the cache directory
|
||||||
|
*/
|
||||||
|
void enablePersistentCache ( const QDir& path=QDir::homePath() + "/QMapControl.cache" );
|
||||||
|
|
||||||
|
|
||||||
|
//! Sets the proxy for HTTP connections
|
||||||
|
/*!
|
||||||
|
* This method sets the proxy for HTTP connections.
|
||||||
|
* This is not provided by the current Qtopia version!
|
||||||
|
* @param host the proxy´s hostname or ip
|
||||||
|
* @param port the proxy´s port
|
||||||
|
*/
|
||||||
|
void setProxy ( QString host, int port );
|
||||||
|
|
||||||
|
//! Displays the scale within the widget
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
* @param show true if the scale should be displayed
|
||||||
|
*/
|
||||||
|
void showScale ( bool show );
|
||||||
|
|
||||||
|
private:
|
||||||
|
LayerManager* layermanager;
|
||||||
|
QPoint screen_middle; // middle of the widget (half size)
|
||||||
|
|
||||||
|
QPoint pre_click_px; // used for scrolling (MouseMode Panning)
|
||||||
|
QPoint current_mouse_pos; // used for scrolling and dragging (MouseMode Panning/Dragging)
|
||||||
|
|
||||||
|
QSize size; // size of the widget
|
||||||
|
|
||||||
|
bool mousepressed;
|
||||||
|
MouseMode mymousemode;
|
||||||
|
bool scaleVisible;
|
||||||
|
|
||||||
|
bool m_loadingFlag;
|
||||||
|
|
||||||
|
QMutex moveMutex; // used for method moveTo()
|
||||||
|
QPointF target; // used for method moveTo()
|
||||||
|
int steps; // used for method moveTo()
|
||||||
|
|
||||||
|
QPointF clickToWorldCoordinate ( QPoint click );
|
||||||
|
MapControl& operator= ( const MapControl& rhs );
|
||||||
|
MapControl ( const MapControl& old );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void paintEvent ( QPaintEvent* evnt );
|
||||||
|
void mousePressEvent ( QMouseEvent* evnt );
|
||||||
|
void mouseReleaseEvent ( QMouseEvent* evnt );
|
||||||
|
void mouseMoveEvent ( QMouseEvent* evnt );
|
||||||
|
|
||||||
|
signals:
|
||||||
|
// void mouseEvent(const QMouseEvent* evnt);
|
||||||
|
|
||||||
|
//! Emitted AFTER a MouseEvent occured
|
||||||
|
/*!
|
||||||
|
* This signals allows to receive click events within the MapWidget together with the world coordinate.
|
||||||
|
* It is emitted on MousePressEvents and MouseReleaseEvents.
|
||||||
|
* The kind of the event can be obtained by checking the events type.
|
||||||
|
* @param evnt the QMouseEvent that occured
|
||||||
|
* @param coordinate the corresponding world coordinate
|
||||||
|
*/
|
||||||
|
void mouseEventCoordinate ( const QMouseEvent* evnt, const QPointF coordinate );
|
||||||
|
|
||||||
|
//! Emitted, after a Rectangular is dragged.
|
||||||
|
/*!
|
||||||
|
* It is possible to select a rectangular area in the map, if the MouseMode is set to Dragging.
|
||||||
|
* The coordinates are in world coordinates
|
||||||
|
* @param QRectF the dragged Rect
|
||||||
|
*/
|
||||||
|
void boxDragged ( const QRectF );
|
||||||
|
|
||||||
|
//! This signal is emitted, when a Geometry is clicked
|
||||||
|
/*!
|
||||||
|
* @param geometry The clicked Geometry object
|
||||||
|
* @param coord_px The coordinate in pixel coordinates
|
||||||
|
*/
|
||||||
|
void geometryClicked ( Geometry* geometry, QPoint coord_px );
|
||||||
|
|
||||||
|
//! This signal is emitted, after the view have changed
|
||||||
|
/*!
|
||||||
|
* @param coordinate The current coordinate
|
||||||
|
* @param zoom The current zoom
|
||||||
|
*/
|
||||||
|
void viewChanged ( const QPointF &coordinate, int zoom );
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
//! zooms in one step
|
||||||
|
void zoomIn();
|
||||||
|
|
||||||
|
//! zooms out one step
|
||||||
|
void zoomOut();
|
||||||
|
|
||||||
|
//! sets the given zoomlevel
|
||||||
|
/*!
|
||||||
|
* @param zoomlevel the zoomlevel
|
||||||
|
*/
|
||||||
|
void setZoom ( int zoomlevel );
|
||||||
|
|
||||||
|
//! scrolls the view to the left
|
||||||
|
void scrollLeft ( int pixel=10 );
|
||||||
|
|
||||||
|
//! scrolls the view to the right
|
||||||
|
void scrollRight ( int pixel=10 );
|
||||||
|
|
||||||
|
//! scrolls the view up
|
||||||
|
void scrollUp ( int pixel=10 );
|
||||||
|
|
||||||
|
//! scrolls the view down
|
||||||
|
void scrollDown ( int pixel=10 );
|
||||||
|
|
||||||
|
//! scrolls the view by the given point
|
||||||
|
void scroll ( const QPoint scroll );
|
||||||
|
|
||||||
|
//! updates the map for the given rect
|
||||||
|
/*!
|
||||||
|
* @param rect the area which should be repainted
|
||||||
|
*/
|
||||||
|
void updateRequest ( QRect rect );
|
||||||
|
|
||||||
|
//! updates the hole map by creating a new offscreen image
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void updateRequestNew();
|
||||||
|
|
||||||
|
//! Resizes the map to the given size
|
||||||
|
/*!
|
||||||
|
* @param newSize The new size
|
||||||
|
*/
|
||||||
|
void resize(const QSize newSize);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void tick();
|
||||||
|
void loadingFinished();
|
||||||
|
void positionChanged ( Geometry* geom );
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
38
ground/src/libs/qmapcontrol/src/maplayer.cpp
Normal file
38
ground/src/libs/qmapcontrol/src/maplayer.cpp
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "maplayer.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
MapLayer::MapLayer(QString layername, MapAdapter* mapadapter, bool takeevents)
|
||||||
|
: Layer(layername, mapadapter, Layer::MapLayer, takeevents)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MapLayer::~MapLayer()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
65
ground/src/libs/qmapcontrol/src/maplayer.h
Normal file
65
ground/src/libs/qmapcontrol/src/maplayer.h
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MAPLAYER_H
|
||||||
|
#define MAPLAYER_H
|
||||||
|
|
||||||
|
#include "layer.h"
|
||||||
|
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
//! MapLayer class
|
||||||
|
/*!
|
||||||
|
* There are two different layer types:
|
||||||
|
* - MapLayer: Displays Maps, but also Geometries. The configuration for displaying maps have to be done in the MapAdapter
|
||||||
|
* - GeometryLayer: Only displays Geometry objects.
|
||||||
|
*
|
||||||
|
* MapLayers also can display Geometry objects. The difference to the GeometryLayer is the repainting. Objects that are
|
||||||
|
* added to a MapLayer are "baken" on the map. This means, when you change it´s position for example the changes are
|
||||||
|
* not visible until a new offscreen image has been drawn. If you have "static" Geometries which won´t change their
|
||||||
|
* position this is fine. But if you want to change the objects position or pen you should use a GeometryLayer. Those
|
||||||
|
* are repainted immediately on changes.
|
||||||
|
*
|
||||||
|
* @author Kai Winter <kaiwinter@gmx.de>
|
||||||
|
*/
|
||||||
|
class MapLayer : public Layer
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
//! MapLayer constructor
|
||||||
|
/*!
|
||||||
|
* This is used to construct a map layer.
|
||||||
|
*
|
||||||
|
* @param layername The name of the Layer
|
||||||
|
* @param mapadapter The MapAdapter which does coordinate translation and Query-String-Forming
|
||||||
|
* @param takeevents Should the Layer receive MouseEvents? This is set to true by default. Setting it to false could
|
||||||
|
* be something like a "speed up hint"
|
||||||
|
*/
|
||||||
|
MapLayer(QString layername, MapAdapter* mapadapter, bool takeevents=true);
|
||||||
|
virtual ~MapLayer();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
136
ground/src/libs/qmapcontrol/src/mapnetwork.cpp
Normal file
136
ground/src/libs/qmapcontrol/src/mapnetwork.cpp
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mapnetwork.h"
|
||||||
|
#include <QWaitCondition>
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
MapNetwork::MapNetwork(ImageManager* parent)
|
||||||
|
:parent(parent), http(new QHttp(this)), loaded(0)
|
||||||
|
{
|
||||||
|
connect(http, SIGNAL(requestFinished(int, bool)),
|
||||||
|
this, SLOT(requestFinished(int, bool)));
|
||||||
|
}
|
||||||
|
|
||||||
|
MapNetwork::~MapNetwork()
|
||||||
|
{
|
||||||
|
http->clearPendingRequests();
|
||||||
|
delete http;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MapNetwork::loadImage(const QString& host, const QString& url)
|
||||||
|
{
|
||||||
|
// qDebug() << "getting: " << QString(host).append(url);
|
||||||
|
// http->setHost(host);
|
||||||
|
// int getId = http->get(url);
|
||||||
|
|
||||||
|
http->setHost(host);
|
||||||
|
QHttpRequestHeader header("GET", url);
|
||||||
|
header.setValue("User-Agent", "Mozilla");
|
||||||
|
header.setValue("Host", host);
|
||||||
|
int getId = http->request(header);
|
||||||
|
|
||||||
|
if (vectorMutex.tryLock())
|
||||||
|
{
|
||||||
|
loadingMap[getId] = url;
|
||||||
|
vectorMutex.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapNetwork::requestFinished(int id, bool error)
|
||||||
|
{
|
||||||
|
// sleep(1);
|
||||||
|
// qDebug() << "MapNetwork::requestFinished" << http->state() << ", id: " << id;
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
qDebug() << "network error: " << http->errorString();
|
||||||
|
//restart query
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (vectorMutex.tryLock())
|
||||||
|
{
|
||||||
|
// check if id is in map?
|
||||||
|
if (loadingMap.contains(id))
|
||||||
|
{
|
||||||
|
|
||||||
|
QString url = loadingMap[id];
|
||||||
|
loadingMap.remove(id);
|
||||||
|
vectorMutex.unlock();
|
||||||
|
// qDebug() << "request finished for id: " << id << ", belongs to: " << notifier.url << endl;
|
||||||
|
QByteArray ax;
|
||||||
|
|
||||||
|
if (http->bytesAvailable()>0)
|
||||||
|
{
|
||||||
|
QPixmap pm;
|
||||||
|
ax = http->readAll();
|
||||||
|
|
||||||
|
if (pm.loadFromData(ax))
|
||||||
|
{
|
||||||
|
loaded += pm.size().width()*pm.size().height()*pm.depth()/8/1024;
|
||||||
|
// qDebug() << "Network loaded: " << (loaded);
|
||||||
|
parent->receivedImage(pm, url);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qDebug() << "NETWORK_PIXMAP_ERROR: " << ax;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
vectorMutex.unlock();
|
||||||
|
|
||||||
|
}
|
||||||
|
if (loadingMap.size() == 0)
|
||||||
|
{
|
||||||
|
// qDebug () << "all loaded";
|
||||||
|
parent->loadingQueueEmpty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapNetwork::abortLoading()
|
||||||
|
{
|
||||||
|
http->clearPendingRequests();
|
||||||
|
if (vectorMutex.tryLock())
|
||||||
|
{
|
||||||
|
loadingMap.clear();
|
||||||
|
vectorMutex.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MapNetwork::imageIsLoading(QString url)
|
||||||
|
{
|
||||||
|
return loadingMap.values().contains(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapNetwork::setProxy(QString host, int port)
|
||||||
|
{
|
||||||
|
#ifndef Q_WS_QWS
|
||||||
|
// do not set proxy on qt/extended
|
||||||
|
http->setProxy(host, port);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
78
ground/src/libs/qmapcontrol/src/mapnetwork.h
Normal file
78
ground/src/libs/qmapcontrol/src/mapnetwork.h
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MAPNETWORK_H
|
||||||
|
#define MAPNETWORK_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QHttp>
|
||||||
|
#include <QVector>
|
||||||
|
#include <QPixmap>
|
||||||
|
#include "imagemanager.h"
|
||||||
|
/**
|
||||||
|
@author Kai Winter <kaiwinter@gmx.de>
|
||||||
|
*/
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
class ImageManager;
|
||||||
|
class MapNetwork : QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
MapNetwork(ImageManager* parent);
|
||||||
|
~MapNetwork();
|
||||||
|
|
||||||
|
void loadImage(const QString& host, const QString& url);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* checks if the given url is already loading
|
||||||
|
* @param url the url of the image
|
||||||
|
* @return boolean, if the image is already loading
|
||||||
|
*/
|
||||||
|
bool imageIsLoading(QString url);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Aborts all current loading threads.
|
||||||
|
* This is useful when changing the zoom-factor, though newly needed images loads faster
|
||||||
|
*/
|
||||||
|
void abortLoading();
|
||||||
|
void setProxy(QString host, int port);
|
||||||
|
|
||||||
|
private:
|
||||||
|
ImageManager* parent;
|
||||||
|
QHttp* http;
|
||||||
|
QMap<int, QString> loadingMap;
|
||||||
|
qreal loaded;
|
||||||
|
QMutex vectorMutex;
|
||||||
|
MapNetwork& operator=(const MapNetwork& rhs);
|
||||||
|
MapNetwork(const MapNetwork& old);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void requestFinished(int id, bool error);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
37
ground/src/libs/qmapcontrol/src/openaerialmapadapter.cpp
Normal file
37
ground/src/libs/qmapcontrol/src/openaerialmapadapter.cpp
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2009 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "openaerialmapadapter.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
OpenAerialMapAdapter::OpenAerialMapAdapter()
|
||||||
|
: TileMapAdapter("tile.openaerialmap.org", "/tiles/1.0.0/openaerialmap-900913/%1/%2/%3.png", 256, 0, 17)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
OpenAerialMapAdapter::~OpenAerialMapAdapter()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
49
ground/src/libs/qmapcontrol/src/openaerialmapadapter.h
Normal file
49
ground/src/libs/qmapcontrol/src/openaerialmapadapter.h
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2009 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OPENAERIALMAPADAPTER_H
|
||||||
|
#define OPENAERIALMAPADAPTER_H
|
||||||
|
|
||||||
|
#include "tilemapadapter.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
//! MapAdapter for OpenStreetMap
|
||||||
|
/*!
|
||||||
|
* This is a conveniece class, which extends and configures a TileMapAdapter. Source of maps is http://www.openaerialmap.org/
|
||||||
|
* @author Kai Winter <kaiwinter@gmx.de>
|
||||||
|
*/
|
||||||
|
class OpenAerialMapAdapter : public TileMapAdapter
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
//! constructor
|
||||||
|
/*!
|
||||||
|
* This construct a OpenAerialMap Adapter
|
||||||
|
*/
|
||||||
|
OpenAerialMapAdapter();
|
||||||
|
virtual ~OpenAerialMapAdapter();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
37
ground/src/libs/qmapcontrol/src/osmmapadapter.cpp
Normal file
37
ground/src/libs/qmapcontrol/src/osmmapadapter.cpp
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "osmmapadapter.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
OSMMapAdapter::OSMMapAdapter()
|
||||||
|
: TileMapAdapter("tile.openstreetmap.org", "/%1/%2/%3.png", 256, 0, 17)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
OSMMapAdapter::~OSMMapAdapter()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
49
ground/src/libs/qmapcontrol/src/osmmapadapter.h
Normal file
49
ground/src/libs/qmapcontrol/src/osmmapadapter.h
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OSMMAPADAPTER_H
|
||||||
|
#define OSMMAPADAPTER_H
|
||||||
|
|
||||||
|
#include "tilemapadapter.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
//! MapAdapter for OpenStreetMap
|
||||||
|
/*!
|
||||||
|
* This is a conveniece class, which extends and configures a TileMapAdapter
|
||||||
|
* @author Kai Winter <kaiwinter@gmx.de>
|
||||||
|
*/
|
||||||
|
class OSMMapAdapter : public TileMapAdapter
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
//! constructor
|
||||||
|
/*!
|
||||||
|
* This construct a OpenStreetmap Adapter
|
||||||
|
*/
|
||||||
|
OSMMapAdapter();
|
||||||
|
virtual ~OSMMapAdapter();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
330
ground/src/libs/qmapcontrol/src/point.cpp
Normal file
330
ground/src/libs/qmapcontrol/src/point.cpp
Normal file
@ -0,0 +1,330 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "point.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
Point::Point()
|
||||||
|
{}
|
||||||
|
Point::Point(const Point& point)
|
||||||
|
:Geometry(point.name()), X(point.longitude()), Y(point.latitude())
|
||||||
|
{
|
||||||
|
visible = point.isVisible();
|
||||||
|
mywidget = 0;
|
||||||
|
mypixmap = 0;
|
||||||
|
mypen = point.mypen;
|
||||||
|
homelevel = -1;
|
||||||
|
minsize = QSize(-1,-1);
|
||||||
|
maxsize = QSize(-1,-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Point::Point(qreal x, qreal y, QString name, enum Alignment alignment)
|
||||||
|
: Geometry(name), X(x), Y(y), myalignment(alignment)
|
||||||
|
{
|
||||||
|
GeometryType = "Point";
|
||||||
|
mywidget = 0;
|
||||||
|
mypixmap = 0;
|
||||||
|
visible = true;
|
||||||
|
homelevel = -1;
|
||||||
|
minsize = QSize(-1,-1);
|
||||||
|
maxsize = QSize(-1,-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Point::Point(qreal x, qreal y, QWidget* widget, QString name, enum Alignment alignment)
|
||||||
|
: Geometry(name), X(x), Y(y), mywidget(widget), myalignment(alignment)
|
||||||
|
{
|
||||||
|
// Point(x, y, name, alignment);
|
||||||
|
GeometryType = "Point";
|
||||||
|
mypixmap = 0;
|
||||||
|
visible = true;
|
||||||
|
size = widget->size();
|
||||||
|
homelevel = -1;
|
||||||
|
minsize = QSize(-1,-1);
|
||||||
|
maxsize = QSize(-1,-1);
|
||||||
|
mywidget->show();
|
||||||
|
}
|
||||||
|
Point::Point(qreal x, qreal y, QPixmap* pixmap, QString name, enum Alignment alignment)
|
||||||
|
: Geometry(name), X(x), Y(y), mypixmap(pixmap), myalignment(alignment)
|
||||||
|
{
|
||||||
|
GeometryType = "Point";
|
||||||
|
mywidget = 0;
|
||||||
|
visible = true;
|
||||||
|
size = pixmap->size();
|
||||||
|
homelevel = -1;
|
||||||
|
minsize = QSize(-1,-1);
|
||||||
|
maxsize = QSize(-1,-1);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
Point& Point::operator=(const Point& rhs)
|
||||||
|
{
|
||||||
|
if (this == &rhs)
|
||||||
|
return *this;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
X = rhs.X;
|
||||||
|
Y = rhs.Y;
|
||||||
|
size = rhs.size;
|
||||||
|
|
||||||
|
mywidget = rhs.mywidget;
|
||||||
|
mypixmap = rhs.mypixmap;
|
||||||
|
alignment = rhs.alignment;
|
||||||
|
homelevel = rhs.homelevel;
|
||||||
|
minsize = rhs.minsize;
|
||||||
|
maxsize = rhs.maxsize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
Point::~Point()
|
||||||
|
{
|
||||||
|
delete mywidget;
|
||||||
|
delete mypixmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Point::setVisible(bool visible)
|
||||||
|
{
|
||||||
|
this->visible = visible;
|
||||||
|
if (mywidget !=0)
|
||||||
|
{
|
||||||
|
mywidget->setVisible(visible);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QRectF Point::boundingBox()
|
||||||
|
{
|
||||||
|
//TODO: have to be calculated in relation to alignment...
|
||||||
|
return QRectF(QPointF(X, Y), displaysize);
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal Point::longitude() const
|
||||||
|
{
|
||||||
|
return X;
|
||||||
|
}
|
||||||
|
qreal Point::latitude() const
|
||||||
|
{
|
||||||
|
return Y;
|
||||||
|
}
|
||||||
|
QPointF Point::coordinate() const
|
||||||
|
{
|
||||||
|
return QPointF(X, Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Point::draw(QPainter* painter, const MapAdapter* mapadapter, const QRect &viewport, const QPoint offset)
|
||||||
|
{
|
||||||
|
if (!visible)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (homelevel > 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
int currentzoom = mapadapter->maxZoom() < mapadapter->minZoom() ? mapadapter->minZoom() - mapadapter->currentZoom() : mapadapter->currentZoom();
|
||||||
|
|
||||||
|
// int currentzoom = mapadapter->getZoom();
|
||||||
|
int diffzoom = homelevel-currentzoom;
|
||||||
|
int viewheight = size.height();
|
||||||
|
int viewwidth = size.width();
|
||||||
|
viewheight = int(viewheight / pow(2, diffzoom));
|
||||||
|
viewwidth = int(viewwidth / pow(2, diffzoom));
|
||||||
|
|
||||||
|
if (minsize.height()!= -1 && viewheight < minsize.height())
|
||||||
|
viewheight = minsize.height();
|
||||||
|
else if (maxsize.height() != -1 && viewheight > maxsize.height())
|
||||||
|
viewheight = maxsize.height();
|
||||||
|
|
||||||
|
|
||||||
|
if (minsize.width()!= -1 && viewwidth < minsize.width())
|
||||||
|
viewwidth = minsize.width();
|
||||||
|
else if (maxsize.width() != -1 && viewwidth > maxsize.width())
|
||||||
|
viewwidth = maxsize.width();
|
||||||
|
|
||||||
|
|
||||||
|
displaysize = QSize(viewwidth, viewheight);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
displaysize = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (mypixmap !=0)
|
||||||
|
{
|
||||||
|
const QPointF c = QPointF(X, Y);
|
||||||
|
QPoint point = mapadapter->coordinateToDisplay(c);
|
||||||
|
|
||||||
|
if (viewport.contains(point))
|
||||||
|
{
|
||||||
|
QPoint alignedtopleft = alignedPoint(point);
|
||||||
|
painter->drawPixmap(alignedtopleft.x(), alignedtopleft.y(), displaysize.width(), displaysize.height(), *mypixmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (mywidget!=0)
|
||||||
|
{
|
||||||
|
drawWidget(mapadapter, offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Point::drawWidget(const MapAdapter* mapadapter, const QPoint offset)
|
||||||
|
{
|
||||||
|
const QPointF c = QPointF(X, Y);
|
||||||
|
QPoint point = mapadapter->coordinateToDisplay(c);
|
||||||
|
point -= offset;
|
||||||
|
|
||||||
|
QPoint alignedtopleft = alignedPoint(point);
|
||||||
|
mywidget->setGeometry(alignedtopleft.x(), alignedtopleft.y(), displaysize.width(), displaysize.height());
|
||||||
|
}
|
||||||
|
|
||||||
|
QPoint Point::alignedPoint(const QPoint point) const
|
||||||
|
{
|
||||||
|
QPoint alignedtopleft;
|
||||||
|
if (myalignment == Middle)
|
||||||
|
{
|
||||||
|
alignedtopleft.setX(point.x()-displaysize.width()/2);
|
||||||
|
alignedtopleft.setY(point.y()-displaysize.height()/2);
|
||||||
|
}
|
||||||
|
else if (myalignment == TopLeft)
|
||||||
|
{
|
||||||
|
alignedtopleft.setX(point.x());
|
||||||
|
alignedtopleft.setY(point.y());
|
||||||
|
}
|
||||||
|
else if (myalignment == TopRight)
|
||||||
|
{
|
||||||
|
alignedtopleft.setX(point.x()-displaysize.width());
|
||||||
|
alignedtopleft.setY(point.y());
|
||||||
|
}
|
||||||
|
else if (myalignment == BottomLeft)
|
||||||
|
{
|
||||||
|
alignedtopleft.setX(point.x());
|
||||||
|
alignedtopleft.setY(point.y()-displaysize.height());
|
||||||
|
}
|
||||||
|
else if (myalignment == BottomRight)
|
||||||
|
{
|
||||||
|
alignedtopleft.setX(point.x()-displaysize.width());
|
||||||
|
alignedtopleft.setY(point.y()-displaysize.height());
|
||||||
|
}
|
||||||
|
return alignedtopleft;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Point::Touches(Point* p, const MapAdapter* mapadapter)
|
||||||
|
{
|
||||||
|
if (this->isVisible() == false)
|
||||||
|
return false;
|
||||||
|
if (mypixmap == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
QPointF c = p->coordinate();
|
||||||
|
// coordinate to pixel
|
||||||
|
QPoint pxOfPoint = mapadapter->coordinateToDisplay(c);
|
||||||
|
// size/2 Pixel toleranz aufaddieren
|
||||||
|
QPoint p1;
|
||||||
|
QPoint p2;
|
||||||
|
|
||||||
|
switch (myalignment)
|
||||||
|
{
|
||||||
|
case Middle:
|
||||||
|
p1 = pxOfPoint - QPoint(displaysize.width()/2,displaysize.height()/2);
|
||||||
|
p2 = pxOfPoint + QPoint(displaysize.width()/2,displaysize.height()/2);
|
||||||
|
break;
|
||||||
|
case TopLeft:
|
||||||
|
p1 = pxOfPoint - QPoint(displaysize.width(),displaysize.height());
|
||||||
|
p2 = pxOfPoint;
|
||||||
|
break;
|
||||||
|
case TopRight:
|
||||||
|
p1 = pxOfPoint - QPoint(0, displaysize.height());
|
||||||
|
p2 = pxOfPoint + QPoint(displaysize.width(),0);
|
||||||
|
break;
|
||||||
|
case BottomLeft:
|
||||||
|
p1 = pxOfPoint - QPoint(displaysize.width(), 0);
|
||||||
|
p2 = pxOfPoint + QPoint(0, displaysize.height());
|
||||||
|
break;
|
||||||
|
case BottomRight:
|
||||||
|
p1 = pxOfPoint;
|
||||||
|
p2 = pxOfPoint + QPoint(displaysize.width(), displaysize.height());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// calculate "Bounding Box" in coordinates
|
||||||
|
QPointF c1 = mapadapter->displayToCoordinate(p1);
|
||||||
|
QPointF c2 = mapadapter->displayToCoordinate(p2);
|
||||||
|
|
||||||
|
|
||||||
|
if(this->longitude()>=c1.x() && this->longitude()<=c2.x())
|
||||||
|
{
|
||||||
|
if (this->latitude()<=c1.y() && this->latitude()>=c2.y())
|
||||||
|
{
|
||||||
|
emit(geometryClicked(this, QPoint(0,0)));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Point::setCoordinate(QPointF point)
|
||||||
|
{
|
||||||
|
// emit(updateRequest(this));
|
||||||
|
// emit(updateRequest(QRectF(X, Y, size.width(), size.height())));
|
||||||
|
X = point.x();
|
||||||
|
Y = point.y();
|
||||||
|
// emit(updateRequest(this));
|
||||||
|
emit(updateRequest(QRectF(X, Y, size.width(), size.height())));
|
||||||
|
|
||||||
|
emit(positionChanged(this));
|
||||||
|
}
|
||||||
|
QList<Point*> Point::points()
|
||||||
|
{
|
||||||
|
//TODO: assigning temp?!
|
||||||
|
QList<Point*> points;
|
||||||
|
points.append(this);
|
||||||
|
return points;
|
||||||
|
}
|
||||||
|
|
||||||
|
QWidget* Point::widget()
|
||||||
|
{
|
||||||
|
return mywidget;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPixmap* Point::pixmap()
|
||||||
|
{
|
||||||
|
return mypixmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Point::setBaselevel(int zoomlevel)
|
||||||
|
{
|
||||||
|
homelevel = zoomlevel;
|
||||||
|
}
|
||||||
|
void Point::setMinsize(QSize minsize)
|
||||||
|
{
|
||||||
|
this->minsize = minsize;
|
||||||
|
}
|
||||||
|
void Point::setMaxsize(QSize maxsize)
|
||||||
|
{
|
||||||
|
this->maxsize = maxsize;
|
||||||
|
}
|
||||||
|
Point::Alignment Point::alignment() const
|
||||||
|
{
|
||||||
|
return myalignment;
|
||||||
|
}
|
||||||
|
}
|
215
ground/src/libs/qmapcontrol/src/point.h
Normal file
215
ground/src/libs/qmapcontrol/src/point.h
Normal file
@ -0,0 +1,215 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef POINT_H
|
||||||
|
#define POINT_H
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
#include "geometry.h"
|
||||||
|
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
//! A geometric point to draw objects into maps
|
||||||
|
/*!
|
||||||
|
* This class can be used to draw your custom QPixmap or other QWidgets into maps.
|
||||||
|
* You can instantiate a Point with any Pixmap you want. The objects cares about collision detection (for clickable objects)
|
||||||
|
*
|
||||||
|
* When drawing a pixmap, take care you are adding the point to a GeometryLayer.
|
||||||
|
* You can also add a point to a MapLayer, but this should only be done, if the point is not changing its position or color etc.
|
||||||
|
* (GeometryLayers are assured to be repainted on any changes at the point. MapLayers only gets repainted, if a new
|
||||||
|
* offscreenImage is painter. This is a performance issue.)
|
||||||
|
*
|
||||||
|
* Points emit click events, if the containing layer receives clickevents (the default)
|
||||||
|
*
|
||||||
|
* You can also add a widget into maps. But keep in mind, that widgets always are drawn on top of all layers.
|
||||||
|
* You also have to handle click events yourself.
|
||||||
|
*
|
||||||
|
* To create "zoomable objects" (objects that increases size on zooming), a base level have to be set.
|
||||||
|
* The base level is the zoom level on which the point´s pixmap gets displayed on full size.
|
||||||
|
* On lower zoom levels it gets displayed smaller and on higher zoom levels larger.
|
||||||
|
* A minimal size can be set as well as a maximum size.
|
||||||
|
* @see setBaselevel, setMinsize, setMaxsize
|
||||||
|
*
|
||||||
|
* @author Kai Winter <kaiwinter@gmx.de>
|
||||||
|
*/
|
||||||
|
class Point : public Geometry
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
friend class Layer;
|
||||||
|
friend class LineString;
|
||||||
|
|
||||||
|
//! sets where the point should be aligned
|
||||||
|
enum Alignment
|
||||||
|
{
|
||||||
|
TopLeft, /*!< Align on TopLeft*/
|
||||||
|
TopRight, /*!< Align on TopRight*/
|
||||||
|
BottomLeft, /*!< Align on BottomLeft*/
|
||||||
|
BottomRight,/*!< Align on BottomRight*/
|
||||||
|
Middle /*!< Align on Middle*/
|
||||||
|
};
|
||||||
|
|
||||||
|
Point();
|
||||||
|
explicit Point(const Point&);
|
||||||
|
//! Copy Constructor
|
||||||
|
/*!
|
||||||
|
* This constructor creates a Point with no image or widget.
|
||||||
|
* @param x longitude
|
||||||
|
* @param y latitude
|
||||||
|
* @param name name of the point
|
||||||
|
* @param alignment allignment of the point (Middle or TopLeft)
|
||||||
|
*/
|
||||||
|
Point(qreal x, qreal y, QString name = QString(), enum Alignment alignment=Middle);
|
||||||
|
|
||||||
|
//! Constructor
|
||||||
|
/*!
|
||||||
|
* This constructor creates a point which will display the given widget.
|
||||||
|
* You can set an alignment on which corner the widget should be aligned to the coordinate.
|
||||||
|
* You have to set the size of the widget, before adding it to
|
||||||
|
* IMPORTANT: You have to set the QMapControl as parent for the widget!
|
||||||
|
* @param x longitude
|
||||||
|
* @param y latitude
|
||||||
|
* @param widget the widget which should be displayed by this point
|
||||||
|
* @param name name of the point
|
||||||
|
* @param alignment allignment of the point (Middle or TopLeft)
|
||||||
|
*/
|
||||||
|
Point(qreal x, qreal y, QWidget* widget, QString name = QString(), enum Alignment alignment = Middle);
|
||||||
|
|
||||||
|
//! Constructor
|
||||||
|
/*!
|
||||||
|
* This constructor creates a point which will display the give pixmap.
|
||||||
|
* You can set an alignment on which corner the pixmap should be aligned to the coordinate.
|
||||||
|
* @param x longitude
|
||||||
|
* @param y latitude
|
||||||
|
* @param pixmap the pixmap which should be displayed by this point
|
||||||
|
* @param name name of the point
|
||||||
|
* @param alignment allignment of the point (Middle or TopLeft)
|
||||||
|
*/
|
||||||
|
Point(qreal x, qreal y, QPixmap* pixmap, QString name = QString(), enum Alignment alignment = Middle);
|
||||||
|
virtual ~Point();
|
||||||
|
|
||||||
|
//! returns the bounding box of the point
|
||||||
|
/*!
|
||||||
|
* The Bounding contains the coordinate of the point and its size.
|
||||||
|
* The size is set, if the point contains a pixmap or a widget
|
||||||
|
* @return the bounding box of the point
|
||||||
|
*/
|
||||||
|
virtual QRectF boundingBox();
|
||||||
|
|
||||||
|
//! returns the longitude of the point
|
||||||
|
/*!
|
||||||
|
* @return the longitude of the point
|
||||||
|
*/
|
||||||
|
qreal longitude() const;
|
||||||
|
|
||||||
|
//! returns the latitude of the point
|
||||||
|
/*!
|
||||||
|
* @return the latitude of the point
|
||||||
|
*/
|
||||||
|
qreal latitude() const;
|
||||||
|
|
||||||
|
//! returns the coordinate of the point
|
||||||
|
/*!
|
||||||
|
* The x component of the returned QPointF is the longitude value,
|
||||||
|
* the y component the latitude
|
||||||
|
* @return the coordinate of a point
|
||||||
|
*/
|
||||||
|
QPointF coordinate() const;
|
||||||
|
|
||||||
|
virtual QList<Point*> points();
|
||||||
|
|
||||||
|
/*! \brief returns the widget of the point
|
||||||
|
@return the widget of the point
|
||||||
|
*/
|
||||||
|
QWidget* widget();
|
||||||
|
|
||||||
|
//! returns the pixmap of the point
|
||||||
|
/*!
|
||||||
|
* @return the pixmap of the point
|
||||||
|
*/
|
||||||
|
QPixmap* pixmap();
|
||||||
|
|
||||||
|
//! Sets the zoom level on which the point<6E>s pixmap gets displayed on full size
|
||||||
|
/*!
|
||||||
|
* Use this method to set a zoom level on which the pixmap gets displayed with its real size.
|
||||||
|
* On zoomlevels below it will be displayed smaller, and on zoom levels thereover it will be displayed larger
|
||||||
|
* @see setMinsize, setMaxsize
|
||||||
|
* @param zoomlevel the zoomlevel on which the point will be displayed on full size
|
||||||
|
*/
|
||||||
|
void setBaselevel(int zoomlevel);
|
||||||
|
|
||||||
|
//! sets a minimal size for the pixmap
|
||||||
|
/*!
|
||||||
|
* When the point's pixmap should change its size on zooming, this method sets the minimal size.
|
||||||
|
* @see setBaselevel
|
||||||
|
* @param minsize the minimal size which the pixmap should have
|
||||||
|
*/
|
||||||
|
void setMinsize(QSize minsize);
|
||||||
|
|
||||||
|
//! sets a maximal size for the pixmap
|
||||||
|
/*!
|
||||||
|
* When the point´s pixmap should change its size on zooming, this method sets the maximal size.
|
||||||
|
* @see setBaselevel
|
||||||
|
* @param maxsize the maximal size which the pixmap should have
|
||||||
|
*/
|
||||||
|
void setMaxsize(QSize maxsize);
|
||||||
|
|
||||||
|
Point::Alignment alignment() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
qreal X;
|
||||||
|
qreal Y;
|
||||||
|
QSize size;
|
||||||
|
|
||||||
|
QWidget* mywidget;
|
||||||
|
QPixmap* mypixmap;
|
||||||
|
Alignment myalignment;
|
||||||
|
int homelevel;
|
||||||
|
QSize displaysize;
|
||||||
|
QSize minsize;
|
||||||
|
QSize maxsize;
|
||||||
|
|
||||||
|
|
||||||
|
void drawWidget(const MapAdapter* mapadapter, const QPoint offset);
|
||||||
|
// void drawPixmap(QPainter* painter, const MapAdapter* mapadapter, const QRect &viewport, const QPoint versch);
|
||||||
|
virtual void draw(QPainter* painter, const MapAdapter* mapadapter, const QRect &viewport, const QPoint offset);
|
||||||
|
QPoint alignedPoint(const QPoint point) const;
|
||||||
|
|
||||||
|
//! returns true if the given Point touches this Point
|
||||||
|
/*!
|
||||||
|
* The collision detection checks for the bounding rectangulars.
|
||||||
|
* @param geom the other point which should be tested on collision
|
||||||
|
* @param mapadapter the mapadapter which is used for calculations
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
virtual bool Touches(Point* geom, const MapAdapter* mapadapter);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void setCoordinate(QPointF point);
|
||||||
|
virtual void setVisible(bool visible);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
63
ground/src/libs/qmapcontrol/src/src.pro
Normal file
63
ground/src/libs/qmapcontrol/src/src.pro
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
######################################################################
|
||||||
|
# Automatically generated by qmake (2.01a) Fri Mar 12 13:34:16 2010
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
include(../../../openpilotgcslibrary.pri)
|
||||||
|
|
||||||
|
TEMPLATE = lib
|
||||||
|
TARGET = QMapControl
|
||||||
|
DEFINES += QMAPCONTROL_LIBRARY
|
||||||
|
DEPENDPATH += .
|
||||||
|
INCLUDEPATH += .
|
||||||
|
|
||||||
|
# Input
|
||||||
|
HEADERS += circlepoint.h \
|
||||||
|
curve.h \
|
||||||
|
emptymapadapter.h \
|
||||||
|
fixedimageoverlay.h \
|
||||||
|
geometry.h \
|
||||||
|
geometrylayer.h \
|
||||||
|
googlemapadapter.h \
|
||||||
|
googlesatmapadapter.h \
|
||||||
|
gps_position.h \
|
||||||
|
imagemanager.h \
|
||||||
|
imagepoint.h \
|
||||||
|
layer.h \
|
||||||
|
layermanager.h \
|
||||||
|
linestring.h \
|
||||||
|
mapadapter.h \
|
||||||
|
mapcontrol.h \
|
||||||
|
maplayer.h \
|
||||||
|
mapnetwork.h \
|
||||||
|
openaerialmapadapter.h \
|
||||||
|
osmmapadapter.h \
|
||||||
|
point.h \
|
||||||
|
tilemapadapter.h \
|
||||||
|
wmsmapadapter.h \
|
||||||
|
yahoomapadapter.h
|
||||||
|
SOURCES += circlepoint.cpp \
|
||||||
|
curve.cpp \
|
||||||
|
emptymapadapter.cpp \
|
||||||
|
fixedimageoverlay.cpp \
|
||||||
|
geometry.cpp \
|
||||||
|
geometrylayer.cpp \
|
||||||
|
googlemapadapter.cpp \
|
||||||
|
googlesatmapadapter.cpp \
|
||||||
|
gps_position.cpp \
|
||||||
|
imagemanager.cpp \
|
||||||
|
imagepoint.cpp \
|
||||||
|
layer.cpp \
|
||||||
|
layermanager.cpp \
|
||||||
|
linestring.cpp \
|
||||||
|
mapadapter.cpp \
|
||||||
|
mapcontrol.cpp \
|
||||||
|
maplayer.cpp \
|
||||||
|
mapnetwork.cpp \
|
||||||
|
openaerialmapadapter.cpp \
|
||||||
|
osmmapadapter.cpp \
|
||||||
|
point.cpp \
|
||||||
|
tilemapadapter.cpp \
|
||||||
|
wmsmapadapter.cpp \
|
||||||
|
yahoomapadapter.cpp
|
||||||
|
|
||||||
|
QT += network
|
185
ground/src/libs/qmapcontrol/src/tilemapadapter.cpp
Normal file
185
ground/src/libs/qmapcontrol/src/tilemapadapter.cpp
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "tilemapadapter.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
TileMapAdapter::TileMapAdapter(const QString& host, const QString& serverPath, int tilesize, int minZoom, int maxZoom)
|
||||||
|
:MapAdapter(host, serverPath, tilesize, minZoom, maxZoom)
|
||||||
|
{
|
||||||
|
PI = acos(-1.0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Initialize the "substring replace engine". First the string replacement
|
||||||
|
in getQuery was made by QString().arg() but this was very slow. So this
|
||||||
|
splits the servers path into substrings and when calling getQuery the
|
||||||
|
substrings get merged with the parameters of the URL.
|
||||||
|
Pretty complicated, but fast.
|
||||||
|
*/
|
||||||
|
param1 = serverPath.indexOf("%1");
|
||||||
|
param2 = serverPath.indexOf("%2");
|
||||||
|
param3 = serverPath.indexOf("%3");
|
||||||
|
|
||||||
|
int min = param1 < param2 ? param1 : param2;
|
||||||
|
min = param3 < min ? param3 : min;
|
||||||
|
|
||||||
|
int max = param1 > param2 ? param1 : param2;
|
||||||
|
max = param3 > max ? param3 : max;
|
||||||
|
|
||||||
|
int middle = param1+param2+param3-min-max;
|
||||||
|
|
||||||
|
order[0][0] = min;
|
||||||
|
if (min == param1)
|
||||||
|
order[0][1] = 0;
|
||||||
|
else if (min == param2)
|
||||||
|
order[0][1] = 1;
|
||||||
|
else
|
||||||
|
order[0][1] = 2;
|
||||||
|
|
||||||
|
order[1][0] = middle;
|
||||||
|
if (middle == param1)
|
||||||
|
order[1][1] = 0;
|
||||||
|
else if (middle == param2)
|
||||||
|
order[1][1] = 1;
|
||||||
|
else
|
||||||
|
order[1][1] = 2;
|
||||||
|
|
||||||
|
order[2][0] = max;
|
||||||
|
if (max == param1)
|
||||||
|
order[2][1] = 0;
|
||||||
|
else if(max == param2)
|
||||||
|
order[2][1] = 1;
|
||||||
|
else
|
||||||
|
order[2][1] = 2;
|
||||||
|
|
||||||
|
int zoom = max_zoom < min_zoom ? min_zoom - current_zoom : current_zoom;
|
||||||
|
numberOfTiles = tilesonzoomlevel(zoom);
|
||||||
|
loc.setNumberOptions(QLocale::OmitGroupSeparator);
|
||||||
|
}
|
||||||
|
|
||||||
|
TileMapAdapter::~TileMapAdapter()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
//TODO: pull out
|
||||||
|
void TileMapAdapter::zoom_in()
|
||||||
|
{
|
||||||
|
if (min_zoom > max_zoom)
|
||||||
|
{
|
||||||
|
//current_zoom = current_zoom-1;
|
||||||
|
current_zoom = current_zoom > max_zoom ? current_zoom-1 : max_zoom;
|
||||||
|
}
|
||||||
|
else if (min_zoom < max_zoom)
|
||||||
|
{
|
||||||
|
//current_zoom = current_zoom+1;
|
||||||
|
current_zoom = current_zoom < max_zoom ? current_zoom+1 : max_zoom;
|
||||||
|
}
|
||||||
|
|
||||||
|
int zoom = max_zoom < min_zoom ? min_zoom - current_zoom : current_zoom;
|
||||||
|
numberOfTiles = tilesonzoomlevel(zoom);
|
||||||
|
|
||||||
|
}
|
||||||
|
void TileMapAdapter::zoom_out()
|
||||||
|
{
|
||||||
|
if (min_zoom > max_zoom)
|
||||||
|
{
|
||||||
|
//current_zoom = current_zoom+1;
|
||||||
|
current_zoom = current_zoom < min_zoom ? current_zoom+1 : min_zoom;
|
||||||
|
}
|
||||||
|
else if (min_zoom < max_zoom)
|
||||||
|
{
|
||||||
|
//current_zoom = current_zoom-1;
|
||||||
|
current_zoom = current_zoom > min_zoom ? current_zoom-1 : min_zoom;
|
||||||
|
}
|
||||||
|
|
||||||
|
int zoom = max_zoom < min_zoom ? min_zoom - current_zoom : current_zoom;
|
||||||
|
numberOfTiles = tilesonzoomlevel(zoom);
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal TileMapAdapter::deg_rad(qreal x) const
|
||||||
|
{
|
||||||
|
return x * (PI/180.0);
|
||||||
|
}
|
||||||
|
qreal TileMapAdapter::rad_deg(qreal x) const
|
||||||
|
{
|
||||||
|
return x * (180/PI);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString TileMapAdapter::query(int x, int y, int z) const
|
||||||
|
{
|
||||||
|
x = xoffset(x);
|
||||||
|
y = yoffset(y);
|
||||||
|
|
||||||
|
int a[3] = {z, x, y};
|
||||||
|
return QString(serverPath).replace(order[2][0],2, loc.toString(a[order[2][1]]))
|
||||||
|
.replace(order[1][0],2, loc.toString(a[order[1][1]]))
|
||||||
|
.replace(order[0][0],2, loc.toString(a[order[0][1]]));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
QPoint TileMapAdapter::coordinateToDisplay(const QPointF& coordinate) const
|
||||||
|
{
|
||||||
|
qreal x = (coordinate.x()+180) * (numberOfTiles*mytilesize)/360.; // coord to pixel!
|
||||||
|
qreal y = (1-(log(tan(PI/4+deg_rad(coordinate.y())/2)) /PI)) /2 * (numberOfTiles*mytilesize);
|
||||||
|
|
||||||
|
return QPoint(int(x), int(y));
|
||||||
|
}
|
||||||
|
|
||||||
|
QPointF TileMapAdapter::displayToCoordinate(const QPoint& point) const
|
||||||
|
{
|
||||||
|
qreal longitude = (point.x()*(360/(numberOfTiles*mytilesize)))-180;
|
||||||
|
qreal latitude = rad_deg(atan(sinh((1-point.y()*(2/(numberOfTiles*mytilesize)))*PI)));
|
||||||
|
|
||||||
|
return QPointF(longitude, latitude);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TileMapAdapter::isValid(int x, int y, int z) const
|
||||||
|
{
|
||||||
|
if (max_zoom < min_zoom)
|
||||||
|
{
|
||||||
|
z= min_zoom - z;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (x<0 || x>pow(2,z)-1 ||
|
||||||
|
y<0 || y>pow(2,z)-1)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
int TileMapAdapter::tilesonzoomlevel(int zoomlevel) const
|
||||||
|
{
|
||||||
|
return int(pow(2, zoomlevel));
|
||||||
|
}
|
||||||
|
int TileMapAdapter::xoffset(int x) const
|
||||||
|
{
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
int TileMapAdapter::yoffset(int y) const
|
||||||
|
{
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
}
|
76
ground/src/libs/qmapcontrol/src/tilemapadapter.h
Normal file
76
ground/src/libs/qmapcontrol/src/tilemapadapter.h
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TILEMAPADAPTER_H
|
||||||
|
#define TILEMAPADAPTER_H
|
||||||
|
|
||||||
|
#include "mapadapter.h"
|
||||||
|
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
//! MapAdapter for servers with image tiles
|
||||||
|
/*!
|
||||||
|
* Use this derived MapAdapter to display maps from OpenStreetMap
|
||||||
|
* @author Kai Winter <kaiwinter@gmx.de>
|
||||||
|
*/
|
||||||
|
class TileMapAdapter : public MapAdapter
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
//! constructor
|
||||||
|
/*!
|
||||||
|
* Sample of a correct initialization of a MapAdapter:<br/>
|
||||||
|
* TileMapAdapter* ta = new TileMapAdapter("192.168.8.1", "/img/img_cache.php/%1/%2/%3.png", 256, 0,17);<br/>
|
||||||
|
* The placeholders %1, %2, %3 stands for x, y, z<br/>
|
||||||
|
* The minZoom is 0 (means the whole world is visible). The maxZoom is 17 (means it is zoomed in to the max)
|
||||||
|
* @param host The servers URL
|
||||||
|
* @param serverPath The path to the tiles with placeholders
|
||||||
|
* @param tilesize the size of the tiles
|
||||||
|
* @param minZoom the minimum zoom level
|
||||||
|
* @param maxZoom the maximum zoom level
|
||||||
|
*/
|
||||||
|
TileMapAdapter(const QString& host, const QString& serverPath, int tilesize, int minZoom = 0, int maxZoom = 17);
|
||||||
|
|
||||||
|
virtual ~TileMapAdapter();
|
||||||
|
|
||||||
|
virtual QPoint coordinateToDisplay(const QPointF&) const;
|
||||||
|
virtual QPointF displayToCoordinate(const QPoint&) const;
|
||||||
|
|
||||||
|
qreal PI;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
qreal rad_deg(qreal) const;
|
||||||
|
qreal deg_rad(qreal) const;
|
||||||
|
|
||||||
|
virtual bool isValid(int x, int y, int z) const;
|
||||||
|
virtual void zoom_in();
|
||||||
|
virtual void zoom_out();
|
||||||
|
virtual QString query(int x, int y, int z) const;
|
||||||
|
virtual int tilesonzoomlevel(int zoomlevel) const;
|
||||||
|
virtual int xoffset(int x) const;
|
||||||
|
virtual int yoffset(int y) const;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
110
ground/src/libs/qmapcontrol/src/wmsmapadapter.cpp
Normal file
110
ground/src/libs/qmapcontrol/src/wmsmapadapter.cpp
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "wmsmapadapter.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
WMSMapAdapter::WMSMapAdapter(QString host, QString serverPath, int tilesize)
|
||||||
|
: MapAdapter(host, serverPath, tilesize, 0, 17)
|
||||||
|
{
|
||||||
|
// param1 = serverPath.indexOf("%1");
|
||||||
|
// param2 = serverPath.indexOf("%2");
|
||||||
|
// param3 = serverPath.indexOf("%3");
|
||||||
|
// param4 = serverPath.indexOf("%4");
|
||||||
|
// param5 = serverPath.indexOf("%5");
|
||||||
|
// param6 = serverPath.lastIndexOf("%5");
|
||||||
|
|
||||||
|
// this->serverPath = serverPath.replace(param6, 2, QString().setNum(tilesize)).replace(param5, 2, QString().setNum(tilesize));
|
||||||
|
|
||||||
|
// sub1 = serverPath.mid(0, param1);
|
||||||
|
// sub2 = serverPath.mid(param1+2, param2-param1-2);
|
||||||
|
// sub3 = serverPath.mid(param2+2, param3-param2-2);
|
||||||
|
// sub4 = serverPath.mid(param3+2, param4-param3-2);
|
||||||
|
// sub5 = serverPath.mid(param4+2);
|
||||||
|
|
||||||
|
this->serverPath.append("&WIDTH=").append(loc.toString(tilesize))
|
||||||
|
.append("&HEIGHT=").append(loc.toString(tilesize))
|
||||||
|
.append("&BBOX=");
|
||||||
|
numberOfTiles = pow(2, current_zoom);
|
||||||
|
coord_per_x_tile = 360. / numberOfTiles;
|
||||||
|
coord_per_y_tile = 180. / numberOfTiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
WMSMapAdapter::~WMSMapAdapter()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QPoint WMSMapAdapter::coordinateToDisplay(const QPointF& coordinate) const
|
||||||
|
{
|
||||||
|
qreal x = (coordinate.x()+180) * (numberOfTiles*mytilesize)/360.; // coord to pixel!
|
||||||
|
qreal y = -1*(coordinate.y()-90) * (numberOfTiles*mytilesize)/180.; // coord to pixel!
|
||||||
|
return QPoint(int(x), int(y));
|
||||||
|
}
|
||||||
|
QPointF WMSMapAdapter::displayToCoordinate(const QPoint& point) const
|
||||||
|
{
|
||||||
|
qreal lon = (point.x()*(360./(numberOfTiles*mytilesize)))-180;
|
||||||
|
qreal lat = -(point.y()*(180./(numberOfTiles*mytilesize)))+90;
|
||||||
|
return QPointF(lon, lat);
|
||||||
|
}
|
||||||
|
void WMSMapAdapter::zoom_in()
|
||||||
|
{
|
||||||
|
current_zoom+=1;
|
||||||
|
numberOfTiles = pow(2, current_zoom);
|
||||||
|
coord_per_x_tile = 360. / numberOfTiles;
|
||||||
|
coord_per_y_tile = 180. / numberOfTiles;
|
||||||
|
}
|
||||||
|
void WMSMapAdapter::zoom_out()
|
||||||
|
{
|
||||||
|
current_zoom-=1;
|
||||||
|
numberOfTiles = pow(2, current_zoom);
|
||||||
|
coord_per_x_tile = 360. / numberOfTiles;
|
||||||
|
coord_per_y_tile = 180. / numberOfTiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WMSMapAdapter::isValid(int /*x*/, int /*y*/, int /*z*/) const
|
||||||
|
{
|
||||||
|
// if (x>0 && y>0 && z>0)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// return false;
|
||||||
|
}
|
||||||
|
QString WMSMapAdapter::query(int i, int j, int /*z*/) const
|
||||||
|
{
|
||||||
|
return getQ(-180+i*coord_per_x_tile,
|
||||||
|
90-(j+1)*coord_per_y_tile,
|
||||||
|
-180+i*coord_per_x_tile+coord_per_x_tile,
|
||||||
|
90-(j+1)*coord_per_y_tile+coord_per_y_tile);
|
||||||
|
}
|
||||||
|
QString WMSMapAdapter::getQ(qreal ux, qreal uy, qreal ox, qreal oy) const
|
||||||
|
{
|
||||||
|
return QString().append(serverPath)
|
||||||
|
.append(loc.toString(ux)).append(",")
|
||||||
|
.append(loc.toString(uy)).append(",")
|
||||||
|
.append(loc.toString(ox)).append(",")
|
||||||
|
.append(loc.toString(oy));
|
||||||
|
}
|
||||||
|
}
|
70
ground/src/libs/qmapcontrol/src/wmsmapadapter.h
Normal file
70
ground/src/libs/qmapcontrol/src/wmsmapadapter.h
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef WMSMAPADAPTER_H
|
||||||
|
#define WMSMAPADAPTER_H
|
||||||
|
|
||||||
|
#include "mapadapter.h"
|
||||||
|
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
//! MapAdapter for WMS servers
|
||||||
|
/*!
|
||||||
|
* Use this derived MapAdapter to display maps from WMS servers
|
||||||
|
* @author Kai Winter <kaiwinter@gmx.de>
|
||||||
|
*/
|
||||||
|
class WMSMapAdapter : public MapAdapter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//! constructor
|
||||||
|
/*!
|
||||||
|
* Sample of a correct initialization of a MapAdapter:<br/>
|
||||||
|
* MapAdapter* mapadapter = new WMSMapAdapter("www2.demis.nl", "/wms/wms.asp?wms=WorldMap[...]&BBOX=%1,%2,%3,%4&WIDTH=%5&HEIGHT=%5&TRANSPARENT=TRUE", 256);<br/>
|
||||||
|
* The placeholders %1, %2, %3, %4 creates the bounding box, %5 is for the tilesize
|
||||||
|
* The minZoom is 0 (means the whole world is visible). The maxZoom is 17 (means it is zoomed in to the max)
|
||||||
|
* @param host The servers URL
|
||||||
|
* @param serverPath The path to the tiles with placeholders
|
||||||
|
* @param tilesize the size of the tiles
|
||||||
|
*/
|
||||||
|
WMSMapAdapter(QString host, QString serverPath, int tilesize = 256);
|
||||||
|
virtual ~WMSMapAdapter();
|
||||||
|
|
||||||
|
virtual QPoint coordinateToDisplay(const QPointF&) const;
|
||||||
|
virtual QPointF displayToCoordinate(const QPoint&) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void zoom_in();
|
||||||
|
virtual void zoom_out();
|
||||||
|
virtual QString query(int x, int y, int z) const;
|
||||||
|
virtual bool isValid(int x, int y, int z) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual QString getQ(qreal ux, qreal uy, qreal ox, qreal oy) const;
|
||||||
|
|
||||||
|
qreal coord_per_x_tile;
|
||||||
|
qreal coord_per_y_tile;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
63
ground/src/libs/qmapcontrol/src/yahoomapadapter.cpp
Normal file
63
ground/src/libs/qmapcontrol/src/yahoomapadapter.cpp
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "yahoomapadapter.h"
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
YahooMapAdapter::YahooMapAdapter()
|
||||||
|
: TileMapAdapter("png.maps.yimg.com", "/png?v=3.1.0&x=%2&y=%3&z=%1", 256, 17,0)
|
||||||
|
{
|
||||||
|
int zoom = max_zoom < min_zoom ? min_zoom - current_zoom : current_zoom;
|
||||||
|
numberOfTiles = pow(2, zoom+1);
|
||||||
|
}
|
||||||
|
YahooMapAdapter::YahooMapAdapter(QString host, QString url)
|
||||||
|
: TileMapAdapter(host, url, 256, 17,0)
|
||||||
|
{
|
||||||
|
int zoom = max_zoom < min_zoom ? min_zoom - current_zoom : current_zoom;
|
||||||
|
numberOfTiles = pow(2, zoom+1);
|
||||||
|
}
|
||||||
|
YahooMapAdapter::~YahooMapAdapter()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool YahooMapAdapter::isValid(int /*x*/, int /*y*/, int /*z*/) const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int YahooMapAdapter::tilesonzoomlevel(int zoomlevel) const
|
||||||
|
{
|
||||||
|
return int(pow(2, zoomlevel+1));
|
||||||
|
}
|
||||||
|
|
||||||
|
int YahooMapAdapter::yoffset(int y) const
|
||||||
|
{
|
||||||
|
int zoom = max_zoom < min_zoom ? min_zoom - current_zoom : current_zoom;
|
||||||
|
|
||||||
|
int tiles = int(pow(2, zoom));
|
||||||
|
y = y*(-1)+tiles-1;
|
||||||
|
return int(y);
|
||||||
|
}
|
||||||
|
}
|
56
ground/src/libs/qmapcontrol/src/yahoomapadapter.h
Normal file
56
ground/src/libs/qmapcontrol/src/yahoomapadapter.h
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of QMapControl,
|
||||||
|
* an open-source cross-platform map widget
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 - 2008 Kai Winter
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with QMapControl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Contact e-mail: kaiwinter@gmx.de
|
||||||
|
* Program URL : http://qmapcontrol.sourceforge.net/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef YAHOOMAPADAPTER_H
|
||||||
|
#define YAHOOMAPADAPTER_H
|
||||||
|
|
||||||
|
#include "tilemapadapter.h"
|
||||||
|
|
||||||
|
namespace qmapcontrol
|
||||||
|
{
|
||||||
|
//! MapAdapter for Yahoo Maps
|
||||||
|
/*!
|
||||||
|
* @author Kai Winter <kaiwinter@gmx.de>
|
||||||
|
*/
|
||||||
|
class YahooMapAdapter : public TileMapAdapter
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
//! constructor
|
||||||
|
/*!
|
||||||
|
* This construct a Yahoo Adapter
|
||||||
|
*/
|
||||||
|
YahooMapAdapter();
|
||||||
|
YahooMapAdapter(QString host, QString url);
|
||||||
|
virtual ~YahooMapAdapter();
|
||||||
|
bool isValid(int x, int y, int z) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual int tilesonzoomlevel(int zoomlevel) const;
|
||||||
|
virtual int yoffset(int y) const;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user