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