├── .gitignore
├── .mvn
└── wrapper
│ ├── maven-wrapper.jar
│ └── maven-wrapper.properties
├── LICENSE
├── README.md
├── img.jpg
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
├── main
├── java
│ ├── META-INF
│ │ └── MANIFEST.MF
│ └── com
│ │ └── cheese
│ │ └── MapServer
│ │ ├── MapServerApplication.java
│ │ ├── bean
│ │ ├── InitResult.java
│ │ ├── LatLngInfo.java
│ │ ├── LevelInfo.java
│ │ ├── MapConfig.java
│ │ └── ThreadReqParamInfo.java
│ │ ├── controller
│ │ ├── InitController.java
│ │ └── ServerController.java
│ │ ├── service
│ │ └── InitService.java
│ │ └── utils
│ │ ├── BackgroundType.java
│ │ ├── CoodUtils.java
│ │ ├── FileUtils.java
│ │ ├── HttpUtils.java
│ │ └── InitUtils.java
└── resources
│ ├── application.yml
│ └── static
│ ├── asset-manifest.json
│ ├── index.html
│ ├── manifest.json
│ ├── map.png
│ ├── service-worker.js
│ └── static
│ ├── css
│ ├── main.1d7b5214.css
│ └── main.1d7b5214.css.map
│ └── js
│ ├── main.3633225c.js
│ └── main.3633225c.js.map
└── test
└── java
└── com
└── cheese
└── MapServer
└── MapServerApplicationTests.java
/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
26 |
27 | ### Project ###
28 | /map/
29 |
--------------------------------------------------------------------------------
/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Icemap/MapServer/1ceab70ae9aba9ab832caf9dcb7c4714c2b1a4cc/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.3/apache-maven-3.5.3-bin.zip
2 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 3, 29 June 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 | Preamble
9 |
10 | The GNU General Public License is a free, copyleft license for
11 | software and other kinds of works.
12 |
13 | The licenses for most software and other practical works are designed
14 | to take away your freedom to share and change the works. By contrast,
15 | the GNU General Public License is intended to guarantee your freedom to
16 | share and change all versions of a program--to make sure it remains free
17 | software for all its users. We, the Free Software Foundation, use the
18 | GNU General Public License for most of our software; it applies also to
19 | any other work released this way by its authors. You can apply it to
20 | your programs, too.
21 |
22 | When we speak of free software, we are referring to freedom, not
23 | price. Our General Public Licenses are designed to make sure that you
24 | have the freedom to distribute copies of free software (and charge for
25 | them if you wish), that you receive source code or can get it if you
26 | want it, that you can change the software or use pieces of it in new
27 | free programs, and that you know you can do these things.
28 |
29 | To protect your rights, we need to prevent others from denying you
30 | these rights or asking you to surrender the rights. Therefore, you have
31 | certain responsibilities if you distribute copies of the software, or if
32 | you modify it: responsibilities to respect the freedom of others.
33 |
34 | For example, if you distribute copies of such a program, whether
35 | gratis or for a fee, you must pass on to the recipients the same
36 | freedoms that you received. You must make sure that they, too, receive
37 | or can get the source code. And you must show them these terms so they
38 | know their rights.
39 |
40 | Developers that use the GNU GPL protect your rights with two steps:
41 | (1) assert copyright on the software, and (2) offer you this License
42 | giving you legal permission to copy, distribute and/or modify it.
43 |
44 | For the developers' and authors' protection, the GPL clearly explains
45 | that there is no warranty for this free software. For both users' and
46 | authors' sake, the GPL requires that modified versions be marked as
47 | changed, so that their problems will not be attributed erroneously to
48 | authors of previous versions.
49 |
50 | Some devices are designed to deny users access to install or run
51 | modified versions of the software inside them, although the manufacturer
52 | can do so. This is fundamentally incompatible with the aim of
53 | protecting users' freedom to change the software. The systematic
54 | pattern of such abuse occurs in the area of products for individuals to
55 | use, which is precisely where it is most unacceptable. Therefore, we
56 | have designed this version of the GPL to prohibit the practice for those
57 | products. If such problems arise substantially in other domains, we
58 | stand ready to extend this provision to those domains in future versions
59 | of the GPL, as needed to protect the freedom of users.
60 |
61 | Finally, every program is threatened constantly by software patents.
62 | States should not allow patents to restrict development and use of
63 | software on general-purpose computers, but in those that do, we wish to
64 | avoid the special danger that patents applied to a free program could
65 | make it effectively proprietary. To prevent this, the GPL assures that
66 | patents cannot be used to render the program non-free.
67 |
68 | The precise terms and conditions for copying, distribution and
69 | modification follow.
70 |
71 | TERMS AND CONDITIONS
72 |
73 | 0. Definitions.
74 |
75 | "This License" refers to version 3 of the GNU General Public License.
76 |
77 | "Copyright" also means copyright-like laws that apply to other kinds of
78 | works, such as semiconductor masks.
79 |
80 | "The Program" refers to any copyrightable work licensed under this
81 | License. Each licensee is addressed as "you". "Licensees" and
82 | "recipients" may be individuals or organizations.
83 |
84 | To "modify" a work means to copy from or adapt all or part of the work
85 | in a fashion requiring copyright permission, other than the making of an
86 | exact copy. The resulting work is called a "modified version" of the
87 | earlier work or a work "based on" the earlier work.
88 |
89 | A "covered work" means either the unmodified Program or a work based
90 | on the Program.
91 |
92 | To "propagate" a work means to do anything with it that, without
93 | permission, would make you directly or secondarily liable for
94 | infringement under applicable copyright law, except executing it on a
95 | computer or modifying a private copy. Propagation includes copying,
96 | distribution (with or without modification), making available to the
97 | public, and in some countries other activities as well.
98 |
99 | To "convey" a work means any kind of propagation that enables other
100 | parties to make or receive copies. Mere interaction with a user through
101 | a computer network, with no transfer of a copy, is not conveying.
102 |
103 | An interactive user interface displays "Appropriate Legal Notices"
104 | to the extent that it includes a convenient and prominently visible
105 | feature that (1) displays an appropriate copyright notice, and (2)
106 | tells the user that there is no warranty for the work (except to the
107 | extent that warranties are provided), that licensees may convey the
108 | work under this License, and how to view a copy of this License. If
109 | the interface presents a list of user commands or options, such as a
110 | menu, a prominent item in the list meets this criterion.
111 |
112 | 1. Source Code.
113 |
114 | The "source code" for a work means the preferred form of the work
115 | for making modifications to it. "Object code" means any non-source
116 | form of a work.
117 |
118 | A "Standard Interface" means an interface that either is an official
119 | standard defined by a recognized standards body, or, in the case of
120 | interfaces specified for a particular programming language, one that
121 | is widely used among developers working in that language.
122 |
123 | The "System Libraries" of an executable work include anything, other
124 | than the work as a whole, that (a) is included in the normal form of
125 | packaging a Major Component, but which is not part of that Major
126 | Component, and (b) serves only to enable use of the work with that
127 | Major Component, or to implement a Standard Interface for which an
128 | implementation is available to the public in source code form. A
129 | "Major Component", in this context, means a major essential component
130 | (kernel, window system, and so on) of the specific operating system
131 | (if any) on which the executable work runs, or a compiler used to
132 | produce the work, or an object code interpreter used to run it.
133 |
134 | The "Corresponding Source" for a work in object code form means all
135 | the source code needed to generate, install, and (for an executable
136 | work) run the object code and to modify the work, including scripts to
137 | control those activities. However, it does not include the work's
138 | System Libraries, or general-purpose tools or generally available free
139 | programs which are used unmodified in performing those activities but
140 | which are not part of the work. For example, Corresponding Source
141 | includes interface definition files associated with source files for
142 | the work, and the source code for shared libraries and dynamically
143 | linked subprograms that the work is specifically designed to require,
144 | such as by intimate data communication or control flow between those
145 | subprograms and other parts of the work.
146 |
147 | The Corresponding Source need not include anything that users
148 | can regenerate automatically from other parts of the Corresponding
149 | Source.
150 |
151 | The Corresponding Source for a work in source code form is that
152 | same work.
153 |
154 | 2. Basic Permissions.
155 |
156 | All rights granted under this License are granted for the term of
157 | copyright on the Program, and are irrevocable provided the stated
158 | conditions are met. This License explicitly affirms your unlimited
159 | permission to run the unmodified Program. The output from running a
160 | covered work is covered by this License only if the output, given its
161 | content, constitutes a covered work. This License acknowledges your
162 | rights of fair use or other equivalent, as provided by copyright law.
163 |
164 | You may make, run and propagate covered works that you do not
165 | convey, without conditions so long as your license otherwise remains
166 | in force. You may convey covered works to others for the sole purpose
167 | of having them make modifications exclusively for you, or provide you
168 | with facilities for running those works, provided that you comply with
169 | the terms of this License in conveying all material for which you do
170 | not control copyright. Those thus making or running the covered works
171 | for you must do so exclusively on your behalf, under your direction
172 | and control, on terms that prohibit them from making any copies of
173 | your copyrighted material outside their relationship with you.
174 |
175 | Conveying under any other circumstances is permitted solely under
176 | the conditions stated below. Sublicensing is not allowed; section 10
177 | makes it unnecessary.
178 |
179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180 |
181 | No covered work shall be deemed part of an effective technological
182 | measure under any applicable law fulfilling obligations under article
183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184 | similar laws prohibiting or restricting circumvention of such
185 | measures.
186 |
187 | When you convey a covered work, you waive any legal power to forbid
188 | circumvention of technological measures to the extent such circumvention
189 | is effected by exercising rights under this License with respect to
190 | the covered work, and you disclaim any intention to limit operation or
191 | modification of the work as a means of enforcing, against the work's
192 | users, your or third parties' legal rights to forbid circumvention of
193 | technological measures.
194 |
195 | 4. Conveying Verbatim Copies.
196 |
197 | You may convey verbatim copies of the Program's source code as you
198 | receive it, in any medium, provided that you conspicuously and
199 | appropriately publish on each copy an appropriate copyright notice;
200 | keep intact all notices stating that this License and any
201 | non-permissive terms added in accord with section 7 apply to the code;
202 | keep intact all notices of the absence of any warranty; and give all
203 | recipients a copy of this License along with the Program.
204 |
205 | You may charge any price or no price for each copy that you convey,
206 | and you may offer support or warranty protection for a fee.
207 |
208 | 5. Conveying Modified Source Versions.
209 |
210 | You may convey a work based on the Program, or the modifications to
211 | produce it from the Program, in the form of source code under the
212 | terms of section 4, provided that you also meet all of these conditions:
213 |
214 | a) The work must carry prominent notices stating that you modified
215 | it, and giving a relevant date.
216 |
217 | b) The work must carry prominent notices stating that it is
218 | released under this License and any conditions added under section
219 | 7. This requirement modifies the requirement in section 4 to
220 | "keep intact all notices".
221 |
222 | c) You must license the entire work, as a whole, under this
223 | License to anyone who comes into possession of a copy. This
224 | License will therefore apply, along with any applicable section 7
225 | additional terms, to the whole of the work, and all its parts,
226 | regardless of how they are packaged. This License gives no
227 | permission to license the work in any other way, but it does not
228 | invalidate such permission if you have separately received it.
229 |
230 | d) If the work has interactive user interfaces, each must display
231 | Appropriate Legal Notices; however, if the Program has interactive
232 | interfaces that do not display Appropriate Legal Notices, your
233 | work need not make them do so.
234 |
235 | A compilation of a covered work with other separate and independent
236 | works, which are not by their nature extensions of the covered work,
237 | and which are not combined with it such as to form a larger program,
238 | in or on a volume of a storage or distribution medium, is called an
239 | "aggregate" if the compilation and its resulting copyright are not
240 | used to limit the access or legal rights of the compilation's users
241 | beyond what the individual works permit. Inclusion of a covered work
242 | in an aggregate does not cause this License to apply to the other
243 | parts of the aggregate.
244 |
245 | 6. Conveying Non-Source Forms.
246 |
247 | You may convey a covered work in object code form under the terms
248 | of sections 4 and 5, provided that you also convey the
249 | machine-readable Corresponding Source under the terms of this License,
250 | in one of these ways:
251 |
252 | a) Convey the object code in, or embodied in, a physical product
253 | (including a physical distribution medium), accompanied by the
254 | Corresponding Source fixed on a durable physical medium
255 | customarily used for software interchange.
256 |
257 | b) Convey the object code in, or embodied in, a physical product
258 | (including a physical distribution medium), accompanied by a
259 | written offer, valid for at least three years and valid for as
260 | long as you offer spare parts or customer support for that product
261 | model, to give anyone who possesses the object code either (1) a
262 | copy of the Corresponding Source for all the software in the
263 | product that is covered by this License, on a durable physical
264 | medium customarily used for software interchange, for a price no
265 | more than your reasonable cost of physically performing this
266 | conveying of source, or (2) access to copy the
267 | Corresponding Source from a network server at no charge.
268 |
269 | c) Convey individual copies of the object code with a copy of the
270 | written offer to provide the Corresponding Source. This
271 | alternative is allowed only occasionally and noncommercially, and
272 | only if you received the object code with such an offer, in accord
273 | with subsection 6b.
274 |
275 | d) Convey the object code by offering access from a designated
276 | place (gratis or for a charge), and offer equivalent access to the
277 | Corresponding Source in the same way through the same place at no
278 | further charge. You need not require recipients to copy the
279 | Corresponding Source along with the object code. If the place to
280 | copy the object code is a network server, the Corresponding Source
281 | may be on a different server (operated by you or a third party)
282 | that supports equivalent copying facilities, provided you maintain
283 | clear directions next to the object code saying where to find the
284 | Corresponding Source. Regardless of what server hosts the
285 | Corresponding Source, you remain obligated to ensure that it is
286 | available for as long as needed to satisfy these requirements.
287 |
288 | e) Convey the object code using peer-to-peer transmission, provided
289 | you inform other peers where the object code and Corresponding
290 | Source of the work are being offered to the general public at no
291 | charge under subsection 6d.
292 |
293 | A separable portion of the object code, whose source code is excluded
294 | from the Corresponding Source as a System Library, need not be
295 | included in conveying the object code work.
296 |
297 | A "User Product" is either (1) a "consumer product", which means any
298 | tangible personal property which is normally used for personal, family,
299 | or household purposes, or (2) anything designed or sold for incorporation
300 | into a dwelling. In determining whether a product is a consumer product,
301 | doubtful cases shall be resolved in favor of coverage. For a particular
302 | product received by a particular user, "normally used" refers to a
303 | typical or common use of that class of product, regardless of the status
304 | of the particular user or of the way in which the particular user
305 | actually uses, or expects or is expected to use, the product. A product
306 | is a consumer product regardless of whether the product has substantial
307 | commercial, industrial or non-consumer uses, unless such uses represent
308 | the only significant mode of use of the product.
309 |
310 | "Installation Information" for a User Product means any methods,
311 | procedures, authorization keys, or other information required to install
312 | and execute modified versions of a covered work in that User Product from
313 | a modified version of its Corresponding Source. The information must
314 | suffice to ensure that the continued functioning of the modified object
315 | code is in no case prevented or interfered with solely because
316 | modification has been made.
317 |
318 | If you convey an object code work under this section in, or with, or
319 | specifically for use in, a User Product, and the conveying occurs as
320 | part of a transaction in which the right of possession and use of the
321 | User Product is transferred to the recipient in perpetuity or for a
322 | fixed term (regardless of how the transaction is characterized), the
323 | Corresponding Source conveyed under this section must be accompanied
324 | by the Installation Information. But this requirement does not apply
325 | if neither you nor any third party retains the ability to install
326 | modified object code on the User Product (for example, the work has
327 | been installed in ROM).
328 |
329 | The requirement to provide Installation Information does not include a
330 | requirement to continue to provide support service, warranty, or updates
331 | for a work that has been modified or installed by the recipient, or for
332 | the User Product in which it has been modified or installed. Access to a
333 | network may be denied when the modification itself materially and
334 | adversely affects the operation of the network or violates the rules and
335 | protocols for communication across the network.
336 |
337 | Corresponding Source conveyed, and Installation Information provided,
338 | in accord with this section must be in a format that is publicly
339 | documented (and with an implementation available to the public in
340 | source code form), and must require no special password or key for
341 | unpacking, reading or copying.
342 |
343 | 7. Additional Terms.
344 |
345 | "Additional permissions" are terms that supplement the terms of this
346 | License by making exceptions from one or more of its conditions.
347 | Additional permissions that are applicable to the entire Program shall
348 | be treated as though they were included in this License, to the extent
349 | that they are valid under applicable law. If additional permissions
350 | apply only to part of the Program, that part may be used separately
351 | under those permissions, but the entire Program remains governed by
352 | this License without regard to the additional permissions.
353 |
354 | When you convey a copy of a covered work, you may at your option
355 | remove any additional permissions from that copy, or from any part of
356 | it. (Additional permissions may be written to require their own
357 | removal in certain cases when you modify the work.) You may place
358 | additional permissions on material, added by you to a covered work,
359 | for which you have or can give appropriate copyright permission.
360 |
361 | Notwithstanding any other provision of this License, for material you
362 | add to a covered work, you may (if authorized by the copyright holders of
363 | that material) supplement the terms of this License with terms:
364 |
365 | a) Disclaiming warranty or limiting liability differently from the
366 | terms of sections 15 and 16 of this License; or
367 |
368 | b) Requiring preservation of specified reasonable legal notices or
369 | author attributions in that material or in the Appropriate Legal
370 | Notices displayed by works containing it; or
371 |
372 | c) Prohibiting misrepresentation of the origin of that material, or
373 | requiring that modified versions of such material be marked in
374 | reasonable ways as different from the original version; or
375 |
376 | d) Limiting the use for publicity purposes of names of licensors or
377 | authors of the material; or
378 |
379 | e) Declining to grant rights under trademark law for use of some
380 | trade names, trademarks, or service marks; or
381 |
382 | f) Requiring indemnification of licensors and authors of that
383 | material by anyone who conveys the material (or modified versions of
384 | it) with contractual assumptions of liability to the recipient, for
385 | any liability that these contractual assumptions directly impose on
386 | those licensors and authors.
387 |
388 | All other non-permissive additional terms are considered "further
389 | restrictions" within the meaning of section 10. If the Program as you
390 | received it, or any part of it, contains a notice stating that it is
391 | governed by this License along with a term that is a further
392 | restriction, you may remove that term. If a license document contains
393 | a further restriction but permits relicensing or conveying under this
394 | License, you may add to a covered work material governed by the terms
395 | of that license document, provided that the further restriction does
396 | not survive such relicensing or conveying.
397 |
398 | If you add terms to a covered work in accord with this section, you
399 | must place, in the relevant source files, a statement of the
400 | additional terms that apply to those files, or a notice indicating
401 | where to find the applicable terms.
402 |
403 | Additional terms, permissive or non-permissive, may be stated in the
404 | form of a separately written license, or stated as exceptions;
405 | the above requirements apply either way.
406 |
407 | 8. Termination.
408 |
409 | You may not propagate or modify a covered work except as expressly
410 | provided under this License. Any attempt otherwise to propagate or
411 | modify it is void, and will automatically terminate your rights under
412 | this License (including any patent licenses granted under the third
413 | paragraph of section 11).
414 |
415 | However, if you cease all violation of this License, then your
416 | license from a particular copyright holder is reinstated (a)
417 | provisionally, unless and until the copyright holder explicitly and
418 | finally terminates your license, and (b) permanently, if the copyright
419 | holder fails to notify you of the violation by some reasonable means
420 | prior to 60 days after the cessation.
421 |
422 | Moreover, your license from a particular copyright holder is
423 | reinstated permanently if the copyright holder notifies you of the
424 | violation by some reasonable means, this is the first time you have
425 | received notice of violation of this License (for any work) from that
426 | copyright holder, and you cure the violation prior to 30 days after
427 | your receipt of the notice.
428 |
429 | Termination of your rights under this section does not terminate the
430 | licenses of parties who have received copies or rights from you under
431 | this License. If your rights have been terminated and not permanently
432 | reinstated, you do not qualify to receive new licenses for the same
433 | material under section 10.
434 |
435 | 9. Acceptance Not Required for Having Copies.
436 |
437 | You are not required to accept this License in order to receive or
438 | run a copy of the Program. Ancillary propagation of a covered work
439 | occurring solely as a consequence of using peer-to-peer transmission
440 | to receive a copy likewise does not require acceptance. However,
441 | nothing other than this License grants you permission to propagate or
442 | modify any covered work. These actions infringe copyright if you do
443 | not accept this License. Therefore, by modifying or propagating a
444 | covered work, you indicate your acceptance of this License to do so.
445 |
446 | 10. Automatic Licensing of Downstream Recipients.
447 |
448 | Each time you convey a covered work, the recipient automatically
449 | receives a license from the original licensors, to run, modify and
450 | propagate that work, subject to this License. You are not responsible
451 | for enforcing compliance by third parties with this License.
452 |
453 | An "entity transaction" is a transaction transferring control of an
454 | organization, or substantially all assets of one, or subdividing an
455 | organization, or merging organizations. If propagation of a covered
456 | work results from an entity transaction, each party to that
457 | transaction who receives a copy of the work also receives whatever
458 | licenses to the work the party's predecessor in interest had or could
459 | give under the previous paragraph, plus a right to possession of the
460 | Corresponding Source of the work from the predecessor in interest, if
461 | the predecessor has it or can get it with reasonable efforts.
462 |
463 | You may not impose any further restrictions on the exercise of the
464 | rights granted or affirmed under this License. For example, you may
465 | not impose a license fee, royalty, or other charge for exercise of
466 | rights granted under this License, and you may not initiate litigation
467 | (including a cross-claim or counterclaim in a lawsuit) alleging that
468 | any patent claim is infringed by making, using, selling, offering for
469 | sale, or importing the Program or any portion of it.
470 |
471 | 11. Patents.
472 |
473 | A "contributor" is a copyright holder who authorizes use under this
474 | License of the Program or a work on which the Program is based. The
475 | work thus licensed is called the contributor's "contributor version".
476 |
477 | A contributor's "essential patent claims" are all patent claims
478 | owned or controlled by the contributor, whether already acquired or
479 | hereafter acquired, that would be infringed by some manner, permitted
480 | by this License, of making, using, or selling its contributor version,
481 | but do not include claims that would be infringed only as a
482 | consequence of further modification of the contributor version. For
483 | purposes of this definition, "control" includes the right to grant
484 | patent sublicenses in a manner consistent with the requirements of
485 | this License.
486 |
487 | Each contributor grants you a non-exclusive, worldwide, royalty-free
488 | patent license under the contributor's essential patent claims, to
489 | make, use, sell, offer for sale, import and otherwise run, modify and
490 | propagate the contents of its contributor version.
491 |
492 | In the following three paragraphs, a "patent license" is any express
493 | agreement or commitment, however denominated, not to enforce a patent
494 | (such as an express permission to practice a patent or covenant not to
495 | sue for patent infringement). To "grant" such a patent license to a
496 | party means to make such an agreement or commitment not to enforce a
497 | patent against the party.
498 |
499 | If you convey a covered work, knowingly relying on a patent license,
500 | and the Corresponding Source of the work is not available for anyone
501 | to copy, free of charge and under the terms of this License, through a
502 | publicly available network server or other readily accessible means,
503 | then you must either (1) cause the Corresponding Source to be so
504 | available, or (2) arrange to deprive yourself of the benefit of the
505 | patent license for this particular work, or (3) arrange, in a manner
506 | consistent with the requirements of this License, to extend the patent
507 | license to downstream recipients. "Knowingly relying" means you have
508 | actual knowledge that, but for the patent license, your conveying the
509 | covered work in a country, or your recipient's use of the covered work
510 | in a country, would infringe one or more identifiable patents in that
511 | country that you have reason to believe are valid.
512 |
513 | If, pursuant to or in connection with a single transaction or
514 | arrangement, you convey, or propagate by procuring conveyance of, a
515 | covered work, and grant a patent license to some of the parties
516 | receiving the covered work authorizing them to use, propagate, modify
517 | or convey a specific copy of the covered work, then the patent license
518 | you grant is automatically extended to all recipients of the covered
519 | work and works based on it.
520 |
521 | A patent license is "discriminatory" if it does not include within
522 | the scope of its coverage, prohibits the exercise of, or is
523 | conditioned on the non-exercise of one or more of the rights that are
524 | specifically granted under this License. You may not convey a covered
525 | work if you are a party to an arrangement with a third party that is
526 | in the business of distributing software, under which you make payment
527 | to the third party based on the extent of your activity of conveying
528 | the work, and under which the third party grants, to any of the
529 | parties who would receive the covered work from you, a discriminatory
530 | patent license (a) in connection with copies of the covered work
531 | conveyed by you (or copies made from those copies), or (b) primarily
532 | for and in connection with specific products or compilations that
533 | contain the covered work, unless you entered into that arrangement,
534 | or that patent license was granted, prior to 28 March 2007.
535 |
536 | Nothing in this License shall be construed as excluding or limiting
537 | any implied license or other defenses to infringement that may
538 | otherwise be available to you under applicable patent law.
539 |
540 | 12. No Surrender of Others' Freedom.
541 |
542 | If conditions are imposed on you (whether by court order, agreement or
543 | otherwise) that contradict the conditions of this License, they do not
544 | excuse you from the conditions of this License. If you cannot convey a
545 | covered work so as to satisfy simultaneously your obligations under this
546 | License and any other pertinent obligations, then as a consequence you may
547 | not convey it at all. For example, if you agree to terms that obligate you
548 | to collect a royalty for further conveying from those to whom you convey
549 | the Program, the only way you could satisfy both those terms and this
550 | License would be to refrain entirely from conveying the Program.
551 |
552 | 13. Use with the GNU Affero General Public License.
553 |
554 | Notwithstanding any other provision of this License, you have
555 | permission to link or combine any covered work with a work licensed
556 | under version 3 of the GNU Affero General Public License into a single
557 | combined work, and to convey the resulting work. The terms of this
558 | License will continue to apply to the part which is the covered work,
559 | but the special requirements of the GNU Affero General Public License,
560 | section 13, concerning interaction through a network will apply to the
561 | combination as such.
562 |
563 | 14. Revised Versions of this License.
564 |
565 | The Free Software Foundation may publish revised and/or new versions of
566 | the GNU General Public License from time to time. Such new versions will
567 | be similar in spirit to the present version, but may differ in detail to
568 | address new problems or concerns.
569 |
570 | Each version is given a distinguishing version number. If the
571 | Program specifies that a certain numbered version of the GNU General
572 | Public License "or any later version" applies to it, you have the
573 | option of following the terms and conditions either of that numbered
574 | version or of any later version published by the Free Software
575 | Foundation. If the Program does not specify a version number of the
576 | GNU General Public License, you may choose any version ever published
577 | by the Free Software Foundation.
578 |
579 | If the Program specifies that a proxy can decide which future
580 | versions of the GNU General Public License can be used, that proxy's
581 | public statement of acceptance of a version permanently authorizes you
582 | to choose that version for the Program.
583 |
584 | Later license versions may give you additional or different
585 | permissions. However, no additional obligations are imposed on any
586 | author or copyright holder as a result of your choosing to follow a
587 | later version.
588 |
589 | 15. Disclaimer of Warranty.
590 |
591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599 |
600 | 16. Limitation of Liability.
601 |
602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610 | SUCH DAMAGES.
611 |
612 | 17. Interpretation of Sections 15 and 16.
613 |
614 | If the disclaimer of warranty and limitation of liability provided
615 | above cannot be given local legal effect according to their terms,
616 | reviewing courts shall apply local law that most closely approximates
617 | an absolute waiver of all civil liability in connection with the
618 | Program, unless a warranty or assumption of liability accompanies a
619 | copy of the Program in return for a fee.
620 |
621 | END OF TERMS AND CONDITIONS
622 |
623 | How to Apply These Terms to Your New Programs
624 |
625 | If you develop a new program, and you want it to be of the greatest
626 | possible use to the public, the best way to achieve this is to make it
627 | free software which everyone can redistribute and change under these terms.
628 |
629 | To do so, attach the following notices to the program. It is safest
630 | to attach them to the start of each source file to most effectively
631 | state the exclusion of warranty; and each file should have at least
632 | the "copyright" line and a pointer to where the full notice is found.
633 |
634 |
635 | Copyright (C)
636 |
637 | This program is free software: you can redistribute it and/or modify
638 | it under the terms of the GNU General Public License as published by
639 | the Free Software Foundation, either version 3 of the License, or
640 | (at your option) any later version.
641 |
642 | This program is distributed in the hope that it will be useful,
643 | but WITHOUT ANY WARRANTY; without even the implied warranty of
644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645 | GNU General Public License for more details.
646 |
647 | You should have received a copy of the GNU General Public License
648 | along with this program. If not, see .
649 |
650 | Also add information on how to contact you by electronic and paper mail.
651 |
652 | If the program does terminal interaction, make it output a short
653 | notice like this when it starts in an interactive mode:
654 |
655 | Copyright (C)
656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657 | This is free software, and you are welcome to redistribute it
658 | under certain conditions; type `show c' for details.
659 |
660 | The hypothetical commands `show w' and `show c' should show the appropriate
661 | parts of the General Public License. Of course, your program's commands
662 | might be different; for a GUI interface, you would use an "about box".
663 |
664 | You should also get your employer (if you work as a programmer) or school,
665 | if any, to sign a "copyright disclaimer" for the program, if necessary.
666 | For more information on this, and how to apply and follow the GNU GPL, see
667 | .
668 |
669 | The GNU General Public License does not permit incorporating your program
670 | into proprietary programs. If your program is a subroutine library, you
671 | may consider it more useful to permit linking proprietary applications with
672 | the library. If this is what you want to do, use the GNU Lesser General
673 | Public License instead of this License. But first, please read
674 | .
675 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # 这里是MapServer的后端源码
2 |
3 | ## 前端源码在这里:https://github.com/Icemap/MapServer-Front
4 |
5 | ## 这是一个在需要本地化部署地图服务时,快速建立本地瓦片地图服务的小工具。
6 |
7 | ## 比如你部署服务的位置不能访问外网,但是你的前端又需要一个地图控件。或者你需要对地图瓦片进行处理,需要地图色调变成“五彩斑斓的黑色”,美工让你下载切片。那么这个工具可以帮你快速建立这样的瓦片地图服务。
8 |
9 | ## 这个后端小工具使用Java、Spring Boot编写。
10 |
11 | ## 基本思路为:
12 | > - 将传入的经纬度形式的矩形参数,转换成Web墨卡托形式的矩形参数(CoodUtils.java);
13 | > - 通过转换后的Web墨卡托参数形式的矩形,以及传入的地图类型、地图等级,计算出需下载的切片URL(InitUtils.java);
14 | > - 使用URL得到地图瓦片(HttpUtils.java);
15 | > - 保存至相应位置(FileUtils.java);
16 | > - 请求时返回相应位置的文件(ServerController.java);
17 |
18 | --------
19 |
20 | ## 支持地图类型为:
21 | > - Google卫星
22 | > - Google矢量
23 | > - Google地形
24 | > - 高德卫星
25 | > - 高德矢量
26 | > - 高德标签层
27 | > - 天地图卫星
28 | > - 天地图矢量
29 | > - 天地图标签层
30 | > - PS:多种类型的瓦片类型可以同时存在。
31 | > - PSS:瓦片保存位置为 ./map。
32 |
33 | --------
34 |
35 | ## 坐标系:
36 | > - Google与高德使用的大地坐标系为GCJ02,是加过偏的,使用时需要注意转经纬度。
37 | > - 天地图使用的大地坐标系为WGS84,是不加偏的,国家队待遇就是不一样=。=
38 |
39 | --------
40 |
41 | ## API简述:
42 |
43 | #### 1. 初始化地图(下载切片)
44 | > - /init/initMap POST, 参数为:
45 | > - left : 类型:double, 单位:经纬度, 含义:请求瓦片的左边界
46 | > - right : 类型:double, 单位:经纬度, 含义:请求瓦片的右边界
47 | > - top : 类型:double, 单位:经纬度, 含义:请求瓦片的上边界
48 | > - bottom : 类型:double, 单位:经纬度, 含义:请求瓦片的下边界
49 | > - type : 类型:string, 单位:瓦片类型, 含义:请求瓦片的类型,说明见瓦片类型参数说明
50 | > - level : 类型:int, 单位:瓦片等级, 含义:请求瓦片的等级,说明见瓦片等级参数说明
51 |
52 | #### 2. 获取拥有的地图类型、等级、范围
53 | > - /server/config GET, 参数为空
54 |
55 | #### 3. 地图服务
56 | > - /server/map/{type}/{x}/{y}/{z} GET, 参数为URL参数,放在请求的路径中:
57 | > - type : 类型:string, 单位:瓦片类型, 含义:请求瓦片的类型,说明见瓦片类型参数说明
58 | > - x : 类型:int, 单位:/, 含义:标准TMS(瓦片地图服务)的x参数
59 | > - y : 类型:int, 单位:/, 含义:标准TMS(瓦片地图服务)的y参数
60 | > - z : 类型:int, 单位:/, 含义:标准TMS(瓦片地图服务)的z参数
61 |
62 | ## 其余描述:
63 | > - 见前端Q&A页面。
64 |
--------------------------------------------------------------------------------
/img.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Icemap/MapServer/1ceab70ae9aba9ab832caf9dcb7c4714c2b1a4cc/img.jpg
--------------------------------------------------------------------------------
/mvnw:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | # ----------------------------------------------------------------------------
3 | # Licensed to the Apache Software Foundation (ASF) under one
4 | # or more contributor license agreements. See the NOTICE file
5 | # distributed with this work for additional information
6 | # regarding copyright ownership. The ASF licenses this file
7 | # to you under the Apache License, Version 2.0 (the
8 | # "License"); you may not use this file except in compliance
9 | # with the License. You may obtain a copy of the License at
10 | #
11 | # http://www.apache.org/licenses/LICENSE-2.0
12 | #
13 | # Unless required by applicable law or agreed to in writing,
14 | # software distributed under the License is distributed on an
15 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 | # KIND, either express or implied. See the License for the
17 | # specific language governing permissions and limitations
18 | # under the License.
19 | # ----------------------------------------------------------------------------
20 |
21 | # ----------------------------------------------------------------------------
22 | # Maven2 Start Up Batch script
23 | #
24 | # Required ENV vars:
25 | # ------------------
26 | # JAVA_HOME - location of a JDK home dir
27 | #
28 | # Optional ENV vars
29 | # -----------------
30 | # M2_HOME - location of maven2's installed home dir
31 | # MAVEN_OPTS - parameters passed to the Java VM when running Maven
32 | # e.g. to debug Maven itself, use
33 | # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
34 | # MAVEN_SKIP_RC - flag to disable loading of mavenrc files
35 | # ----------------------------------------------------------------------------
36 |
37 | if [ -z "$MAVEN_SKIP_RC" ] ; then
38 |
39 | if [ -f /etc/mavenrc ] ; then
40 | . /etc/mavenrc
41 | fi
42 |
43 | if [ -f "$HOME/.mavenrc" ] ; then
44 | . "$HOME/.mavenrc"
45 | fi
46 |
47 | fi
48 |
49 | # OS specific support. $var _must_ be set to either true or false.
50 | cygwin=false;
51 | darwin=false;
52 | mingw=false
53 | case "`uname`" in
54 | CYGWIN*) cygwin=true ;;
55 | MINGW*) mingw=true;;
56 | Darwin*) darwin=true
57 | # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
58 | # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
59 | if [ -z "$JAVA_HOME" ]; then
60 | if [ -x "/usr/libexec/java_home" ]; then
61 | export JAVA_HOME="`/usr/libexec/java_home`"
62 | else
63 | export JAVA_HOME="/Library/Java/Home"
64 | fi
65 | fi
66 | ;;
67 | esac
68 |
69 | if [ -z "$JAVA_HOME" ] ; then
70 | if [ -r /etc/gentoo-release ] ; then
71 | JAVA_HOME=`java-config --jre-home`
72 | fi
73 | fi
74 |
75 | if [ -z "$M2_HOME" ] ; then
76 | ## resolve links - $0 may be a link to maven's home
77 | PRG="$0"
78 |
79 | # need this for relative symlinks
80 | while [ -h "$PRG" ] ; do
81 | ls=`ls -ld "$PRG"`
82 | link=`expr "$ls" : '.*-> \(.*\)$'`
83 | if expr "$link" : '/.*' > /dev/null; then
84 | PRG="$link"
85 | else
86 | PRG="`dirname "$PRG"`/$link"
87 | fi
88 | done
89 |
90 | saveddir=`pwd`
91 |
92 | M2_HOME=`dirname "$PRG"`/..
93 |
94 | # make it fully qualified
95 | M2_HOME=`cd "$M2_HOME" && pwd`
96 |
97 | cd "$saveddir"
98 | # echo Using m2 at $M2_HOME
99 | fi
100 |
101 | # For Cygwin, ensure paths are in UNIX format before anything is touched
102 | if $cygwin ; then
103 | [ -n "$M2_HOME" ] &&
104 | M2_HOME=`cygpath --unix "$M2_HOME"`
105 | [ -n "$JAVA_HOME" ] &&
106 | JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
107 | [ -n "$CLASSPATH" ] &&
108 | CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
109 | fi
110 |
111 | # For Migwn, ensure paths are in UNIX format before anything is touched
112 | if $mingw ; then
113 | [ -n "$M2_HOME" ] &&
114 | M2_HOME="`(cd "$M2_HOME"; pwd)`"
115 | [ -n "$JAVA_HOME" ] &&
116 | JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
117 | # TODO classpath?
118 | fi
119 |
120 | if [ -z "$JAVA_HOME" ]; then
121 | javaExecutable="`which javac`"
122 | if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
123 | # readlink(1) is not available as standard on Solaris 10.
124 | readLink=`which readlink`
125 | if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
126 | if $darwin ; then
127 | javaHome="`dirname \"$javaExecutable\"`"
128 | javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
129 | else
130 | javaExecutable="`readlink -f \"$javaExecutable\"`"
131 | fi
132 | javaHome="`dirname \"$javaExecutable\"`"
133 | javaHome=`expr "$javaHome" : '\(.*\)/bin'`
134 | JAVA_HOME="$javaHome"
135 | export JAVA_HOME
136 | fi
137 | fi
138 | fi
139 |
140 | if [ -z "$JAVACMD" ] ; then
141 | if [ -n "$JAVA_HOME" ] ; then
142 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
143 | # IBM's JDK on AIX uses strange locations for the executables
144 | JAVACMD="$JAVA_HOME/jre/sh/java"
145 | else
146 | JAVACMD="$JAVA_HOME/bin/java"
147 | fi
148 | else
149 | JAVACMD="`which java`"
150 | fi
151 | fi
152 |
153 | if [ ! -x "$JAVACMD" ] ; then
154 | echo "Error: JAVA_HOME is not defined correctly." >&2
155 | echo " We cannot execute $JAVACMD" >&2
156 | exit 1
157 | fi
158 |
159 | if [ -z "$JAVA_HOME" ] ; then
160 | echo "Warning: JAVA_HOME environment variable is not set."
161 | fi
162 |
163 | CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
164 |
165 | # traverses directory structure from process work directory to filesystem root
166 | # first directory with .mvn subdirectory is considered project base directory
167 | find_maven_basedir() {
168 |
169 | if [ -z "$1" ]
170 | then
171 | echo "Path not specified to find_maven_basedir"
172 | return 1
173 | fi
174 |
175 | basedir="$1"
176 | wdir="$1"
177 | while [ "$wdir" != '/' ] ; do
178 | if [ -d "$wdir"/.mvn ] ; then
179 | basedir=$wdir
180 | break
181 | fi
182 | # workaround for JBEAP-8937 (on Solaris 10/Sparc)
183 | if [ -d "${wdir}" ]; then
184 | wdir=`cd "$wdir/.."; pwd`
185 | fi
186 | # end of workaround
187 | done
188 | echo "${basedir}"
189 | }
190 |
191 | # concatenates all lines of a file
192 | concat_lines() {
193 | if [ -f "$1" ]; then
194 | echo "$(tr -s '\n' ' ' < "$1")"
195 | fi
196 | }
197 |
198 | BASE_DIR=`find_maven_basedir "$(pwd)"`
199 | if [ -z "$BASE_DIR" ]; then
200 | exit 1;
201 | fi
202 |
203 | export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
204 | echo $MAVEN_PROJECTBASEDIR
205 | MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
206 |
207 | # For Cygwin, switch paths to Windows format before running java
208 | if $cygwin; then
209 | [ -n "$M2_HOME" ] &&
210 | M2_HOME=`cygpath --path --windows "$M2_HOME"`
211 | [ -n "$JAVA_HOME" ] &&
212 | JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
213 | [ -n "$CLASSPATH" ] &&
214 | CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
215 | [ -n "$MAVEN_PROJECTBASEDIR" ] &&
216 | MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
217 | fi
218 |
219 | WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
220 |
221 | exec "$JAVACMD" \
222 | $MAVEN_OPTS \
223 | -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
224 | "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
225 | ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
226 |
--------------------------------------------------------------------------------
/mvnw.cmd:
--------------------------------------------------------------------------------
1 | @REM ----------------------------------------------------------------------------
2 | @REM Licensed to the Apache Software Foundation (ASF) under one
3 | @REM or more contributor license agreements. See the NOTICE file
4 | @REM distributed with this work for additional information
5 | @REM regarding copyright ownership. The ASF licenses this file
6 | @REM to you under the Apache License, Version 2.0 (the
7 | @REM "License"); you may not use this file except in compliance
8 | @REM with the License. You may obtain a copy of the License at
9 | @REM
10 | @REM http://www.apache.org/licenses/LICENSE-2.0
11 | @REM
12 | @REM Unless required by applicable law or agreed to in writing,
13 | @REM software distributed under the License is distributed on an
14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 | @REM KIND, either express or implied. See the License for the
16 | @REM specific language governing permissions and limitations
17 | @REM under the License.
18 | @REM ----------------------------------------------------------------------------
19 |
20 | @REM ----------------------------------------------------------------------------
21 | @REM Maven2 Start Up Batch script
22 | @REM
23 | @REM Required ENV vars:
24 | @REM JAVA_HOME - location of a JDK home dir
25 | @REM
26 | @REM Optional ENV vars
27 | @REM M2_HOME - location of maven2's installed home dir
28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
31 | @REM e.g. to debug Maven itself, use
32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
34 | @REM ----------------------------------------------------------------------------
35 |
36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
37 | @echo off
38 | @REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
39 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
40 |
41 | @REM set %HOME% to equivalent of $HOME
42 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
43 |
44 | @REM Execute a user defined script before this one
45 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
46 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending
47 | if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
48 | if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
49 | :skipRcPre
50 |
51 | @setlocal
52 |
53 | set ERROR_CODE=0
54 |
55 | @REM To isolate internal variables from possible post scripts, we use another setlocal
56 | @setlocal
57 |
58 | @REM ==== START VALIDATION ====
59 | if not "%JAVA_HOME%" == "" goto OkJHome
60 |
61 | echo.
62 | echo Error: JAVA_HOME not found in your environment. >&2
63 | echo Please set the JAVA_HOME variable in your environment to match the >&2
64 | echo location of your Java installation. >&2
65 | echo.
66 | goto error
67 |
68 | :OkJHome
69 | if exist "%JAVA_HOME%\bin\java.exe" goto init
70 |
71 | echo.
72 | echo Error: JAVA_HOME is set to an invalid directory. >&2
73 | echo JAVA_HOME = "%JAVA_HOME%" >&2
74 | echo Please set the JAVA_HOME variable in your environment to match the >&2
75 | echo location of your Java installation. >&2
76 | echo.
77 | goto error
78 |
79 | @REM ==== END VALIDATION ====
80 |
81 | :init
82 |
83 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
84 | @REM Fallback to current working directory if not found.
85 |
86 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
87 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
88 |
89 | set EXEC_DIR=%CD%
90 | set WDIR=%EXEC_DIR%
91 | :findBaseDir
92 | IF EXIST "%WDIR%"\.mvn goto baseDirFound
93 | cd ..
94 | IF "%WDIR%"=="%CD%" goto baseDirNotFound
95 | set WDIR=%CD%
96 | goto findBaseDir
97 |
98 | :baseDirFound
99 | set MAVEN_PROJECTBASEDIR=%WDIR%
100 | cd "%EXEC_DIR%"
101 | goto endDetectBaseDir
102 |
103 | :baseDirNotFound
104 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
105 | cd "%EXEC_DIR%"
106 |
107 | :endDetectBaseDir
108 |
109 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
110 |
111 | @setlocal EnableExtensions EnableDelayedExpansion
112 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
113 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
114 |
115 | :endReadAdditionalConfig
116 |
117 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
118 |
119 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
120 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
121 |
122 | %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
123 | if ERRORLEVEL 1 goto error
124 | goto end
125 |
126 | :error
127 | set ERROR_CODE=1
128 |
129 | :end
130 | @endlocal & set ERROR_CODE=%ERROR_CODE%
131 |
132 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
133 | @REM check for post script, once with legacy .bat ending and once with .cmd ending
134 | if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
135 | if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
136 | :skipRcPost
137 |
138 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
139 | if "%MAVEN_BATCH_PAUSE%" == "on" pause
140 |
141 | if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
142 |
143 | exit /B %ERROR_CODE%
144 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.cheese
7 | MapServer
8 | 0.0.2
9 | jar
10 |
11 | MapServer
12 | Demo project for Spring Boot
13 |
14 |
15 | org.springframework.boot
16 | spring-boot-starter-parent
17 | 2.0.3.RELEASE
18 |
19 |
20 |
21 |
22 | UTF-8
23 | UTF-8
24 | 1.8
25 |
26 |
27 |
28 |
29 | org.springframework.boot
30 | spring-boot-starter-web
31 |
32 |
33 |
34 | org.springframework.boot
35 | spring-boot-starter-test
36 | test
37 |
38 |
39 |
40 |
41 | commons-httpclient
42 | commons-httpclient
43 | 3.1
44 |
45 |
46 |
47 |
48 | com.google.code.gson
49 | gson
50 | 2.8.4
51 |
52 |
53 |
54 |
55 |
56 |
57 | org.springframework.boot
58 | spring-boot-maven-plugin
59 |
60 |
61 |
62 |
63 |
64 |
65 |
--------------------------------------------------------------------------------
/src/main/java/META-INF/MANIFEST.MF:
--------------------------------------------------------------------------------
1 | Manifest-Version: 1.0
2 | Main-Class: com.cheese.MapServer.MapServerApplication
3 |
4 |
--------------------------------------------------------------------------------
/src/main/java/com/cheese/MapServer/MapServerApplication.java:
--------------------------------------------------------------------------------
1 | package com.cheese.MapServer;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class MapServerApplication {
8 |
9 | public static void main(String[] args) {
10 | SpringApplication.run(MapServerApplication.class, args);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/java/com/cheese/MapServer/bean/InitResult.java:
--------------------------------------------------------------------------------
1 | package com.cheese.MapServer.bean;
2 |
3 | public class InitResult
4 | {
5 | private Boolean success;
6 | private String type;
7 | private Integer level;
8 | private Object errorList;
9 |
10 | public Boolean getSuccess()
11 | {
12 | return success;
13 | }
14 |
15 | public void setSuccess(Boolean success)
16 | {
17 | this.success = success;
18 | }
19 |
20 | public String getType()
21 | {
22 | return type;
23 | }
24 |
25 | public void setType(String type)
26 | {
27 | this.type = type;
28 | }
29 |
30 | public Integer getLevel()
31 | {
32 | return level;
33 | }
34 |
35 | public void setLevel(Integer level)
36 | {
37 | this.level = level;
38 | }
39 |
40 | public Object getErrorList() {
41 | return errorList;
42 | }
43 |
44 | public void setErrorList(Object errorList) {
45 | this.errorList = errorList;
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/src/main/java/com/cheese/MapServer/bean/LatLngInfo.java:
--------------------------------------------------------------------------------
1 | package com.cheese.MapServer.bean;
2 |
3 | public class LatLngInfo
4 | {
5 | private double latitude;
6 | private double longitude;
7 |
8 | public LatLngInfo()
9 | {
10 | }
11 |
12 | public LatLngInfo(double latitude, double longitude)
13 | {
14 | this.setLatitude(latitude);
15 | this.setLongitude(longitude);
16 | }
17 |
18 | public double getLongitude()
19 | {
20 | return longitude;
21 | }
22 |
23 | public void setLongitude(double longitude)
24 | {
25 | this.longitude = longitude;
26 | }
27 |
28 | public double getLatitude()
29 | {
30 | return latitude;
31 | }
32 |
33 | public void setLatitude(double latitude)
34 | {
35 | this.latitude = latitude;
36 | }
37 | }
--------------------------------------------------------------------------------
/src/main/java/com/cheese/MapServer/bean/LevelInfo.java:
--------------------------------------------------------------------------------
1 | package com.cheese.MapServer.bean;
2 |
3 | public class LevelInfo
4 | {
5 | private Integer xL;
6 | private Integer xR;
7 | private Integer yT;
8 | private Integer yB;
9 | private Integer z;
10 |
11 | public Integer getxL()
12 | {
13 | return xL;
14 | }
15 |
16 | public void setxL(Integer xL)
17 | {
18 | this.xL = xL;
19 | }
20 |
21 | public Integer getxR()
22 | {
23 | return xR;
24 | }
25 |
26 | public void setxR(Integer xR)
27 | {
28 | this.xR = xR;
29 | }
30 |
31 | public Integer getyT()
32 | {
33 | return yT;
34 | }
35 |
36 | public void setyT(Integer yT)
37 | {
38 | this.yT = yT;
39 | }
40 |
41 | public Integer getyB()
42 | {
43 | return yB;
44 | }
45 |
46 | public void setyB(Integer yB)
47 | {
48 | this.yB = yB;
49 | }
50 |
51 | public Integer getZ()
52 | {
53 | return z;
54 | }
55 |
56 | public void setZ(Integer z)
57 | {
58 | this.z = z;
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/src/main/java/com/cheese/MapServer/bean/MapConfig.java:
--------------------------------------------------------------------------------
1 | package com.cheese.MapServer.bean;
2 |
3 | import com.cheese.MapServer.utils.BackgroundType;
4 |
5 | import java.util.HashMap;
6 | import java.util.Map;
7 |
8 | public class MapConfig
9 | {
10 | public Map> getConfig()
11 | {
12 | return config;
13 | }
14 |
15 | public void setConfig(Map> config)
16 | {
17 | this.config = config;
18 | }
19 |
20 | private Map> config = new HashMap<>();
21 |
22 |
23 | public static class PicArea
24 | {
25 | public Double getLeft()
26 | {
27 | return left;
28 | }
29 |
30 | public void setLeft(Double left)
31 | {
32 | this.left = left;
33 | }
34 |
35 | public Double getRight()
36 | {
37 | return right;
38 | }
39 |
40 | public void setRight(Double right)
41 | {
42 | this.right = right;
43 | }
44 |
45 | public Double getTop()
46 | {
47 | return top;
48 | }
49 |
50 | public void setTop(Double top)
51 | {
52 | this.top = top;
53 | }
54 |
55 | public Double getBottom()
56 | {
57 | return bottom;
58 | }
59 |
60 | public void setBottom(Double bottom)
61 | {
62 | this.bottom = bottom;
63 | }
64 |
65 | private Double left;
66 | private Double right;
67 | private Double top;
68 | private Double bottom;
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/src/main/java/com/cheese/MapServer/bean/ThreadReqParamInfo.java:
--------------------------------------------------------------------------------
1 | package com.cheese.MapServer.bean;
2 |
3 | import com.cheese.MapServer.utils.BackgroundType;
4 |
5 | /**
6 | * @author Icemap
7 | * @date 2019/4/28 5:00 PM
8 | */
9 | public class ThreadReqParamInfo {
10 | private BackgroundType type;
11 | private Integer x;
12 | private Integer y;
13 | private Integer z;
14 |
15 | public ThreadReqParamInfo() {
16 | }
17 |
18 | public ThreadReqParamInfo(BackgroundType type, Integer x, Integer y, Integer z) {
19 | this.type = type;
20 | this.x = x;
21 | this.y = y;
22 | this.z = z;
23 | }
24 |
25 | public BackgroundType getType() {
26 | return type;
27 | }
28 |
29 | public void setType(BackgroundType type) {
30 | this.type = type;
31 | }
32 |
33 | public Integer getX() {
34 | return x;
35 | }
36 |
37 | public void setX(Integer x) {
38 | this.x = x;
39 | }
40 |
41 | public Integer getY() {
42 | return y;
43 | }
44 |
45 | public void setY(Integer y) {
46 | this.y = y;
47 | }
48 |
49 | public Integer getZ() {
50 | return z;
51 | }
52 |
53 | public void setZ(Integer z) {
54 | this.z = z;
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/src/main/java/com/cheese/MapServer/controller/InitController.java:
--------------------------------------------------------------------------------
1 | package com.cheese.MapServer.controller;
2 |
3 | import com.cheese.MapServer.bean.InitResult;
4 | import com.cheese.MapServer.bean.ThreadReqParamInfo;
5 | import com.cheese.MapServer.service.InitService;
6 | import com.cheese.MapServer.utils.InitUtils;
7 | import org.springframework.beans.factory.annotation.Autowired;
8 | import org.springframework.web.bind.annotation.RequestMapping;
9 | import org.springframework.web.bind.annotation.RestController;
10 |
11 | import java.util.List;
12 |
13 | @RestController
14 | @RequestMapping("/init")
15 | public class InitController
16 | {
17 | @Autowired
18 | InitService initService;
19 |
20 | @RequestMapping("/initMap")
21 | public InitResult initMap(Double left, Double right, Double top,
22 | Double bottom, Integer level, String type)
23 | {
24 | List errorList = initService.getLevelPic(InitUtils.getTypeByName(type),
25 | level, left, right, top, bottom);
26 |
27 | InitResult initResult = new InitResult();
28 | initResult.setLevel(level);
29 | initResult.setSuccess(errorList.isEmpty());
30 | initResult.setType(type);
31 | initResult.setErrorList(errorList);
32 |
33 | return initResult;
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/src/main/java/com/cheese/MapServer/controller/ServerController.java:
--------------------------------------------------------------------------------
1 | package com.cheese.MapServer.controller;
2 |
3 | import com.cheese.MapServer.bean.MapConfig;
4 | import com.cheese.MapServer.utils.FileUtils;
5 | import com.cheese.MapServer.utils.InitUtils;
6 | import com.google.gson.Gson;
7 | import org.springframework.http.MediaType;
8 | import org.springframework.web.bind.annotation.PathVariable;
9 | import org.springframework.web.bind.annotation.RequestMapping;
10 | import org.springframework.web.bind.annotation.RequestMethod;
11 | import org.springframework.web.bind.annotation.RestController;
12 |
13 | import java.io.File;
14 | import java.io.FileInputStream;
15 | import java.io.IOException;
16 |
17 | @RestController
18 | @RequestMapping("/server")
19 | public class ServerController
20 | {
21 | @RequestMapping(
22 | value = "/map/{type}/{x}/{y}/{z}",
23 | method = RequestMethod.GET,
24 | produces = { MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_GIF_VALUE, MediaType.IMAGE_PNG_VALUE}
25 | )
26 | public byte[] initMap(@PathVariable Integer x, @PathVariable Integer y,
27 | @PathVariable Integer z, @PathVariable String type) throws IOException
28 | {
29 | String path = InitUtils.getPathByType(InitUtils.getTypeByName(type));
30 |
31 | String imgPath = path + z + "/" + x + "/" + y + "/img.jpg";
32 | File file = new File(imgPath);
33 | FileInputStream inputStream = new FileInputStream(file);
34 | byte[] data = new byte[(int)file.length()];
35 | inputStream.read(data);
36 | inputStream.close();
37 |
38 | return data;
39 | }
40 |
41 | @RequestMapping("/config")
42 | public MapConfig getConfig()
43 | {
44 | try
45 | {
46 | File configFile = new File("map/map.config.json");
47 | MapConfig mapConfig = new MapConfig();
48 | if(configFile.exists())
49 | mapConfig = new Gson().fromJson(FileUtils.readFileByUtf8("map/map.config.json"),
50 | MapConfig.class);
51 |
52 | return mapConfig;
53 | }
54 | catch (IOException e)
55 | {
56 | e.printStackTrace();
57 | }
58 | return new MapConfig();
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/src/main/java/com/cheese/MapServer/service/InitService.java:
--------------------------------------------------------------------------------
1 | package com.cheese.MapServer.service;
2 |
3 | import com.cheese.MapServer.bean.MapConfig;
4 | import com.cheese.MapServer.bean.ThreadReqParamInfo;
5 | import com.cheese.MapServer.utils.BackgroundType;
6 | import com.cheese.MapServer.utils.FileUtils;
7 | import com.cheese.MapServer.utils.InitUtils;
8 | import com.google.gson.Gson;
9 | import org.springframework.beans.factory.annotation.Value;
10 | import org.springframework.stereotype.Service;
11 |
12 | import javax.annotation.PostConstruct;
13 | import java.io.File;
14 | import java.io.FileWriter;
15 | import java.io.IOException;
16 | import java.util.HashMap;
17 | import java.util.List;
18 | import java.util.Map;
19 |
20 | @Service
21 | public class InitService
22 | {
23 | @Value("#{'${map-server.init-dirs}'.split(',')}")
24 | public List initCreateDirs;
25 |
26 | @Value("${map-server.config-file}")
27 | public String configFilePath;
28 |
29 | @PostConstruct
30 | public void init() {
31 | for (String dirPath : initCreateDirs) {
32 | File create = new File(dirPath.trim());
33 | if(!create.exists()) {
34 | create.mkdir();
35 | }
36 | }
37 | }
38 |
39 | public List getLevelPic(BackgroundType type, Integer level, Double left,
40 | Double right, Double top, Double bottom)
41 | {
42 | List errorList = InitUtils.getLevelPic(type, level, left, right, top, bottom);
43 | addConfig(type, level, left, right, top, bottom);
44 |
45 | return errorList;
46 | }
47 |
48 | public void addConfig(BackgroundType type, Integer level, Double left,
49 | Double right, Double top, Double bottom)
50 | {
51 | try
52 | {
53 | File configFile = new File(configFilePath);
54 | MapConfig mapConfig = new MapConfig();
55 | if(configFile.exists())
56 | mapConfig = new Gson().fromJson(FileUtils.readFileByUtf8(configFilePath),
57 | MapConfig.class);
58 |
59 | MapConfig.PicArea area = new MapConfig.PicArea();
60 | area.setLeft(left);
61 | area.setRight(right);
62 | area.setBottom(bottom);
63 | area.setTop(top);
64 |
65 | if(mapConfig.getConfig().containsKey(type))
66 | mapConfig.getConfig().get(type).put(level, area);
67 | else
68 | {
69 | Map levelArea = new HashMap<>();
70 | levelArea.put(level, area);
71 | mapConfig.getConfig().put(type, levelArea);
72 | }
73 |
74 | FileWriter fileWriter = new FileWriter(configFile);
75 | fileWriter.write(new Gson().toJson(mapConfig));
76 | fileWriter.close();
77 | }
78 | catch (IOException e)
79 | {
80 | e.printStackTrace();
81 | }
82 | }
83 | }
84 |
--------------------------------------------------------------------------------
/src/main/java/com/cheese/MapServer/utils/BackgroundType.java:
--------------------------------------------------------------------------------
1 | package com.cheese.MapServer.utils;
2 |
3 | public enum BackgroundType
4 | {
5 | Google_Satellite,
6 | Google_Image,
7 | Google_Terrain,
8 | AMap_Satellite,
9 | AMap_Cover,
10 | AMap_Image,
11 | TianDiTu_Satellite,
12 | TianDiTu_Image,
13 | TianDiTu_Cover
14 | }
15 |
--------------------------------------------------------------------------------
/src/main/java/com/cheese/MapServer/utils/CoodUtils.java:
--------------------------------------------------------------------------------
1 | package com.cheese.MapServer.utils;
2 |
3 | import com.cheese.MapServer.bean.LatLngInfo;
4 |
5 | public class CoodUtils
6 | {
7 | public static double a = 6378245.0D;
8 | public static double ee = 0.006693421622965943D;
9 |
10 | public static LatLngInfo mercatorToLonLat(double lon, double lat)
11 | {
12 | double toX = lon / 20037508.34D * 180.0D;
13 | double toY = lat / 20037508.34D * 180.0D;
14 | toY = 57.295779513082323D * (2.0D * Math.atan(Math
15 | .exp(toY * 3.141592653589793D / 180.0D)) - 1.570796326794897D);
16 | return new LatLngInfo(toY, toX);
17 | }
18 |
19 | public static LatLngInfo lonLatToMercator(double lon, double lat)
20 | {
21 | double toX = lon * 20037508.34D / 180.0D;
22 | double toY = Math.log(Math
23 | .tan((90.0D + lat) * 3.141592653589793D / 360.0D)) / 0.0174532925199433D;
24 | toY = toY * 20037508.34D / 180.0D;
25 |
26 | return new LatLngInfo(toY, toX);
27 | }
28 |
29 | public static LatLngInfo lonLatToGoogleMercator(double lon, double lat)
30 | {
31 | double toX = lon * 20037508.34D / 180.0D + 20037508.34D;
32 | double toY = Math.log(Math
33 | .tan((90.0D + lat) * 3.141592653589793D / 360.0D)) / 0.0174532925199433D;
34 | toY = toY * 20037508.34D / 180.0D;
35 | toY = 20037508.34D - toY;
36 | return new LatLngInfo(toY, toX);
37 | }
38 |
39 | public static LatLngInfo mercatorToGcj(double lon, double lat)
40 | {
41 | LatLngInfo latLngInfo = mercatorToLonLat(lon, lat);
42 | return gps84_To_Gcj02(latLngInfo.getLatitude(), latLngInfo.getLongitude());
43 | }
44 |
45 | public static LatLngInfo gcjToMercator(double lon, double lat)
46 | {
47 | LatLngInfo latLngInfo = gcj_To_Gps84(lat, lon);
48 | return lonLatToMercator(latLngInfo.getLongitude(), latLngInfo.getLatitude());
49 | }
50 |
51 | public static LatLngInfo gps84_To_Gcj02(double lat, double lon)
52 | {
53 | if (outOfChina(lat, lon))
54 | {
55 | return new LatLngInfo(lat, lon);
56 | }
57 | double dLat = transformLat(lon - 105.0D, lat - 35.0D);
58 | double dLon = transformLon(lon - 105.0D, lat - 35.0D);
59 | double radLat = lat / 180.0D * 3.141592653589793D;
60 | double magic = Math.sin(radLat);
61 | magic = 1.0D - ee * magic * magic;
62 | double sqrtMagic = Math.sqrt(magic);
63 | dLat = dLat * 180.0D
64 | / (a * (1.0D - ee) / (magic * sqrtMagic) * 3.141592653589793D);
65 | dLon = dLon * 180.0D
66 | / (a / sqrtMagic * Math.cos(radLat) * 3.141592653589793D);
67 | double mgLat = lat + dLat;
68 | double mgLon = lon + dLon;
69 | return new LatLngInfo(mgLat, mgLon);
70 | }
71 |
72 | public static LatLngInfo gcj_To_Gps84(double lat, double lon)
73 | {
74 | LatLngInfo gps = transform(lat, lon);
75 | double lontitude = lon * 2.0D - gps.getLongitude();
76 | double latitude = lat * 2.0D - gps.getLatitude();
77 | return new LatLngInfo(latitude, lontitude);
78 | }
79 |
80 | public static LatLngInfo transform(double lat, double lon)
81 | {
82 | if (outOfChina(lat, lon))
83 | {
84 | return new LatLngInfo(lat, lon);
85 | }
86 | double dLat = transformLat(lon - 105.0D, lat - 35.0D);
87 | double dLon = transformLon(lon - 105.0D, lat - 35.0D);
88 | double radLat = lat / 180.0D * 3.141592653589793D;
89 | double magic = Math.sin(radLat);
90 | magic = 1.0D - ee * magic * magic;
91 | double sqrtMagic = Math.sqrt(magic);
92 | dLat = dLat * 180.0D
93 | / (a * (1.0D - ee) / (magic * sqrtMagic) * 3.141592653589793D);
94 | dLon = dLon * 180.0D
95 | / (a / sqrtMagic * Math.cos(radLat) * 3.141592653589793D);
96 | double mgLat = lat + dLat;
97 | double mgLon = lon + dLon;
98 | return new LatLngInfo(mgLat, mgLon);
99 | }
100 |
101 | public static boolean outOfChina(double lat, double lon)
102 | {
103 | if ((lon < 72.004000000000005D) || (lon > 137.8347D))
104 | return true;
105 | if ((lat < 0.8293D) || (lat > 55.827100000000002D))
106 | return true;
107 | return false;
108 | }
109 |
110 | public static double transformLat(double x, double y)
111 | {
112 | double ret = -100.0D + 2.0D * x + 3.0D * y + 0.2D * y * y + 0.1D * x
113 | * y + 0.2D * Math.sqrt(Math.abs(x));
114 |
115 | ret += (20.0D * Math.sin(6.0D * x * 3.141592653589793D) + 20.0D * Math
116 | .sin(2.0D * x * 3.141592653589793D)) * 2.0D / 3.0D;
117 | ret += (20.0D * Math.sin(y * 3.141592653589793D) + 40.0D * Math
118 | .sin(y / 3.0D * 3.141592653589793D)) * 2.0D / 3.0D;
119 | ret += (160.0D * Math.sin(y / 12.0D * 3.141592653589793D) + 320.0D * Math
120 | .sin(y * 3.141592653589793D / 30.0D)) * 2.0D / 3.0D;
121 | return ret;
122 | }
123 |
124 | public static double transformLon(double x, double y)
125 | {
126 | double ret = 300.0D + x + 2.0D * y + 0.1D * x * x + 0.1D * x * y + 0.1D
127 | * Math.sqrt(Math.abs(x));
128 |
129 | ret += (20.0D * Math.sin(6.0D * x * 3.141592653589793D) + 20.0D * Math
130 | .sin(2.0D * x * 3.141592653589793D)) * 2.0D / 3.0D;
131 | ret += (20.0D * Math.sin(x * 3.141592653589793D) + 40.0D * Math
132 | .sin(x / 3.0D * 3.141592653589793D)) * 2.0D / 3.0D;
133 | ret += (150.0D * Math.sin(x / 12.0D * 3.141592653589793D) + 300.0D * Math
134 | .sin(x / 30.0D * 3.141592653589793D)) * 2.0D / 3.0D;
135 |
136 | return ret;
137 | }
138 | }
139 |
--------------------------------------------------------------------------------
/src/main/java/com/cheese/MapServer/utils/FileUtils.java:
--------------------------------------------------------------------------------
1 | package com.cheese.MapServer.utils;
2 |
3 | import java.io.BufferedReader;
4 | import java.io.File;
5 | import java.io.FileInputStream;
6 | import java.io.FileOutputStream;
7 | import java.io.FileReader;
8 | import java.io.IOException;
9 | import java.io.InputStream;
10 | import java.io.InputStreamReader;
11 | import java.io.OutputStream;
12 | import java.util.Date;
13 |
14 | import org.springframework.core.io.ClassPathResource;
15 | import org.springframework.core.io.Resource;
16 | import org.springframework.web.multipart.MultipartFile;
17 |
18 | public class FileUtils
19 | {
20 | public static Integer readTideInfo(String fileName,String datetime)
21 | {
22 | File file = new File(fileName);
23 | BufferedReader reader = null;
24 | try
25 | {
26 | reader = new BufferedReader(new FileReader(file));
27 | String tempString = null;
28 | while ((tempString = reader.readLine()) != null)
29 | {
30 | String[] tempArray = tempString.split(",");
31 | if(tempArray[2].trim().equals("tide" + datetime + ".nc"))
32 | return Integer.parseInt(tempArray[0]);
33 | }
34 | reader.close();
35 | }
36 | catch (IOException e)
37 | {
38 | e.printStackTrace();
39 | }
40 | finally
41 | {
42 | if (reader != null)
43 | {
44 | try
45 | {
46 | reader.close();
47 | }
48 | catch (IOException e1)
49 | {
50 | }
51 | }
52 | }
53 |
54 | return null;
55 | }
56 |
57 | public static String readFileByLines(String fileName)
58 | {
59 | StringBuilder sb = new StringBuilder();
60 | File file = new File(fileName);
61 | BufferedReader reader = null;
62 | try
63 | {
64 | reader = new BufferedReader(new FileReader(file));
65 | String tempString = null;
66 | while ((tempString = reader.readLine()) != null)
67 | {
68 | sb.append(tempString);
69 | }
70 | reader.close();
71 | }
72 | catch (IOException e)
73 | {
74 | e.printStackTrace();
75 | }
76 | finally
77 | {
78 | if (reader != null)
79 | {
80 | try
81 | {
82 | reader.close();
83 | }
84 | catch (IOException e1)
85 | {
86 | }
87 | }
88 | }
89 |
90 | return sb.toString();
91 | }
92 |
93 | public static String readResourcesByLines(String path)
94 | {
95 | Resource res = new ClassPathResource(path);
96 |
97 | try
98 | {
99 | return readFileByUtf8(res.getFile().getAbsolutePath());
100 | }
101 | catch (IOException e)
102 | {
103 | e.printStackTrace();
104 | }
105 |
106 | return null;
107 | }
108 |
109 | public static String readFileByUtf8(String path) throws IOException
110 | {
111 | StringBuffer sb = new StringBuffer();
112 | FileInputStream fis = new FileInputStream(path);
113 | InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
114 | BufferedReader br = new BufferedReader(isr);
115 | String line = null;
116 | while ((line = br.readLine()) != null)
117 | {
118 | sb.append(line);
119 | }
120 | br.close();
121 | return sb.toString();
122 | }
123 |
124 | public static String saveFile(MultipartFile file, String path)
125 | {
126 | String extName = file.getOriginalFilename().substring(file.
127 | getOriginalFilename().lastIndexOf(".")).toLowerCase();
128 | String fileName = new Date().getTime() + extName;
129 |
130 | saveFile(safeGetInputStream(file), fileName, path);
131 | return fileName;
132 | }
133 |
134 | public static String saveFile(InputStream inputStream, String fileName,String path)
135 | {
136 | String savePath = "";
137 |
138 | OutputStream os = null;
139 | try
140 | {
141 | byte[] bs = new byte[1024];
142 | int len;
143 |
144 | File tempFile = new File(path);
145 | if (!tempFile.exists())
146 | {
147 | tempFile.mkdirs();
148 | }
149 |
150 | savePath = path + fileName;
151 | os = new FileOutputStream(savePath);
152 | while ((len = inputStream.read(bs)) != -1)
153 | {
154 | os.write(bs, 0, len);
155 | }
156 |
157 | }
158 | catch (IOException e)
159 | {
160 | e.printStackTrace();
161 | }
162 | catch (Exception e)
163 | {
164 | e.printStackTrace();
165 | }
166 | finally
167 | {
168 | try
169 | {
170 | if(os != null)
171 | os.close();
172 | if(inputStream != null)
173 | inputStream.close();
174 | }
175 | catch (IOException e)
176 | {
177 | e.printStackTrace();
178 | }
179 | }
180 | return fileName;
181 | }
182 |
183 | public static String savePic(InputStream inputStream, String fileName,String path)
184 | {
185 | return saveFile(inputStream, fileName, path);
186 | }
187 |
188 | public static String readResourcesByLinesWithEnter(String path)
189 | {
190 | Resource res = new ClassPathResource(path);
191 |
192 | try
193 | {
194 | return readFileByUtf8WithEnter(res.getFile().getAbsolutePath());
195 | }
196 | catch (IOException e)
197 | {
198 | e.printStackTrace();
199 | }
200 |
201 | return null;
202 | }
203 |
204 | public static String readFileByUtf8WithEnter(String path) throws IOException
205 | {
206 | StringBuffer sb = new StringBuffer();
207 | FileInputStream fis = new FileInputStream(path);
208 | InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
209 | BufferedReader br = new BufferedReader(isr);
210 | String line = null;
211 | while ((line = br.readLine()) != null)
212 | {
213 | sb.append(line).append(System.getProperty("line.separator"));
214 | }
215 | br.close();
216 | return sb.toString();
217 | }
218 |
219 | public static InputStream safeGetInputStream(MultipartFile file)
220 | {
221 | InputStream is = null;
222 | try
223 | {
224 | is = file.getInputStream();
225 | }
226 | catch (IOException e)
227 | {
228 | e.printStackTrace();
229 | }
230 | return is;
231 | }
232 | }
233 |
--------------------------------------------------------------------------------
/src/main/java/com/cheese/MapServer/utils/HttpUtils.java:
--------------------------------------------------------------------------------
1 | package com.cheese.MapServer.utils;
2 |
3 | import java.awt.image.BufferedImage;
4 | import java.io.BufferedReader;
5 | import java.io.ByteArrayOutputStream;
6 | import java.io.IOException;
7 | import java.io.InputStreamReader;
8 | import java.io.OutputStreamWriter;
9 | import java.io.PrintWriter;
10 | import java.io.UnsupportedEncodingException;
11 | import java.net.HttpURLConnection;
12 | import java.net.MalformedURLException;
13 | import java.net.URL;
14 | import java.net.URLEncoder;
15 | import java.util.Iterator;
16 | import java.util.Map;
17 | import java.util.Set;
18 |
19 | import javax.imageio.ImageIO;
20 |
21 | import org.apache.commons.httpclient.HttpClient;
22 | import org.apache.commons.httpclient.HttpException;
23 | import org.apache.commons.httpclient.HttpStatus;
24 | import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
25 | import org.apache.commons.httpclient.methods.GetMethod;
26 | import org.apache.commons.httpclient.methods.PostMethod;
27 | import org.apache.commons.logging.Log;
28 | import org.apache.commons.logging.LogFactory;
29 |
30 | public class HttpUtils
31 | {
32 | public static BufferedImage getImage(String url) throws IOException
33 | {
34 | BufferedImage bufImg = null;
35 |
36 | URL urlObj = new URL(url);
37 | HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection();
38 |
39 | // 连接超时
40 | conn.setDoInput(true);
41 | conn.setDoOutput(true);
42 | conn.setConnectTimeout(25000);
43 |
44 | // 读取超时 --服务器响应比较慢,增大时间
45 | conn.setReadTimeout(25000);
46 | conn.setRequestMethod("GET");
47 | conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36");
48 | conn.connect();
49 |
50 | bufImg = ImageIO.read(conn.getInputStream());
51 |
52 | return bufImg;
53 | }
54 |
55 | public static byte[] getRequest(String url, String repType)
56 | {
57 | String result = "";
58 | byte[] resByt = null;
59 | try
60 | {
61 | URL urlObj = new URL(url);
62 | HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection();
63 |
64 | // 连接超时
65 | conn.setDoInput(true);
66 | conn.setDoOutput(true);
67 | conn.setConnectTimeout(25000);
68 |
69 | // 读取超时 --服务器响应比较慢,增大时间
70 | conn.setReadTimeout(25000);
71 | conn.setRequestMethod("GET");
72 | conn.connect();
73 |
74 | PrintWriter out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "UTF-8"), true);
75 |
76 | if ("image/jpeg".equals(repType))
77 | {
78 | ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
79 | BufferedImage bufImg = ImageIO.read(conn.getInputStream());
80 | ImageIO.write(bufImg, "jpg", outputStream);
81 | resByt = outputStream.toByteArray();
82 | outputStream.close();
83 | }
84 | else
85 | {
86 | // 取得输入流,并使用Reader读取
87 | BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
88 |
89 | System.out.println("=============================");
90 | System.out.println("Contents of get request");
91 | System.out.println("=============================");
92 | String lines = null;
93 | while ((lines = reader.readLine()) != null)
94 | {
95 | System.out.println(lines);
96 | result += lines;
97 | result += "\r";
98 | }
99 | resByt = result.getBytes();
100 | reader.close();
101 | }
102 | out.print(resByt);
103 | out.flush();
104 | out.close();
105 | // 断开连接
106 | conn.disconnect();
107 | System.out.println("=============================");
108 | System.out.println("Contents of get request ends");
109 | System.out.println("=============================");
110 | }
111 | catch (MalformedURLException e)
112 | {
113 | // TODO Auto-generated catch block
114 | e.printStackTrace();
115 | }
116 | catch (IOException e)
117 | {
118 | // TODO Auto-generated catch block
119 | e.printStackTrace();
120 | }
121 |
122 | return resByt;
123 | }
124 |
125 |
126 |
127 |
128 | private static Log log = LogFactory.getLog(HttpUtils.class);
129 |
130 | /**
131 | * 定义编码格式 UTF-8
132 | */
133 | public static final String URL_PARAM_DECODECHARSET_UTF8 = "UTF-8";
134 |
135 | /**
136 | * 定义编码格式 GBK
137 | */
138 | public static final String URL_PARAM_DECODECHARSET_GBK = "GBK";
139 |
140 | private static final String URL_PARAM_CONNECT_FLAG = "&";
141 |
142 | private static final String EMPTY = "";
143 |
144 | private static MultiThreadedHttpConnectionManager connectionManager = null;
145 |
146 | private static int connectionTimeOut = 600000;
147 |
148 | private static int socketTimeOut = 600000;
149 |
150 | private static int maxConnectionPerHost = 20;
151 |
152 | private static int maxTotalConnections = 20;
153 |
154 | private static HttpClient client;
155 |
156 | static{
157 | connectionManager = new MultiThreadedHttpConnectionManager();
158 | connectionManager.getParams().setConnectionTimeout(connectionTimeOut);
159 | connectionManager.getParams().setSoTimeout(socketTimeOut);
160 | connectionManager.getParams().setDefaultMaxConnectionsPerHost(maxConnectionPerHost);
161 | connectionManager.getParams().setMaxTotalConnections(maxTotalConnections);
162 | client = new HttpClient(connectionManager);
163 | }
164 |
165 | /**
166 | * POST方式提交数据
167 | * @param url
168 | * 待请求的URL
169 | * @param params
170 | * 要提交的数据
171 | * @param enc
172 | * 编码
173 | * @return
174 | * 响应结果
175 | * @throws IOException
176 | * IO异常
177 | */
178 | public static String URLPost(String url, Map params, String enc){
179 |
180 | String response = EMPTY;
181 | PostMethod postMethod = null;
182 | try {
183 | postMethod = new PostMethod(url);
184 | postMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=" + enc);
185 | //将表单的值放入postMethod中
186 | Set keySet = params.keySet();
187 | for(String key : keySet){
188 | String value = params.get(key);
189 | postMethod.addParameter(key, value);
190 | }
191 | //执行postMethod
192 | int statusCode = client.executeMethod(postMethod);
193 | if(statusCode == HttpStatus.SC_OK) {
194 | response = postMethod.getResponseBodyAsString();
195 | }else{
196 | log.error("响应状态码 = " + postMethod.getStatusCode());
197 | }
198 | }catch(HttpException e){
199 | log.error("发生致命的异常,可能是协议不对或者返回的内容有问题", e);
200 | e.printStackTrace();
201 | }catch(IOException e){
202 | log.error("发生网络异常", e);
203 | e.printStackTrace();
204 | }finally{
205 | if(postMethod != null){
206 | postMethod.releaseConnection();
207 | postMethod = null;
208 | }
209 | }
210 |
211 | return response;
212 | }
213 |
214 | /**
215 | * GET方式提交数据
216 | * @param url
217 | * 待请求的URL
218 | * @param params
219 | * 要提交的数据
220 | * @param enc
221 | * 编码
222 | * @return
223 | * 响应结果
224 | * @throws IOException
225 | * IO异常
226 | */
227 | public static String URLGet(String url, Map params, String enc){
228 |
229 | String response = EMPTY;
230 | GetMethod getMethod = null;
231 | StringBuffer strtTotalURL = new StringBuffer(EMPTY);
232 |
233 | if(strtTotalURL.indexOf("?") == -1) {
234 | strtTotalURL.append(url).append("?").append(getUrl(params, enc));
235 | } else {
236 | strtTotalURL.append(url).append("&").append(getUrl(params, enc));
237 | }
238 | log.debug("GET请求URL = \n" + strtTotalURL.toString());
239 |
240 | try {
241 | getMethod = new GetMethod(strtTotalURL.toString());
242 | getMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=" + enc);
243 | //执行getMethod
244 | int statusCode = client.executeMethod(getMethod);
245 | if(statusCode == HttpStatus.SC_OK) {
246 | response = getMethod.getResponseBodyAsString();
247 | }else{
248 | log.debug("响应状态码 = " + getMethod.getStatusCode());
249 | }
250 | }catch(HttpException e){
251 | log.error("发生致命的异常,可能是协议不对或者返回的内容有问题", e);
252 | e.printStackTrace();
253 | }catch(IOException e){
254 | log.error("发生网络异常", e);
255 | e.printStackTrace();
256 | }finally{
257 | if(getMethod != null){
258 | getMethod.releaseConnection();
259 | getMethod = null;
260 | }
261 | }
262 |
263 | return response;
264 | }
265 |
266 | /**
267 | * 据Map生成URL字符串
268 | * @param map
269 | * Map
270 | * @param valueEnc
271 | * URL编码
272 | * @return
273 | * URL
274 | */
275 | private static String getUrl(Map map, String valueEnc) {
276 |
277 | if (null == map || map.keySet().size() == 0) {
278 | return (EMPTY);
279 | }
280 | StringBuffer url = new StringBuffer();
281 | Set keys = map.keySet();
282 | for (Iterator it = keys.iterator(); it.hasNext();) {
283 | String key = it.next();
284 | if (map.containsKey(key)) {
285 | String val = map.get(key);
286 | String str = val != null ? val : EMPTY;
287 | try {
288 | str = URLEncoder.encode(str, valueEnc);
289 | } catch (UnsupportedEncodingException e) {
290 | e.printStackTrace();
291 | }
292 | url.append(key).append("=").append(str).append(URL_PARAM_CONNECT_FLAG);
293 | }
294 | }
295 | String strURL = EMPTY;
296 | strURL = url.toString();
297 | if (URL_PARAM_CONNECT_FLAG.equals(EMPTY + strURL.charAt(strURL.length() - 1))) {
298 | strURL = strURL.substring(0, strURL.length() - 1);
299 | }
300 |
301 | return (strURL);
302 | }
303 | }
304 |
--------------------------------------------------------------------------------
/src/main/java/com/cheese/MapServer/utils/InitUtils.java:
--------------------------------------------------------------------------------
1 | package com.cheese.MapServer.utils;
2 |
3 | import com.cheese.MapServer.bean.LatLngInfo;
4 | import com.cheese.MapServer.bean.LevelInfo;
5 | import com.cheese.MapServer.bean.ThreadReqParamInfo;
6 | import com.google.gson.Gson;
7 |
8 | import javax.imageio.ImageIO;
9 | import java.awt.image.BufferedImage;
10 | import java.io.File;
11 | import java.io.IOException;
12 | import java.util.ArrayList;
13 | import java.util.List;
14 | import java.util.Vector;
15 | import java.util.concurrent.ExecutorService;
16 | import java.util.concurrent.Executors;
17 | import java.util.concurrent.TimeUnit;
18 | import java.util.concurrent.atomic.AtomicReference;
19 | import java.util.function.UnaryOperator;
20 |
21 | public class InitUtils
22 | {
23 | // Web墨卡托投影的长或宽的一半,单位为M
24 | private static Double WEB_MOC_HALF_WIDTH = 20037508.3427892;
25 |
26 | // 待匹配的URL
27 | private static String Google_Satellite_Url = "http://mt0.google.cn/vt/lyrs=y&hl=zh-CN&hl=zh-CN&gl=CN&x={x}&y={y}&z={z}&s=Gali";
28 | private static String Google_Image_Url = "http://mt0.google.cn/vt/lyrs=m&hl=zh-CN&hl=zh-CN&gl=CN&x={x}&y={y}&z={z}&s=Gali";
29 | private static String Google_Terrain_Url = "http://mt0.google.cn/vt/lyrs=p&hl=zh-CN&hl=zh-CN&gl=CN&x={x}&y={y}&z={z}&s=Gali";
30 | private static String AMap_Satellite_Url = "http://webst02.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}";
31 | private static String AMap_Cover_Url = "http://webst02.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8";
32 | private static String AMap_Image_Url = "http://webrd03.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}";
33 | private static String TianDiTu_Satellite_Url = "http://t1.tianditu.cn/DataServer?T=img_w&X={x}&Y={y}&L={z}";
34 | private static String TianDiTu_Image_Url = "http://t1.tianditu.cn/DataServer?T=vec_w&X={x}&Y={y}&L={z}";
35 | private static String TianDiTu_Cover_Url = "http://t1.tianditu.cn/DataServer?T=cva_w&X={x}&Y={y}&L={z}";
36 |
37 |
38 | public static List getLevelPic(BackgroundType type, Integer level, Double left,
39 | Double right, Double top, Double bottom)
40 | {
41 | LevelInfo levelInfo = getLevelInfo(level, left, right, top, bottom);
42 |
43 | // 开多线程请求图片
44 | AtomicReference> errorList = new AtomicReference<>();
45 | errorList.set(new ArrayList<>());
46 |
47 | // 看自己以前的代码真的辣眼睛。。。
48 | ExecutorService executorService = Executors.newFixedThreadPool(50);
49 | for(int x = levelInfo.getxL() ; x <= levelInfo.getxR() ; x ++) {
50 | for(int y = levelInfo.getyT(); y <= levelInfo.getyB() ; y ++) {
51 | final int fX = x;
52 | final int fY = y;
53 | Runnable getPicRunnable = () -> {
54 | if (!getPic(type, fX, fY, levelInfo.getZ())) {
55 | errorList.getAndUpdate(threadReqParamInfos -> {
56 | threadReqParamInfos.add(new ThreadReqParamInfo(type, fX, fY, levelInfo.getZ()));
57 | return threadReqParamInfos;
58 | });
59 | }
60 | };
61 |
62 | executorService.submit(getPicRunnable);
63 | }
64 | }
65 |
66 | executorService.shutdown();
67 | try {
68 | executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.MINUTES);
69 | } catch (InterruptedException e) {
70 | e.printStackTrace();
71 | }
72 |
73 | return errorList.get();
74 | }
75 |
76 | public static LevelInfo getLevelInfo(Integer level, Double left,
77 | Double right, Double top, Double bottom)
78 | {
79 | LevelInfo levelInfo = new LevelInfo();
80 | LatLngInfo leftTopMocPoint = CoodUtils.lonLatToGoogleMercator(left, top);
81 | LatLngInfo rightBottomMocPoint = CoodUtils.lonLatToGoogleMercator(right, bottom);
82 |
83 | Double perTileWidth = WEB_MOC_HALF_WIDTH * 2 / Math.pow(2, level);
84 | levelInfo.setZ(level);
85 | levelInfo.setxL((int)(leftTopMocPoint.getLongitude() / perTileWidth));
86 | levelInfo.setxR((int)(rightBottomMocPoint.getLongitude() / perTileWidth));
87 | levelInfo.setyT((int)(leftTopMocPoint.getLatitude() / perTileWidth));
88 | levelInfo.setyB((int)(rightBottomMocPoint.getLatitude() / perTileWidth));
89 |
90 | return levelInfo;
91 | }
92 |
93 | public static Boolean getPic(BackgroundType type, Integer x, Integer y, Integer z)
94 | {
95 | try
96 | {
97 | File saveImg = new File(getPathByType(type) + z + "/" + x + "/" + y + "/img.jpg");
98 | String url = buildUrl(x, y, z, type);
99 | BufferedImage image = HttpUtils.getImage(url);
100 |
101 | if(saveImg.exists())
102 | return true;
103 |
104 | File xF = new File(getPathByType(type) + z);
105 | if(!xF.exists())xF.mkdir();
106 | File xyF = new File(getPathByType(type) + z + "/" + x );
107 | if(!xyF.exists())xyF.mkdir();
108 | File xyzF = new File(getPathByType(type) + z + "/" + x + "/" + y);
109 | if(!xyzF.exists())xyzF.mkdir();
110 |
111 | ImageIO.write(image,"jpeg", saveImg);
112 |
113 | System.out.println(saveImg.getAbsolutePath());
114 | return true;
115 | }
116 | catch (IOException e)
117 | {
118 | e.printStackTrace();
119 | return false;
120 | }
121 | }
122 |
123 | private static String buildUrl(Integer x, Integer y, Integer z, BackgroundType type)
124 | {
125 | String url = "";
126 | switch (type)
127 | {
128 | case Google_Satellite:
129 | url = Google_Satellite_Url;
130 | break;
131 | case Google_Image:
132 | url = Google_Image_Url;
133 | break;
134 | case Google_Terrain:
135 | url = Google_Terrain_Url;
136 | break;
137 | case AMap_Image:
138 | url = AMap_Image_Url;
139 | break;
140 | case AMap_Satellite:
141 | url = AMap_Satellite_Url;
142 | break;
143 | case AMap_Cover:
144 | url = AMap_Cover_Url;
145 | break;
146 | case TianDiTu_Image:
147 | url = TianDiTu_Image_Url;
148 | break;
149 | case TianDiTu_Cover:
150 | url = TianDiTu_Cover_Url;
151 | break;
152 | case TianDiTu_Satellite:
153 | url = TianDiTu_Satellite_Url;
154 | break;
155 | }
156 |
157 | url = url.replace("{x}", x + "");
158 | url = url.replace("{y}", y + "");
159 | url = url.replace("{z}", z + "");
160 |
161 | return url;
162 | }
163 |
164 | public static String getPathByType(BackgroundType type)
165 | {
166 | String result = "";
167 | switch (type)
168 | {
169 | case AMap_Cover:
170 | result = "map/amap/cover/";
171 | break;
172 | case AMap_Image:
173 | result = "map/amap/image/";
174 | break;
175 | case AMap_Satellite:
176 | result = "map/amap/satellite/";
177 | break;
178 | case Google_Image:
179 | result = "map/google/image/";
180 | break;
181 | case Google_Satellite:
182 | result = "map/google/satellite/";
183 | break;
184 | case Google_Terrain:
185 | result = "map/google/terrain/";
186 | break;
187 | case TianDiTu_Cover:
188 | result = "map/tianditu/cover/";
189 | break;
190 | case TianDiTu_Satellite:
191 | result = "map/tianditu/satellite/";
192 | break;
193 | case TianDiTu_Image:
194 | result = "map/tianditu/image/";
195 | break;
196 | }
197 |
198 | return result;
199 | }
200 |
201 | public static BackgroundType getTypeByName(String typeName)
202 | {
203 | BackgroundType type = BackgroundType.Google_Satellite;
204 |
205 | switch (typeName)
206 | {
207 | case "google-satellite":
208 | type = BackgroundType.Google_Satellite;
209 | break;
210 | case "google-image":
211 | type = BackgroundType.Google_Image;
212 | break;
213 | case "google-terrain":
214 | type = BackgroundType.Google_Terrain;
215 | break;
216 | case "amap-satellite":
217 | type = BackgroundType.AMap_Satellite;
218 | break;
219 | case "amap-image":
220 | type = BackgroundType.AMap_Image;
221 | break;
222 | case "amap-cover":
223 | type = BackgroundType.AMap_Cover;
224 | break;
225 | case "tianditu-satellite":
226 | type = BackgroundType.TianDiTu_Satellite;
227 | break;
228 | case "tianditu-image":
229 | type = BackgroundType.TianDiTu_Image;
230 | break;
231 | case "tianditu-cover":
232 | type = BackgroundType.TianDiTu_Cover;
233 | break;
234 | }
235 |
236 | return type;
237 | }
238 | }
239 |
--------------------------------------------------------------------------------
/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 2018
3 |
4 | map-server:
5 | init-dirs: map, map/google, map/google/satellite, map/google/image, map/google/terrain,
6 | map/amap, map/amap/satellite, map/amap/image, map/amap/cover,
7 | map/tianditu, map/tianditu/satellite, map/tianditu/image, map/tianditu/cover
8 | config-file: map/map.config.json
9 |
--------------------------------------------------------------------------------
/src/main/resources/static/asset-manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "main.css": "static/css/main.1d7b5214.css",
3 | "main.css.map": "static/css/main.1d7b5214.css.map",
4 | "main.js": "static/js/main.3633225c.js",
5 | "main.js.map": "static/js/main.3633225c.js.map"
6 | }
--------------------------------------------------------------------------------
/src/main/resources/static/index.html:
--------------------------------------------------------------------------------
1 | 地图服务
--------------------------------------------------------------------------------
/src/main/resources/static/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | }
10 | ],
11 | "start_url": "./index.html",
12 | "display": "standalone",
13 | "theme_color": "#000000",
14 | "background_color": "#ffffff"
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/resources/static/map.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Icemap/MapServer/1ceab70ae9aba9ab832caf9dcb7c4714c2b1a4cc/src/main/resources/static/map.png
--------------------------------------------------------------------------------
/src/main/resources/static/service-worker.js:
--------------------------------------------------------------------------------
1 | "use strict";var precacheConfig=[["/index.html","f2e500dc72c292548533544c5e2d1d89"],["/static/css/main.1d7b5214.css","c2432dfc45270d9cd3ef8d62b0116fd9"],["/static/js/main.3633225c.js","cc1766a24e81fe3127c25a84cc50d2c1"]],cacheName="sw-precache-v3-sw-precache-webpack-plugin-"+(self.registration?self.registration.scope:""),ignoreUrlParametersMatching=[/^utm_/],addDirectoryIndex=function(e,t){var n=new URL(e);return"/"===n.pathname.slice(-1)&&(n.pathname+=t),n.toString()},cleanResponse=function(t){return t.redirected?("body"in t?Promise.resolve(t.body):t.blob()).then(function(e){return new Response(e,{headers:t.headers,status:t.status,statusText:t.statusText})}):Promise.resolve(t)},createCacheKey=function(e,t,n,r){var a=new URL(e);return r&&a.pathname.match(r)||(a.search+=(a.search?"&":"")+encodeURIComponent(t)+"="+encodeURIComponent(n)),a.toString()},isPathWhitelisted=function(e,t){if(0===e.length)return!0;var n=new URL(t).pathname;return e.some(function(e){return n.match(e)})},stripIgnoredUrlParameters=function(e,n){var t=new URL(e);return t.hash="",t.search=t.search.slice(1).split("&").map(function(e){return e.split("=")}).filter(function(t){return n.every(function(e){return!e.test(t[0])})}).map(function(e){return e.join("=")}).join("&"),t.toString()},hashParamName="_sw-precache",urlsToCacheKeys=new Map(precacheConfig.map(function(e){var t=e[0],n=e[1],r=new URL(t,self.location),a=createCacheKey(r,hashParamName,n,/\.\w{8}\./);return[r.toString(),a]}));function setOfCachedUrls(e){return e.keys().then(function(e){return e.map(function(e){return e.url})}).then(function(e){return new Set(e)})}self.addEventListener("install",function(e){e.waitUntil(caches.open(cacheName).then(function(r){return setOfCachedUrls(r).then(function(n){return Promise.all(Array.from(urlsToCacheKeys.values()).map(function(t){if(!n.has(t)){var e=new Request(t,{credentials:"same-origin"});return fetch(e).then(function(e){if(!e.ok)throw new Error("Request for "+t+" returned a response with status "+e.status);return cleanResponse(e).then(function(e){return r.put(t,e)})})}}))})}).then(function(){return self.skipWaiting()}))}),self.addEventListener("activate",function(e){var n=new Set(urlsToCacheKeys.values());e.waitUntil(caches.open(cacheName).then(function(t){return t.keys().then(function(e){return Promise.all(e.map(function(e){if(!n.has(e.url))return t.delete(e)}))})}).then(function(){return self.clients.claim()}))}),self.addEventListener("fetch",function(t){if("GET"===t.request.method){var e,n=stripIgnoredUrlParameters(t.request.url,ignoreUrlParametersMatching),r="index.html";(e=urlsToCacheKeys.has(n))||(n=addDirectoryIndex(n,r),e=urlsToCacheKeys.has(n));var a="/index.html";!e&&"navigate"===t.request.mode&&isPathWhitelisted(["^(?!\\/__).*"],t.request.url)&&(n=new URL(a,self.location).toString(),e=urlsToCacheKeys.has(n)),e&&t.respondWith(caches.open(cacheName).then(function(e){return e.match(urlsToCacheKeys.get(n)).then(function(e){if(e)return e;throw Error("The cached response that was expected is missing.")})}).catch(function(e){return console.warn('Couldn\'t serve response for "%s" from cache: %O',t.request.url,e),fetch(t.request)}))}});
--------------------------------------------------------------------------------
/src/test/java/com/cheese/MapServer/MapServerApplicationTests.java:
--------------------------------------------------------------------------------
1 | package com.cheese.MapServer;
2 |
3 | import org.junit.Test;
4 | import org.junit.runner.RunWith;
5 | import org.springframework.boot.test.context.SpringBootTest;
6 | import org.springframework.test.context.junit4.SpringRunner;
7 |
8 | @RunWith(SpringRunner.class)
9 | @SpringBootTest
10 | public class MapServerApplicationTests {
11 |
12 | @Test
13 | public void contextLoads() {
14 | }
15 |
16 | }
17 |
--------------------------------------------------------------------------------