From 2d695bcbb71859869863c5fcaf926091cccdc863 Mon Sep 17 00:00:00 2001
From: zzl <961867786@qq.com>
Date: Thu, 20 May 2021 08:47:59 +0800
Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.idea/$PROJECT_FILE$ | 11 +
.idea/.gitignore | 2 +
.idea/.name | 1 +
.idea/artifacts/gis_geotools_war.xml | 14 +
.idea/artifacts/gis_geotools_war_exploded.xml | 146 ++++
.idea/artifacts/springbootshaper_war.xml | 14 +
.../springbootshaper_war_exploded.xml | 146 ++++
.idea/compiler.xml | 24 +
.idea/encodings.xml | 7 +
...__ch_qos_logback_logback_classic_1_2_3.xml | 13 +
...ven__ch_qos_logback_logback_core_1_2_3.xml | 13 +
.../Maven__com_alibaba_fastjson_1_2_74.xml | 13 +
...__com_conversantmedia_disruptor_1_2_13.xml | 13 +
.../Maven__com_fasterxml_classmate_1_4_0.xml | 13 +
...ackson_core_jackson_annotations_2_11_2.xml | 13 +
...erxml_jackson_core_jackson_core_2_11_2.xml | 13 +
...l_jackson_core_jackson_databind_2_11_2.xml | 13 +
..._datatype_jackson_datatype_jdk8_2_11_2.xml | 13 +
...atatype_jackson_datatype_jsr310_2_11_2.xml | 13 +
..._jackson_module_parameter_names_2_11_2.xml | 13 +
..._com_google_code_findbugs_jsr305_3_0_2.xml | 13 +
...rorprone_error_prone_annotations_2_1_3.xml | 13 +
...Maven__com_google_guava_guava_25_1_jre.xml | 13 +
...m_google_j2objc_j2objc_annotations_1_1.xml | 13 +
...googlecode_json_simple_json_simple_1_1.xml | 13 +
...n__com_jayway_jsonpath_json_path_2_4_0.xml | 13 +
...ven__com_miglayout_miglayout_swing_3_7.xml | 13 +
...ogle_android_json_0_0_20131108_vaadin1.xml | 13 +
..._collections_commons_collections_3_2_2.xml | 13 +
.../Maven__commons_dbcp_commons_dbcp_1_4.xml | 13 +
.../Maven__commons_io_commons_io_2_6.xml | 13 +
.../Maven__commons_pool_commons_pool_1_6.xml | 13 +
...imageio_ext_imageio_ext_geocore_1_1_25.xml | 13 +
...imageio_ext_imageio_ext_streams_1_1_25.xml | 13 +
...ns_imageio_ext_imageio_ext_tiff_1_1_25.xml | 13 +
...ageio_ext_imageio_ext_utilities_1_1_25.xml | 13 +
...olutions_jaiext_affine_jt_affine_1_1_1.xml | 13 +
...utions_jaiext_algebra_jt_algebra_1_1_1.xml | 13 +
...aiext_bandcombine_jt_bandcombine_1_1_1.xml | 13 +
...ns_jaiext_bandmerge_jt_bandmerge_1_1_1.xml | 13 +
..._jaiext_bandselect_jt_bandselect_1_1_1.xml | 13 +
...ions_jaiext_binarize_jt_binarize_1_1_1.xml | 13 +
...olutions_jaiext_border_jt_border_1_1_1.xml | 13 +
...olutions_jaiext_buffer_jt_buffer_1_1_1.xml | 13 +
..._jaiext_classifier_jt_classifier_1_1_1.xml | 13 +
...ext_colorconvert_jt_colorconvert_1_1_1.xml | 13 +
...ext_colorindexer_jt_colorindexer_1_1_1.xml | 13 +
...geosolutions_jaiext_crop_jt_crop_1_1_1.xml | 13 +
...errordiffusion_jt_errordiffusion_1_1_1.xml | 13 +
...olutions_jaiext_format_jt_format_1_1_1.xml | 13 +
...t_imagefunction_jt_imagefunction_1_1_1.xml | 13 +
...ns_jaiext_iterators_jt_iterators_1_1_1.xml | 13 +
...olutions_jaiext_lookup_jt_lookup_1_1_1.xml | 13 +
...olutions_jaiext_mosaic_jt_mosaic_1_1_1.xml | 13 +
...olutions_jaiext_nullop_jt_nullop_1_1_1.xml | 13 +
...aiext_orderdither_jt_orderdither_1_1_1.xml | 13 +
...ns_jaiext_piecewise_jt_piecewise_1_1_1.xml | 13 +
...utions_jaiext_rescale_jt_rescale_1_1_1.xml | 13 +
...utions_jaiext_rlookup_jt_rlookup_1_1_1.xml | 13 +
...olutions_jaiext_scale2_jt_scale2_1_1_1.xml | 13 +
...osolutions_jaiext_scale_jt_scale_1_1_1.xml | 13 +
...ext_shadedrelief_jt_shadedrelief_1_1_1.xml | 13 +
...osolutions_jaiext_stats_jt_stats_1_1_1.xml | 13 +
...ns_jaiext_translate_jt_translate_1_1_1.xml | 13 +
...ns_jaiext_utilities_jt_utilities_1_1_1.xml | 13 +
...ns_jaiext_vectorbin_jt_vectorbin_1_1_1.xml | 13 +
...geosolutions_jaiext_warp_jt_warp_1_1_1.xml | 13 +
...osolutions_jaiext_zonal_jt_zonal_1_1_1.xml | 13 +
..._annotation_javax_annotation_api_1_3_2.xml | 13 +
.../Maven__javax_measure_unit_api_1_0.xml | 13 +
.../Maven__javax_media_jai_codec_1_1_3.xml | 13 +
.../Maven__javax_media_jai_core_1_1_3.xml | 13 +
.../Maven__javax_media_jai_imageio_1_1.xml | 13 +
..._validation_validation_api_2_0_1_Final.xml | 13 +
.../Maven__jgridshift_jgridshift_1_0.xml | 13 +
.idea/libraries/Maven__junit_junit_4_12.xml | 13 +
...ven__mysql_mysql_connector_java_5_1_25.xml | 13 +
...Maven__net_bytebuddy_byte_buddy_1_9_12.xml | 13 +
..._net_bytebuddy_byte_buddy_agent_1_9_12.xml | 13 +
...Maven__net_minidev_accessors_smart_1_2.xml | 13 +
.../Maven__net_minidev_json_smart_2_3.xml | 13 +
..._geographiclib_GeographicLib_Java_1_49.xml | 13 +
...org_apache_commons_commons_lang3_3_8_1.xml | 13 +
..._apache_logging_log4j_log4j_api_2_11_2.xml | 13 +
...he_logging_log4j_log4j_to_slf4j_2_11_2.xml | 13 +
..._tomcat_embed_tomcat_embed_core_9_0_17.xml | 13 +
...he_tomcat_embed_tomcat_embed_el_9_0_17.xml | 13 +
...at_embed_tomcat_embed_websocket_9_0_17.xml | 13 +
...Maven__org_assertj_assertj_core_3_11_1.xml | 13 +
...rg_checkerframework_checker_qual_2_0_0.xml | 13 +
...s_mojo_animal_sniffer_annotations_1_14.xml | 13 +
.../Maven__org_ejml_ejml_core_0_34.xml | 13 +
.../Maven__org_ejml_ejml_ddense_0_34.xml | 13 +
.../Maven__org_geotools_gt_api_20_0.xml | 13 +
.../Maven__org_geotools_gt_coverage_20_0.xml | 13 +
.../Maven__org_geotools_gt_cql_20_0.xml | 13 +
.../Maven__org_geotools_gt_data_20_0.xml | 13 +
.../Maven__org_geotools_gt_geojson_20_0.xml | 13 +
.../Maven__org_geotools_gt_jdbc_20_0.xml | 13 +
.../Maven__org_geotools_gt_main_20_0.xml | 13 +
.../Maven__org_geotools_gt_metadata_20_0.xml | 13 +
.../Maven__org_geotools_gt_opengis_20_0.xml | 13 +
...aven__org_geotools_gt_referencing_20_0.xml | 13 +
.../Maven__org_geotools_gt_render_20_0.xml | 13 +
.../Maven__org_geotools_gt_shapefile_20_0.xml | 13 +
.../Maven__org_geotools_gt_swing_20_0.xml | 13 +
...__org_geotools_jdbc_gt_jdbc_mysql_20_0.xml | 13 +
.../Maven__org_hamcrest_hamcrest_core_1_3.xml | 13 +
...ven__org_hamcrest_hamcrest_library_1_3.xml | 13 +
...dator_hibernate_validator_6_0_16_Final.xml | 13 +
.../Maven__org_jaitools_jt_utils_1_5_0.xml | 13 +
...aven__org_jaitools_jt_zonalstats_1_5_0.xml | 13 +
...boss_logging_jboss_logging_3_3_2_Final.xml | 13 +
.../libraries/Maven__org_jdom_jdom2_2_0_6.xml | 13 +
...__org_locationtech_jts_jts_core_1_16_0.xml | 13 +
...Maven__org_mockito_mockito_core_2_23_4.xml | 13 +
.../Maven__org_objenesis_objenesis_2_6.xml | 13 +
.../Maven__org_ow2_asm_asm_5_0_4.xml | 13 +
...aven__org_skyscreamer_jsonassert_1_5_0.xml | 13 +
.../Maven__org_slf4j_jul_to_slf4j_1_7_26.xml | 13 +
.../Maven__org_slf4j_slf4j_api_1_7_26.xml | 13 +
...amework_boot_spring_boot_2_1_4_RELEASE.xml | 13 +
...pring_boot_autoconfigure_2_1_4_RELEASE.xml | 13 +
...boot_spring_boot_starter_2_1_4_RELEASE.xml | 13 +
...spring_boot_starter_json_2_1_4_RELEASE.xml | 13 +
...ing_boot_starter_logging_2_1_4_RELEASE.xml | 13 +
...spring_boot_starter_test_2_1_4_RELEASE.xml | 13 +
...ring_boot_starter_tomcat_2_1_4_RELEASE.xml | 13 +
..._spring_boot_starter_web_2_1_4_RELEASE.xml | 13 +
...rk_boot_spring_boot_test_2_1_4_RELEASE.xml | 13 +
..._boot_test_autoconfigure_2_1_4_RELEASE.xml | 13 +
...ringframework_spring_aop_5_1_6_RELEASE.xml | 13 +
...ngframework_spring_beans_5_1_6_RELEASE.xml | 13 +
...framework_spring_context_5_1_6_RELEASE.xml | 13 +
...ingframework_spring_core_5_1_6_RELEASE.xml | 13 +
...mework_spring_expression_5_1_6_RELEASE.xml | 13 +
...ringframework_spring_jcl_5_1_6_RELEASE.xml | 13 +
...ingframework_spring_test_5_1_6_RELEASE.xml | 13 +
...ringframework_spring_web_5_1_6_RELEASE.xml | 13 +
...gframework_spring_webmvc_5_1_6_RELEASE.xml | 13 +
.../Maven__org_xmlunit_xmlunit_core_2_6_2.xml | 13 +
.../Maven__org_yaml_snakeyaml_1_23.xml | 13 +
.../Maven__si_uom_si_quantity_0_7_1.xml | 13 +
.../Maven__si_uom_si_units_java8_0_7_1.xml | 13 +
...systems_uom_systems_common_java8_0_7_2.xml | 13 +
...aven__tec_uom_lib_uom_lib_common_1_0_2.xml | 13 +
.../libraries/Maven__tec_uom_uom_se_1_0_8.xml | 13 +
.idea/misc.xml | 23 +
.idea/modules.xml | 9 +
.idea/qaplug_profiles.xml | 465 ++++++++++++
.idea/vcs.xml | 6 +
gis_geotools.iml | 169 +++++
pom.xml | 188 +++++
.../com/appleyk/IO/StringTokenReader.java | 672 ++++++++++++++++++
src/main/java/com/appleyk/ShpApplication.java | 56 ++
.../com/appleyk/controller/ShpController.java | 77 ++
.../exception/GlobalExceptionHandler.java | 30 +
.../java/com/appleyk/geotools/GeoUtils.java | 125 ++++
.../com/appleyk/geotools/GeometryCreator.java | 237 ++++++
.../java/com/appleyk/geotools/ShapeTools.java | 82 +++
.../java/com/appleyk/geotools/ShpTools.java | 444 ++++++++++++
src/main/java/com/appleyk/pojos/ShpDatas.java | 55 ++
src/main/java/com/appleyk/pojos/ShpInfo.java | 92 +++
.../com/appleyk/result/ResponseMessage.java | 31 +
.../com/appleyk/result/ResponseResult.java | 153 ++++
.../java/com/appleyk/service/ShpService.java | 33 +
src/main/resources/application-dev.properties | 3 +
.../resources/application-prod.properties | 3 +
.../resources/application-test.properties | 3 +
src/main/resources/application.properties | 23 +
src/main/resources/logback-boot.xml | 53 ++
src/main/resources/static/ReadMe | 12 +
.../shpTest[LineString]/china_railways.cpg | 1 +
.../shpTest[LineString]/china_railways.dbf | Bin 0 -> 176607 bytes
.../shpTest[LineString]/china_railways.prj | 1 +
.../shpTest[LineString]/china_railways.qpj | 1 +
.../shpTest[LineString]/china_railways.shp | Bin 0 -> 280908 bytes
.../shpTest[LineString]/china_railways.shx | Bin 0 -> 10556 bytes
.../resources/static/shpTest[Point]/dp_tl.dbf | Bin 0 -> 70784 bytes
.../resources/static/shpTest[Point]/dp_tl.prj | 1 +
.../resources/static/shpTest[Point]/dp_tl.qix | Bin 0 -> 84548 bytes
.../resources/static/shpTest[Point]/dp_tl.sbn | Bin 0 -> 61228 bytes
.../resources/static/shpTest[Point]/dp_tl.sbx | Bin 0 -> 1820 bytes
.../resources/static/shpTest[Point]/dp_tl.shp | Bin 0 -> 180028 bytes
.../static/shpTest[Point]/dp_tl.shp.xml | 2 +
.../resources/static/shpTest[Point]/dp_tl.shx | Bin 0 -> 51508 bytes
.../shpTest[Polygon]/china_building_part.cpg | 1 +
.../shpTest[Polygon]/china_building_part.dbf | Bin 0 -> 161084 bytes
.../shpTest[Polygon]/china_building_part.prj | 1 +
.../shpTest[Polygon]/china_building_part.qix | Bin 0 -> 13936 bytes
.../shpTest[Polygon]/china_building_part.qpj | 1 +
.../shpTest[Polygon]/china_building_part.shp | Bin 0 -> 161780 bytes
.../shpTest[Polygon]/china_building_part.shx | Bin 0 -> 8404 bytes
.../SpringbootshaperApplicationTests.java | 16 +
target/classes/application-dev.properties | 3 +
target/classes/application-prod.properties | 3 +
target/classes/application-test.properties | 3 +
target/classes/application.properties | 23 +
.../com/appleyk/IO/StringTokenReader.class | Bin 0 -> 13078 bytes
.../classes/com/appleyk/ShpApplication.class | Bin 0 -> 2226 bytes
.../appleyk/controller/ShpController.class | Bin 0 -> 2656 bytes
.../exception/GlobalExceptionHandler.class | Bin 0 -> 1217 bytes
.../com/appleyk/geotools/GeoUtils.class | Bin 0 -> 6418 bytes
.../appleyk/geotools/GeometryCreator.class | Bin 0 -> 6906 bytes
.../com/appleyk/geotools/ShapeTools.class | Bin 0 -> 4470 bytes
.../com/appleyk/geotools/ShpTools.class | Bin 0 -> 16618 bytes
.../classes/com/appleyk/pojos/ShpDatas.class | Bin 0 -> 1730 bytes
.../classes/com/appleyk/pojos/ShpInfo.class | Bin 0 -> 1568 bytes
.../com/appleyk/result/ResponseMessage.class | Bin 0 -> 1507 bytes
.../com/appleyk/result/ResponseResult.class | Bin 0 -> 4712 bytes
.../com/appleyk/service/ShpService.class | Bin 0 -> 1681 bytes
target/classes/logback-boot.xml | 53 ++
target/classes/static/ReadMe | 12 +
.../shpTest[LineString]/china_railways.cpg | 1 +
.../shpTest[LineString]/china_railways.dbf | Bin 0 -> 176607 bytes
.../shpTest[LineString]/china_railways.prj | 1 +
.../shpTest[LineString]/china_railways.qpj | 1 +
.../shpTest[LineString]/china_railways.shp | Bin 0 -> 280908 bytes
.../shpTest[LineString]/china_railways.shx | Bin 0 -> 10556 bytes
.../classes/static/shpTest[Point]/dp_tl.dbf | Bin 0 -> 70784 bytes
.../classes/static/shpTest[Point]/dp_tl.prj | 1 +
.../classes/static/shpTest[Point]/dp_tl.qix | Bin 0 -> 84548 bytes
.../classes/static/shpTest[Point]/dp_tl.sbn | Bin 0 -> 61228 bytes
.../classes/static/shpTest[Point]/dp_tl.sbx | Bin 0 -> 1820 bytes
.../classes/static/shpTest[Point]/dp_tl.shp | Bin 0 -> 180028 bytes
.../static/shpTest[Point]/dp_tl.shp.xml | 2 +
.../classes/static/shpTest[Point]/dp_tl.shx | Bin 0 -> 51508 bytes
.../shpTest[Polygon]/china_building_part.cpg | 1 +
.../shpTest[Polygon]/china_building_part.dbf | Bin 0 -> 161084 bytes
.../shpTest[Polygon]/china_building_part.prj | 1 +
.../shpTest[Polygon]/china_building_part.qix | Bin 0 -> 13936 bytes
.../shpTest[Polygon]/china_building_part.qpj | 1 +
.../shpTest[Polygon]/china_building_part.shp | Bin 0 -> 161780 bytes
.../shpTest[Polygon]/china_building_part.shx | Bin 0 -> 8404 bytes
.../SpringbootshaperApplicationTests.class | Bin 0 -> 648 bytes
235 files changed, 5334 insertions(+)
create mode 100644 .idea/$PROJECT_FILE$
create mode 100644 .idea/.gitignore
create mode 100644 .idea/.name
create mode 100644 .idea/artifacts/gis_geotools_war.xml
create mode 100644 .idea/artifacts/gis_geotools_war_exploded.xml
create mode 100644 .idea/artifacts/springbootshaper_war.xml
create mode 100644 .idea/artifacts/springbootshaper_war_exploded.xml
create mode 100644 .idea/compiler.xml
create mode 100644 .idea/encodings.xml
create mode 100644 .idea/libraries/Maven__ch_qos_logback_logback_classic_1_2_3.xml
create mode 100644 .idea/libraries/Maven__ch_qos_logback_logback_core_1_2_3.xml
create mode 100644 .idea/libraries/Maven__com_alibaba_fastjson_1_2_74.xml
create mode 100644 .idea/libraries/Maven__com_conversantmedia_disruptor_1_2_13.xml
create mode 100644 .idea/libraries/Maven__com_fasterxml_classmate_1_4_0.xml
create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_11_2.xml
create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_11_2.xml
create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_11_2.xml
create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_11_2.xml
create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_11_2.xml
create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_11_2.xml
create mode 100644 .idea/libraries/Maven__com_google_code_findbugs_jsr305_3_0_2.xml
create mode 100644 .idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_1_3.xml
create mode 100644 .idea/libraries/Maven__com_google_guava_guava_25_1_jre.xml
create mode 100644 .idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_1.xml
create mode 100644 .idea/libraries/Maven__com_googlecode_json_simple_json_simple_1_1.xml
create mode 100644 .idea/libraries/Maven__com_jayway_jsonpath_json_path_2_4_0.xml
create mode 100644 .idea/libraries/Maven__com_miglayout_miglayout_swing_3_7.xml
create mode 100644 .idea/libraries/Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml
create mode 100644 .idea/libraries/Maven__commons_collections_commons_collections_3_2_2.xml
create mode 100644 .idea/libraries/Maven__commons_dbcp_commons_dbcp_1_4.xml
create mode 100644 .idea/libraries/Maven__commons_io_commons_io_2_6.xml
create mode 100644 .idea/libraries/Maven__commons_pool_commons_pool_1_6.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_imageio_ext_imageio_ext_geocore_1_1_25.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_imageio_ext_imageio_ext_streams_1_1_25.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_imageio_ext_imageio_ext_tiff_1_1_25.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_imageio_ext_imageio_ext_utilities_1_1_25.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_affine_jt_affine_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_algebra_jt_algebra_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_bandcombine_jt_bandcombine_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_bandmerge_jt_bandmerge_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_bandselect_jt_bandselect_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_binarize_jt_binarize_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_border_jt_border_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_buffer_jt_buffer_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_classifier_jt_classifier_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_colorconvert_jt_colorconvert_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_colorindexer_jt_colorindexer_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_crop_jt_crop_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_errordiffusion_jt_errordiffusion_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_format_jt_format_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_imagefunction_jt_imagefunction_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_iterators_jt_iterators_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_lookup_jt_lookup_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_mosaic_jt_mosaic_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_nullop_jt_nullop_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_orderdither_jt_orderdither_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_piecewise_jt_piecewise_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_rescale_jt_rescale_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_rlookup_jt_rlookup_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_scale2_jt_scale2_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_scale_jt_scale_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_shadedrelief_jt_shadedrelief_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_stats_jt_stats_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_translate_jt_translate_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_utilities_jt_utilities_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_vectorbin_jt_vectorbin_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_warp_jt_warp_1_1_1.xml
create mode 100644 .idea/libraries/Maven__it_geosolutions_jaiext_zonal_jt_zonal_1_1_1.xml
create mode 100644 .idea/libraries/Maven__javax_annotation_javax_annotation_api_1_3_2.xml
create mode 100644 .idea/libraries/Maven__javax_measure_unit_api_1_0.xml
create mode 100644 .idea/libraries/Maven__javax_media_jai_codec_1_1_3.xml
create mode 100644 .idea/libraries/Maven__javax_media_jai_core_1_1_3.xml
create mode 100644 .idea/libraries/Maven__javax_media_jai_imageio_1_1.xml
create mode 100644 .idea/libraries/Maven__javax_validation_validation_api_2_0_1_Final.xml
create mode 100644 .idea/libraries/Maven__jgridshift_jgridshift_1_0.xml
create mode 100644 .idea/libraries/Maven__junit_junit_4_12.xml
create mode 100644 .idea/libraries/Maven__mysql_mysql_connector_java_5_1_25.xml
create mode 100644 .idea/libraries/Maven__net_bytebuddy_byte_buddy_1_9_12.xml
create mode 100644 .idea/libraries/Maven__net_bytebuddy_byte_buddy_agent_1_9_12.xml
create mode 100644 .idea/libraries/Maven__net_minidev_accessors_smart_1_2.xml
create mode 100644 .idea/libraries/Maven__net_minidev_json_smart_2_3.xml
create mode 100644 .idea/libraries/Maven__net_sf_geographiclib_GeographicLib_Java_1_49.xml
create mode 100644 .idea/libraries/Maven__org_apache_commons_commons_lang3_3_8_1.xml
create mode 100644 .idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_11_2.xml
create mode 100644 .idea/libraries/Maven__org_apache_logging_log4j_log4j_to_slf4j_2_11_2.xml
create mode 100644 .idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_9_0_17.xml
create mode 100644 .idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_el_9_0_17.xml
create mode 100644 .idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_17.xml
create mode 100644 .idea/libraries/Maven__org_assertj_assertj_core_3_11_1.xml
create mode 100644 .idea/libraries/Maven__org_checkerframework_checker_qual_2_0_0.xml
create mode 100644 .idea/libraries/Maven__org_codehaus_mojo_animal_sniffer_annotations_1_14.xml
create mode 100644 .idea/libraries/Maven__org_ejml_ejml_core_0_34.xml
create mode 100644 .idea/libraries/Maven__org_ejml_ejml_ddense_0_34.xml
create mode 100644 .idea/libraries/Maven__org_geotools_gt_api_20_0.xml
create mode 100644 .idea/libraries/Maven__org_geotools_gt_coverage_20_0.xml
create mode 100644 .idea/libraries/Maven__org_geotools_gt_cql_20_0.xml
create mode 100644 .idea/libraries/Maven__org_geotools_gt_data_20_0.xml
create mode 100644 .idea/libraries/Maven__org_geotools_gt_geojson_20_0.xml
create mode 100644 .idea/libraries/Maven__org_geotools_gt_jdbc_20_0.xml
create mode 100644 .idea/libraries/Maven__org_geotools_gt_main_20_0.xml
create mode 100644 .idea/libraries/Maven__org_geotools_gt_metadata_20_0.xml
create mode 100644 .idea/libraries/Maven__org_geotools_gt_opengis_20_0.xml
create mode 100644 .idea/libraries/Maven__org_geotools_gt_referencing_20_0.xml
create mode 100644 .idea/libraries/Maven__org_geotools_gt_render_20_0.xml
create mode 100644 .idea/libraries/Maven__org_geotools_gt_shapefile_20_0.xml
create mode 100644 .idea/libraries/Maven__org_geotools_gt_swing_20_0.xml
create mode 100644 .idea/libraries/Maven__org_geotools_jdbc_gt_jdbc_mysql_20_0.xml
create mode 100644 .idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml
create mode 100644 .idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml
create mode 100644 .idea/libraries/Maven__org_hibernate_validator_hibernate_validator_6_0_16_Final.xml
create mode 100644 .idea/libraries/Maven__org_jaitools_jt_utils_1_5_0.xml
create mode 100644 .idea/libraries/Maven__org_jaitools_jt_zonalstats_1_5_0.xml
create mode 100644 .idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_2_Final.xml
create mode 100644 .idea/libraries/Maven__org_jdom_jdom2_2_0_6.xml
create mode 100644 .idea/libraries/Maven__org_locationtech_jts_jts_core_1_16_0.xml
create mode 100644 .idea/libraries/Maven__org_mockito_mockito_core_2_23_4.xml
create mode 100644 .idea/libraries/Maven__org_objenesis_objenesis_2_6.xml
create mode 100644 .idea/libraries/Maven__org_ow2_asm_asm_5_0_4.xml
create mode 100644 .idea/libraries/Maven__org_skyscreamer_jsonassert_1_5_0.xml
create mode 100644 .idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_26.xml
create mode 100644 .idea/libraries/Maven__org_slf4j_slf4j_api_1_7_26.xml
create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_2_1_4_RELEASE.xml
create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_2_1_4_RELEASE.xml
create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_2_1_4_RELEASE.xml
create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_json_2_1_4_RELEASE.xml
create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_2_1_4_RELEASE.xml
create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_test_2_1_4_RELEASE.xml
create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_2_1_4_RELEASE.xml
create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_2_1_4_RELEASE.xml
create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_test_2_1_4_RELEASE.xml
create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_test_autoconfigure_2_1_4_RELEASE.xml
create mode 100644 .idea/libraries/Maven__org_springframework_spring_aop_5_1_6_RELEASE.xml
create mode 100644 .idea/libraries/Maven__org_springframework_spring_beans_5_1_6_RELEASE.xml
create mode 100644 .idea/libraries/Maven__org_springframework_spring_context_5_1_6_RELEASE.xml
create mode 100644 .idea/libraries/Maven__org_springframework_spring_core_5_1_6_RELEASE.xml
create mode 100644 .idea/libraries/Maven__org_springframework_spring_expression_5_1_6_RELEASE.xml
create mode 100644 .idea/libraries/Maven__org_springframework_spring_jcl_5_1_6_RELEASE.xml
create mode 100644 .idea/libraries/Maven__org_springframework_spring_test_5_1_6_RELEASE.xml
create mode 100644 .idea/libraries/Maven__org_springframework_spring_web_5_1_6_RELEASE.xml
create mode 100644 .idea/libraries/Maven__org_springframework_spring_webmvc_5_1_6_RELEASE.xml
create mode 100644 .idea/libraries/Maven__org_xmlunit_xmlunit_core_2_6_2.xml
create mode 100644 .idea/libraries/Maven__org_yaml_snakeyaml_1_23.xml
create mode 100644 .idea/libraries/Maven__si_uom_si_quantity_0_7_1.xml
create mode 100644 .idea/libraries/Maven__si_uom_si_units_java8_0_7_1.xml
create mode 100644 .idea/libraries/Maven__systems_uom_systems_common_java8_0_7_2.xml
create mode 100644 .idea/libraries/Maven__tec_uom_lib_uom_lib_common_1_0_2.xml
create mode 100644 .idea/libraries/Maven__tec_uom_uom_se_1_0_8.xml
create mode 100644 .idea/misc.xml
create mode 100644 .idea/modules.xml
create mode 100644 .idea/qaplug_profiles.xml
create mode 100644 .idea/vcs.xml
create mode 100644 gis_geotools.iml
create mode 100644 pom.xml
create mode 100644 src/main/java/com/appleyk/IO/StringTokenReader.java
create mode 100644 src/main/java/com/appleyk/ShpApplication.java
create mode 100644 src/main/java/com/appleyk/controller/ShpController.java
create mode 100644 src/main/java/com/appleyk/exception/GlobalExceptionHandler.java
create mode 100644 src/main/java/com/appleyk/geotools/GeoUtils.java
create mode 100644 src/main/java/com/appleyk/geotools/GeometryCreator.java
create mode 100644 src/main/java/com/appleyk/geotools/ShapeTools.java
create mode 100644 src/main/java/com/appleyk/geotools/ShpTools.java
create mode 100644 src/main/java/com/appleyk/pojos/ShpDatas.java
create mode 100644 src/main/java/com/appleyk/pojos/ShpInfo.java
create mode 100644 src/main/java/com/appleyk/result/ResponseMessage.java
create mode 100644 src/main/java/com/appleyk/result/ResponseResult.java
create mode 100644 src/main/java/com/appleyk/service/ShpService.java
create mode 100644 src/main/resources/application-dev.properties
create mode 100644 src/main/resources/application-prod.properties
create mode 100644 src/main/resources/application-test.properties
create mode 100644 src/main/resources/application.properties
create mode 100644 src/main/resources/logback-boot.xml
create mode 100644 src/main/resources/static/ReadMe
create mode 100644 src/main/resources/static/shpTest[LineString]/china_railways.cpg
create mode 100644 src/main/resources/static/shpTest[LineString]/china_railways.dbf
create mode 100644 src/main/resources/static/shpTest[LineString]/china_railways.prj
create mode 100644 src/main/resources/static/shpTest[LineString]/china_railways.qpj
create mode 100644 src/main/resources/static/shpTest[LineString]/china_railways.shp
create mode 100644 src/main/resources/static/shpTest[LineString]/china_railways.shx
create mode 100644 src/main/resources/static/shpTest[Point]/dp_tl.dbf
create mode 100644 src/main/resources/static/shpTest[Point]/dp_tl.prj
create mode 100644 src/main/resources/static/shpTest[Point]/dp_tl.qix
create mode 100644 src/main/resources/static/shpTest[Point]/dp_tl.sbn
create mode 100644 src/main/resources/static/shpTest[Point]/dp_tl.sbx
create mode 100644 src/main/resources/static/shpTest[Point]/dp_tl.shp
create mode 100644 src/main/resources/static/shpTest[Point]/dp_tl.shp.xml
create mode 100644 src/main/resources/static/shpTest[Point]/dp_tl.shx
create mode 100644 src/main/resources/static/shpTest[Polygon]/china_building_part.cpg
create mode 100644 src/main/resources/static/shpTest[Polygon]/china_building_part.dbf
create mode 100644 src/main/resources/static/shpTest[Polygon]/china_building_part.prj
create mode 100644 src/main/resources/static/shpTest[Polygon]/china_building_part.qix
create mode 100644 src/main/resources/static/shpTest[Polygon]/china_building_part.qpj
create mode 100644 src/main/resources/static/shpTest[Polygon]/china_building_part.shp
create mode 100644 src/main/resources/static/shpTest[Polygon]/china_building_part.shx
create mode 100644 src/test/java/com/appleyk/SpringbootshaperApplicationTests.java
create mode 100644 target/classes/application-dev.properties
create mode 100644 target/classes/application-prod.properties
create mode 100644 target/classes/application-test.properties
create mode 100644 target/classes/application.properties
create mode 100644 target/classes/com/appleyk/IO/StringTokenReader.class
create mode 100644 target/classes/com/appleyk/ShpApplication.class
create mode 100644 target/classes/com/appleyk/controller/ShpController.class
create mode 100644 target/classes/com/appleyk/exception/GlobalExceptionHandler.class
create mode 100644 target/classes/com/appleyk/geotools/GeoUtils.class
create mode 100644 target/classes/com/appleyk/geotools/GeometryCreator.class
create mode 100644 target/classes/com/appleyk/geotools/ShapeTools.class
create mode 100644 target/classes/com/appleyk/geotools/ShpTools.class
create mode 100644 target/classes/com/appleyk/pojos/ShpDatas.class
create mode 100644 target/classes/com/appleyk/pojos/ShpInfo.class
create mode 100644 target/classes/com/appleyk/result/ResponseMessage.class
create mode 100644 target/classes/com/appleyk/result/ResponseResult.class
create mode 100644 target/classes/com/appleyk/service/ShpService.class
create mode 100644 target/classes/logback-boot.xml
create mode 100644 target/classes/static/ReadMe
create mode 100644 target/classes/static/shpTest[LineString]/china_railways.cpg
create mode 100644 target/classes/static/shpTest[LineString]/china_railways.dbf
create mode 100644 target/classes/static/shpTest[LineString]/china_railways.prj
create mode 100644 target/classes/static/shpTest[LineString]/china_railways.qpj
create mode 100644 target/classes/static/shpTest[LineString]/china_railways.shp
create mode 100644 target/classes/static/shpTest[LineString]/china_railways.shx
create mode 100644 target/classes/static/shpTest[Point]/dp_tl.dbf
create mode 100644 target/classes/static/shpTest[Point]/dp_tl.prj
create mode 100644 target/classes/static/shpTest[Point]/dp_tl.qix
create mode 100644 target/classes/static/shpTest[Point]/dp_tl.sbn
create mode 100644 target/classes/static/shpTest[Point]/dp_tl.sbx
create mode 100644 target/classes/static/shpTest[Point]/dp_tl.shp
create mode 100644 target/classes/static/shpTest[Point]/dp_tl.shp.xml
create mode 100644 target/classes/static/shpTest[Point]/dp_tl.shx
create mode 100644 target/classes/static/shpTest[Polygon]/china_building_part.cpg
create mode 100644 target/classes/static/shpTest[Polygon]/china_building_part.dbf
create mode 100644 target/classes/static/shpTest[Polygon]/china_building_part.prj
create mode 100644 target/classes/static/shpTest[Polygon]/china_building_part.qix
create mode 100644 target/classes/static/shpTest[Polygon]/china_building_part.qpj
create mode 100644 target/classes/static/shpTest[Polygon]/china_building_part.shp
create mode 100644 target/classes/static/shpTest[Polygon]/china_building_part.shx
create mode 100644 target/test-classes/com/appleyk/SpringbootshaperApplicationTests.class
diff --git a/.idea/$PROJECT_FILE$ b/.idea/$PROJECT_FILE$
new file mode 100644
index 0000000..58b7e3e
--- /dev/null
+++ b/.idea/$PROJECT_FILE$
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..5c98b42
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,2 @@
+# Default ignored files
+/workspace.xml
\ No newline at end of file
diff --git a/.idea/.name b/.idea/.name
new file mode 100644
index 0000000..2a2fcd4
--- /dev/null
+++ b/.idea/.name
@@ -0,0 +1 @@
+springbootshaper
\ No newline at end of file
diff --git a/.idea/artifacts/gis_geotools_war.xml b/.idea/artifacts/gis_geotools_war.xml
new file mode 100644
index 0000000..1021d3c
--- /dev/null
+++ b/.idea/artifacts/gis_geotools_war.xml
@@ -0,0 +1,14 @@
+
+
+ $PROJECT_DIR$/target
+
+
+ gis_geotools
+ war
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/artifacts/gis_geotools_war_exploded.xml b/.idea/artifacts/gis_geotools_war_exploded.xml
new file mode 100644
index 0000000..36aad06
--- /dev/null
+++ b/.idea/artifacts/gis_geotools_war_exploded.xml
@@ -0,0 +1,146 @@
+
+
+ $PROJECT_DIR$/target/gis_geotools-0.1.1-SNAPSHOT
+
+
+ true
+ gis_geotools
+ war
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/artifacts/springbootshaper_war.xml b/.idea/artifacts/springbootshaper_war.xml
new file mode 100644
index 0000000..4429093
--- /dev/null
+++ b/.idea/artifacts/springbootshaper_war.xml
@@ -0,0 +1,14 @@
+
+
+ $PROJECT_DIR$/target
+
+
+ springbootshaper
+ war
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/artifacts/springbootshaper_war_exploded.xml b/.idea/artifacts/springbootshaper_war_exploded.xml
new file mode 100644
index 0000000..53b9a41
--- /dev/null
+++ b/.idea/artifacts/springbootshaper_war_exploded.xml
@@ -0,0 +1,146 @@
+
+
+ $PROJECT_DIR$/target/gis_geotools-0.1.1-SNAPSHOT
+
+
+ true
+ springbootshaper
+ war
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..bc969b0
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..f86397b
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_2_3.xml b/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_2_3.xml
new file mode 100644
index 0000000..6fec8f4
--- /dev/null
+++ b/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_2_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__ch_qos_logback_logback_core_1_2_3.xml b/.idea/libraries/Maven__ch_qos_logback_logback_core_1_2_3.xml
new file mode 100644
index 0000000..9eb8596
--- /dev/null
+++ b/.idea/libraries/Maven__ch_qos_logback_logback_core_1_2_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_alibaba_fastjson_1_2_74.xml b/.idea/libraries/Maven__com_alibaba_fastjson_1_2_74.xml
new file mode 100644
index 0000000..d3dbd7e
--- /dev/null
+++ b/.idea/libraries/Maven__com_alibaba_fastjson_1_2_74.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_conversantmedia_disruptor_1_2_13.xml b/.idea/libraries/Maven__com_conversantmedia_disruptor_1_2_13.xml
new file mode 100644
index 0000000..bdf000e
--- /dev/null
+++ b/.idea/libraries/Maven__com_conversantmedia_disruptor_1_2_13.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_fasterxml_classmate_1_4_0.xml b/.idea/libraries/Maven__com_fasterxml_classmate_1_4_0.xml
new file mode 100644
index 0000000..bbd3a88
--- /dev/null
+++ b/.idea/libraries/Maven__com_fasterxml_classmate_1_4_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_11_2.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_11_2.xml
new file mode 100644
index 0000000..6447563
--- /dev/null
+++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_11_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_11_2.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_11_2.xml
new file mode 100644
index 0000000..4923956
--- /dev/null
+++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_11_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_11_2.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_11_2.xml
new file mode 100644
index 0000000..bb59715
--- /dev/null
+++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_11_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_11_2.xml b/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_11_2.xml
new file mode 100644
index 0000000..c22af69
--- /dev/null
+++ b/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_11_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_11_2.xml b/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_11_2.xml
new file mode 100644
index 0000000..dd6fb59
--- /dev/null
+++ b/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_11_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_11_2.xml b/.idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_11_2.xml
new file mode 100644
index 0000000..22aba0a
--- /dev/null
+++ b/.idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_11_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_google_code_findbugs_jsr305_3_0_2.xml b/.idea/libraries/Maven__com_google_code_findbugs_jsr305_3_0_2.xml
new file mode 100644
index 0000000..1c380d0
--- /dev/null
+++ b/.idea/libraries/Maven__com_google_code_findbugs_jsr305_3_0_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_1_3.xml b/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_1_3.xml
new file mode 100644
index 0000000..2343a7f
--- /dev/null
+++ b/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_1_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_google_guava_guava_25_1_jre.xml b/.idea/libraries/Maven__com_google_guava_guava_25_1_jre.xml
new file mode 100644
index 0000000..9d28def
--- /dev/null
+++ b/.idea/libraries/Maven__com_google_guava_guava_25_1_jre.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_1.xml b/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_1.xml
new file mode 100644
index 0000000..c06f999
--- /dev/null
+++ b/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_googlecode_json_simple_json_simple_1_1.xml b/.idea/libraries/Maven__com_googlecode_json_simple_json_simple_1_1.xml
new file mode 100644
index 0000000..ea70fe1
--- /dev/null
+++ b/.idea/libraries/Maven__com_googlecode_json_simple_json_simple_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_jayway_jsonpath_json_path_2_4_0.xml b/.idea/libraries/Maven__com_jayway_jsonpath_json_path_2_4_0.xml
new file mode 100644
index 0000000..f19f6eb
--- /dev/null
+++ b/.idea/libraries/Maven__com_jayway_jsonpath_json_path_2_4_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_miglayout_miglayout_swing_3_7.xml b/.idea/libraries/Maven__com_miglayout_miglayout_swing_3_7.xml
new file mode 100644
index 0000000..64bb065
--- /dev/null
+++ b/.idea/libraries/Maven__com_miglayout_miglayout_swing_3_7.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml b/.idea/libraries/Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml
new file mode 100644
index 0000000..b8581a6
--- /dev/null
+++ b/.idea/libraries/Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__commons_collections_commons_collections_3_2_2.xml b/.idea/libraries/Maven__commons_collections_commons_collections_3_2_2.xml
new file mode 100644
index 0000000..13afda2
--- /dev/null
+++ b/.idea/libraries/Maven__commons_collections_commons_collections_3_2_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__commons_dbcp_commons_dbcp_1_4.xml b/.idea/libraries/Maven__commons_dbcp_commons_dbcp_1_4.xml
new file mode 100644
index 0000000..49c39ce
--- /dev/null
+++ b/.idea/libraries/Maven__commons_dbcp_commons_dbcp_1_4.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__commons_io_commons_io_2_6.xml b/.idea/libraries/Maven__commons_io_commons_io_2_6.xml
new file mode 100644
index 0000000..d722698
--- /dev/null
+++ b/.idea/libraries/Maven__commons_io_commons_io_2_6.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__commons_pool_commons_pool_1_6.xml b/.idea/libraries/Maven__commons_pool_commons_pool_1_6.xml
new file mode 100644
index 0000000..8393648
--- /dev/null
+++ b/.idea/libraries/Maven__commons_pool_commons_pool_1_6.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_imageio_ext_imageio_ext_geocore_1_1_25.xml b/.idea/libraries/Maven__it_geosolutions_imageio_ext_imageio_ext_geocore_1_1_25.xml
new file mode 100644
index 0000000..fe1fae5
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_imageio_ext_imageio_ext_geocore_1_1_25.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_imageio_ext_imageio_ext_streams_1_1_25.xml b/.idea/libraries/Maven__it_geosolutions_imageio_ext_imageio_ext_streams_1_1_25.xml
new file mode 100644
index 0000000..6b543f2
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_imageio_ext_imageio_ext_streams_1_1_25.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_imageio_ext_imageio_ext_tiff_1_1_25.xml b/.idea/libraries/Maven__it_geosolutions_imageio_ext_imageio_ext_tiff_1_1_25.xml
new file mode 100644
index 0000000..e09b99e
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_imageio_ext_imageio_ext_tiff_1_1_25.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_imageio_ext_imageio_ext_utilities_1_1_25.xml b/.idea/libraries/Maven__it_geosolutions_imageio_ext_imageio_ext_utilities_1_1_25.xml
new file mode 100644
index 0000000..8958bf6
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_imageio_ext_imageio_ext_utilities_1_1_25.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_affine_jt_affine_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_affine_jt_affine_1_1_1.xml
new file mode 100644
index 0000000..fee267b
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_affine_jt_affine_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_algebra_jt_algebra_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_algebra_jt_algebra_1_1_1.xml
new file mode 100644
index 0000000..c19554e
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_algebra_jt_algebra_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_bandcombine_jt_bandcombine_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_bandcombine_jt_bandcombine_1_1_1.xml
new file mode 100644
index 0000000..22c5665
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_bandcombine_jt_bandcombine_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_bandmerge_jt_bandmerge_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_bandmerge_jt_bandmerge_1_1_1.xml
new file mode 100644
index 0000000..60fbb9e
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_bandmerge_jt_bandmerge_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_bandselect_jt_bandselect_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_bandselect_jt_bandselect_1_1_1.xml
new file mode 100644
index 0000000..5ab8020
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_bandselect_jt_bandselect_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_binarize_jt_binarize_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_binarize_jt_binarize_1_1_1.xml
new file mode 100644
index 0000000..3ff7f52
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_binarize_jt_binarize_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_border_jt_border_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_border_jt_border_1_1_1.xml
new file mode 100644
index 0000000..cc3d12b
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_border_jt_border_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_buffer_jt_buffer_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_buffer_jt_buffer_1_1_1.xml
new file mode 100644
index 0000000..e6d7c81
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_buffer_jt_buffer_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_classifier_jt_classifier_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_classifier_jt_classifier_1_1_1.xml
new file mode 100644
index 0000000..41c8855
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_classifier_jt_classifier_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_colorconvert_jt_colorconvert_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_colorconvert_jt_colorconvert_1_1_1.xml
new file mode 100644
index 0000000..c9f8bb4
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_colorconvert_jt_colorconvert_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_colorindexer_jt_colorindexer_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_colorindexer_jt_colorindexer_1_1_1.xml
new file mode 100644
index 0000000..54f6090
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_colorindexer_jt_colorindexer_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_crop_jt_crop_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_crop_jt_crop_1_1_1.xml
new file mode 100644
index 0000000..08f1afb
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_crop_jt_crop_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_errordiffusion_jt_errordiffusion_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_errordiffusion_jt_errordiffusion_1_1_1.xml
new file mode 100644
index 0000000..d5e2696
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_errordiffusion_jt_errordiffusion_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_format_jt_format_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_format_jt_format_1_1_1.xml
new file mode 100644
index 0000000..3e5ca19
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_format_jt_format_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_imagefunction_jt_imagefunction_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_imagefunction_jt_imagefunction_1_1_1.xml
new file mode 100644
index 0000000..d7cc095
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_imagefunction_jt_imagefunction_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_iterators_jt_iterators_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_iterators_jt_iterators_1_1_1.xml
new file mode 100644
index 0000000..6aaf1c2
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_iterators_jt_iterators_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_lookup_jt_lookup_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_lookup_jt_lookup_1_1_1.xml
new file mode 100644
index 0000000..7ef01c6
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_lookup_jt_lookup_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_mosaic_jt_mosaic_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_mosaic_jt_mosaic_1_1_1.xml
new file mode 100644
index 0000000..95e3c06
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_mosaic_jt_mosaic_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_nullop_jt_nullop_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_nullop_jt_nullop_1_1_1.xml
new file mode 100644
index 0000000..3cac309
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_nullop_jt_nullop_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_orderdither_jt_orderdither_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_orderdither_jt_orderdither_1_1_1.xml
new file mode 100644
index 0000000..e0945e1
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_orderdither_jt_orderdither_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_piecewise_jt_piecewise_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_piecewise_jt_piecewise_1_1_1.xml
new file mode 100644
index 0000000..1c5e5e3
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_piecewise_jt_piecewise_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_rescale_jt_rescale_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_rescale_jt_rescale_1_1_1.xml
new file mode 100644
index 0000000..624f59b
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_rescale_jt_rescale_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_rlookup_jt_rlookup_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_rlookup_jt_rlookup_1_1_1.xml
new file mode 100644
index 0000000..27861bb
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_rlookup_jt_rlookup_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_scale2_jt_scale2_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_scale2_jt_scale2_1_1_1.xml
new file mode 100644
index 0000000..8eff0bb
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_scale2_jt_scale2_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_scale_jt_scale_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_scale_jt_scale_1_1_1.xml
new file mode 100644
index 0000000..8a10f37
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_scale_jt_scale_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_shadedrelief_jt_shadedrelief_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_shadedrelief_jt_shadedrelief_1_1_1.xml
new file mode 100644
index 0000000..e898f77
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_shadedrelief_jt_shadedrelief_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_stats_jt_stats_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_stats_jt_stats_1_1_1.xml
new file mode 100644
index 0000000..5d45a0d
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_stats_jt_stats_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_translate_jt_translate_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_translate_jt_translate_1_1_1.xml
new file mode 100644
index 0000000..94fdc48
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_translate_jt_translate_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_utilities_jt_utilities_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_utilities_jt_utilities_1_1_1.xml
new file mode 100644
index 0000000..c16a164
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_utilities_jt_utilities_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_vectorbin_jt_vectorbin_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_vectorbin_jt_vectorbin_1_1_1.xml
new file mode 100644
index 0000000..14b3205
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_vectorbin_jt_vectorbin_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_warp_jt_warp_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_warp_jt_warp_1_1_1.xml
new file mode 100644
index 0000000..3cc41b9
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_warp_jt_warp_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__it_geosolutions_jaiext_zonal_jt_zonal_1_1_1.xml b/.idea/libraries/Maven__it_geosolutions_jaiext_zonal_jt_zonal_1_1_1.xml
new file mode 100644
index 0000000..694e472
--- /dev/null
+++ b/.idea/libraries/Maven__it_geosolutions_jaiext_zonal_jt_zonal_1_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__javax_annotation_javax_annotation_api_1_3_2.xml b/.idea/libraries/Maven__javax_annotation_javax_annotation_api_1_3_2.xml
new file mode 100644
index 0000000..e74f3ab
--- /dev/null
+++ b/.idea/libraries/Maven__javax_annotation_javax_annotation_api_1_3_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__javax_measure_unit_api_1_0.xml b/.idea/libraries/Maven__javax_measure_unit_api_1_0.xml
new file mode 100644
index 0000000..096a37c
--- /dev/null
+++ b/.idea/libraries/Maven__javax_measure_unit_api_1_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__javax_media_jai_codec_1_1_3.xml b/.idea/libraries/Maven__javax_media_jai_codec_1_1_3.xml
new file mode 100644
index 0000000..4341c63
--- /dev/null
+++ b/.idea/libraries/Maven__javax_media_jai_codec_1_1_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__javax_media_jai_core_1_1_3.xml b/.idea/libraries/Maven__javax_media_jai_core_1_1_3.xml
new file mode 100644
index 0000000..d8609e8
--- /dev/null
+++ b/.idea/libraries/Maven__javax_media_jai_core_1_1_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__javax_media_jai_imageio_1_1.xml b/.idea/libraries/Maven__javax_media_jai_imageio_1_1.xml
new file mode 100644
index 0000000..931d9cb
--- /dev/null
+++ b/.idea/libraries/Maven__javax_media_jai_imageio_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__javax_validation_validation_api_2_0_1_Final.xml b/.idea/libraries/Maven__javax_validation_validation_api_2_0_1_Final.xml
new file mode 100644
index 0000000..6978c0b
--- /dev/null
+++ b/.idea/libraries/Maven__javax_validation_validation_api_2_0_1_Final.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__jgridshift_jgridshift_1_0.xml b/.idea/libraries/Maven__jgridshift_jgridshift_1_0.xml
new file mode 100644
index 0000000..b7ad97c
--- /dev/null
+++ b/.idea/libraries/Maven__jgridshift_jgridshift_1_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__junit_junit_4_12.xml b/.idea/libraries/Maven__junit_junit_4_12.xml
new file mode 100644
index 0000000..d411041
--- /dev/null
+++ b/.idea/libraries/Maven__junit_junit_4_12.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__mysql_mysql_connector_java_5_1_25.xml b/.idea/libraries/Maven__mysql_mysql_connector_java_5_1_25.xml
new file mode 100644
index 0000000..4440a5f
--- /dev/null
+++ b/.idea/libraries/Maven__mysql_mysql_connector_java_5_1_25.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_9_12.xml b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_9_12.xml
new file mode 100644
index 0000000..ec857e4
--- /dev/null
+++ b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_9_12.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__net_bytebuddy_byte_buddy_agent_1_9_12.xml b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_agent_1_9_12.xml
new file mode 100644
index 0000000..767dbf7
--- /dev/null
+++ b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_agent_1_9_12.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__net_minidev_accessors_smart_1_2.xml b/.idea/libraries/Maven__net_minidev_accessors_smart_1_2.xml
new file mode 100644
index 0000000..b3d3858
--- /dev/null
+++ b/.idea/libraries/Maven__net_minidev_accessors_smart_1_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__net_minidev_json_smart_2_3.xml b/.idea/libraries/Maven__net_minidev_json_smart_2_3.xml
new file mode 100644
index 0000000..1083023
--- /dev/null
+++ b/.idea/libraries/Maven__net_minidev_json_smart_2_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__net_sf_geographiclib_GeographicLib_Java_1_49.xml b/.idea/libraries/Maven__net_sf_geographiclib_GeographicLib_Java_1_49.xml
new file mode 100644
index 0000000..34bd9de
--- /dev/null
+++ b/.idea/libraries/Maven__net_sf_geographiclib_GeographicLib_Java_1_49.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_commons_commons_lang3_3_8_1.xml b/.idea/libraries/Maven__org_apache_commons_commons_lang3_3_8_1.xml
new file mode 100644
index 0000000..33b78e9
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_commons_commons_lang3_3_8_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_11_2.xml b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_11_2.xml
new file mode 100644
index 0000000..fe93f54
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_11_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_logging_log4j_log4j_to_slf4j_2_11_2.xml b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_to_slf4j_2_11_2.xml
new file mode 100644
index 0000000..889bf4f
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_to_slf4j_2_11_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_9_0_17.xml b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_9_0_17.xml
new file mode 100644
index 0000000..d311b9a
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_9_0_17.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_el_9_0_17.xml b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_el_9_0_17.xml
new file mode 100644
index 0000000..735fed3
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_el_9_0_17.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_17.xml b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_17.xml
new file mode 100644
index 0000000..9b8e69b
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_17.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_assertj_assertj_core_3_11_1.xml b/.idea/libraries/Maven__org_assertj_assertj_core_3_11_1.xml
new file mode 100644
index 0000000..4d16d46
--- /dev/null
+++ b/.idea/libraries/Maven__org_assertj_assertj_core_3_11_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_checkerframework_checker_qual_2_0_0.xml b/.idea/libraries/Maven__org_checkerframework_checker_qual_2_0_0.xml
new file mode 100644
index 0000000..2cbbe64
--- /dev/null
+++ b/.idea/libraries/Maven__org_checkerframework_checker_qual_2_0_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_codehaus_mojo_animal_sniffer_annotations_1_14.xml b/.idea/libraries/Maven__org_codehaus_mojo_animal_sniffer_annotations_1_14.xml
new file mode 100644
index 0000000..1af11e4
--- /dev/null
+++ b/.idea/libraries/Maven__org_codehaus_mojo_animal_sniffer_annotations_1_14.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_ejml_ejml_core_0_34.xml b/.idea/libraries/Maven__org_ejml_ejml_core_0_34.xml
new file mode 100644
index 0000000..2ca0399
--- /dev/null
+++ b/.idea/libraries/Maven__org_ejml_ejml_core_0_34.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_ejml_ejml_ddense_0_34.xml b/.idea/libraries/Maven__org_ejml_ejml_ddense_0_34.xml
new file mode 100644
index 0000000..737819a
--- /dev/null
+++ b/.idea/libraries/Maven__org_ejml_ejml_ddense_0_34.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_geotools_gt_api_20_0.xml b/.idea/libraries/Maven__org_geotools_gt_api_20_0.xml
new file mode 100644
index 0000000..326e48e
--- /dev/null
+++ b/.idea/libraries/Maven__org_geotools_gt_api_20_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_geotools_gt_coverage_20_0.xml b/.idea/libraries/Maven__org_geotools_gt_coverage_20_0.xml
new file mode 100644
index 0000000..5f34337
--- /dev/null
+++ b/.idea/libraries/Maven__org_geotools_gt_coverage_20_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_geotools_gt_cql_20_0.xml b/.idea/libraries/Maven__org_geotools_gt_cql_20_0.xml
new file mode 100644
index 0000000..0a5d794
--- /dev/null
+++ b/.idea/libraries/Maven__org_geotools_gt_cql_20_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_geotools_gt_data_20_0.xml b/.idea/libraries/Maven__org_geotools_gt_data_20_0.xml
new file mode 100644
index 0000000..68f9d95
--- /dev/null
+++ b/.idea/libraries/Maven__org_geotools_gt_data_20_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_geotools_gt_geojson_20_0.xml b/.idea/libraries/Maven__org_geotools_gt_geojson_20_0.xml
new file mode 100644
index 0000000..60358e2
--- /dev/null
+++ b/.idea/libraries/Maven__org_geotools_gt_geojson_20_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_geotools_gt_jdbc_20_0.xml b/.idea/libraries/Maven__org_geotools_gt_jdbc_20_0.xml
new file mode 100644
index 0000000..412a461
--- /dev/null
+++ b/.idea/libraries/Maven__org_geotools_gt_jdbc_20_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_geotools_gt_main_20_0.xml b/.idea/libraries/Maven__org_geotools_gt_main_20_0.xml
new file mode 100644
index 0000000..313cf91
--- /dev/null
+++ b/.idea/libraries/Maven__org_geotools_gt_main_20_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_geotools_gt_metadata_20_0.xml b/.idea/libraries/Maven__org_geotools_gt_metadata_20_0.xml
new file mode 100644
index 0000000..d174b7f
--- /dev/null
+++ b/.idea/libraries/Maven__org_geotools_gt_metadata_20_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_geotools_gt_opengis_20_0.xml b/.idea/libraries/Maven__org_geotools_gt_opengis_20_0.xml
new file mode 100644
index 0000000..e270809
--- /dev/null
+++ b/.idea/libraries/Maven__org_geotools_gt_opengis_20_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_geotools_gt_referencing_20_0.xml b/.idea/libraries/Maven__org_geotools_gt_referencing_20_0.xml
new file mode 100644
index 0000000..42619a1
--- /dev/null
+++ b/.idea/libraries/Maven__org_geotools_gt_referencing_20_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_geotools_gt_render_20_0.xml b/.idea/libraries/Maven__org_geotools_gt_render_20_0.xml
new file mode 100644
index 0000000..d105829
--- /dev/null
+++ b/.idea/libraries/Maven__org_geotools_gt_render_20_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_geotools_gt_shapefile_20_0.xml b/.idea/libraries/Maven__org_geotools_gt_shapefile_20_0.xml
new file mode 100644
index 0000000..9d25ab6
--- /dev/null
+++ b/.idea/libraries/Maven__org_geotools_gt_shapefile_20_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_geotools_gt_swing_20_0.xml b/.idea/libraries/Maven__org_geotools_gt_swing_20_0.xml
new file mode 100644
index 0000000..3992fee
--- /dev/null
+++ b/.idea/libraries/Maven__org_geotools_gt_swing_20_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_geotools_jdbc_gt_jdbc_mysql_20_0.xml b/.idea/libraries/Maven__org_geotools_jdbc_gt_jdbc_mysql_20_0.xml
new file mode 100644
index 0000000..35ba129
--- /dev/null
+++ b/.idea/libraries/Maven__org_geotools_jdbc_gt_jdbc_mysql_20_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml
new file mode 100644
index 0000000..f58bbc1
--- /dev/null
+++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml
new file mode 100644
index 0000000..78dbe45
--- /dev/null
+++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_hibernate_validator_hibernate_validator_6_0_16_Final.xml b/.idea/libraries/Maven__org_hibernate_validator_hibernate_validator_6_0_16_Final.xml
new file mode 100644
index 0000000..1ca9936
--- /dev/null
+++ b/.idea/libraries/Maven__org_hibernate_validator_hibernate_validator_6_0_16_Final.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_jaitools_jt_utils_1_5_0.xml b/.idea/libraries/Maven__org_jaitools_jt_utils_1_5_0.xml
new file mode 100644
index 0000000..4dd41bc
--- /dev/null
+++ b/.idea/libraries/Maven__org_jaitools_jt_utils_1_5_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_jaitools_jt_zonalstats_1_5_0.xml b/.idea/libraries/Maven__org_jaitools_jt_zonalstats_1_5_0.xml
new file mode 100644
index 0000000..d99fc29
--- /dev/null
+++ b/.idea/libraries/Maven__org_jaitools_jt_zonalstats_1_5_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_2_Final.xml b/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_2_Final.xml
new file mode 100644
index 0000000..5f7dd01
--- /dev/null
+++ b/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_2_Final.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_jdom_jdom2_2_0_6.xml b/.idea/libraries/Maven__org_jdom_jdom2_2_0_6.xml
new file mode 100644
index 0000000..020a02f
--- /dev/null
+++ b/.idea/libraries/Maven__org_jdom_jdom2_2_0_6.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_locationtech_jts_jts_core_1_16_0.xml b/.idea/libraries/Maven__org_locationtech_jts_jts_core_1_16_0.xml
new file mode 100644
index 0000000..5654d1f
--- /dev/null
+++ b/.idea/libraries/Maven__org_locationtech_jts_jts_core_1_16_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_mockito_mockito_core_2_23_4.xml b/.idea/libraries/Maven__org_mockito_mockito_core_2_23_4.xml
new file mode 100644
index 0000000..159204f
--- /dev/null
+++ b/.idea/libraries/Maven__org_mockito_mockito_core_2_23_4.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_objenesis_objenesis_2_6.xml b/.idea/libraries/Maven__org_objenesis_objenesis_2_6.xml
new file mode 100644
index 0000000..af41e3b
--- /dev/null
+++ b/.idea/libraries/Maven__org_objenesis_objenesis_2_6.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_ow2_asm_asm_5_0_4.xml b/.idea/libraries/Maven__org_ow2_asm_asm_5_0_4.xml
new file mode 100644
index 0000000..0bf8cf2
--- /dev/null
+++ b/.idea/libraries/Maven__org_ow2_asm_asm_5_0_4.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_skyscreamer_jsonassert_1_5_0.xml b/.idea/libraries/Maven__org_skyscreamer_jsonassert_1_5_0.xml
new file mode 100644
index 0000000..c4c54d6
--- /dev/null
+++ b/.idea/libraries/Maven__org_skyscreamer_jsonassert_1_5_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_26.xml b/.idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_26.xml
new file mode 100644
index 0000000..087b2a4
--- /dev/null
+++ b/.idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_26.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_26.xml b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_26.xml
new file mode 100644
index 0000000..6545f77
--- /dev/null
+++ b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_26.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_2_1_4_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_2_1_4_RELEASE.xml
new file mode 100644
index 0000000..cf900a4
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_2_1_4_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_2_1_4_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_2_1_4_RELEASE.xml
new file mode 100644
index 0000000..1f7cd0d
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_2_1_4_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_2_1_4_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_2_1_4_RELEASE.xml
new file mode 100644
index 0000000..093c9f8
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_2_1_4_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_json_2_1_4_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_json_2_1_4_RELEASE.xml
new file mode 100644
index 0000000..f60fc74
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_json_2_1_4_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_2_1_4_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_2_1_4_RELEASE.xml
new file mode 100644
index 0000000..b844df9
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_2_1_4_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_test_2_1_4_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_test_2_1_4_RELEASE.xml
new file mode 100644
index 0000000..69a8086
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_test_2_1_4_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_2_1_4_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_2_1_4_RELEASE.xml
new file mode 100644
index 0000000..23a762f
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_2_1_4_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_2_1_4_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_2_1_4_RELEASE.xml
new file mode 100644
index 0000000..73a7558
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_2_1_4_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_2_1_4_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_2_1_4_RELEASE.xml
new file mode 100644
index 0000000..d6a7d75
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_2_1_4_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_autoconfigure_2_1_4_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_autoconfigure_2_1_4_RELEASE.xml
new file mode 100644
index 0000000..ee6fc74
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_autoconfigure_2_1_4_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_aop_5_1_6_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_aop_5_1_6_RELEASE.xml
new file mode 100644
index 0000000..4c53933
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_aop_5_1_6_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_beans_5_1_6_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_beans_5_1_6_RELEASE.xml
new file mode 100644
index 0000000..9affe15
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_beans_5_1_6_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_context_5_1_6_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_context_5_1_6_RELEASE.xml
new file mode 100644
index 0000000..78eb291
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_context_5_1_6_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_core_5_1_6_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_core_5_1_6_RELEASE.xml
new file mode 100644
index 0000000..143f040
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_core_5_1_6_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_expression_5_1_6_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_expression_5_1_6_RELEASE.xml
new file mode 100644
index 0000000..279c319
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_expression_5_1_6_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_jcl_5_1_6_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_jcl_5_1_6_RELEASE.xml
new file mode 100644
index 0000000..b3e41fd
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_jcl_5_1_6_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_test_5_1_6_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_test_5_1_6_RELEASE.xml
new file mode 100644
index 0000000..b189322
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_test_5_1_6_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_web_5_1_6_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_web_5_1_6_RELEASE.xml
new file mode 100644
index 0000000..33dcd41
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_web_5_1_6_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_webmvc_5_1_6_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_webmvc_5_1_6_RELEASE.xml
new file mode 100644
index 0000000..ae260fa
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_webmvc_5_1_6_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_xmlunit_xmlunit_core_2_6_2.xml b/.idea/libraries/Maven__org_xmlunit_xmlunit_core_2_6_2.xml
new file mode 100644
index 0000000..9f44657
--- /dev/null
+++ b/.idea/libraries/Maven__org_xmlunit_xmlunit_core_2_6_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_yaml_snakeyaml_1_23.xml b/.idea/libraries/Maven__org_yaml_snakeyaml_1_23.xml
new file mode 100644
index 0000000..7e63769
--- /dev/null
+++ b/.idea/libraries/Maven__org_yaml_snakeyaml_1_23.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__si_uom_si_quantity_0_7_1.xml b/.idea/libraries/Maven__si_uom_si_quantity_0_7_1.xml
new file mode 100644
index 0000000..3fb0117
--- /dev/null
+++ b/.idea/libraries/Maven__si_uom_si_quantity_0_7_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__si_uom_si_units_java8_0_7_1.xml b/.idea/libraries/Maven__si_uom_si_units_java8_0_7_1.xml
new file mode 100644
index 0000000..19afb9b
--- /dev/null
+++ b/.idea/libraries/Maven__si_uom_si_units_java8_0_7_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__systems_uom_systems_common_java8_0_7_2.xml b/.idea/libraries/Maven__systems_uom_systems_common_java8_0_7_2.xml
new file mode 100644
index 0000000..1c5c69b
--- /dev/null
+++ b/.idea/libraries/Maven__systems_uom_systems_common_java8_0_7_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__tec_uom_lib_uom_lib_common_1_0_2.xml b/.idea/libraries/Maven__tec_uom_lib_uom_lib_common_1_0_2.xml
new file mode 100644
index 0000000..78a93e7
--- /dev/null
+++ b/.idea/libraries/Maven__tec_uom_lib_uom_lib_common_1_0_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__tec_uom_uom_se_1_0_8.xml b/.idea/libraries/Maven__tec_uom_uom_se_1_0_8.xml
new file mode 100644
index 0000000..70fe3d0
--- /dev/null
+++ b/.idea/libraries/Maven__tec_uom_uom_se_1_0_8.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..75172d1
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..a44d8ea
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/qaplug_profiles.xml b/.idea/qaplug_profiles.xml
new file mode 100644
index 0000000..3dfd21f
--- /dev/null
+++ b/.idea/qaplug_profiles.xml
@@ -0,0 +1,465 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/gis_geotools.iml b/gis_geotools.iml
new file mode 100644
index 0000000..6d9eb79
--- /dev/null
+++ b/gis_geotools.iml
@@ -0,0 +1,169 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..4a7ca39
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,188 @@
+
+
+
+ 4.0.0
+ com.appleyk
+ gis_geotools
+ 0.1.1-SNAPSHOT
+ war
+
+ gis_geotools
+ spring-boot集成geotools工具包,实现将几何对象写进Shapefile【文件】并读取和显示
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.1.4.RELEASE
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+ 20.0
+ 42.1.4
+ 2.11.2
+ 1.2.74
+
+
+
+
+ osgeo
+ OSGeo Release Repository
+ https://repo.osgeo.org/repository/release/
+
+ false
+
+
+ true
+
+
+
+ osgeo-snapshot
+ OSGeo Snapshot Repository
+ https://repo.osgeo.org/repository/snapshot/
+
+ true
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+ junit
+ junit
+
+
+
+
+ org.geotools
+ gt-shapefile
+ ${geotools.version}
+
+
+
+ org.geotools
+ gt-swing
+ ${geotools.version}
+
+
+
+
+ org.geotools
+ gt-geojson
+ ${geotools.version}
+
+
+
+ org.geotools.jdbc
+ gt-jdbc-mysql
+ ${geotools.version}
+
+
+
+ mysql
+ mysql-connector-java
+ 5.1.25
+
+
+
+
+ com.alibaba
+ fastjson
+ ${fastjson.version}
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+ ${jackson.version}
+
+
+ com.fasterxml.jackson.core
+ jackson-annotations
+ ${jackson.version}
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson.version}
+
+
+
+
+
+
+
+
+
+ src/main/resources
+
+
+ src/main/resources
+
+ **/*.properties
+ **/*.xml
+
+ false
+
+
+ src/main/java
+
+ **/*.properties
+ **/*.xml
+
+ false
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ true
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ **/*Documentation.java
+
+
+
+
+
+
diff --git a/src/main/java/com/appleyk/IO/StringTokenReader.java b/src/main/java/com/appleyk/IO/StringTokenReader.java
new file mode 100644
index 0000000..fe465a6
--- /dev/null
+++ b/src/main/java/com/appleyk/IO/StringTokenReader.java
@@ -0,0 +1,672 @@
+package com.appleyk.IO;
+
+
+import org.locationtech.jts.geom.*;
+import org.locationtech.jts.io.ParseException;
+import org.locationtech.jts.util.Assert;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StreamTokenizer;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
StringToken 特殊、自定义字符串解析Reader
+ * @author Appleyk
+ * @blob https://blog.csdn.net/appleyk
+ * @date Created on 上午 2018年10月25日09:22:41
+ */
+public class StringTokenReader {
+
+ private static final String EMPTY = "EMPTY";
+ private static final String COMMA = ",";
+ private static final String L_PAREN = "(";
+ private static final String R_PAREN = ")";
+ private static final String NAN_SYMBOL = "NaN";
+ private static final String Z = "Z";
+ private static final String M = "M";
+ private static final String ZM = "ZM";
+ private static final String POINT = "POINT";
+ private static final String LINESTRING = "LINESTRING";
+ private static final String LINEARRING = "LINEARRING";
+ private static final String POLYGON = "POLYGON";
+ private static final String MULTI_POINT = "MULTIPOINT";
+ private static final String MULTI_LINESTRING = "MULTILINESTRING";
+ private static final String MULTI_POLYGON = "MULTIPOLYGON";
+
+ private GeometryFactory geometryFactory;
+ private PrecisionModel precisionModel;
+ private StreamTokenizer tokenizer;
+
+ /**
+ * Not yet used (useful if we want to read Z, M and ZM WKT)
+ */
+ private boolean z;
+ private boolean m;
+
+ /**
+ * Creates a reader that creates objects using the default
+ * {@link GeometryFactory}.
+ */
+ public StringTokenReader() {
+ this(new GeometryFactory());
+ }
+
+ /**
+ * Creates a reader that creates objects using the given
+ * {@link GeometryFactory}.
+ *
+ * @param geometryFactory the factory used to create Geometry
s.
+ */
+ public StringTokenReader(GeometryFactory geometryFactory) {
+ this.geometryFactory = geometryFactory;
+ precisionModel = geometryFactory.getPrecisionModel();
+ }
+
+ /**
+ * Reads a Well-Known Text representation of a {@link Geometry} from a
+ * {@link String}.
+ *
+ * @param wellKnownText one or more <Geometry Tagged Text> strings (see the
+ * OpenGIS Simple Features Specification) separated by whitespace
+ * @return a Geometry
specified by wellKnownText
+ * @throws ParseException if a parsing problem occurs
+ */
+ public Geometry read(String wellKnownText) throws ParseException {
+ StringReader reader = new StringReader(wellKnownText);
+ try {
+ return read(reader);
+ } finally {
+ reader.close();
+ }
+ }
+
+ /**
+ * Reads a Well-Known Text representation of a {@link Geometry} from a
+ * {@link Reader}.
+ *
+ * @param reader a Reader which will return a <Geometry Tagged Text>
+ * string (see the OpenGIS Simple Features Specification)
+ * @return a Geometry
read from reader
+ * @throws ParseException if a parsing problem occurs
+ */
+ public Geometry read(Reader reader) throws ParseException {
+ tokenizer = new StreamTokenizer(reader);
+ // set tokenizer to NOT parse numbers
+ tokenizer.resetSyntax();
+ tokenizer.wordChars('a', 'z');
+ tokenizer.wordChars('A', 'Z');
+ tokenizer.wordChars(128 + 32, 255);
+ tokenizer.wordChars('0', '9');
+ tokenizer.wordChars('-', '-');
+ tokenizer.wordChars('+', '+');
+ tokenizer.wordChars('.', '.');
+ tokenizer.whitespaceChars(0, ' ');
+ tokenizer.commentChar('#');
+ z = false;
+ m = false;
+ try {
+ return readGeometryTaggedText();
+ } catch (IOException e) {
+ throw new ParseException(e.toString());
+ }
+ }
+
+ /**
+ * Returns the next array of Coordinate
s in the stream.
+ *
+ * tokenizer tokenizer over a stream of text in Well-known Text format. The
+ * next element returned by the stream should be L_PAREN (the beginning of
+ * "(x1 y1, x2 y2, ..., xn yn)") or EMPTY.
+ *
+ * @return the next array of Coordinate
s in the stream, or an
+ * empty array if EMPTY is the next element returned by the stream.
+ * @throws IOException if an I/O error occurs
+ * @throws ParseException if an unexpected token was encountered
+ */
+ private Coordinate[] getCoordinates() throws IOException, ParseException {
+ String nextToken = getNextEmptyOrOpener();
+ if (EMPTY.equals(nextToken)) {
+ return new Coordinate[]{};
+ }
+ List coordinates = new ArrayList<>();
+ coordinates.add(getPreciseCoordinate());
+ nextToken = getNextCloserOrComma();
+ while (COMMA.equals(nextToken)) {
+ coordinates.add(getPreciseCoordinate());
+ nextToken = getNextCloserOrComma();
+ }
+ Coordinate[] array = new Coordinate[coordinates.size()];
+ return coordinates.toArray(array);
+ }
+
+ private Coordinate[] getCoordinatesNoLeftParen() throws IOException, ParseException {
+ List coordinates = new ArrayList<>();
+ coordinates.add(getPreciseCoordinate());
+ String nextToken = getNextCloserOrComma();
+ while (COMMA.equals(nextToken)) {
+ coordinates.add(getPreciseCoordinate());
+ nextToken = getNextCloserOrComma();
+ }
+ Coordinate[] array = new Coordinate[coordinates.size()];
+ return coordinates.toArray(array);
+ }
+
+ private Coordinate getPreciseCoordinate() throws IOException, ParseException {
+ Coordinate coordinate = new Coordinate();
+ coordinate.setX(getNextNumber());
+ coordinate.setY(getNextNumber());
+ if (isNumberNext()) {
+ coordinate.setZ(getNextNumber());
+ }
+ if (isNumberNext()) {
+ // ignore M value
+ getNextNumber();
+ }
+ precisionModel.makePrecise(coordinate);
+ return coordinate;
+ }
+
+ private boolean isNumberNext() throws IOException {
+ int type = tokenizer.nextToken();
+ tokenizer.pushBack();
+ return type == StreamTokenizer.TT_WORD;
+ }
+
+ /**
+ * Parses the next number in the stream. Numbers with exponents are handled.
+ * NaN values are handled correctly, and the case of the "NaN"
+ * symbol is not significant.
+ *
+ * tokenizer tokenizer over a stream of text in Well-known Text format. The
+ * next token must be a number.
+ *
+ * @return the next number in the stream
+ * @throws ParseException if the next token is not a valid number
+ * @throws IOException if an I/O error occurs
+ */
+ private double getNextNumber() throws IOException, ParseException {
+ int type = tokenizer.nextToken();
+ switch (type) {
+ case StreamTokenizer.TT_WORD: {
+ if (tokenizer.sval.equalsIgnoreCase(NAN_SYMBOL)) {
+ return Double.NaN;
+ } else {
+ try {
+ return Double.parseDouble(tokenizer.sval);
+ } catch (NumberFormatException ex) {
+ parseErrorWithLine("Invalid number: " + tokenizer.sval);
+ }
+ }
+ break;
+ }
+ default:{
+
+ }
+ }
+ parseErrorExpected("number");
+ return 0.0;
+ }
+
+ /**
+ * Returns the next EMPTY or L_PAREN in the stream as uppercase text.
+ *
+ * tokenizer tokenizer over a stream of text in Well-known Text format. The
+ * next token must be EMPTY or L_PAREN.
+ *
+ * @return the next EMPTY or L_PAREN in the stream as uppercase text.
+ * @throws ParseException if the next token is not EMPTY or L_PAREN
+ * @throws IOException if an I/O error occurs
+ */
+ private String getNextEmptyOrOpener() throws IOException, ParseException {
+ String nextWord = getNextWord();
+ if (Z.equalsIgnoreCase(nextWord)) {
+ z = true;
+ nextWord = getNextWord();
+ } else if (M.equalsIgnoreCase(nextWord)) {
+ m = true;
+ nextWord = getNextWord();
+ } else if (ZM.equalsIgnoreCase(nextWord)) {
+ z = true;
+ m = true;
+ nextWord = getNextWord();
+ }
+ if (EMPTY.equals(nextWord) || L_PAREN.equals(nextWord)) {
+ return nextWord;
+ }
+ parseErrorExpected(EMPTY + " or " + L_PAREN);
+ return null;
+ }
+
+ /**
+ * Returns the next R_PAREN or COMMA in the stream.
+ *
+ * tokenizer tokenizer over a stream of text in Well-known Text format. The
+ * next token must be R_PAREN or COMMA.
+ *
+ * @return the next R_PAREN or COMMA in the stream
+ * @throws ParseException if the next token is not R_PAREN or COMMA
+ * @throws IOException if an I/O error occurs
+ */
+ private String getNextCloserOrComma() throws IOException, ParseException {
+ String nextWord = getNextWord();
+ if (COMMA.equals(nextWord) || R_PAREN.equals(nextWord)) {
+ return nextWord;
+ }
+ parseErrorExpected(COMMA + " or " + R_PAREN);
+ return null;
+ }
+
+ /**
+ * Returns the next R_PAREN in the stream.
+ *
+ * tokenizer tokenizer over a stream of text in Well-known Text format. The
+ * next token must be R_PAREN.
+ *
+ * @return the next R_PAREN in the stream
+ * @throws ParseException if the next token is not R_PAREN
+ * @throws IOException if an I/O error occurs
+ */
+ private String getNextCloser() throws IOException, ParseException {
+ String nextWord = getNextWord();
+ if (R_PAREN.equals(nextWord)) {
+ return nextWord;
+ }
+ parseErrorExpected(R_PAREN);
+ return null;
+ }
+
+ /**
+ * Returns the next word in the stream.
+ *
+ * tokenizer tokenizer over a stream of text in Well-known Text format. The
+ * next token must be a word.
+ *
+ * @return the next word in the stream as uppercase text
+ * @throws ParseException if the next token is not a word
+ * @throws IOException if an I/O error occurs
+ */
+ private String getNextWord() throws IOException, ParseException {
+ int type = tokenizer.nextToken();
+ switch (type) {
+ case StreamTokenizer.TT_WORD:
+
+ String word = tokenizer.sval;
+ if (word.equalsIgnoreCase(EMPTY)){
+ return EMPTY;
+ }
+
+ return word;
+
+ case '(':
+ return L_PAREN;
+ case ')':
+ return R_PAREN;
+ case ',':
+ return COMMA;
+ default:{
+
+ }
+ }
+ parseErrorExpected("word");
+ return null;
+ }
+
+ /**
+ * Returns the next word in the stream.
+ *
+ * tokenizer tokenizer over a stream of text in Well-known Text format. The
+ * next token must be a word.
+ *
+ * @return the next word in the stream as uppercase text
+ * @throws ParseException if the next token is not a word
+ * @throws IOException if an I/O error occurs
+ */
+ private String lookaheadWord() throws IOException, ParseException {
+ String nextWord = getNextWord();
+ tokenizer.pushBack();
+ return nextWord;
+ }
+
+ /**
+ * Throws a formatted ParseException reporting that the current token was
+ * unexpected.
+ *
+ * @param expected a description of what was expected
+ * @throws ParseException AssertionFailedException if an invalid token is encountered
+ */
+ private void parseErrorExpected(String expected) throws ParseException {
+ // throws Asserts for tokens that should never be seen
+ if (tokenizer.ttype == StreamTokenizer.TT_NUMBER){
+ Assert.shouldNeverReachHere("Unexpected NUMBER token");
+ }
+ if (tokenizer.ttype == StreamTokenizer.TT_EOL){
+ Assert.shouldNeverReachHere("Unexpected EOL token");
+ }
+
+ String tokenStr = tokenString();
+ parseErrorWithLine("Expected " + expected + " but found " + tokenStr);
+ }
+
+ private void parseErrorWithLine(String msg) throws ParseException {
+ throw new ParseException(msg + " (line " + tokenizer.lineno() + ")");
+ }
+
+ /**
+ * Gets a description of the current token
+ *
+ * @return a description of the current token
+ */
+ private String tokenString() {
+ switch (tokenizer.ttype) {
+ case StreamTokenizer.TT_NUMBER:
+ return "";
+ case StreamTokenizer.TT_EOL:
+ return "End-of-Line";
+ case StreamTokenizer.TT_EOF:
+ return "End-of-Stream";
+ case StreamTokenizer.TT_WORD:
+ return "'" + tokenizer.sval + "'";
+ default:{
+
+ }
+ }
+ return "'" + (char) tokenizer.ttype + "'";
+ }
+
+ /**
+ * Creates a Geometry
using the next token in the stream.
+ *
+ * tokenizer tokenizer over a stream of text in Well-known Text format. The
+ * next tokens must form a <Geometry Tagged Text>.
+ *
+ * @return a Geometry
specified by the next token in the stream
+ * @throws ParseException if the coordinates used to create a Polygon
+ * shell and holes do not form closed linestrings, or if an
+ * unexpected token was encountered
+ * @throws IOException if an I/O error occurs
+ */
+ private Geometry readGeometryTaggedText() throws IOException, ParseException {
+
+ String type;
+ try {
+ type = getNextWord();
+ if(type == null){
+ return null;
+ }
+ type= type.toUpperCase();
+
+ if (type.endsWith(Z)){
+ z = true;
+ }
+ if (type.endsWith(M)){
+ m = true;
+ }
+ } catch (IOException e) {
+ return null;
+ }
+
+ if (type.startsWith(POINT)) {
+ return readPointText();
+ } else if (type.startsWith(LINESTRING)) {
+ return readLineStringText();
+ } else if (type.startsWith(LINEARRING)) {
+ return readLinearRingText();
+ } else if (type.startsWith(POLYGON)) {
+ return readPolygonText();
+ } else if (type.startsWith(MULTI_POINT)) {
+ return readMultiPointText();
+ } else if (type.startsWith(MULTI_LINESTRING)) {
+ return readMultiLineStringText();
+ } else if (type.startsWith(MULTI_POLYGON)) {
+ return readMultiPolygonText();
+ }
+ parseErrorWithLine("Unknown geometry type: " + type);
+ return null;
+ }
+
+ /**
+ * Creates a Point
using the next token in the stream.
+ *
+ * tokenizer tokenizer over a stream of text in Well-known Text format. The
+ * next tokens must form a <Point Text>.
+ *
+ * @return a Point
specified by the next token in the stream
+ * @throws IOException if an I/O error occurs
+ * @throws ParseException if an unexpected token was encountered
+ */
+ private Point readPointText() throws IOException, ParseException {
+ String nextToken = getNextEmptyOrOpener();
+ if (EMPTY.equals(nextToken)) {
+ return geometryFactory
+ .createPoint(geometryFactory.getCoordinateSequenceFactory().create(new Coordinate[]{}));
+ }
+ Point point = geometryFactory.createPoint(getPreciseCoordinate());
+ getNextCloser();
+ return point;
+ }
+
+ /**
+ * Creates a LineString
using the next token in the stream.
+ *
+ * tokenizer tokenizer over a stream of text in Well-known Text format. The
+ * next tokens must form a <LineString Text>.
+ *
+ * @return a LineString
specified by the next token in the
+ * stream
+ * @throws IOException if an I/O error occurs
+ * @throws ParseException if an unexpected token was encountered
+ */
+ private LineString readLineStringText() throws IOException, ParseException {
+ return geometryFactory.createLineString(getCoordinates());
+ }
+
+ /**
+ * Creates a LinearRing
using the next token in the stream.
+ *
+ * tokenizer tokenizer over a stream of text in Well-known Text format. The
+ * next tokens must form a <LineString Text>.
+ *
+ * @return a LinearRing
specified by the next token in the
+ * stream
+ * @throws IOException if an I/O error occurs
+ * @throws ParseException if the coordinates used to create the LinearRing
+ * do not form a closed linestring, or if an unexpected token
+ * was encountered
+ */
+ private LinearRing readLinearRingText() throws IOException, ParseException {
+ return geometryFactory.createLinearRing(getCoordinates());
+ }
+
+ /*
+ * private MultiPoint OLDreadMultiPointText() throws IOException,
+ * ParseException { return
+ * geometryFactory.createMultiPoint(toPoints(getCoordinates())); }
+ */
+
+ private static final boolean ALLOW_OLD_JTS_MULTIPOINT_SYNTAX = true;
+
+ /**
+ * Creates a MultiPoint
using the next tokens in the stream.
+ *
+ * tokenizer tokenizer over a stream of text in Well-known Text format. The
+ * next tokens must form a <MultiPoint Text>.
+ *
+ * @return a MultiPoint
specified by the next token in the
+ * stream
+ * @throws IOException if an I/O error occurs
+ * @throws ParseException if an unexpected token was encountered
+ */
+ private MultiPoint readMultiPointText() throws IOException, ParseException {
+ String nextToken = getNextEmptyOrOpener();
+ if (EMPTY.equals(nextToken)) {
+ return geometryFactory.createMultiPoint(new Point[0]);
+ }
+
+ // check for old-style JTS syntax and parse it if present
+ // MD 2009-02-21 - this is only provided for backwards compatibility for
+ // a few versions
+ if (ALLOW_OLD_JTS_MULTIPOINT_SYNTAX) {
+ String nextWord = lookaheadWord();
+ if (!nextWord.equals(L_PAREN)) {
+ return geometryFactory.createMultiPoint(toPoints(getCoordinatesNoLeftParen()));
+ }
+ }
+
+ List points = new ArrayList<>();
+ Point point = readPointText();
+ points.add(point);
+ nextToken = getNextCloserOrComma();
+ while (COMMA.equals(nextToken)) {
+ point = readPointText();
+ points.add(point);
+ nextToken = getNextCloserOrComma();
+ }
+ Point[] array = new Point[points.size()];
+ return geometryFactory.createMultiPoint( points.toArray(array));
+ }
+
+ /**
+ * Creates an array of Point
s having the given
+ * Coordinate
s.
+ *
+ * @param coordinates the Coordinate
s with which to create the
+ * Point
s
+ * @return Point
s created using this WKTReader
s
+ * GeometryFactory
+ */
+ private Point[] toPoints(Coordinate[] coordinates) {
+ List points = new ArrayList<>();
+ for (Coordinate coordinate : coordinates) {
+ points.add(geometryFactory.createPoint(coordinate));
+ }
+ return points.toArray(new Point[]{});
+ }
+
+ /**
+ * Creates a Polygon
using the next token in the stream.
+ *
+ * tokenizer tokenizer over a stream of text in Well-known Text format. The
+ * next tokens must form a <Polygon Text>.
+ *
+ * @return a Polygon
specified by the next token in the stream
+ * @throws ParseException if the coordinates used to create the Polygon
+ * shell and holes do not form closed linestrings, or if an
+ * unexpected token was encountered.
+ * @throws IOException if an I/O error occurs
+ */
+ private Polygon readPolygonText() throws IOException, ParseException {
+ String nextToken = getNextEmptyOrOpener();
+ if (EMPTY.equals(nextToken)) {
+ return geometryFactory.createPolygon(geometryFactory.createLinearRing(new Coordinate[]{}),
+ new LinearRing[]{});
+ }
+ List holes = new ArrayList<>();
+ LinearRing shell = readLinearRingText();
+ nextToken = getNextCloserOrComma();
+ while (COMMA.equals(nextToken)) {
+ LinearRing hole = readLinearRingText();
+ holes.add(hole);
+ nextToken = getNextCloserOrComma();
+ }
+ LinearRing[] array = new LinearRing[holes.size()];
+ return geometryFactory.createPolygon(shell, holes.toArray(array));
+ }
+
+ /**
+ * Creates a MultiLineString
using the next token in the
+ * stream.
+ *
+ * tokenizer tokenizer over a stream of text in Well-known Text format. The
+ * next tokens must form a <MultiLineString Text>.
+ *
+ * @return a MultiLineString
specified by the next token in the
+ * stream
+ * @throws IOException if an I/O error occurs
+ * @throws ParseException if an unexpected token was encountered
+ */
+ private MultiLineString readMultiLineStringText() throws IOException, ParseException {
+ String nextToken = getNextEmptyOrOpener();
+ if (EMPTY.equals(nextToken)) {
+ return geometryFactory.createMultiLineString(new LineString[]{});
+ }
+ List lineStrings = new ArrayList<>();
+ LineString lineString = readLineStringText();
+ lineStrings.add(lineString);
+ nextToken = getNextCloserOrComma();
+ while (COMMA.equals(nextToken)) {
+ lineString = readLineStringText();
+ lineStrings.add(lineString);
+ nextToken = getNextCloserOrComma();
+ }
+ LineString[] array = new LineString[lineStrings.size()];
+ return geometryFactory.createMultiLineString(lineStrings.toArray(array));
+ }
+
+ /**
+ * Creates a MultiPolygon
using the next token in the stream.
+ *
+ * tokenizer tokenizer over a stream of text in Well-known Text format. The
+ * next tokens must form a <MultiPolygon Text>.
+ *
+ * @return a MultiPolygon
specified by the next token in the
+ * stream, or if if the coordinates used to create the
+ * Polygon
shells and holes do not form closed
+ * linestrings.
+ * @throws IOException if an I/O error occurs
+ * @throws ParseException if an unexpected token was encountered
+ */
+ private MultiPolygon readMultiPolygonText() throws IOException, ParseException {
+ String nextToken = getNextEmptyOrOpener();
+ if (EMPTY.equals(nextToken)) {
+ return new MultiPolygon(null, geometryFactory);
+ }
+ List polygons = new ArrayList<>();
+ Polygon polygon = readPolygonText();
+ polygons.add(polygon);
+ nextToken = getNextCloserOrComma();
+ while (COMMA.equals(nextToken)) {
+ polygon = readPolygonText();
+ polygons.add(polygon);
+ nextToken = getNextCloserOrComma();
+ }
+ Polygon[] array = new Polygon[polygons.size()];
+ return geometryFactory.createMultiPolygon(polygons.toArray(array));
+ }
+
+ /**
+ * Creates a GeometryCollection
using the next token in the
+ * stream.
+ *
+ * tokenizer tokenizer over a stream of text in Well-known Text format. The
+ * next tokens must form a <GeometryCollection Text>.
+ *
+ * @return a GeometryCollection
specified by the next token in
+ * the stream
+ * @throws ParseException if the coordinates used to create a Polygon
+ * shell and holes do not form closed linestrings, or if an
+ * unexpected token was encountered
+ * @throws IOException if an I/O error occurs
+ */
+ private GeometryCollection readGeometryCollectionText() throws IOException, ParseException {
+ String nextToken = getNextEmptyOrOpener();
+ if (EMPTY.equals(nextToken)) {
+ return geometryFactory.createGeometryCollection(new Geometry[]{});
+ }
+ List geometries = new ArrayList<>();
+ Geometry geometry = readGeometryTaggedText();
+ geometries.add(geometry);
+ nextToken = getNextCloserOrComma();
+ while (COMMA.equals(nextToken)) {
+ geometry = readGeometryTaggedText();
+ geometries.add(geometry);
+ nextToken = getNextCloserOrComma();
+ }
+ Geometry[] array = new Geometry[geometries.size()];
+ return geometryFactory.createGeometryCollection(geometries.toArray(array));
+ }
+
+
+}
diff --git a/src/main/java/com/appleyk/ShpApplication.java b/src/main/java/com/appleyk/ShpApplication.java
new file mode 100644
index 0000000..e8aa454
--- /dev/null
+++ b/src/main/java/com/appleyk/ShpApplication.java
@@ -0,0 +1,56 @@
+package com.appleyk;
+
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import org.springframework.context.annotation.Bean;
+
+/**
+ * 下面是一个典型的结构:
+ *
+ * com
+ * +- example
+ * +- myproject
+ * +- Application.java --
+ *
+ * 注意这个位置,习惯性的放在项目的一开始,也就是根包的第一层 | + - domain | +- Customer.java | +-
+ * CustomerRepository.java | + - service | +- CustomerService.java | + - web +-
+ * CustomerController.java
+ * 文件将声明 main 方法, 还有基本的 @Configuration
+ *
+ * SpringBoot启动类
+ * @author Appleyk
+ * @blob https://blog.csdn.net/appleyk
+ * @date Created on 上午 11:54 2018-10-12
+ */
+@SpringBootApplication// same as @Configuration @EnableAutoConfiguration @ComponentScan
+public class ShpApplication extends SpringBootServletInitializer {
+
+ /**
+ * SpringApplication类提供了一种从main()方法启动Spring应用的便捷方式。 在很多情况下, 你只需委托给
+ * SpringApplication.run这个静态方法:
+ * @param args 输入参数
+ */
+ public static void main(String[] args) {
+ SpringApplication.run(ShpApplication.class, args);
+ }
+
+ @Override
+ protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
+ return application.sources(ShpApplication.class);
+ }
+
+ /**
+ * Spring-Boot启动的时候,加载、创建、初始化数据
+ * @return 初始化信息
+ */
+ @Bean
+ CommandLineRunner demo() {
+ return args -> {
+ System.out.println("<<<<<<<<< Hello,Spring Boot ! >>>>>>>>");
+ };
+ }
+
+}
diff --git a/src/main/java/com/appleyk/controller/ShpController.java b/src/main/java/com/appleyk/controller/ShpController.java
new file mode 100644
index 0000000..ba31732
--- /dev/null
+++ b/src/main/java/com/appleyk/controller/ShpController.java
@@ -0,0 +1,77 @@
+package com.appleyk.controller;
+
+import com.appleyk.pojos.ShpInfo;
+import com.appleyk.result.ResponseResult;
+import com.appleyk.service.ShpService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * shp接口请求处理器
+ * @author Appleyk
+ * @blob https://blog.csdn.net/appleyk
+ * @date Created on 下午 2018-10-24 16:27:22
+ */
+@CrossOrigin
+@RequestMapping("/shper")
+@RestController
+public class ShpController {
+
+ @Autowired
+ private ShpService shpService;
+
+ @GetMapping("/hello")
+ public String sayHello(){
+ return "Hello Appleyk's Controller !";
+ }
+
+
+ /**
+ * 写一个shp文件
+ * @param shpInfo
+ * @return
+ * @throws Exception
+ */
+ @PostMapping("/write")
+ public ResponseResult write(@RequestBody ShpInfo shpInfo) throws Exception{
+ return shpService.writeShp(shpInfo);
+ }
+
+ /**
+ * 查询一个shp文件
+ * @param shpFilePath 文件绝对路径
+ * @param limit 指定显示多少条shp特征【features】
+ * @return
+ * @throws Exception
+ */
+ @GetMapping("/query")
+ public ResponseResult query(@RequestParam(value = "path",required = true) String shpFilePath,
+ @RequestParam(value = "limit",required = false,defaultValue = "10") Integer limit ) throws Exception{
+ return shpService.getShpDatas(shpFilePath,limit);
+ }
+
+ /**
+ * 将shp文件转换成png图片,图片或写入文件或通过response输出到界面【比如,客户端浏览器】
+ * @param path shp文件路径
+ * @param imagePath 如果imagePath不等于空,则shp文件转成图片文件存储进行存
+ * @param color 渲染颜色
+ */
+ @GetMapping("/show")
+ public void show(@RequestParam(value = "path",required = true) String path,
+ @RequestParam(value = "imagePath",required = false) String imagePath,
+ @RequestParam(value = "color",required = false) String color,
+ HttpServletResponse response) throws Exception{
+
+ // 设置响应消息的类型
+ response.setContentType("image/png");
+
+ // 设置页面不缓存
+ response.setHeader("Cache-Control", "no-cache");
+ response.setHeader("Pragma", "no-cache");
+ response.setDateHeader("Expires", 0);
+ shpService.showShp(path, imagePath,color ,response);
+ }
+
+}
diff --git a/src/main/java/com/appleyk/exception/GlobalExceptionHandler.java b/src/main/java/com/appleyk/exception/GlobalExceptionHandler.java
new file mode 100644
index 0000000..e573e8d
--- /dev/null
+++ b/src/main/java/com/appleyk/exception/GlobalExceptionHandler.java
@@ -0,0 +1,30 @@
+package com.appleyk.exception;
+
+
+import com.appleyk.result.ResponseResult;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+
+/**
+ * 全局异常捕获处理类
+ * @author Appleyk
+ * @blob https://blog.csdn.net/appleyk
+ * @date Created on 上午 2018年10月25日09:57:57
+ */
+@CrossOrigin
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+
+ @ExceptionHandler
+ public ResponseResult processException(Exception ex, HttpServletRequest request, HttpServletResponse response)
+ throws Exception {
+
+ return new ResponseResult(400, ex);
+ }
+
+}
diff --git a/src/main/java/com/appleyk/geotools/GeoUtils.java b/src/main/java/com/appleyk/geotools/GeoUtils.java
new file mode 100644
index 0000000..c682db8
--- /dev/null
+++ b/src/main/java/com/appleyk/geotools/GeoUtils.java
@@ -0,0 +1,125 @@
+package com.appleyk.geotools;
+
+import org.geotools.data.DataStore;
+import org.geotools.data.FeatureWriter;
+import org.geotools.data.Transaction;
+import org.geotools.data.mysql.MySQLDataStoreFactory;
+import org.geotools.data.shapefile.ShapefileDataStore;
+import org.geotools.data.simple.SimpleFeatureCollection;
+import org.geotools.data.simple.SimpleFeatureIterator;
+import org.geotools.data.simple.SimpleFeatureSource;
+import org.geotools.jdbc.JDBCDataStore;
+import org.opengis.feature.simple.SimpleFeature;
+import org.opengis.feature.simple.SimpleFeatureType;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.Charset;
+
+/**
+ * @description:
+ * @author: zzl
+ * @date: Created in 2021/5/16 13:30
+ * @version: 1
+ * @modified By:
+ */
+public class GeoUtils {
+
+ //测试代码
+ public static void main(String[] args) throws IOException {
+
+ JDBCDataStore connnection2mysql = GeoUtils.connnection2mysql("localhost", "gis?serverTimezone=GMT%2B8", 3318, "gly", "glyadmin");
+ SimpleFeatureSource featureSource = readSHP("D:\\NsgkSoft\\files\\uploadPath\\gis\\china_railways.shp");
+ JDBCDataStore ds = createTable(connnection2mysql, featureSource);
+ writeShp2Mysql(ds, featureSource);
+
+ }
+
+ public static SimpleFeatureSource readSHP(String shpfile) {
+ SimpleFeatureSource featureSource = null;
+ try {
+ File file = new File(shpfile);
+ ShapefileDataStore shpDataStore = null;
+
+ shpDataStore = new ShapefileDataStore(file.toURL());
+ //设置编码
+ Charset charset = Charset.forName("utf-8");
+ shpDataStore.setCharset(charset);
+ String tableName = shpDataStore.getTypeNames()[0];
+ featureSource = shpDataStore.getFeatureSource(tableName);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return featureSource;
+ }
+
+ public static JDBCDataStore connnection2mysql(String host, String dataBase, int port, String userName, String pwd) {
+ JDBCDataStore ds = null;
+ DataStore dataStore = null;
+ //连接数据库参数
+ java.util.Map params = new java.util.HashMap();
+ params.put(MySQLDataStoreFactory.DBTYPE.key, "mysql");
+ params.put(MySQLDataStoreFactory.HOST.key, host);
+ params.put(MySQLDataStoreFactory.PORT.key, port);
+ params.put(MySQLDataStoreFactory.DATABASE.key, dataBase);
+ params.put(MySQLDataStoreFactory.USER.key, userName);
+ params.put(MySQLDataStoreFactory.PASSWD.key, pwd);
+
+ try {
+ MySQLDataStoreFactory factory1 = new MySQLDataStoreFactory();
+
+ dataStore = factory1.createDataStore(params);
+ if (dataStore != null) {
+ ds = (JDBCDataStore) dataStore;
+ System.out.println(dataBase + "连接成功");
+ } else {
+ System.out.println(dataBase + "连接失败");
+ }
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return ds;
+ }
+
+ public static JDBCDataStore createTable(JDBCDataStore ds, SimpleFeatureSource featureSource) {
+ SimpleFeatureType schema = featureSource.getSchema();
+ try {
+ //创建数据表
+ ds.createSchema(schema);
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return ds;
+ }
+
+ public static void writeShp2Mysql(JDBCDataStore ds, SimpleFeatureSource featureSource) {
+ SimpleFeatureType schema = featureSource.getSchema();
+ System.out.println("表结构: " + schema);
+ //开始写入数据
+ try {
+ FeatureWriter writer = ds.getFeatureWriter(schema.getTypeName().toLowerCase(), Transaction.AUTO_COMMIT);
+ SimpleFeatureCollection featureCollection = featureSource.getFeatures();
+ SimpleFeatureIterator features = featureCollection.features();
+ while (features.hasNext()) {
+ writer.hasNext();
+ SimpleFeature next = writer.next();
+ SimpleFeature feature = features.next();
+ for (int i = 0; i < feature.getAttributeCount(); i++) {
+ next.setAttribute(i, feature.getAttribute(i));
+ }
+ writer.write();
+ }
+ writer.close();
+ ds.dispose();
+ System.out.println("导入成功");
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } // SimpleFeatureIterator itertor = featureSource.getFeatures() // .features(); //create the builder SimpleFeatureBuilder builder = new SimpleFeatureBuilder(schema);
+
+
+ }
+}
diff --git a/src/main/java/com/appleyk/geotools/GeometryCreator.java b/src/main/java/com/appleyk/geotools/GeometryCreator.java
new file mode 100644
index 0000000..e44f90b
--- /dev/null
+++ b/src/main/java/com/appleyk/geotools/GeometryCreator.java
@@ -0,0 +1,237 @@
+package com.appleyk.geotools;
+
+import org.geotools.geojson.geom.GeometryJSON;
+import org.locationtech.jts.geom.*;
+import org.locationtech.jts.io.ParseException;
+import org.locationtech.jts.io.WKTReader;
+
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.List;
+
+/**
+ * 自定义几何对象构造器
+ * @author Appleyk
+ * @blob https://blog.csdn.net/appleyk
+ * @date Created on 上午 11:54 2018-10-12
+ */
+public class GeometryCreator {
+
+
+ private static GeometryCreator geometryCreator = null;
+ private static GeometryFactory geometryFactory = new GeometryFactory();
+
+ /**
+ * 设置保留6位小数,否则GeometryJSON默认保留4位小数
+ */
+ private static GeometryJSON geometryJson = new GeometryJSON(6);
+
+
+ private GeometryCreator() {
+ }
+
+ /**
+ * 返回本类的唯一实例
+ * @return
+ */
+ public static GeometryCreator getInstance() {
+ if (geometryCreator == null) {
+ return new GeometryCreator();
+ }
+ return geometryCreator;
+ }
+
+
+ /**
+ * 1.1根据X,Y坐标构建一个几何对象: 点 【Point】
+ * @param x
+ * @param y
+ * @return
+ */
+ public Point createPoint(double x,double y){
+ Coordinate coord = new Coordinate(x, y);
+ return geometryFactory.createPoint(coord);
+ }
+
+ /**
+ * 1.2根据几何对象的WKT描述【String】创建几何对象: 点 【Point】
+ * @return
+ * @throws ParseException
+ */
+ public Point createPointByWKT(String PointWKT) throws ParseException {
+ WKTReader reader = new WKTReader(geometryFactory);
+ return (Point) reader.read(PointWKT);
+ }
+
+ /**
+ * 1.3根据几何对象的WKT描述【String】创建几何对象:多点 【MultiPoint】
+ * @return
+ * @throws ParseException
+ */
+ public MultiPoint createMulPointByWKT(String MPointWKT)throws ParseException{
+ WKTReader reader = new WKTReader( geometryFactory );
+ return (MultiPoint) reader.read(MPointWKT);
+ }
+
+ /**
+ * 2.1根据两点 创建几何对象:线 【LineString】
+ * @param ax 第一个点的x坐标
+ * @param ay 第一个点的y坐标
+ * @param bx 第二个点的x坐标
+ * @param by 第二个点的y坐标
+ * @return
+ */
+ public LineString createLine(double ax,double ay,double bx,double by){
+ Coordinate[] coords = new Coordinate[] {new Coordinate(ax, ay), new Coordinate(bx, by)};
+ return geometryFactory.createLineString(coords);
+ }
+
+ /**
+ * 2.2根据线的WKT描述创建几何对象:线 【LineString】
+ * @param LineStringWKT
+ * @return
+ * @throws ParseException
+ */
+ public LineString createLineByWKT(String LineStringWKT) throws ParseException{
+ WKTReader reader = new WKTReader( geometryFactory );
+ return (LineString) reader.read(LineStringWKT);
+ }
+
+ /**
+ * 2.3根据点组合的线数组,创建几何对象:多线 【MultiLineString】
+ * @param list
+ * @return
+ */
+ public MultiLineString createMLine(List list){
+
+ if(list == null){
+ return null;
+ }
+
+ LineString[] lineStrings = new LineString[list.size()];
+ int i = 0;
+ for (Coordinate[] coordinates : list) {
+ lineStrings[i] = geometryFactory.createLineString(coordinates);
+ }
+
+ return geometryFactory.createMultiLineString(lineStrings);
+ }
+
+
+ /**
+ * 2.4根据几何对象的WKT描述【String】创建几何对象 : 多线【MultiLineString】
+ * @param MLineStringWKT
+ * @return
+ * @throws ParseException
+ */
+ public MultiLineString createMLineByWKT(String MLineStringWKT)throws ParseException{
+ WKTReader reader = new WKTReader( geometryFactory );
+ return (MultiLineString) reader.read(MLineStringWKT);
+ }
+
+
+ /**
+ * 3.1 根据几何对象的WKT描述【String】创建几何对象:多边形 【Polygon】
+ * @param PolygonWKT
+ * @return
+ * @throws ParseException
+ */
+ public Polygon createPolygonByWKT(String PolygonWKT) throws ParseException{
+ WKTReader reader = new WKTReader( geometryFactory );
+ return (Polygon) reader.read(PolygonWKT);
+ }
+
+ /**
+ * 3.2 根据几何对象的WKT描述【String】创建几何对象: 多多边形 【MultiPolygon】
+ * @param MPolygonWKT
+ * @return
+ * @throws ParseException
+ */
+ public MultiPolygon createMulPolygonByWKT(String MPolygonWKT) throws ParseException{
+ WKTReader reader = new WKTReader( geometryFactory );
+ return (MultiPolygon) reader.read(MPolygonWKT);
+ }
+
+ /**
+ * 根据多边形数组 进行多多边形的创建
+ * @param polygons
+ * @return
+ * @throws ParseException
+ */
+ public MultiPolygon createMulPolygonByPolygon(Polygon[] polygons) throws ParseException{
+ return geometryFactory.createMultiPolygon(polygons);
+ }
+
+ /**
+ * 4.1 根据几何对象数组,创建几何对象集合:【GeometryCollection】
+ * @return
+ * @throws ParseException
+ */
+ public GeometryCollection createGeoCollect(Geometry[] geoArray) throws ParseException{
+ return geometryFactory.createGeometryCollection(geoArray);
+ }
+
+ /**
+ * 5.1 根据圆点以及半径创建几何对象:特殊的多边形--圆 【Polygon】
+ * @param x 圆点x坐标
+ * @param y 圆点y坐标
+ * @param radius 半径
+ * @return
+ */
+ public Polygon createCircle(double x, double y, final double radius){
+
+ //圆上面的点个数
+ final int sides = 32;
+ Coordinate[] coords = new Coordinate[sides+1];
+ for( int i = 0; i < sides; i++){
+ double angle = ((double) i / (double) sides) * Math.PI * 2.0;
+ double dx = Math.cos( angle ) * radius;
+ double dy = Math.sin( angle ) * radius;
+ coords[i] = new Coordinate( (double) x + dx, (double) y + dy );
+ }
+ coords[sides] = coords[0];
+ //线性环
+ LinearRing ring = geometryFactory.createLinearRing(coords);
+ return geometryFactory.createPolygon(ring, null);
+ }
+
+
+ /**
+ * 6.1 根据WKT创建环
+ * @param ringWKT
+ * @return
+ * @throws ParseException
+ */
+ public LinearRing createLinearRingByWKT(String ringWKT) throws ParseException{
+ WKTReader reader = new WKTReader( geometryFactory );
+ return (LinearRing) reader.read(ringWKT);
+ }
+
+ /**
+ * 几何对象转GeoJson对象
+ * @param geometry
+ * @return
+ * @throws Exception
+ */
+ public static String geometryToGeoJson(Geometry geometry) throws Exception {
+ if (geometry == null) {
+ return null;
+ }
+ StringWriter writer = new StringWriter();
+ geometryJson.write(geometry, writer);
+ String geojson = writer.toString();
+ writer.close();
+ return geojson;
+ }
+
+ /**
+ * GeoJson转几何对象
+ * @param geojson
+ * @return
+ * @throws Exception
+ */
+ public static Geometry geoJsonToGeometry(String geojson) throws Exception {
+ return geometryJson.read(new StringReader(geojson));
+ }
+
+}
diff --git a/src/main/java/com/appleyk/geotools/ShapeTools.java b/src/main/java/com/appleyk/geotools/ShapeTools.java
new file mode 100644
index 0000000..3c3e384
--- /dev/null
+++ b/src/main/java/com/appleyk/geotools/ShapeTools.java
@@ -0,0 +1,82 @@
+package com.appleyk.geotools;
+
+import org.geotools.data.FileDataStore;
+import org.geotools.data.FileDataStoreFinder;
+import org.geotools.data.simple.SimpleFeatureCollection;
+import org.geotools.data.simple.SimpleFeatureIterator;
+import org.geotools.data.simple.SimpleFeatureSource;
+import org.opengis.feature.GeometryAttribute;
+import org.opengis.feature.Property;
+import org.opengis.feature.simple.SimpleFeature;
+import org.opengis.feature.type.GeometryType;
+import org.opengis.feature.type.Name;
+import org.opengis.referencing.crs.CoordinateReferenceSystem;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * @description:
+ * @author: zzl
+ * @date: Created in 2021/5/19 18:53
+ * @version: 1
+ * @modified By:
+ */
+public class ShapeTools {
+
+ public static void main(String[] args) throws IOException {
+ String pathName = "D:\\NsgkSoft\\files\\uploadPath\\gis\\环翠区农用地利用情况.shp";
+ File file = new File(pathName);
+
+ // 读取到数据存储中
+ FileDataStore dataStore = FileDataStoreFinder.getDataStore(file);
+ // 获取特征资源
+ SimpleFeatureSource simpleFeatureSource = dataStore.getFeatureSource();
+ // 要素集合
+ SimpleFeatureCollection simpleFeatureCollection = simpleFeatureSource.getFeatures();
+
+ // 要素数量
+ int featureSize = simpleFeatureCollection.size();
+ // 获取要素迭代器
+ SimpleFeatureIterator featureIterator = simpleFeatureCollection.features();
+ if(featureIterator.hasNext()){
+ // 要素对象
+ SimpleFeature feature = featureIterator.next();
+ // 要素属性信息,名称,值,类型
+ List propertyList = (List) feature.getValue();
+ for(Property property : propertyList){
+ System.out.println("属性名称:" + property.getName());
+ System.out.println("属性值:" + property.getValue());
+ System.out.println("属性类型:" + property.getType());
+ System.out.println();
+ }
+
+ // 要素属性信息
+ List featureAttributes = feature.getAttributes();
+
+ // 要素geometry的类型和坐标,如点,线,面及其组成的坐标
+ Object geometryText = feature.getDefaultGeometry();
+
+ // geometry属性
+ GeometryAttribute geometryAttribute = feature.getDefaultGeometryProperty();
+ // 获取坐标参考系信息
+ CoordinateReferenceSystem coordinateReferenceSystem = geometryAttribute.getDescriptor().getCoordinateReferenceSystem();
+
+ // geometry类型
+ GeometryType geometryType = geometryAttribute.getType();
+ // geometry类型名称
+ Name name = geometryType.getName();
+
+ System.out.println("要素数量:"+ featureSize);
+ System.out.println("要素属性:" + featureAttributes);
+ System.out.println("要素geometry位置信息:" + geometryText);
+ System.out.println("要素geometry类型名称:" + name);
+ System.out.println("shp文件使用的坐标参考系:\n" + coordinateReferenceSystem);
+
+ }
+
+ }
+
+
+}
diff --git a/src/main/java/com/appleyk/geotools/ShpTools.java b/src/main/java/com/appleyk/geotools/ShpTools.java
new file mode 100644
index 0000000..127a4f1
--- /dev/null
+++ b/src/main/java/com/appleyk/geotools/ShpTools.java
@@ -0,0 +1,444 @@
+package com.appleyk.geotools;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.appleyk.IO.StringTokenReader;
+import com.appleyk.pojos.ShpDatas;
+import com.appleyk.pojos.ShpInfo;
+import com.appleyk.result.ResponseMessage;
+import com.appleyk.result.ResponseResult;
+import org.geotools.data.*;
+import org.geotools.data.shapefile.ShapefileDataStore;
+import org.geotools.data.shapefile.ShapefileDataStoreFactory;
+import org.geotools.data.simple.SimpleFeatureIterator;
+import org.geotools.data.simple.SimpleFeatureSource;
+import org.geotools.feature.FeatureCollection;
+import org.geotools.feature.FeatureIterator;
+import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
+import org.geotools.geojson.feature.FeatureJSON;
+import org.geotools.geometry.jts.ReferencedEnvelope;
+import org.geotools.map.FeatureLayer;
+import org.geotools.map.Layer;
+import org.geotools.map.MapContent;
+import org.geotools.referencing.crs.DefaultGeographicCRS;
+import org.geotools.renderer.lite.StreamingRenderer;
+import org.geotools.styling.SLD;
+import org.geotools.styling.Style;
+import org.geotools.swing.JMapFrame;
+import org.geotools.swing.data.JFileDataStoreChooser;
+import org.locationtech.jts.geom.Geometry;
+import org.opengis.feature.Property;
+import org.opengis.feature.simple.SimpleFeature;
+import org.opengis.feature.simple.SimpleFeatureType;
+
+import javax.imageio.ImageIO;
+import javax.servlet.http.HttpServletResponse;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.io.Serializable;
+import java.io.StringWriter;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.text.SimpleDateFormat;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * ShapeFile文件读写工具类
+ * @author Appleyk
+ * @blob https://blog.csdn.net/appleyk
+ * @date Created on 上午 11:54 2018-10-12
+ */
+public class ShpTools {
+
+ /**几何对象构造器【自定义的】*/
+ private static GeometryCreator gCreator = GeometryCreator.getInstance();
+
+ /**边界*/
+ private static ReferencedEnvelope bounds;
+
+ /**画布的宽度*/
+ private static final int IMAGE_WIDTH = 1280;
+
+ /**画布的高度*/
+ private static final int IMAGE_HEIGHT = 1200;
+
+ public static void main(String[] args) throws Exception{
+
+ File file = new File("D:\\NsgkSoft\\files\\uploadPath\\gis\\环翠区农用地利用情况.shp");
+ // 从shp文件里面读取属性信息
+ //readShpByPath(file.getAbsolutePath(),10);
+ //System.out.println("=================下面开始往shp文件里面写几何对象===================");
+
+ // 使用GeoTools读取ShapeFile文件
+ ShapefileDataStore store = new ShapefileDataStore(file.toURI().toURL());
+ //设置编码
+ Charset charset = Charset.forName("GBK");
+ store.setCharset(charset);
+ SimpleFeatureSource sfSource = store.getFeatureSource();
+ SimpleFeatureIterator sfIter = sfSource.getFeatures().features();
+ // 从ShapeFile文件中遍历每一个Feature,然后将Feature转为GeoJSON字符串
+ while (sfIter.hasNext()) {
+ SimpleFeature feature = (SimpleFeature) sfIter.next();
+ // Feature转GeoJSON
+
+ System.out.println("id ===== >>>> " + feature.getID().substring(feature.getID().indexOf(".")+1));
+
+ FeatureJSON fjson = new FeatureJSON();
+ StringWriter writer = new StringWriter();
+ fjson.writeFeature(feature, writer);
+ String sjson = writer.toString();
+ System.out.println("sjson===== >>>> " + sjson);
+
+ JSONObject obj = JSON.parseObject(sjson);
+ System.out.println("properties===== >>>> " + obj.getString("properties"));
+
+
+ }
+
+
+ /* // 先创建文件夹test
+ String filePath = "C:/test/test.shp";
+
+ String pointWkt="POINT (120.76164848270959 31.22001141278534)";
+ Point point = gCreator.createPointByWKT(pointWkt);
+
+ // Polygon【面】
+ String polygonWkt="POLYGON ((103.859188 34.695908, 103.85661 34.693788, 103.862027 34.69259, 103.863709 34.695078, 103.859188 34.695908))";
+ Polygon polygon = gCreator.createPolygonByWKT(polygonWkt);
+
+ // LineString【线】
+ String linestringWkt="LINESTRING(113.511315990174 41.7274734296674,113.51492087909 41.7284983348307,113.516079593384 41.727649586406,113.515907932007 41.7262243043929,113.514019656861 41.7247989907606,113.512131381714 41.7250872589898,113.51138036319 41.7256637915682,113.511315990174 41.7274734296674)";
+ LineString lineString = gCreator.createLineByWKT(linestringWkt);
+
+ // MultiPolygon【多面】
+ String multiPolyWkt = "MULTIPOLYGON(((101.870371 25.19228,101.873633 25.188183,101.880564 25.184416,101.886808 25.186028,101.892043 25.189969,101.896592 25.190163,101.903716 25.190785,101.905454 25.193464,101.899897 25.196202,101.894146 25.197911,101.891657 25.19826,101.886078 25.197658,101.884211145538 25.2007060137013,101.88172564506 25.1949712942389,101.87874 25.199619,101.874641 25.200998,101.868547 25.202415,101.863741 25.202415,101.85887 25.202842,101.854557 25.202182,101.852604 25.199736,101.852282 25.19628,101.854492 25.194183,101.855608 25.192668,101.863698 25.192105,101.870371 25.19228)))";
+ MultiPolygon multiPolygon = gCreator.createMulPolygonByWKT(multiPolyWkt);
+
+ // 几何对象的范围【矩形边界】
+ Envelope envelope = polygon.getEnvelopeInternal();
+ System.out.println(envelope);
+
+ // 往shp文件里面写几何对象
+ writeShpByGeom(filePath,point);*/
+
+
+ }
+
+
+ /**
+ * 通过shp文件路径,读取shp内容
+ * @param filePath 文件路径
+ */
+ public static ShpDatas readShpByPath(String filePath,Integer limit) throws Exception {
+
+ // 一个数据存储实现,允许从Shapefiles读取和写入
+ ShapefileDataStore shpDataStore = new ShapefileDataStore(new File(filePath).toURI().toURL());
+ // 设置编码【防止中文乱码】
+ shpDataStore.setCharset(StandardCharsets.UTF_8);
+
+ // getTypeNames:获取所有地理图层,这里我只取第一个【如果是数据表,取出的就是表名】
+ String typeName = shpDataStore.getTypeNames()[0];
+ System.out.println("shp【图层】名称:"+typeName);
+ FeatureCollection result = getFeatures(shpDataStore, typeName);
+
+ // 迭代特征集合
+ FeatureIterator iterator = result.features();
+
+ ShpDatas shpDatas = new ShpDatas();
+ shpDatas.setName(typeName);
+ shpDatas.setShpPath(filePath);
+ buildShpDatas(limit, iterator, shpDatas);
+ System.out.println("二、地理要素 数量:{},数据:{}" + result.size()+"," + JSON.toJSON(shpDatas));
+ iterator.close();
+ return shpDatas;
+ }
+
+
+ /**
+ * 根据数据源及图层名称拿到特征集合
+ * @param shpDataStore shp数据存储对象
+ * @param typeName 图层名称
+ * @return FeatureCollection
+ */
+ private static FeatureCollection getFeatures(ShapefileDataStore shpDataStore, String typeName) throws IOException {
+
+ // 通过此接口可以引用单个shapefile、数据库表等。与数据存储进行比较和约束
+ FeatureSource featureSource = shpDataStore.getFeatureSource(typeName);
+ // 一个用于处理FeatureCollection的实用工具类。提供一个获取FeatureCollection实例的机制
+ FeatureCollection result = featureSource.getFeatures();
+ System.out.println("地理要素【记录】:"+result.size()+"个");
+ System.out.println("==================================");
+ return result;
+ }
+
+ /**
+ * 构建shpDatas对象
+ * @param limit 要素查询限制数
+ * @param iterator 迭代器
+ * @param shpDatas shp封装的数据集
+ */
+ private static void buildShpDatas(Integer limit, FeatureIterator iterator, ShpDatas shpDatas) {
+ // 这里我们只迭代前limit个
+ int stop = 0;
+ while (iterator.hasNext()) {
+ if (stop > limit) {
+ break;
+ }
+ // 拿到一个特征
+ SimpleFeature feature = iterator.next();
+ // 取出特征里面的属性集合
+ Collection p = feature.getProperties();
+
+ // 遍历属性集合
+ Map prop = new HashMap<>();
+ for (Property pro : p) {
+ String key = pro.getName().toString();
+ String val;
+ if ("java.util.Date".equals(pro.getType().getBinding().getName())){
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
+ val = pro.getValue() ==null ? "" : dateFormat.format(pro.getValue());
+ }else{
+ val = pro.getValue()==null ?"":pro.getValue().toString();
+ }
+ prop.put(key, val);
+ System.out.println("key【字段】:"+key+"\t||value【值】:"+val);
+ }
+ System.out.println("\n============================ 序号:"+stop+"\n");
+ shpDatas.addProp(prop);
+ stop++;
+ } // end 最外层 while
+ }
+
+ /**
+ * 将一个几何对象写进shapefile
+ * @param filePath 文件路径
+ * @param geometry 几何对象
+ */
+ public static void writeShpByGeom(String filePath, Geometry geometry) throws Exception{
+
+ ShapefileDataStore ds = getshpDS(filePath, geometry);
+
+ FeatureWriter writer = ds.getFeatureWriter(ds.getTypeNames()[0],
+ Transaction.AUTO_COMMIT);
+
+ // Interface SimpleFeature:一个由固定列表值以已知顺序组成的SimpleFeatureType实例。
+ SimpleFeature feature = writer.next();
+ feature.setAttribute("name", "XXXX名称");
+ feature.setAttribute("path", "c:/test");
+ feature.setAttribute("the_geom", geometry);
+ feature.setAttribute("id", 1010L);
+ feature.setAttribute("des", "XXXX描述");
+
+ System.out.println("========= 写入【"+geometry.getGeometryType()+"】成功 !=========");
+
+ // 写入
+ writer.write();
+ // 关闭
+ writer.close();
+ // 释放资源
+ ds.dispose();
+ }
+
+
+ /**
+ * 将一个几何对象写进shapefile
+ * @param shpInfo shp信息
+ */
+ public static ResponseResult writeShpByGeom(ShpInfo shpInfo) throws Exception{
+
+ // 特殊字符串解析器
+ StringTokenReader reader = new StringTokenReader();
+ // 根据几何对象的wkt字符串,反解【解析】成Geometry对象
+ Geometry geometry = reader.read(shpInfo.getGeom());
+ // 拿到shp对象所在的目录【文件夹】
+ String path = shpInfo.getPath();
+ File file = new File(path);
+ if(!file.exists()){
+ file.mkdir();
+ }
+
+ if(!file.isDirectory()){
+ return new ResponseResult(ResponseMessage.BAD_REQUEST,"path不是有效的文件夹" );
+ }
+
+ String filePath = shpInfo.getPath()+"/"+shpInfo.getName()+".shp";
+ ShapefileDataStore ds = getshpDS(filePath, geometry);
+ String typeName = ds.getTypeNames()[0];
+ FeatureWriter writer ;
+ if(shpInfo.isAppendWrite()){
+ // 追加写几何对象
+ writer = ds.getFeatureWriterAppend(typeName, Transaction.AUTO_COMMIT);
+ }else{
+ // 覆盖写几何对象
+ writer = ds.getFeatureWriter(typeName, Transaction.AUTO_COMMIT);
+ }
+
+ // Interface SimpleFeature:一个由固定列表值以已知顺序组成的SimpleFeatureType实例。
+ SimpleFeature feature = writer.next();
+ feature.setAttribute("name", shpInfo.getName());
+ feature.setAttribute("path", shpInfo.getPath());
+ feature.setAttribute("the_geom", geometry);
+ feature.setAttribute("id", shpInfo.getId());
+ feature.setAttribute("des", shpInfo.getDes());
+
+ System.out.println("========= 写入【"+geometry.getGeometryType()+"】成功 !=========");
+
+ // 写入
+ writer.write();
+ // 关闭
+ writer.close();
+ // 释放资源
+ ds.dispose();
+ // 返回创建成功后的shp文件路径
+ return new ResponseResult(ResponseMessage.OK,filePath);
+
+ }
+
+ /**
+ * 拿到配置好的DataStore
+ * @param filePath 文件路径
+ * @param geometry 几何对象
+ * @return ShapefileDataStore
+ */
+ private static ShapefileDataStore getshpDS(String filePath, Geometry geometry) throws IOException {
+ // 1.创建shape文件对象
+ File file = new File(filePath);
+
+ Map params = new HashMap<>();
+
+ // 2、用于捕获参数需求的数据类 URLP:url to the .shp file.
+ params.put(ShapefileDataStoreFactory.URLP.key, file.toURI().toURL());
+
+ // 3、创建一个新的数据存储【如果存在,则不创建】
+ ShapefileDataStore ds = (ShapefileDataStore) new ShapefileDataStoreFactory().createNewDataStore(params);
+
+ // 4、定义图形信息和属性信息 -- SimpleFeatureTypeBuilder 构造简单特性类型的构造器
+ SimpleFeatureTypeBuilder tBuilder = new SimpleFeatureTypeBuilder();
+
+ // 5、设置 -- WGS84:一个二维地理坐标参考系统,使用WGS84数据
+ tBuilder.setCRS(DefaultGeographicCRS.WGS84);
+ tBuilder.setName("shapefile");
+
+ // 添加名称
+ tBuilder.add("name", String.class);
+ // 添加shp所在目录名称
+ tBuilder.add("path", String.class);
+ // 添加 一个几何对象
+ tBuilder.add("the_geom", geometry.getClass());
+ // 添加一个id
+ tBuilder.add("id", Long.class);
+ // 添加描述
+ tBuilder.add("des", String.class);
+
+ // 设置此数据存储的特征类型
+ ds.createSchema(tBuilder.buildFeatureType());
+ // 设置编码
+ ds.setCharset(StandardCharsets.UTF_8);
+ return ds;
+ }
+
+ /**
+ * 打开shp文件,获取地图内容
+ * @param filePath 文件路径
+ * @param isOpenByChoose 是否自定义打开shp文件
+ * @throws Exception
+ */
+ public static MapContent getMapContentByPath(String filePath,boolean isOpenByChoose,String color) throws Exception{
+
+ File file;
+ if(isOpenByChoose){
+ // 1.1、 数据源选择 shp扩展类型的
+ file = JFileDataStoreChooser.showOpenFile("shp", null);
+ }else{
+ // 1.2、根据路径拿到文件对象
+ file = new File(filePath);
+ }
+
+ if(file==null){
+ return null;
+ }
+ // 2、得到打开的文件的数据源
+ FileDataStore store = FileDataStoreFinder.getDataStore(file);
+
+ // 3、设置数据源的编码,防止中文乱码
+ ((ShapefileDataStore)store).setCharset(Charset.forName("UTF-8"));
+
+ /**
+ * 使用FeatureSource管理要素数据
+ * 使用Style(SLD)管理样式
+ * 使用Layer管理显示
+ * 使用MapContent管理所有地图相关信息
+ */
+
+ // 4、以java对象的方式访问地理信息 -- 简单地理要素
+ SimpleFeatureSource featureSource = store.getFeatureSource();
+
+ bounds = featureSource.getBounds();
+
+ // 5、创建映射内容,并将我们的shapfile添加进去
+ MapContent mapContent = new MapContent();
+
+ // 6、设置容器的标题
+ mapContent.setTitle("Appleyk's GeoTools");
+ Color color1;
+ if(color == null || "".equals(color.toLowerCase())){
+ color1 = Color.BLACK;
+ }else if("red".equals(color.toLowerCase())){
+ color1 = Color.RED;
+ }else if("green".equals(color.toLowerCase())){
+ color1 = Color.GREEN;
+ }else if("blue".equals(color.toLowerCase())){
+ color1 = Color.BLUE;
+ }else{
+ color1 = Color.getColor(color);
+ }
+
+ // 7、创建简单样式 【颜色填充】
+ Style style = SLD.createSimpleStyle(featureSource.getSchema(),color1);
+
+ // 8、显示【shapfile地理信息+样式】
+ Layer layer = new FeatureLayer(featureSource, style);
+
+ // 9、将显示添加进map容器
+ mapContent.addLayer(layer);
+
+ return mapContent;
+ }
+
+ public static void showMap(MapContent mapContent){
+ JMapFrame.showMap(mapContent);
+ }
+
+ /**
+ * shp文件转Image【格式定png】
+ * @param shpFilePath shp目标文件
+ * @param destImagePath 转成图片的文件 == 如果没有,转成的图片写进response输出流里
+ * @param response 响应流
+ * @throws Exception
+ */
+ public static void shp2Image(String shpFilePath,String destImagePath,String color, HttpServletResponse response) throws Exception{
+
+ // 流渲染器
+ StreamingRenderer renderer = new StreamingRenderer();
+ MapContent mapContent = getMapContentByPath(shpFilePath,false,color );
+ renderer.setMapContent(mapContent);
+ Rectangle imageBounds = new Rectangle(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);
+ BufferedImage dumpImage = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
+ Graphics2D g2d = dumpImage.createGraphics();
+ g2d.fillRect(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);
+ g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+ renderer.paint(g2d, imageBounds, bounds);
+ g2d.dispose();
+ if(destImagePath == null || "".equals(destImagePath)){
+ ImageIO.write(dumpImage, "png", response.getOutputStream());
+ }else{
+ ImageIO.write(dumpImage, "png", new File(destImagePath));
+ }
+ }
+
+
+}
diff --git a/src/main/java/com/appleyk/pojos/ShpDatas.java b/src/main/java/com/appleyk/pojos/ShpDatas.java
new file mode 100644
index 0000000..57ab150
--- /dev/null
+++ b/src/main/java/com/appleyk/pojos/ShpDatas.java
@@ -0,0 +1,55 @@
+package com.appleyk.pojos;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * shp数据模型对象 -- 针对读
+ * @author Appleyk
+ * @blob https://blog.csdn.net/appleyk
+ * @date Created on 下午 2018年10月24日16:31:30
+ */
+public class ShpDatas {
+
+ private String name;
+
+ /** 属性【字段】集合*/
+ private List> props;
+
+ /** shp文件路径地址*/
+ private String shpPath;
+
+ public ShpDatas(){
+ props = new ArrayList<>();
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public List> getProps() {
+ return props;
+ }
+
+ public void setProps(List> props) {
+ this.props = props;
+ }
+
+ public void addProp(Map prop){
+ this.props.add(prop);
+ }
+
+ public String getShpPath() {
+ return shpPath;
+ }
+
+ public void setShpPath(String shpPath) {
+ this.shpPath = shpPath;
+ }
+
+}
diff --git a/src/main/java/com/appleyk/pojos/ShpInfo.java b/src/main/java/com/appleyk/pojos/ShpInfo.java
new file mode 100644
index 0000000..67bd376
--- /dev/null
+++ b/src/main/java/com/appleyk/pojos/ShpInfo.java
@@ -0,0 +1,92 @@
+package com.appleyk.pojos;
+
+/**
+ * shp业务模型对象 -- 针对写
+ * @author Appleyk
+ * @blob https://blog.csdn.net/appleyk
+ * @date Created on 上午 2018年10月25日09:17:44
+ */
+public class ShpInfo {
+
+
+ /**
+ * 图层名称
+ */
+ private String name;
+
+ /**
+ * 往哪个路径下写shp
+ */
+ private String path;
+
+ /**
+ * 几何对象WKT
+ */
+ private String geom;
+
+ /**
+ * 标识
+ */
+ private String id;
+
+ /**
+ * 描述
+ */
+ private String des;
+
+ /**
+ * 是否追加写
+ */
+ private boolean appendWrite = false;
+
+ public ShpInfo(){
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getPath() {
+ return path;
+ }
+
+ public void setPath(String path) {
+ this.path = path;
+ }
+
+ public String getGeom() {
+ return geom;
+ }
+
+ public void setGeom(String geom) {
+ this.geom = geom;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getDes() {
+ return des;
+ }
+
+ public void setDes(String des) {
+ this.des = des;
+ }
+
+ public boolean isAppendWrite() {
+ return appendWrite;
+ }
+
+ public void setAppendWrite(boolean appendWrite) {
+ this.appendWrite = appendWrite;
+ }
+}
diff --git a/src/main/java/com/appleyk/result/ResponseMessage.java b/src/main/java/com/appleyk/result/ResponseMessage.java
new file mode 100644
index 0000000..1160ef9
--- /dev/null
+++ b/src/main/java/com/appleyk/result/ResponseMessage.java
@@ -0,0 +1,31 @@
+package com.appleyk.result;
+
+public enum ResponseMessage {
+
+ /**
+ * 成功
+ */
+ OK(200,"成功"),
+
+ /**
+ * 失败
+ */
+ BAD_REQUEST(400,"错误的请求");
+
+
+ private final int status;
+ private final String message;
+
+ ResponseMessage(int status, String message){
+ this.status = status;
+ this.message = message;
+ }
+
+ public int getStatus() {
+ return status;
+ }
+ public String getMessage() {
+ return message;
+ }
+
+}
diff --git a/src/main/java/com/appleyk/result/ResponseResult.java b/src/main/java/com/appleyk/result/ResponseResult.java
new file mode 100644
index 0000000..b114cb6
--- /dev/null
+++ b/src/main/java/com/appleyk/result/ResponseResult.java
@@ -0,0 +1,153 @@
+package com.appleyk.result;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+public class ResponseResult implements Serializable {
+
+ private static final long serialVersionUID = 2719931935414658118L;
+
+ private final Integer status;
+
+ private final String message;
+
+ @JsonInclude(value = Include.NON_NULL)
+ private final Object data;
+
+ @JsonInclude(value = Include.NON_EMPTY)
+ private final String[] exceptions;
+
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private final Date timestamp;
+
+ public ResponseResult(Integer status, String message) {
+
+ super();
+ this.status = status;
+ this.message = message;
+ this.data = null;
+ this.timestamp = new Date();
+ this.exceptions = null;
+ }
+
+ public ResponseResult() {
+
+ super();
+ this.status = null;
+ this.message = null;
+ this.data = null;
+ this.timestamp = new Date();
+ this.exceptions = null;
+
+ }
+
+ public ResponseResult(ResponseMessage rm){
+
+ super();
+ this.status = rm.getStatus();
+ this.message = rm.getMessage();
+ this.data = null;
+ this.timestamp = new Date();
+ this.exceptions = null;
+ }
+
+ public ResponseResult(ResponseMessage rm, Object data){
+ super();
+ this.status = rm.getStatus();
+ this.message = rm.getMessage();
+ this.data = data;
+ this.timestamp = new Date();
+ this.exceptions = null;
+ }
+
+ public ResponseResult(ResponseMessage rm, Long data){
+ super();
+ this.status = rm.getStatus();
+ this.message = rm.getMessage();
+ HashMap result = new HashMap<>();
+ result.put("id", data);
+ this.data = result;
+ this.timestamp = new Date();
+ this.exceptions = null;
+ }
+
+
+ public ResponseResult(Integer status, String message, Object data) {
+ super();
+ this.status = status;
+ this.message = message;
+ this.data = data;
+ this.timestamp = new Date();
+ this.exceptions = null;
+ }
+
+ public ResponseResult(Integer status, String message, String key, Object value) {
+ super();
+ this.status = status;
+ this.message = message;
+ Map map = new HashMap();
+
+ if (key == null || ("").equals(key)) {
+ map.put("key", value);
+ } else {
+ map.put(key, value);
+ }
+ this.data = map;
+ this.timestamp = new Date();
+ this.exceptions = null;
+
+ }
+
+ public ResponseResult(Integer status, Throwable ex) {
+ super();
+ this.status = status;
+ this.message = ex.getMessage();
+ this.data = null;
+ StackTraceElement[] stackTeanceElement = ex.getStackTrace();
+ this.exceptions = new String[stackTeanceElement.length];
+ for (int i = 0; i < stackTeanceElement.length; i++) {
+ this.exceptions[i] = stackTeanceElement[i].toString();
+ }
+ this.timestamp = new Date();
+ }
+
+ public ResponseResult(Integer status, String message, Throwable ex) {
+
+ super();
+ this.status = status;
+ this.message = message;
+ this.data = null;
+ StackTraceElement[] stackTeanceElement = ex.getStackTrace();
+ this.exceptions = new String[stackTeanceElement.length];
+ for (int i = 0; i < stackTeanceElement.length; i++) {
+ this.exceptions[i] = stackTeanceElement[i].toString();
+ }
+ this.timestamp = new Date();
+
+ }
+ public Integer getStatus() {
+ return status;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public Object getData() {
+ return data;
+ }
+
+ public String[] getExceptions() {
+ return exceptions;
+ }
+
+ public Date getTimestamp() {
+ return timestamp;
+ }
+}
diff --git a/src/main/java/com/appleyk/service/ShpService.java b/src/main/java/com/appleyk/service/ShpService.java
new file mode 100644
index 0000000..7acb5fa
--- /dev/null
+++ b/src/main/java/com/appleyk/service/ShpService.java
@@ -0,0 +1,33 @@
+package com.appleyk.service;
+
+import com.appleyk.geotools.ShpTools;
+import com.appleyk.pojos.ShpDatas;
+import com.appleyk.pojos.ShpInfo;
+import com.appleyk.result.ResponseMessage;
+import com.appleyk.result.ResponseResult;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Shp业务逻辑类
+ * @author Appleyk
+ * @blob https://blog.csdn.net/appleyk
+ * @date Created on 下午 2018年10月24日17:17:46
+ */
+@Service
+public class ShpService {
+
+ public ResponseResult getShpDatas(String shpPath,Integer limit) throws Exception{
+ ShpDatas shpDatas = ShpTools.readShpByPath(shpPath, limit);
+ return new ResponseResult(ResponseMessage.OK,shpDatas);
+ }
+
+ public void showShp(String shpPath,String imagePath,String color, HttpServletResponse response) throws Exception{
+ ShpTools.shp2Image(shpPath, imagePath ,color,response);
+ }
+
+ public ResponseResult writeShp(ShpInfo shpInfo) throws Exception{
+ return ShpTools.writeShpByGeom(shpInfo);
+ }
+}
diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties
new file mode 100644
index 0000000..bcc3bee
--- /dev/null
+++ b/src/main/resources/application-dev.properties
@@ -0,0 +1,3 @@
+server.port=8081
+server.servlet.session.timeout=10
+server.tomcat.uri-encoding=utf8
diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties
new file mode 100644
index 0000000..209423f
--- /dev/null
+++ b/src/main/resources/application-prod.properties
@@ -0,0 +1,3 @@
+server.port=8082
+server.servlet.session.timeout=10
+server.tomcat.uri-encoding=utf8
diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties
new file mode 100644
index 0000000..ed4a1b1
--- /dev/null
+++ b/src/main/resources/application-test.properties
@@ -0,0 +1,3 @@
+server.port=8083
+server.servlet.session.timeout=10
+server.tomcat.uri-encoding=utf8
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
new file mode 100644
index 0000000..24be2c7
--- /dev/null
+++ b/src/main/resources/application.properties
@@ -0,0 +1,23 @@
+#SpringApplication\u5C06\u4ECE\u4EE5\u4E0B\u4F4D\u7F6E\u52A0\u8F7Dapplication.properties\u6587\u4EF6\uFF0C \u5E76\u628A\u5B83\u4EEC\u6DFB\u52A0\u5230Spring Environment\u4E2D\uFF1A
+#1. \u5F53\u524D\u76EE\u5F55\u4E0B\u7684\u4E00\u4E2A/config\u5B50\u76EE\u5F55
+#2. \u5F53\u524D\u76EE\u5F55
+#3. \u4E00\u4E2Aclasspath\u4E0B\u7684/config\u5305
+#4. classpath\u6839\u8DEF\u5F84\uFF08root\uFF09
+#\u8FD9\u4E2A\u5217\u8868\u662F\u6309\u4F18\u5148\u7EA7\u6392\u5E8F\u7684\uFF08\u5217\u8868\u4E2D\u4F4D\u7F6E\u9AD8\u7684\u5C06\u8986\u76D6\u4F4D\u7F6E\u4F4E\u7684\uFF09 \u3002
+#\u6CE8\uFF1A\u4F60\u53EF\u4EE5\u4F7F\u7528YAML\uFF08'.yml'\uFF09 \u6587\u4EF6\u66FF\u4EE3'.properties'
+
+#Spring-Boot\u591A\u73AF\u5883\u914D\u7F6E -- dev\uFF1A \u672C\u5730\u5F00\u53D1\u73AF\u5883\u3010\u7AEF\u53E3\uFF1A8081\u3011
+#Spring-Boot\u591A\u73AF\u5883\u914D\u7F6E -- prod\uFF1A\u7EBF\u4E0A\u751F\u4EA7\u73AF\u5883\u3010\u7AEF\u53E3\uFF1A8082\u3011
+#Spring-Boot\u591A\u73AF\u5883\u914D\u7F6E -- test\uFF1A\u7EBF\u4E0A\u6D4B\u8BD5\u73AF\u5883\u3010\u7AEF\u53E3\uFF1A8083\u3011
+
+#\u5F00\u542F\u591A\u6587\u4EF6\u4E0A\u4F20
+spring.servlet.multipart.enabled=true
+
+spring.profiles.active = dev
+
+#\u5728application.properties\u6587\u4EF6\u4E2D\u5F15\u5165\u65E5\u5FD7\u914D\u7F6E\u6587\u4EF6
+#===================================== log =============================
+logging.config=classpath:logback-boot.xml
+
+
+
diff --git a/src/main/resources/logback-boot.xml b/src/main/resources/logback-boot.xml
new file mode 100644
index 0000000..6f93aa0
--- /dev/null
+++ b/src/main/resources/logback-boot.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+ %d %p (%file:%line\)- %m%n
+
+ UTF-8
+
+
+
+
+
+
+
+ opt/spring-boot-web/logs/sys.log
+
+
+
+
+
+ log/sys.%d.%i.log
+
+ 30
+
+
+ 10MB
+
+
+
+
+
+ %d %p (%file:%line\)- %m%n
+
+
+ UTF-8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/static/ReadMe b/src/main/resources/static/ReadMe
new file mode 100644
index 0000000..17f8377
--- /dev/null
+++ b/src/main/resources/static/ReadMe
@@ -0,0 +1,12 @@
+本项目的测试shp均在shpTest文件夹下
+
+============== 一个shp只支持一种几何类型
+
+Point类型 : 某地方的大棚数据
+LineString类型: 中国铁路网【部分】
+Polygon类型 : 中国建筑物【部分 -- 北京故宫】
+
+==============
+
+E:\Spring-boot\Spring-Boot-Shaper\src\main\resources\static\shpTest[Point]\dp_tl.shp
+E:\Spring-boot\Spring-Boot-Shaper\src\main\resources\static\shpTest[Polygon]\china_building_part.shp
\ No newline at end of file
diff --git a/src/main/resources/static/shpTest[LineString]/china_railways.cpg b/src/main/resources/static/shpTest[LineString]/china_railways.cpg
new file mode 100644
index 0000000..3ad133c
--- /dev/null
+++ b/src/main/resources/static/shpTest[LineString]/china_railways.cpg
@@ -0,0 +1 @@
+UTF-8
\ No newline at end of file
diff --git a/src/main/resources/static/shpTest[LineString]/china_railways.dbf b/src/main/resources/static/shpTest[LineString]/china_railways.dbf
new file mode 100644
index 0000000000000000000000000000000000000000..d7baed4f4519350964ffa223782d3f7800b99508
GIT binary patch
literal 176607
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 +th$FuR9-F2|@mdDC$e{}Ob77wp69xz{O
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