From 3030908f05e131b466bac4628ad925fa49856f0a Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 22 Nov 2023 10:30:41 +0100 Subject: [PATCH 01/25] mike21 driver --- mdal/frmts/mdal_mike21.cpp | 434 +++++++++++++++++++++++++++++++++++++ mdal/frmts/mdal_mike21.hpp | 99 +++++++++ 2 files changed, 533 insertions(+) create mode 100644 mdal/frmts/mdal_mike21.cpp create mode 100644 mdal/frmts/mdal_mike21.hpp diff --git a/mdal/frmts/mdal_mike21.cpp b/mdal/frmts/mdal_mike21.cpp new file mode 100644 index 00000000..2a60d2f2 --- /dev/null +++ b/mdal/frmts/mdal_mike21.cpp @@ -0,0 +1,434 @@ +/* + MDAL - Mesh Data Abstraction Library (MIT License) + Copyright (C) 2023 Lutra Consulting Ltd. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mdal_mike21.hpp" +#include "mdal.h" +#include "mdal_utils.hpp" +#include "mdal_logger.hpp" + +#define DRIVER_NAME "Mike21" + +// function to split using regex, by default split on whitespace characters +std::vector _regex_split( const std::string &input, const std::regex &split_regex = std::regex{"\\s+"} ) +{ + std::sregex_token_iterator iter( input.begin(), input.end(), split_regex, -1 ); + std::sregex_token_iterator end; + return {iter, end}; +} + +static bool _parse_vertex_id_gaps( std::map &vertexIDtoIndex, size_t vertexIndex, size_t vertexID ) +{ + if ( vertexIndex == vertexID ) + return false; + + std::map::iterator search = vertexIDtoIndex.find( vertexID ); + if ( search != vertexIDtoIndex.end() ) + { + MDAL::Log::warning( Warn_ElementNotUnique, DRIVER_NAME, "could not find vertex" ); + return true; + } + + vertexIDtoIndex[vertexID] = vertexIndex; + return false; +} + +static void _persist_native_index( std::vector &arr, size_t nativeID, size_t ourId, size_t maxOurId ) +{ + if ( !arr.empty() || ( nativeID != ourId + 1 ) ) + { + // we have gaps in face indexing + if ( arr.empty() ) + { + arr.resize( maxOurId ); + for ( size_t i = 0; i < ourId; ++i ) + arr[i] = static_cast( i + 1 ); + } + arr[ourId] = static_cast( nativeID ); + } +} + +MDAL::MeshMike21::MeshMike21( size_t faceVerticesMaximumCount, + const std::string &uri, + const std::map vertexIDtoIndex ) + : MemoryMesh( DRIVER_NAME, + faceVerticesMaximumCount, + uri ) + , mVertexIDtoIndex( vertexIDtoIndex ) +{ +} + +MDAL::MeshMike21::~MeshMike21() = default; + +size_t MDAL::MeshMike21::vertexIndex( size_t vertexID ) const +{ + auto ni2i = mVertexIDtoIndex.find( vertexID ); + if ( ni2i != mVertexIDtoIndex.end() ) + { + return ni2i->second; // convert from ID to index + } + return vertexID; +} + +size_t MDAL::MeshMike21::maximumVertexId() const +{ + size_t maxIndex = verticesCount() - 1; + if ( mVertexIDtoIndex.empty() ) + return maxIndex; + else + { + // std::map is sorted! + size_t maxID = mVertexIDtoIndex.rbegin()->first; + return std::max( maxIndex, maxID ); + } +} + +MDAL::DriverMike21::DriverMike21(): + Driver( DRIVER_NAME, + "Mike21 Mesh File", + "*.mesh", + Capability::ReadMesh | Capability::SaveMesh + ) +{ +} + +MDAL::DriverMike21 *MDAL::DriverMike21::create() +{ + return new DriverMike21(); +} + +MDAL::DriverMike21::~DriverMike21() = default; + +bool MDAL::DriverMike21::canReadHeader( const std::string &line ) +{ + bool header2012 = std::regex_match( line, mRegexHeader2012 ); + bool header2011 = std::regex_match( line, mRegexHeader2011 ); + return header2011 || header2012; +} + +bool MDAL::DriverMike21::canReadMesh( const std::string &uri ) +{ + std::ifstream in = MDAL::openInputFile( uri ); + std::string line; + if ( !MDAL::getHeaderLine( in, line ) || !canReadHeader( line ) ) + { + return false; + } + return true; +} + +size_t MDAL::DriverMike21::getVertexCount( const std::string &line ) +{ + auto matchResults = std::smatch{}; + if ( std::regex_search( line, matchResults, mRegexHeader2012 ) ) + { + return std::stoi( matchResults[3].str() ); + } + + if ( std::regex_search( line, matchResults, mRegexHeader2011 ) ) + { + return std::stoi( matchResults[1].str() ); + } + + return 0; +} + +std::string MDAL::DriverMike21::getCrs( const std::string &line ) +{ + auto matchResults = std::smatch{}; + if ( std::regex_search( line, matchResults, mRegexHeader2012 ) ) + { + return matchResults[4].str(); + } + + if ( std::regex_search( line, matchResults, mRegexHeader2011 ) ) + { + return matchResults[2].str(); + } + + return ""; +} + +std::unique_ptr MDAL::DriverMike21::load( const std::string &meshFile, const std::string & ) +{ + mMeshFile = meshFile; + + MDAL::Log::resetLastStatus(); + + std::ifstream in = MDAL::openInputFile( meshFile ); + + std::string line; + if ( !std::getline( in, line ) || !canReadHeader( line ) ) + { + MDAL::Log::error( MDAL_Status::Err_UnknownFormat, name(), meshFile + " could not be opened" ); + return nullptr; + } + + std::string crs = getCrs( line ); + + size_t vertexCount = getVertexCount( line ); + size_t faceCount = 0; + size_t maxVerticesPerFace = 2; + + size_t lineNumber = 1; + + while ( std::getline( in, line ) ) + { + if ( lineNumber == vertexCount + 1 ) + { + auto matchResults = std::smatch{}; + if ( std::regex_search( line, matchResults, mRegexElementHeader ) ) + { + faceCount = MDAL::toSizeT( matchResults[1].str() ); + maxVerticesPerFace = MDAL::toSizeT( matchResults[2].str() ); + size_t meshType = MDAL::toSizeT( matchResults[3].str() ); + + if ( !( meshType == 21 || meshType == 25 ) ) + { + MDAL::Log::error( MDAL_Status::Err_InvalidData, name(), "unknow mesh type." ); + return nullptr; + } + } + + } + lineNumber++; + } + + in.clear(); + in.seekg( 0, std::ios::beg ); + + Vertices vertices( vertexCount ); + Faces faces( faceCount ); + + std::map vertexIDtoIndex; + std::vector vertexType( vertexCount ); + + std::vector nativeVertexIds; + std::vector nativeFaceIds; + + size_t lastVertexID = 0; + size_t faceIndex = 0; + size_t vertexIndex = 0; + + std::vector chunks; + lineNumber = 0; + + while ( std::getline( in, line ) ) + { + if ( 0 < lineNumber && lineNumber < vertexCount + 1 ) + { + chunks = _regex_split( MDAL::trim( line ) ); + size_t nodeID = toSizeT( chunks[0] ); + + if ( nodeID != 0 ) + { + // specification of Mike21 does not state if vertexIDs need to continuos, expect that they might be not + // in the same way as in 2DM + if ( ( lastVertexID != 0 ) && ( nodeID <= lastVertexID ) ) + { + // the algorithm requires that the file has points orderer by index + MDAL::Log::error( MDAL_Status::Err_InvalidData, name(), "nodes are not ordered by index" ); + return nullptr; + } + lastVertexID = nodeID; + } + + // in case we have gaps/reorders in native indexes, store it + _persist_native_index( nativeVertexIds, nodeID, vertexIndex, vertexCount ); + _parse_vertex_id_gaps( vertexIDtoIndex, vertexIndex, nodeID - 1 ); + + assert( vertexIndex < vertexCount ); + Vertex &vertex = vertices[vertexIndex]; + vertex.x = toDouble( chunks[1] ); + vertex.y = toDouble( chunks[2] ); + vertex.z = toDouble( chunks[3] ); + vertexType[vertexIndex] = MDAL::toInt( chunks[4] ); + vertexIndex++; + } + + if ( vertexCount + 1 < lineNumber ) + { + chunks = _regex_split( MDAL::trim( line ) ); + assert( faceIndex < faceCount ); + + const size_t faceVertexCount = chunks.size() - 1; + assert( ( faceVertexCount == 3 ) || ( faceVertexCount == 4 ) ); + if ( maxVerticesPerFace < faceVertexCount ) + maxVerticesPerFace = faceVertexCount; + + Face &face = faces[faceIndex]; + face.resize( faceVertexCount ); + + // in case we have gaps/reorders in native indexes, store it + size_t nativeID = MDAL::toSizeT( chunks[0] ); + _persist_native_index( nativeFaceIds, nativeID, faceIndex, faceCount ); + + for ( size_t i = 0; i < faceVertexCount; ++i ) + face[i] = MDAL::toSizeT( chunks[i + 1] ) - 1; // Mike21 is numbered from 1 + + faceIndex++; + } + + lineNumber++; + } + + for ( std::vector::iterator it = faces.begin(); it != faces.end(); ++it ) + { + Face &face = *it; + for ( Face::size_type nd = 0; nd < face.size(); ++nd ) + { + size_t nodeID = face[nd]; + + std::map::iterator ni2i = vertexIDtoIndex.find( nodeID ); + if ( ni2i != vertexIDtoIndex.end() ) + { + face[nd] = ni2i->second; // convert from ID to index + } + else if ( vertices.size() < nodeID ) + { + MDAL::Log::warning( MDAL_Status::Warn_ElementWithInvalidNode, name(), "found invalid node" ); + } + } + } + + // create the mesh and set the required data + std::unique_ptr< MeshMike21 > mesh( + new MeshMike21( + maxVerticesPerFace, + mMeshFile, + vertexIDtoIndex + ) + ); + mesh->setFaces( std::move( faces ) ); + mesh->setVertices( std::move( vertices ) ); + + // Add Vertex Type + MDAL::addVertexScalarDatasetGroup( mesh.get(), vertexType, "VertexType" ); + + // Add Bed Elevation + MDAL::addBedElevationDatasetGroup( mesh.get(), mesh->vertices() ); + + if ( !nativeFaceIds.empty() ) + MDAL::addFaceScalarDatasetGroup( mesh.get(), nativeFaceIds, "NativeFaceIds" ); + if ( !nativeVertexIds.empty() ) + MDAL::addVertexScalarDatasetGroup( mesh.get(), nativeVertexIds, "NativeVertexIds" ); + + mesh->setSourceCrs( crs ); + + return std::unique_ptr( mesh.release() ); +} + +void MDAL::DriverMike21::save( const std::string &fileName, const std::string &, MDAL::Mesh *mesh ) +{ + MDAL::Log::resetLastStatus(); + + std::ofstream file = MDAL::openOutputFile( fileName, std::ofstream::out ); + + if ( !file.is_open() ) + { + MDAL::Log::error( MDAL_Status::Err_FailToWriteToDisk, name(), "Could not open file " + fileName ); + } + + std::string line = std::to_string( mesh->verticesCount() ) + " " + mesh->crs(); + file << line << std::endl; + + std::vector vertexTypes; + + std::shared_ptr vertexTypeDG = mesh->group( "VertexType" ); + if ( vertexTypeDG ) + { + vertexTypes.resize( mesh->verticesCount() ); + auto d = vertexTypeDG->datasets[0]; + d->scalarData( 0, mesh->verticesCount(), vertexTypes.data() ); + } + + // write vertices + std::unique_ptr vertexIterator = mesh->readVertices(); + double vertex[3]; + for ( size_t i = 0; i < mesh->verticesCount(); ++i ) + { + vertexIterator->next( 1, vertex ); + line = ""; + line.append( std::to_string( i + 1 ) ); + for ( size_t j = 0; j < 2; ++j ) + { + line.append( " " ); + line.append( MDAL::coordinateToString( vertex[j] ) ); + } + line.append( " " ); + line.append( MDAL::doubleToString( vertex[2] ) ); + + line.append( " " ); + if ( vertexTypes.size() == mesh->verticesCount() ) + { + line.append( MDAL::doubleToString( vertexTypes.at( i ) ) ); + } + else + { + line.append( MDAL::doubleToString( 0 ) ); + } + + file << line << std::endl; + } + + //write element header line + size_t elementType = 0; + if ( mesh->faceVerticesMaximumCount() == 3 ) + { + elementType = 21; + } + else if ( mesh->faceVerticesMaximumCount() == 4 ) + { + elementType = 25; + } + + line = std::to_string( mesh->facesCount() ); + line.append( " " ); + line.append( std::to_string( mesh->faceVerticesMaximumCount() ) ); + line.append( " " ); + line.append( std::to_string( elementType ) ); + file << line << std::endl; + + // write faces + std::vector vertexIndices( mesh->faceVerticesMaximumCount() ); + std::unique_ptr faceIterator = mesh->readFaces(); + for ( size_t i = 0; i < mesh->facesCount(); ++i ) + { + int faceOffsets[1]; + faceIterator->next( 1, faceOffsets, 4, vertexIndices.data() ); + + if ( faceOffsets[0] > 2 && faceOffsets[0] < 5 ) + { + line = ""; + line.append( std::to_string( i + 1 ) ); + + for ( int j = 0; j < faceOffsets[0]; ++j ) + { + line.append( " " ); + line.append( std::to_string( vertexIndices[j] + 1 ) ); + } + } + file << line << std::endl; + } + + file.close(); +} + +std::string MDAL::DriverMike21::saveMeshOnFileSuffix() const +{ + return "mesh"; +} diff --git a/mdal/frmts/mdal_mike21.hpp b/mdal/frmts/mdal_mike21.hpp new file mode 100644 index 00000000..c58d8f23 --- /dev/null +++ b/mdal/frmts/mdal_mike21.hpp @@ -0,0 +1,99 @@ +/* + MDAL - Mesh Data Abstraction Library (MIT License) + Copyright (C) 2023 Lutra Consulting Ltd. +*/ + +#ifndef MDAL_MIKE21_HPP +#define MDAL_MIKE21_HPP + +#include +#include +#include + +#include "mdal_data_model.hpp" +#include "mdal_memory_data_model.hpp" +#include "mdal.h" +#include "mdal_driver.hpp" + +namespace MDAL +{ + class MeshMike21: public MemoryMesh + { + public: + MeshMike21( size_t faceVerticesMaximumCount, + const std::string &uri, + const std::map vertexIDtoIndex + ); + ~MeshMike21() override; + + + //! Mike21 may supports gaps in the vertex indexing, + //! but we use continuos array of vertices in MDAL + //! \param vertexID internal index/ID of the vertex that native format uses + //! \returns index of the vertex in the continuous array of vertices we returned by readVertices(). + //! For invalid vertexID it is returned index that is out of vertices array bounds. + virtual size_t vertexIndex( size_t vertexID ) const; + + //! Returns maximum vertex ID. + //! For meshes without gaps in vertex indexing, it is vertex count - 1 + virtual size_t maximumVertexId() const; + + private: + //! Mike21 might supports "gaps" in the mesh indexing + //! Store only the indices that have different index and ID + //! https://github.com/lutraconsulting/MDAL/issues/51 + std::map mVertexIDtoIndex; + }; + + /** + * Mike21 format specification + * Text file format representing mesh vertices and faces + * Vertices are stored as - id x y z type_of_vertex (0 for water, 1 for land and above 1 for all other boundaries) + * The format supports triangles and quads + * Faces are stored as id 1 2 3 [4] + * + * full specification here: https://www.xmswiki.com/wiki/SMS:MIKE_21_*.mesh + * + * The format has two special lines in the file: + * First line - that can have format either: + * int int int string - these are type of bathymetry data, units of bathymetry data, number of vertices, CRS + * int string - these are number of vertices, CRS + * Line after the vertices (Element header line): + * int int int - number of faces, max number of vertexes per face, mesh type code + * [21 for faces with triangles only, 25 for faces with also quadrangular elements] + * + * The driver creates at least two Vertex Scalar datasets on the Mesh. "Bed Elevation" for Z coordinate + * and "VertexType" storing the type of vertex (mentioned above). Besides "NativeVertexIds" and "NativeFaceIds" + * maybe created if the IDS in input data are not continuous. + */ + class DriverMike21: public Driver + { + public: + DriverMike21(); + ~DriverMike21() override; + DriverMike21 *create() override; + + int faceVerticesMaximumCount() const override {return 6;} + + bool canReadMesh( const std::string &uri ) override; + std::unique_ptr< Mesh > load( const std::string &meshFile, const std::string &meshName = "" ) override; + void save( const std::string &fileName, const std::string &, Mesh *mesh ) override; + + std::string saveMeshOnFileSuffix() const override; + + private: + std::string mMeshFile; + // regex for header line in form of - integer string + std::regex mRegexHeader2011 = std::regex( "(\\d+)\\s+(.+)(\\s+)?" ); + // regex for header line in form of - integer integer integer string + std::regex mRegexHeader2012 = std::regex( "(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(.+)(\\s+)?" ); + // regex for element header line - integer integer integer(code with two number) + std::regex mRegexElementHeader = std::regex( "(\\d+)\\s+(\\d)\\s+(\\d{2})(\\s+)?" ); + + bool canReadHeader( const std::string &line ); + size_t getVertexCount( const std::string &line ); + std::string getCrs( const std::string &line ); + }; + +} // namespace MDAL +#endif //MDAL_MIKE21_HPP From 973a759b1f5f5b31117501d1648b13e9f0069991 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 22 Nov 2023 10:30:54 +0100 Subject: [PATCH 02/25] add new driver --- mdal/mdal_driver_manager.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mdal/mdal_driver_manager.cpp b/mdal/mdal_driver_manager.cpp index 2d99935c..f639d6fa 100644 --- a/mdal/mdal_driver_manager.cpp +++ b/mdal/mdal_driver_manager.cpp @@ -11,6 +11,7 @@ #include "frmts/mdal_binary_dat.hpp" #include "frmts/mdal_selafin.hpp" #include "frmts/mdal_esri_tin.hpp" +#include "frmts/mdal_mike21.hpp" #include "frmts/mdal_dynamic_driver.hpp" #include "mdal_utils.hpp" @@ -222,6 +223,7 @@ MDAL::DriverManager::DriverManager() mDrivers.push_back( std::make_shared() ); mDrivers.push_back( std::make_shared() ); mDrivers.push_back( std::make_shared() ); + mDrivers.push_back( std::make_shared() ); #ifdef BUILD_PLY mDrivers.push_back( std::make_shared() ); From 44f01110231116b8f3824728ff945c7c6aa1e8c9 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 22 Nov 2023 10:31:10 +0100 Subject: [PATCH 03/25] build driver --- mdal/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mdal/CMakeLists.txt b/mdal/CMakeLists.txt index f0e8f1e6..c5fefa7b 100644 --- a/mdal/CMakeLists.txt +++ b/mdal/CMakeLists.txt @@ -17,6 +17,7 @@ SET(MDAL_SOURCES frmts/mdal_binary_dat.cpp frmts/mdal_selafin.cpp frmts/mdal_esri_tin.cpp + frmts/mdal_mike21.cpp ) SET(MDAL_HEADERS @@ -35,6 +36,7 @@ SET(MDAL_HEADERS frmts/mdal_binary_dat.hpp frmts/mdal_selafin.hpp frmts/mdal_esri_tin.hpp + frmts/mdal_mike21.hpp ) IF(BUILD_PLY) From d15819e0a6092362805bf08c214b7f496bbb2d94 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 22 Nov 2023 10:31:22 +0100 Subject: [PATCH 04/25] mike21 test data --- tests/data/mike21/not_a_mesh_file.mesh | 1 + tests/data/mike21/odense_rough.mesh | 1055 ++++++++++++++ .../data/mike21/odense_rough_comparison.mesh | 1055 ++++++++++++++ tests/data/mike21/odense_rough_quads.mesh | 1261 +++++++++++++++++ tests/data/mike21/small.mesh | 23 + 5 files changed, 3395 insertions(+) create mode 100644 tests/data/mike21/not_a_mesh_file.mesh create mode 100644 tests/data/mike21/odense_rough.mesh create mode 100644 tests/data/mike21/odense_rough_comparison.mesh create mode 100644 tests/data/mike21/odense_rough_quads.mesh create mode 100644 tests/data/mike21/small.mesh diff --git a/tests/data/mike21/not_a_mesh_file.mesh b/tests/data/mike21/not_a_mesh_file.mesh new file mode 100644 index 00000000..0d25932c --- /dev/null +++ b/tests/data/mike21/not_a_mesh_file.mesh @@ -0,0 +1 @@ +This is not a mesh file. diff --git a/tests/data/mike21/odense_rough.mesh b/tests/data/mike21/odense_rough.mesh new file mode 100644 index 00000000..ef97b941 --- /dev/null +++ b/tests/data/mike21/odense_rough.mesh @@ -0,0 +1,1055 @@ +399 UTM-33 +1 218234.754787612 6158181.03268845 -1.8585958480835 0 +2 218448.363292303 6156634.46624341 -0.758316695690155 1 +3 218661.801736625 6164155.31420159 -6.73607683181763 2 +4 214805.038807097 6159196.84730017 -0.200000002980232 1 +5 218064.498077104 6163466.9485874 -2.04044413566589 1 +6 214158.349981676 6157834.31987317 -8.36585235595703 0 +7 222397.938935781 6163313.84185944 -6.02907276153564 2 +8 212015.391029152 6153080.49437996 -0.279053330421448 1 +9 211426.993089602 6154493.06071159 -1.54121208190918 1 +10 220578.099889196 6160950.30862382 -3.4985830783844 1 +11 218459.848374508 6161765.53274988 -1.35477471351624 1 +12 215999.640587678 6160759.59103061 -2.52448463439941 0 +13 218359.569300219 6160475.10277209 -2.91258144378662 0 +14 224171.617336507 6161306.74316874 -1.67552328109741 1 +15 222314.641655962 6160333.12796695 -1.85578179359436 1 +16 211951.445124963 6157057.00755047 -4.13163566589355 1 +17 217214.578876771 6164499.42751662 -2.63900351524353 2 +18 212437.693494665 6157513.13628371 -2.05908417701721 1 +19 214857.756379308 6155728.92723105 -0.298834294080734 1 +20 218043.17335504 6156600.76386338 -10.4425430297852 1 +21 220855.832614909 6162535.13107661 -3.74417161941528 1 +22 212914.88339843 6158366.55072644 -0.200000002980232 1 +23 216205.450054224 6155910.7477512 -0.240045219659805 1 +24 218469.832761019 6162898.83477813 -1.81389617919922 1 +25 220584.136038175 6160058.91937653 -5.70616102218628 0 +26 212782.002381097 6157615.82738795 -2.47031879425049 1 +27 213339.143877772 6158570.04687561 -0.206597551703453 1 +28 215751.081777303 6160059.95311322 -0.391520023345947 1 +29 216770.065611896 6159681.28558763 -1.54843521118164 0 +30 217826.315557184 6163323.65144972 -0.56139874458313 1 +31 219477.125658335 6156616.85604403 -0.282734662294388 1 +32 219407.153911344 6158466.53829403 -2.49201107025146 0 +33 219196.087361848 6156313.16588491 -0.305647701025009 1 +34 222026.729155452 6162637.36017415 -2.54856276512146 1 +35 214470.077488875 6157549.1992363 -2.19016814231873 1 +36 216314.890174346 6162429.11086 -0.983966886997223 0 +37 223747.629896294 6158035.29206417 -2 1 +38 214623.123589079 6163105.9446342 -0.635462641716003 1 +39 222976.411484951 6159957.88979195 -1.90606081485748 1 +40 214489.322205307 6158007.47876373 -1.93917858600616 1 +41 216937.997660155 6157033.46201621 -8.44854831695557 0 +42 211691.422367769 6156239.7600243 -7.5 1 +43 214869.970631973 6161766.25419988 -0.372373551130295 1 +44 223316.948652484 6157425.35188759 -1.88434302806854 1 +45 213739.204676785 6157761.49602243 -8.77565002441406 0 +46 215137.237607823 6157061.69138369 -0.600000023841858 0 +47 212686.685022268 6157111.79128456 -3.82180261611938 0 +48 212803.80887312 6155663.30628287 -0.29642716050148 1 +49 213890.410080064 6155906.25878309 -0.393515765666962 1 +50 216105.759313111 6159538.35072477 -0.397461414337158 1 +51 223482.371543612 6159408.11035235 -1.99268162250519 1 +52 214463.211978972 6153558.26229439 -0.207712545990944 1 +53 219432.209410888 6161872.34709722 -3.8410313129425 1 +54 213166.331441947 6157675.87745025 -8.92999076843262 0 +55 213811.720510359 6156396.8821934 -0.286308169364929 1 +56 213257.754879272 6157073.68693298 -1.96843707561493 1 +57 215130.449144862 6155135.86461025 -0.203458100557327 1 +58 213779.352968979 6153077.66681803 -0.200000002980232 1 +59 223652.971152095 6163069.34312036 -4.24614524841309 2 +60 212168.971013177 6157573.75266458 -0.725977122783661 1 +61 214251.953956276 6162820.51794077 -0.803631663322449 1 +62 220232.666870982 6156668.79303869 -0.200000002980232 1 +63 211598.117642991 6155186.19429982 -0.687073349952698 1 +64 214645.288607245 6154674.18809348 -0.410681515932083 1 +65 219805.859889859 6161258.6000753 -1.78742063045502 1 +66 220227.119186989 6161601.61543441 -4.46690988540649 1 +67 212942.105276519 6157117.7796796 -2.51816487312317 0 +68 214854.015877425 6158580.48183197 -0.200000002980232 1 +69 216684.621822658 6157771.83369603 -0.843548357486725 0 +70 215363.230155388 6163482.13632787 -0.200000002980232 1 +71 214544.267757131 6157780.45135894 -8.39997863769531 0 +72 216544.724089525 6157093.5936873 -8.12824821472168 0 +73 214839.286590095 6157880.24648799 -3.00809240341187 1 +74 214764.29357449 6157631.01240715 -8.23787403106689 0 +75 221493.99934358 6157309.02500421 -0.346539169549942 1 +76 223728.727172704 6160850.38513341 -1.85612845420837 1 +77 220286.26927213 6161978.93139664 -4.12905836105347 1 +78 211198.224499893 6153768.39133792 -1.54869449138641 1 +79 214478.227036906 6155312.05562469 -0.285834819078445 1 +80 223437.258835816 6158713.77083074 -2.00052046775818 1 +81 211928.67197923 6157352.12089064 -1.23207247257233 1 +82 222370.504850611 6162092.81663775 -1.92390537261963 1 +83 219018.196140425 6158909.37647228 -2.45252060890198 0 +84 219722.26449441 6160938.75707331 -3.0658974647522 1 +85 216240.644651403 6157229.59697625 -8.87481689453125 0 +86 217816.129429667 6159567.0166877 -3.94757962226868 0 +87 222582.870998718 6161485.52408602 -1.95625567436218 1 +88 213466.699876995 6157678.43895723 -8.21518421173096 0 +89 215506.808384256 6159149.42975949 -0.22207573056221 1 +90 220744.21795486 6157234.27038954 -0.244243636727333 1 +91 215126.561294869 6156467.6154921 -0.240905299782753 1 +92 217506.554749456 6163895.7237049 -1.71477711200714 1 +93 219634.293094815 6161580.26860057 -7.13487482070923 1 +94 218897.413992427 6161327.96713196 -2.16234517097473 1 +95 219175.496835656 6159550.1864052 -4.50386762619019 0 +96 219603.506562564 6157809.26282308 -2.08366060256958 0 +97 215695.296990665 6158111.17418191 -0.594252526760101 0 +98 217364.620050712 6155830.07811473 -1.50971221923828 1 +99 213346.147155475 6155739.48195604 -0.231514722108841 1 +100 213519.402496687 6156795.99736144 -0.205935597419739 1 +101 222217.705608628 6157301.37469783 -0.804712295532227 1 +102 211068.501175313 6153123.8501268 -0.294852793216705 1 +103 211560.067149477 6155687.31428434 -2.4771146774292 1 +104 213918.509441551 6157164.54477464 -0.441218674182892 1 +105 213786.683470809 6158391.14846654 -0.407660394906998 1 +106 215416.02494335 6157622.92769233 -8.20608520507813 0 +107 217453.378759879 6157573.7508254 -0.956682145595551 0 +108 223632.529158668 6162430.43532057 -2.52213978767395 1 +109 218981.171862145 6162420.04547905 -1.87754213809967 1 +110 215616.108189577 6162713.93950164 -0.631281554698944 0 +111 212002.671108396 6156776.08845575 -8.5 1 +112 214488.098919549 6162270.41615517 -0.632877051830292 1 +113 217067.055902273 6158727.29928539 -1.86662340164185 0 +114 215733.477985935 6164188.97309528 -0.200000002980232 1 +115 215082.234091379 6157631.88812609 -8.79961681365967 0 +116 218885.574787014 6156199.18589637 -1.1349766254425 1 +117 217580.70772748 6158571.75349411 -1.60355067253113 0 +118 216578.604970663 6164492.79835736 -0.548122465610504 1 +119 216782.466830265 6155689.56691694 -0.220892176032066 1 +120 219196.087361848 6160966.46791368 -3.28391075134277 1 +121 216043.999707727 6157494.5988159 -8.20467758178711 0 +122 214442.94919929 6155899.78999571 -0.791756212711334 0 +123 213052.177418159 6157385.75606728 -8.47102546691895 0 +124 214916.999056511 6161125.60143033 -0.325585275888443 1 +125 218416.252252407 6157389.2664885 -1.52851009368896 0 +126 217409.33642282 6162076.79071208 -1.5445077419281 0 +127 219261.484058021 6156814.8532838 -1.66304624080658 0 +128 215215.029712398 6160483.04823562 -0.239644929766655 1 +129 223151.131246053 6161140.37787557 -2.29390668869019 1 +130 220914.790050012 6160770.39191209 -2.55803108215332 1 +131 212904.628505003 6153470.01142746 -0.353047907352448 1 +132 215971.908471111 6157137.67628603 -1.54592406749725 0 +133 222831.479571828 6157076.598249 -1.45214581489563 1 +134 220514.299318747 6162312.71035911 -3.08911323547363 1 +135 215640.61260773 6156138.78650835 -0.291207939386368 1 +136 214103.901284406 6158200.0802819 -0.82498437166214 1 +137 215247.413934929 6154189.57277749 -0.200552731752396 1 +138 221234.955761959 6162681.4394651 -3.50616145133972 1 +139 213379.459825881 6157440.13747 -6.40395164489746 1 +140 219787.344125281 6162616.68741656 -6.82400369644165 0 +141 217742.869954924 6156177.99527819 -7.5 1 +142 211686.332689651 6155924.175159 -1.80567169189453 1 +143 219042.163573348 6163380.48809504 -6.35488986968994 0 +144 216725.125831001 6156527.8491225 -0.600000023841858 0 +145 212921.260010216 6157887.8238852 -0.729369223117828 1 +146 212827.817468493 6156804.91522867 -0.404108017683029 1 +147 212785.410695445 6157391.22748342 -8.92670440673828 1 +148 218112.578776062 6162395.26619378 -0.446148574352264 1 +149 211813.043112547 6156510.54662664 -7.5 1 +150 212727.578562016 6156048.985806 -0.232476979494095 1 +151 214566.241134585 6156705.47819666 -0.85061901807785 1 +152 224082.14080953 6161938.49796029 -1.98526895046234 1 +153 217164.389580285 6164017.06858541 -0.664351642131805 1 +154 220323.08515477 6161234.25808924 -4.16170644760132 1 +155 219897.794949937 6159596.12960384 -4.50171518325806 0 +156 221635.713791149 6162750.33997598 -2.35345387458801 1 +157 221671.002180039 6160736.74351632 -2.06024050712585 1 +158 214960.545167848 6154595.40438237 -0.52475506067276 0 +159 213924.768657378 6157494.66835315 -2.95235967636108 1 +160 213042.786173882 6156939.30108082 -0.336720734834671 1 +161 215188.931539895 6154662.71869387 -0.254696577787399 1 +162 214887.868876053 6154905.02635186 -0.200000002980232 1 +163 214711.998756947 6156217.20271385 -0.420976340770721 1 +164 218210.804294712 6164262.55008703 -4.98391819000244 2 +165 220659.754102296 6163705.32493004 -11.1228122711182 2 +166 215317.790284322 6158012.62842789 -1.34345936775208 0 +167 215562.426817701 6161258.76365349 -2.75726675987244 0 +168 220000.56909369 6161880.25430408 -11 0 +169 216450.095048288 6156747.37174217 -0.638824462890625 0 +170 213396.389090446 6158047.28093632 -0.452111542224884 0 +171 213652.114241629 6157467.40291158 -2.41803574562073 1 +172 221528.846519039 6163509.58339474 -10.3318996429443 2 +173 219660.77791946 6163930.31956582 -10.1560802459717 2 +174 215236.443871629 6161661.9076223 -1.98357903957367 0 +175 212177.421138509 6156035.83731037 -1.41983234882355 0 +176 220697.578550565 6158662.19369981 -3.67778849601746 0 +177 213245.25667879 6154467.82531538 -0.385293990373611 0 +178 220376.450676748 6162821.19538259 -9.33783626556396 0 +179 221786.441726136 6159050.51298778 -2.36333179473877 0 +180 211948.370683191 6155685.28608473 -1.88849771022797 0 +181 212375.531709994 6156986.47331122 -8.80882835388184 0 +182 215588.250761425 6158464.86518836 -0.338044464588165 0 +183 212694.159516687 6154672.30392245 -0.933880865573883 0 +184 216310.258694715 6161554.2631254 -1.68611431121826 0 +185 217165.323065142 6160732.69058209 -2.39603161811829 0 +186 220323.529128359 6158243.14609681 -1.95168697834015 0 +187 219498.42120815 6157355.35423418 -1.8028872013092 0 +188 220931.16794308 6163050.53485641 -11.3592920303345 0 +189 214855.31295695 6153873.91753594 -0.202917739748955 1 +190 219410.578623395 6160189.02554061 -10.2089643478394 0 +191 215218.172737412 6154426.14573568 -0.386455625295639 1 +192 214862.464078635 6154308.94303696 -0.272428065538406 0 +193 214248.051067426 6154094.42969678 -0.598569810390472 0 +194 220107.371276098 6162290.43623137 -10.8823223114014 0 +195 212137.360793515 6156402.61966563 -2.19564604759216 0 +196 221818.77119839 6158316.61056625 -2.32053089141846 0 +197 220159.217674732 6157237.6095955 -0.337973862886429 0 +198 218905.890361451 6156663.41491547 -1.84571969509125 0 +199 218886.562169526 6157398.16451668 -9.94279098510742 0 +200 216230.42179482 6158684.49888885 -0.503425776958466 0 +201 216272.502063192 6163449.51012823 -0.305217206478119 0 +202 214885.560398179 6157313.2762688 -0.609578430652618 0 +203 223150.418968344 6163167.24767902 -5.22873449325562 2 +204 218306.900208993 6157025.76865252 -10.5054931640625 0 +205 219559.538760074 6159038.60035726 -4.00968360900879 0 +206 220346.398425383 6159238.63540135 -3.63252902030945 0 +207 221378.479355914 6159674.19917848 -4.84133386611938 0 +208 217283.084537105 6156541.3461765 -7.35874652862549 0 +209 217125.119346625 6157655.4028467 -1.01953899860382 0 +210 217381.720506601 6158065.32113998 -0.759970545768738 0 +211 220261.278807881 6160803.07799607 -5.83805847167969 0 +212 216214.399061682 6157963.49384274 -0.793091118335724 0 +213 211927.42112651 6153751.88108943 -0.91266804933548 0 +214 218223.397415903 6161113.80272346 -2.78297448158264 0 +215 223022.543656371 6161888.32543085 -6.22438907623291 0 +216 213047.050971075 6155120.72222383 -0.744480550289154 0 +217 213825.807854366 6154953.98063841 -0.581141114234924 0 +218 222657.546699163 6159129.53414006 -2.67379784584045 0 +219 222591.88239974 6158333.31305224 -3.10983347892761 0 +220 221044.885760427 6157979.38859786 -2.88465929031372 0 +221 219281.994916932 6157836.1791658 -5.69617652893066 0 +222 217823.707437247 6161651.38181557 -2 0 +223 220787.599356104 6160548.84160774 -3.82176446914673 0 +224 221426.283949116 6160747.63249252 -2.25076532363892 1 +225 221574.375879837 6160268.07899137 -3.20825886726379 0 +226 221136.426654237 6160497.36635833 -2.93132853507996 0 +227 214710.701593741 6156824.70785235 -0.564994633197784 0 +228 214801.887214453 6156605.44357744 -0.471227556467056 1 +229 214234.80064308 6156881.42197668 -2.20626497268677 0 +230 214276.353561516 6156334.50563565 -1.51278781890869 0 +231 214887.510946042 6156930.18183028 -0.574231386184692 0 +232 215202.464283731 6156718.24463103 -0.425558090209961 0 +233 215440.228079878 6157015.52218436 -0.600000023841858 0 +234 214587.151043726 6157057.72822583 -0.600000023841858 0 +235 215383.5869513 6156303.20100022 -0.260268867015839 1 +236 215640.137357815 6156644.05775981 -0.600000023841858 0 +237 217691.38930182 6156944.02352273 -8.22870445251465 0 +238 222766.777454204 6162588.3378503 -8.12312507629395 0 +239 219790.545114545 6160275.69056274 -9.84108734130859 0 +240 218805.193084531 6158316.05861229 -9.04366016387939 0 +241 222710.551941713 6157657.48090981 -1.88794028759003 0 +242 218692.38762387 6157823.19436565 -3.09091830253601 0 +243 217775.755860042 6160595.05365282 -2.29474020004272 0 +244 217319.96440546 6160042.62279075 -4.83036184310913 0 +245 223631.448229972 6161592.46081491 -4.6619758605957 0 +246 212227.47888044 6157290.17523676 -3.83427095413208 0 +247 215896.028397032 6158030.60947528 -0.58413827419281 0 +248 215924.944660332 6158250.93915557 -0.503640174865723 0 +249 215749.193759232 6157796.79405488 -6.02787923812866 0 +250 217116.040809902 6161448.46925658 -1.94464468955994 0 +251 219365.088918175 6162808.50437634 -6.15605449676514 0 +252 220245.213349404 6160315.05633303 -5.80956125259399 0 +253 211889.040908662 6156025.5856883 -0.936022758483887 0 +254 217942.828512212 6157413.64773504 -0.966099619865417 0 +255 215696.139991968 6161968.13245347 -1.67579102516174 0 +256 222114.670311176 6159735.57032874 -4.11449861526489 0 +257 218490.409741496 6159313.39022015 -8.47690868377686 0 +258 218217.455370447 6159810.34015614 -4.59575748443604 0 +259 218687.299815633 6159961.29311658 -10.5148591995239 0 +260 218742.247260596 6160595.84776969 -3.29014539718628 0 +261 218320.909395437 6158777.67223816 -10.1910905838013 0 +262 219961.736551793 6161487.13392238 -10.2761135101318 0 +263 216997.213596472 6156279.54659534 -0.368005663156509 0 +264 211579.965314294 6153100.4314476 -0.361405432224274 1 +265 215270.311262022 6157331.232306 -1.57031440734863 0 +266 213836.905780932 6158046.86511414 -1.3584645986557 0 +267 220330.73746343 6157699.42492415 -1.04549217224121 0 +268 212693.481141364 6153991.76368859 -0.993276715278625 0 +269 214913.197558195 6162763.95519486 -0.691725969314575 0 +270 216215.172230159 6156924.18031635 -1.15028548240662 0 +271 216143.019932721 6156497.06703096 -0.600000023841858 0 +272 215940.225383462 6156839.76132878 -0.600000023841858 0 +273 216594.546214156 6156648.92078366 -0.600000023841858 0 +274 216557.945905573 6156239.4867567 -0.406104952096939 0 +275 216494.201989512 6156532.13993466 -0.600000023841858 0 +276 216677.345882834 6159200.80974471 -1.83868169784546 0 +277 219741.621037347 6161790.56876783 -9.71485996246338 0 +278 219679.294336499 6162132.83788212 -5.48523044586182 0 +279 219269.470112307 6162069.96268542 -2.4330883026123 1 +280 219416.473937006 6162409.60762057 -3.92522621154785 0 +281 218974.98578313 6163718.98611032 -5.9310736656189 0 +282 219161.289828043 6164042.8168837 -8.57102108001709 2 +283 218691.83347789 6163431.89426131 -3.59557819366455 0 +284 219317.840271369 6163584.41708412 -7.23454809188843 0 +285 219288.43937147 6163196.34920053 -6.30546998977661 0 +286 219779.385083915 6163237.54258912 -7.55351781845093 0 +287 218725.502311582 6162659.44012859 -2.05535411834717 1 +288 218937.718907411 6162970.79376931 -4.15468740463257 0 +289 212502.559960579 6157258.56071993 -8.83439254760742 0 +290 212367.125748037 6155227.43522771 -1.05974817276001 0 +291 212117.883044195 6154553.77315662 -0.847664058208466 0 +292 216625.06250272 6160949.42987144 -3.00058913230896 0 +293 216533.881802237 6160252.01474395 -1.66302978992462 0 +294 219520.487342025 6160588.63859617 -9.60559368133545 0 +295 219079.850552576 6160497.35991158 -4.5139741897583 0 +296 219043.854914905 6160007.68180752 -10.7789812088013 0 +297 219532.333587103 6159589.94519609 -4.26438808441162 0 +298 218736.708238708 6160281.26855164 -4.11802196502686 0 +299 219365.177313864 6159850.27482536 -6.13519716262817 0 +300 219662.910955132 6159914.0483858 -5.48951435089111 0 +301 213505.00935131 6153751.2980049 -0.715252637863159 0 +302 212505.721082275 6155940.43821167 -0.531543135643005 0 +303 212777.698015255 6156426.95051733 -0.297720551490784 1 +304 212360.489505024 6155710.46062349 -0.65423572063446 0 +305 212430.06440473 6156606.77470237 -1.63917350769043 0 +306 221855.852476104 6157305.19985102 -0.408596694469452 1 +307 222144.406269669 6157775.18545022 -1.80588185787201 0 +308 221278.270799214 6158633.14532912 -3.51989340782166 0 +309 221043.388009406 6159156.85401077 -4.97210311889648 0 +310 219324.965445425 6157151.67474377 -1.84161400794983 0 +311 219680.311218115 6157053.84246865 -0.533753752708435 0 +312 219199.938815969 6157444.10644712 -4.25070190429688 0 +313 217136.791621163 6162822.52605171 -0.645951390266418 0 +314 218245.768323671 6156617.61505339 -4.49560928344727 1 +315 218659.371344728 6156928.67612605 -8.15802478790283 0 +316 219189.431058406 6158677.36641515 -2.2131450176239 0 +317 220148.468464703 6158721.69396772 -3.72889065742493 0 +318 220772.727612044 6159682.17595793 -5.52170705795288 0 +319 216998.003992114 6156678.67407868 -3.29531908035278 0 +320 217335.694873288 6156901.4952418 -8.83632946014404 0 +321 217207.465563932 6157304.36233947 -4.75492095947266 0 +322 217893.021654982 6156389.37957078 -8.91867733001709 1 +323 216903.520101634 6157683.22974364 -1.08820044994354 0 +324 216758.284592493 6158180.65709059 -0.674399733543396 0 +325 216970.787003265 6157871.31798984 -0.461027830839157 0 +326 216833.036492587 6157434.27252596 -4.52013969421387 0 +327 219999.594900426 6161064.36222178 -9.73153781890869 0 +328 216427.002450603 6157497.90929847 -2.62999129295349 0 +329 212460.009767078 6153275.25290371 -0.336600601673126 1 +330 213706.031237969 6154316.88341389 -0.708941757678986 0 +331 222213.686495268 6158707.50819226 -3.93689274787903 0 +332 223160.858281694 6158033.04407189 -2.06139802932739 0 +333 219478.480223251 6157595.35137219 -1.84872400760651 0 +334 219807.935073884 6157531.63082609 -1.13165175914764 0 +335 219904.222631213 6157970.31721859 -1.9009006023407 0 +336 219544.24403802 6158112.57088487 -2.46743154525757 0 +337 219814.670349468 6158425.54977409 -2.55084800720215 0 +338 214128.490602682 6157310.98217414 -0.524839341640472 1 +339 214355.1314485 6157199.83285623 -2.1689920425415 0 +340 215730.625562058 6156995.82111734 -0.815037369728088 0 +341 215660.38188352 6157342.08409008 -8.20107173919678 0 +342 219923.272312791 6160664.29372899 -9.22173976898193 0 +343 218944.048656699 6157681.65186651 -10.3005704879761 0 +344 218949.691513424 6158042.72583009 -10.3902912139893 0 +345 219252.991485086 6158167.17121458 -3.61992311477661 0 +346 218588.960456069 6158096.85429803 -4.66019535064697 0 +347 218525.007918106 6158468.44688827 -10.7272968292236 0 +348 218880.303597344 6158594.36291984 -4.01785373687744 0 +349 218661.753855981 6158816.86038659 -5.57251358032227 0 +350 219063.803392113 6159209.64363707 -2.86018323898315 0 +351 218753.132056014 6159118.7632966 -3.1689293384552 0 +352 218811.689487052 6159430.71447602 -4.12365102767944 0 +353 218535.248120299 6159667.89890033 -9.97154521942139 0 +354 218850.890944264 6159723.67234412 -6.83914947509766 0 +355 218238.274939086 6159498.26341225 -8.98717021942139 0 +356 217626.988480757 6159015.26574166 -3.11921072006226 0 +357 218131.221768431 6159132.10294733 -9.14887142181396 0 +358 218325.578276106 6157749.2148646 -0.771965146064758 0 +359 218652.803706177 6157545.22103115 -3.11197209358215 0 +360 218651.131140553 6157229.56081109 -8.10287380218506 0 +361 217620.894445315 6161108.31613899 -2.18250393867493 0 +362 216857.480720592 6162066.24553114 -1.22023332118988 0 +363 219980.299350552 6159982.72136005 -5.61352205276489 0 +364 220304.522410668 6159812.33493629 -5.65347099304199 0 +365 220618.886895649 6160332.97740119 -4.89301729202271 0 +366 220978.991899256 6160151.82399049 -5.12910509109497 0 +367 220498.249753575 6160590.0764403 -5.22387647628784 0 +368 211941.657664199 6156242.86986306 -2.47094368934631 0 +369 217753.590418037 6157457.86217665 -0.756878256797791 0 +370 217692.679887714 6157731.69520976 -0.652207851409912 0 +371 217911.004796478 6157184.4443198 -1.84780061244965 0 +372 218144.217299036 6157396.38595493 -1.13119196891785 0 +373 217961.963853121 6157615.77009448 -0.599876284599304 0 +374 217911.975655271 6157945.56729092 -0.860210299491882 0 +375 215136.662913925 6162190.77008227 -3.62732720375061 0 +376 218299.757547073 6160093.99171084 -4.33448362350464 0 +377 217964.897887796 6160097.44055996 -2.96524024009705 0 +378 217874.131911326 6158330.03854066 -1.70050668716431 0 +379 217952.804815246 6158720.49894716 -2.79955410957336 0 +380 218181.723778319 6158495.62678654 -4.39940071105957 0 +381 217553.036444863 6156003.38495942 -3.36264300346375 1 +382 217221.835140003 6156013.74510442 -0.417111307382584 0 +383 217411.776382339 6156266.14592482 -1.74455034732819 0 +384 216708.492736066 6156788.31583656 -2.49886202812195 0 +385 217213.041051567 6159372.44381229 -3.2013213634491 0 +386 218908.419290182 6160852.16791609 -3.77635169029236 0 +387 218626.267077184 6160873.02145399 -3.31797981262207 0 +388 213341.990736991 6153273.83912275 -0.269388347864151 1 +389 214121.282473975 6153317.96455621 -0.200009509921074 1 +390 212459.307332716 6156243.60103557 -1.14156866073608 0 +391 221671.601877379 6157737.09228703 -1.81735599040985 0 +392 217978.502845752 6156825.58674367 -8.65325164794922 0 +393 218984.273564058 6157090.08892389 -8.18420505523682 0 +394 217672.476318558 6156580.84684331 -9.41825580596924 0 +395 219080.989497415 6158377.45988427 -2.88416147232056 0 +396 218471.695066908 6159031.87397191 -9.00115966796875 0 +397 217558.867089391 6157227.67733639 -2.43736910820007 0 +398 218449.453184682 6159936.77659239 -6.15918493270874 0 +399 218506.69878487 6160149.78950829 -4.60332679748535 0 +654 3 21 +1 69 328 326 +2 213 78 264 +3 215 108 238 +4 2 116 198 +5 8 213 264 +6 243 13 214 +7 268 183 291 +8 222 214 11 +9 48 150 302 +10 304 48 302 +11 175 253 180 +12 180 142 103 +13 216 99 48 +14 9 78 213 +15 345 395 344 +16 104 55 229 +17 348 316 83 +18 42 142 253 +19 77 134 194 +20 149 42 368 +21 16 111 181 +22 369 397 371 +23 175 195 368 +24 312 310 187 +25 47 181 146 +26 238 34 82 +27 67 147 47 +28 67 47 146 +29 56 67 160 +30 56 123 67 +31 33 198 116 +32 305 303 146 +33 180 103 63 +34 246 18 60 +35 320 321 41 +36 107 369 370 +37 295 298 296 +38 268 177 183 +39 217 99 216 +40 217 49 99 +41 262 277 93 +42 122 49 79 +43 137 191 192 +44 267 197 90 +45 161 57 162 +46 189 192 193 +47 391 307 196 +48 284 143 285 +49 289 181 47 +50 122 79 19 +51 186 267 220 +52 162 64 158 +53 314 392 20 +54 196 308 220 +55 230 151 229 +56 230 49 122 +57 55 104 100 +58 55 230 229 +59 229 151 234 +60 330 301 193 +61 151 230 163 +62 74 35 202 +63 135 236 235 +64 272 270 132 +65 233 341 265 +66 46 231 232 +67 169 270 271 +68 46 202 231 +69 270 169 72 +70 91 232 228 +71 167 184 255 +72 165 178 188 +73 273 169 275 +74 301 58 389 +75 221 333 96 +76 236 340 233 +77 246 16 181 +78 147 67 123 +79 178 194 134 +80 60 81 246 +81 292 293 185 +82 193 52 189 +83 147 123 26 +84 113 210 117 +85 123 139 54 +86 159 6 45 +87 170 88 45 +88 88 54 139 +89 213 268 291 +90 159 35 6 +91 123 56 139 +92 123 54 26 +93 147 18 289 +94 145 26 54 +95 145 170 22 +96 54 88 170 +97 266 170 45 +98 170 105 27 +99 158 64 192 +100 181 305 146 +101 266 136 105 +102 32 345 336 +103 6 40 136 +104 71 40 6 +105 248 247 212 +106 177 216 183 +107 110 70 269 +108 291 290 63 +109 145 54 170 +110 136 266 6 +111 171 45 88 +112 176 317 186 +113 6 35 71 +114 238 108 203 +115 71 74 73 +116 74 71 35 +117 64 217 193 +118 106 166 115 +119 166 68 73 +120 4 68 89 +121 73 74 115 +122 185 244 243 +123 212 247 249 +124 265 115 202 +125 68 166 182 +126 106 249 166 +127 89 182 200 +128 166 73 115 +129 69 212 328 +130 46 265 202 +131 74 202 115 +132 124 167 174 +133 43 124 174 +134 51 218 80 +135 70 38 269 +136 375 269 112 +137 112 269 61 +138 205 206 155 +139 167 128 12 +140 250 362 184 +141 28 50 293 +142 389 52 193 +143 201 110 36 +144 174 255 375 +145 167 255 174 +146 201 114 70 +147 50 29 293 +148 12 128 28 +149 72 85 270 +150 239 342 294 +151 89 200 50 +152 71 73 40 +153 340 341 233 +154 216 48 290 +155 209 323 326 +156 129 215 87 +157 319 384 144 +158 141 322 394 +159 210 209 107 +160 384 169 273 +161 382 119 98 +162 119 263 274 +163 41 384 319 +164 192 64 193 +165 248 97 247 +166 31 311 127 +167 315 204 2 +168 41 319 320 +169 308 196 179 +170 383 263 382 +171 191 161 158 +172 204 314 2 +173 200 324 113 +174 323 69 326 +175 117 356 113 +176 50 200 276 +177 323 325 69 +178 29 50 276 +179 210 370 374 +180 292 184 12 +181 349 351 396 +182 374 370 373 +183 353 355 257 +184 346 347 1 +185 83 205 350 +186 376 377 258 +187 344 242 343 +188 107 370 210 +189 254 369 371 +190 361 185 243 +191 33 127 198 +192 200 212 324 +193 393 127 310 +194 311 62 197 +195 311 187 310 +196 197 334 311 +197 334 96 333 +198 242 359 343 +199 217 64 79 +200 315 360 204 +201 63 9 291 +202 172 188 138 +203 218 179 331 +204 68 182 89 +205 241 133 44 +206 364 206 318 +207 220 75 391 +208 206 205 317 +209 62 90 197 +210 219 80 218 +211 95 350 205 +212 205 316 32 +213 211 252 367 +214 155 297 205 +215 364 318 25 +216 211 327 342 +217 186 337 335 +218 376 13 377 +219 225 157 224 +220 176 309 206 +221 225 15 157 +222 39 256 218 +223 110 201 70 +224 195 305 111 +225 268 329 131 +226 256 39 15 +227 37 80 332 +228 189 137 192 +229 44 332 241 +230 31 127 33 +231 313 36 362 +232 223 226 130 +233 286 165 173 +234 250 361 222 +235 148 313 126 +236 94 11 214 +237 126 222 148 +238 313 148 30 +239 22 170 27 +240 36 255 184 +241 122 19 163 +242 294 84 120 +243 195 111 149 +244 184 167 12 +245 278 53 277 +246 279 53 278 +247 278 168 194 +248 251 286 285 +249 387 260 386 +250 180 290 304 +251 17 92 164 +252 200 113 276 +253 211 342 252 +254 201 118 114 +255 176 308 309 +256 330 217 177 +257 150 303 390 +258 313 153 201 +259 24 287 288 +260 285 288 251 +261 3 5 283 +262 143 281 283 +263 3 281 282 +264 282 281 284 +265 178 134 21 +266 95 297 299 +267 387 13 260 +268 328 121 85 +269 191 158 192 +270 201 153 118 +271 67 146 160 +272 211 154 327 +273 154 66 262 +274 327 84 342 +275 171 159 45 +276 77 168 66 +277 5 164 92 +278 211 10 154 +279 76 14 245 +280 334 267 335 +281 129 76 245 +282 245 14 152 +283 331 196 219 +284 90 75 220 +285 394 383 141 +286 194 178 140 +287 241 101 133 +288 215 245 108 +289 140 278 194 +290 161 162 158 +291 128 167 124 +292 156 7 172 +293 165 188 172 +294 138 156 172 +295 182 166 97 +296 21 138 188 +297 238 7 34 +298 215 82 87 +299 2 198 315 +300 108 59 203 +301 207 179 256 +302 34 7 156 +303 200 248 212 +304 194 168 77 +305 88 139 171 +306 21 188 178 +307 39 218 51 +308 262 93 65 +309 25 366 365 +310 49 217 79 +311 306 307 391 +312 324 212 69 +313 186 220 176 +314 217 216 177 +315 148 222 11 +316 222 126 250 +317 252 25 365 +318 223 130 10 +319 225 226 366 +320 226 224 130 +321 225 207 256 +322 366 223 365 +323 225 224 226 +324 231 234 227 +325 231 202 234 +326 227 151 228 +327 339 229 234 +328 227 234 151 +329 49 230 55 +330 163 230 122 +331 231 228 232 +332 227 228 231 +333 232 91 235 +334 132 121 341 +335 135 23 271 +336 233 46 232 +337 202 35 234 +338 229 339 338 +339 236 233 232 +340 235 236 232 +341 236 272 340 +342 321 320 397 +343 328 72 326 +344 215 238 82 +345 7 238 203 +346 300 239 190 +347 252 363 364 +348 348 395 316 +349 347 349 261 +350 332 44 37 +351 219 196 307 +352 242 344 346 +353 199 343 359 +354 361 214 222 +355 292 12 293 +356 29 276 385 +357 377 86 258 +358 108 245 152 +359 215 129 245 +360 16 246 81 +361 246 181 289 +362 97 249 247 +363 166 249 97 +364 200 182 248 +365 182 97 248 +366 341 249 106 +367 212 249 121 +368 362 36 184 +369 292 250 184 +370 178 286 140 +371 280 251 109 +372 363 252 239 +373 365 223 367 +374 42 253 368 +375 142 180 253 +376 373 370 369 +377 254 371 372 +378 36 110 255 +379 375 255 110 +380 256 15 225 +381 218 256 179 +382 258 398 376 +383 86 357 355 +384 94 387 386 +385 351 352 257 +386 352 353 257 +387 295 296 190 +388 294 295 190 +389 376 399 13 +390 357 86 356 +391 261 380 347 +392 262 65 327 +393 168 262 66 +394 263 144 274 +395 319 263 208 +396 78 102 264 +397 233 265 46 +398 115 265 106 +399 170 266 105 +400 6 266 45 +401 220 267 90 +402 334 335 96 +403 268 213 329 +404 301 268 131 +405 112 43 375 +406 38 61 269 +407 271 270 272 +408 85 132 270 +409 135 271 236 +410 275 144 273 +411 340 272 132 +412 236 271 272 +413 271 275 169 +414 72 384 41 +415 271 23 274 +416 274 23 119 +417 271 274 275 +418 144 275 274 +419 356 385 113 +420 244 385 86 +421 277 262 168 +422 277 53 93 +423 279 278 280 +424 168 278 277 +425 280 278 140 +426 251 280 140 +427 109 279 280 +428 5 3 164 +429 24 288 283 +430 284 281 143 +431 3 283 281 +432 5 24 283 +433 283 288 143 +434 173 282 284 +435 286 173 284 +436 285 286 284 +437 140 286 251 +438 165 286 178 +439 285 143 288 +440 251 288 109 +441 109 288 287 +442 147 289 47 +443 246 289 18 +444 63 290 180 +445 216 290 183 +446 213 291 9 +447 290 291 183 +448 29 244 293 +449 250 292 185 +450 12 28 293 +451 244 185 293 +452 120 94 386 +453 239 294 190 +454 295 120 386 +455 298 295 260 +456 354 296 259 +457 95 205 297 +458 296 299 190 +459 190 299 300 +460 13 298 260 +461 296 298 259 +462 95 299 296 +463 300 297 155 +464 297 300 299 +465 300 155 363 +466 268 301 177 +467 301 131 388 +468 304 302 175 +469 175 302 390 +470 390 195 175 +471 180 304 175 +472 48 304 290 +473 111 305 181 +474 390 305 195 +475 307 241 219 +476 101 241 307 +477 306 101 307 +478 309 179 207 +479 220 308 176 +480 179 309 308 +481 309 207 318 +482 199 393 312 +483 310 312 393 +484 127 311 310 +485 62 311 31 +486 312 187 333 +487 343 312 221 +488 153 313 30 +489 36 313 201 +490 392 314 204 +491 198 393 315 +492 199 359 360 +493 337 317 205 +494 205 83 316 +495 206 317 176 +496 337 205 32 +497 309 318 206 +498 207 225 366 +499 263 319 144 +500 208 394 320 +501 208 320 319 +502 369 254 373 +503 107 209 321 +504 321 209 326 +505 237 320 394 +506 392 394 20 +507 69 325 324 +508 325 323 209 +509 210 113 324 +510 209 210 325 +511 210 324 325 +512 72 41 326 +513 321 326 41 +514 262 327 154 +515 84 327 65 +516 121 328 212 +517 72 328 85 +518 213 8 329 +519 301 330 177 +520 193 217 330 +521 196 331 179 +522 219 218 331 +523 80 219 332 +524 241 332 219 +525 334 187 311 +526 312 333 221 +527 334 333 187 +528 267 334 197 +529 267 186 335 +530 336 337 32 +531 96 335 336 +532 221 96 336 +533 186 317 337 +534 335 337 336 +535 338 339 35 +536 338 104 229 +537 234 35 339 +538 121 132 85 +539 340 132 341 +540 249 341 121 +541 265 341 106 +542 294 342 84 +543 252 342 239 +544 312 343 199 +545 344 343 221 +546 345 344 221 +547 346 344 240 +548 336 345 221 +549 32 316 395 +550 347 346 240 +551 346 358 242 +552 348 347 240 +553 210 378 117 +554 348 240 395 +555 349 348 83 +556 348 349 347 +557 349 83 351 +558 350 95 352 +559 350 352 351 +560 350 351 83 +561 257 357 396 +562 95 354 352 +563 352 354 353 +564 243 377 13 +565 355 258 86 +566 296 354 95 +567 353 354 259 +568 258 355 353 +569 385 356 86 +570 357 257 355 +571 378 379 117 +572 379 357 356 +573 396 357 261 +574 358 346 1 +575 125 359 358 +576 358 359 242 +577 360 359 125 +578 360 125 204 +579 360 315 393 +580 185 361 250 +581 214 361 243 +582 126 313 362 +583 250 126 362 +584 300 363 239 +585 364 25 252 +586 155 206 364 +587 363 155 364 +588 252 365 367 +589 366 25 318 +590 366 318 207 +591 223 366 226 +592 223 10 367 +593 211 367 10 +594 175 368 253 +595 149 368 195 +596 237 397 320 +597 107 397 369 +598 373 254 372 +599 358 374 373 +600 392 371 237 +601 125 358 372 +602 372 371 204 +603 204 125 372 +604 372 358 373 +605 374 358 1 +606 1 378 374 +607 374 378 210 +608 375 110 269 +609 174 375 43 +610 259 398 353 +611 298 399 259 +612 243 244 377 +613 86 377 244 +614 378 380 379 +615 347 380 1 +616 357 379 261 +617 356 117 379 +618 379 380 261 +619 1 380 378 +620 382 98 381 +621 263 119 382 +622 383 382 381 +623 141 383 381 +624 263 383 208 +625 169 384 72 +626 144 384 273 +627 29 385 244 +628 385 276 113 +629 120 295 294 +630 386 260 295 +631 94 214 387 +632 13 387 214 +633 389 193 301 +634 301 388 58 +635 150 390 302 +636 305 390 303 +637 391 75 306 +638 196 220 391 +639 371 392 204 +640 394 392 237 +641 127 393 198 +642 360 393 199 +643 383 394 208 +644 20 394 322 +645 344 395 240 +646 32 395 345 +647 349 396 261 +648 257 396 351 +649 371 397 237 +650 321 397 107 +651 398 259 399 +652 258 353 398 +653 13 399 298 +654 398 399 376 diff --git a/tests/data/mike21/odense_rough_comparison.mesh b/tests/data/mike21/odense_rough_comparison.mesh new file mode 100644 index 00000000..768f4cf3 --- /dev/null +++ b/tests/data/mike21/odense_rough_comparison.mesh @@ -0,0 +1,1055 @@ +399 UTM-33 +1 218234.75 6158181.03 -1.8586 0 +2 218448.36 6156634.47 -0.758317 1 +3 218661.8 6164155.31 -6.73608 2 +4 214805.04 6159196.85 -0.2 1 +5 218064.5 6163466.95 -2.04044 1 +6 214158.35 6157834.32 -8.36585 0 +7 222397.94 6163313.84 -6.02907 2 +8 212015.39 6153080.49 -0.279053 1 +9 211426.99 6154493.06 -1.54121 1 +10 220578.1 6160950.31 -3.49858 1 +11 218459.85 6161765.53 -1.35477 1 +12 215999.64 6160759.59 -2.52448 0 +13 218359.57 6160475.1 -2.91258 0 +14 224171.62 6161306.74 -1.67552 1 +15 222314.64 6160333.13 -1.85578 1 +16 211951.45 6157057.01 -4.13164 1 +17 217214.58 6164499.43 -2.639 2 +18 212437.69 6157513.14 -2.05908 1 +19 214857.76 6155728.93 -0.298834 1 +20 218043.17 6156600.76 -10.4425 1 +21 220855.83 6162535.13 -3.74417 1 +22 212914.88 6158366.55 -0.2 1 +23 216205.45 6155910.75 -0.240045 1 +24 218469.83 6162898.83 -1.8139 1 +25 220584.14 6160058.92 -5.70616 0 +26 212782 6157615.83 -2.47032 1 +27 213339.14 6158570.05 -0.206598 1 +28 215751.08 6160059.95 -0.39152 1 +29 216770.07 6159681.29 -1.54844 0 +30 217826.32 6163323.65 -0.561399 1 +31 219477.13 6156616.86 -0.282735 1 +32 219407.15 6158466.54 -2.49201 0 +33 219196.09 6156313.17 -0.305648 1 +34 222026.73 6162637.36 -2.54856 1 +35 214470.08 6157549.2 -2.19017 1 +36 216314.89 6162429.11 -0.983967 0 +37 223747.63 6158035.29 -2 1 +38 214623.12 6163105.94 -0.635463 1 +39 222976.41 6159957.89 -1.90606 1 +40 214489.32 6158007.48 -1.93918 1 +41 216938 6157033.46 -8.44855 0 +42 211691.42 6156239.76 -7.5 1 +43 214869.97 6161766.25 -0.372374 1 +44 223316.95 6157425.35 -1.88434 1 +45 213739.2 6157761.5 -8.77565 0 +46 215137.24 6157061.69 -0.6 0 +47 212686.69 6157111.79 -3.8218 0 +48 212803.81 6155663.31 -0.296427 1 +49 213890.41 6155906.26 -0.393516 1 +50 216105.76 6159538.35 -0.397461 1 +51 223482.37 6159408.11 -1.99268 1 +52 214463.21 6153558.26 -0.207713 1 +53 219432.21 6161872.35 -3.84103 1 +54 213166.33 6157675.88 -8.92999 0 +55 213811.72 6156396.88 -0.286308 1 +56 213257.75 6157073.69 -1.96844 1 +57 215130.45 6155135.86 -0.203458 1 +58 213779.35 6153077.67 -0.2 1 +59 223652.97 6163069.34 -4.24615 2 +60 212168.97 6157573.75 -0.725977 1 +61 214251.95 6162820.52 -0.803632 1 +62 220232.67 6156668.79 -0.2 1 +63 211598.12 6155186.19 -0.687073 1 +64 214645.29 6154674.19 -0.410682 1 +65 219805.86 6161258.6 -1.78742 1 +66 220227.12 6161601.62 -4.46691 1 +67 212942.11 6157117.78 -2.51816 0 +68 214854.02 6158580.48 -0.2 1 +69 216684.62 6157771.83 -0.843548 0 +70 215363.23 6163482.14 -0.2 1 +71 214544.27 6157780.45 -8.39998 0 +72 216544.72 6157093.59 -8.12825 0 +73 214839.29 6157880.25 -3.00809 1 +74 214764.29 6157631.01 -8.23787 0 +75 221494 6157309.03 -0.346539 1 +76 223728.73 6160850.39 -1.85613 1 +77 220286.27 6161978.93 -4.12906 1 +78 211198.22 6153768.39 -1.54869 1 +79 214478.23 6155312.06 -0.285835 1 +80 223437.26 6158713.77 -2.00052 1 +81 211928.67 6157352.12 -1.23207 1 +82 222370.5 6162092.82 -1.92391 1 +83 219018.2 6158909.38 -2.45252 0 +84 219722.26 6160938.76 -3.0659 1 +85 216240.64 6157229.6 -8.87482 0 +86 217816.13 6159567.02 -3.94758 0 +87 222582.87 6161485.52 -1.95626 1 +88 213466.7 6157678.44 -8.21518 0 +89 215506.81 6159149.43 -0.222076 1 +90 220744.22 6157234.27 -0.244244 1 +91 215126.56 6156467.62 -0.240905 1 +92 217506.55 6163895.72 -1.71478 1 +93 219634.29 6161580.27 -7.13487 1 +94 218897.41 6161327.97 -2.16235 1 +95 219175.5 6159550.19 -4.50387 0 +96 219603.51 6157809.26 -2.08366 0 +97 215695.3 6158111.17 -0.594253 0 +98 217364.62 6155830.08 -1.50971 1 +99 213346.15 6155739.48 -0.231515 1 +100 213519.4 6156796 -0.205936 1 +101 222217.71 6157301.37 -0.804712 1 +102 211068.5 6153123.85 -0.294853 1 +103 211560.07 6155687.31 -2.47711 1 +104 213918.51 6157164.54 -0.441219 1 +105 213786.68 6158391.15 -0.40766 1 +106 215416.02 6157622.93 -8.20609 0 +107 217453.38 6157573.75 -0.956682 0 +108 223632.53 6162430.44 -2.52214 1 +109 218981.17 6162420.05 -1.87754 1 +110 215616.11 6162713.94 -0.631282 0 +111 212002.67 6156776.09 -8.5 1 +112 214488.1 6162270.42 -0.632877 1 +113 217067.06 6158727.3 -1.86662 0 +114 215733.48 6164188.97 -0.2 1 +115 215082.23 6157631.89 -8.79962 0 +116 218885.57 6156199.19 -1.13498 1 +117 217580.71 6158571.75 -1.60355 0 +118 216578.6 6164492.8 -0.548122 1 +119 216782.47 6155689.57 -0.220892 1 +120 219196.09 6160966.47 -3.28391 1 +121 216044 6157494.6 -8.20468 0 +122 214442.95 6155899.79 -0.791756 0 +123 213052.18 6157385.76 -8.47103 0 +124 214917 6161125.6 -0.325585 1 +125 218416.25 6157389.27 -1.52851 0 +126 217409.34 6162076.79 -1.54451 0 +127 219261.48 6156814.85 -1.66305 0 +128 215215.03 6160483.05 -0.239645 1 +129 223151.13 6161140.38 -2.29391 1 +130 220914.79 6160770.39 -2.55803 1 +131 212904.63 6153470.01 -0.353048 1 +132 215971.91 6157137.68 -1.54592 0 +133 222831.48 6157076.6 -1.45215 1 +134 220514.3 6162312.71 -3.08911 1 +135 215640.61 6156138.79 -0.291208 1 +136 214103.9 6158200.08 -0.824984 1 +137 215247.41 6154189.57 -0.200553 1 +138 221234.96 6162681.44 -3.50616 1 +139 213379.46 6157440.14 -6.40395 1 +140 219787.34 6162616.69 -6.824 0 +141 217742.87 6156178 -7.5 1 +142 211686.33 6155924.18 -1.80567 1 +143 219042.16 6163380.49 -6.35489 0 +144 216725.13 6156527.85 -0.6 0 +145 212921.26 6157887.82 -0.729369 1 +146 212827.82 6156804.92 -0.404108 1 +147 212785.41 6157391.23 -8.9267 1 +148 218112.58 6162395.27 -0.446149 1 +149 211813.04 6156510.55 -7.5 1 +150 212727.58 6156048.99 -0.232477 1 +151 214566.24 6156705.48 -0.850619 1 +152 224082.14 6161938.5 -1.98527 1 +153 217164.39 6164017.07 -0.664352 1 +154 220323.09 6161234.26 -4.16171 1 +155 219897.79 6159596.13 -4.50172 0 +156 221635.71 6162750.34 -2.35345 1 +157 221671 6160736.74 -2.06024 1 +158 214960.55 6154595.4 -0.524755 0 +159 213924.77 6157494.67 -2.95236 1 +160 213042.79 6156939.3 -0.336721 1 +161 215188.93 6154662.72 -0.254697 1 +162 214887.87 6154905.03 -0.2 1 +163 214712 6156217.2 -0.420976 1 +164 218210.8 6164262.55 -4.98392 2 +165 220659.75 6163705.32 -11.1228 2 +166 215317.79 6158012.63 -1.34346 0 +167 215562.43 6161258.76 -2.75727 0 +168 220000.57 6161880.25 -11 0 +169 216450.1 6156747.37 -0.638824 0 +170 213396.39 6158047.28 -0.452112 0 +171 213652.11 6157467.4 -2.41804 1 +172 221528.85 6163509.58 -10.3319 2 +173 219660.78 6163930.32 -10.1561 2 +174 215236.44 6161661.91 -1.98358 0 +175 212177.42 6156035.84 -1.41983 0 +176 220697.58 6158662.19 -3.67779 0 +177 213245.26 6154467.83 -0.385294 0 +178 220376.45 6162821.2 -9.33784 0 +179 221786.44 6159050.51 -2.36333 0 +180 211948.37 6155685.29 -1.8885 0 +181 212375.53 6156986.47 -8.80883 0 +182 215588.25 6158464.87 -0.338044 0 +183 212694.16 6154672.3 -0.933881 0 +184 216310.26 6161554.26 -1.68611 0 +185 217165.32 6160732.69 -2.39603 0 +186 220323.53 6158243.15 -1.95169 0 +187 219498.42 6157355.35 -1.80289 0 +188 220931.17 6163050.53 -11.3593 0 +189 214855.31 6153873.92 -0.202918 1 +190 219410.58 6160189.03 -10.209 0 +191 215218.17 6154426.15 -0.386456 1 +192 214862.46 6154308.94 -0.272428 0 +193 214248.05 6154094.43 -0.59857 0 +194 220107.37 6162290.44 -10.8823 0 +195 212137.36 6156402.62 -2.19565 0 +196 221818.77 6158316.61 -2.32053 0 +197 220159.22 6157237.61 -0.337974 0 +198 218905.89 6156663.41 -1.84572 0 +199 218886.56 6157398.16 -9.94279 0 +200 216230.42 6158684.5 -0.503426 0 +201 216272.5 6163449.51 -0.305217 0 +202 214885.56 6157313.28 -0.609578 0 +203 223150.42 6163167.25 -5.22873 2 +204 218306.9 6157025.77 -10.5055 0 +205 219559.54 6159038.6 -4.00968 0 +206 220346.4 6159238.64 -3.63253 0 +207 221378.48 6159674.2 -4.84133 0 +208 217283.08 6156541.35 -7.35875 0 +209 217125.12 6157655.4 -1.01954 0 +210 217381.72 6158065.32 -0.759971 0 +211 220261.28 6160803.08 -5.83806 0 +212 216214.4 6157963.49 -0.793091 0 +213 211927.42 6153751.88 -0.912668 0 +214 218223.4 6161113.8 -2.78297 0 +215 223022.54 6161888.33 -6.22439 0 +216 213047.05 6155120.72 -0.744481 0 +217 213825.81 6154953.98 -0.581141 0 +218 222657.55 6159129.53 -2.6738 0 +219 222591.88 6158333.31 -3.10983 0 +220 221044.89 6157979.39 -2.88466 0 +221 219281.99 6157836.18 -5.69618 0 +222 217823.71 6161651.38 -2 0 +223 220787.6 6160548.84 -3.82176 0 +224 221426.28 6160747.63 -2.25077 1 +225 221574.38 6160268.08 -3.20826 0 +226 221136.43 6160497.37 -2.93133 0 +227 214710.7 6156824.71 -0.564995 0 +228 214801.89 6156605.44 -0.471228 1 +229 214234.8 6156881.42 -2.20626 0 +230 214276.35 6156334.51 -1.51279 0 +231 214887.51 6156930.18 -0.574231 0 +232 215202.46 6156718.24 -0.425558 0 +233 215440.23 6157015.52 -0.6 0 +234 214587.15 6157057.73 -0.6 0 +235 215383.59 6156303.2 -0.260269 1 +236 215640.14 6156644.06 -0.6 0 +237 217691.39 6156944.02 -8.2287 0 +238 222766.78 6162588.34 -8.12313 0 +239 219790.55 6160275.69 -9.84109 0 +240 218805.19 6158316.06 -9.04366 0 +241 222710.55 6157657.48 -1.88794 0 +242 218692.39 6157823.19 -3.09092 0 +243 217775.76 6160595.05 -2.29474 0 +244 217319.96 6160042.62 -4.83036 0 +245 223631.45 6161592.46 -4.66198 0 +246 212227.48 6157290.18 -3.83427 0 +247 215896.03 6158030.61 -0.584138 0 +248 215924.94 6158250.94 -0.50364 0 +249 215749.19 6157796.79 -6.02788 0 +250 217116.04 6161448.47 -1.94464 0 +251 219365.09 6162808.5 -6.15605 0 +252 220245.21 6160315.06 -5.80956 0 +253 211889.04 6156025.59 -0.936023 0 +254 217942.83 6157413.65 -0.9661 0 +255 215696.14 6161968.13 -1.67579 0 +256 222114.67 6159735.57 -4.1145 0 +257 218490.41 6159313.39 -8.47691 0 +258 218217.46 6159810.34 -4.59576 0 +259 218687.3 6159961.29 -10.5149 0 +260 218742.25 6160595.85 -3.29015 0 +261 218320.91 6158777.67 -10.1911 0 +262 219961.74 6161487.13 -10.2761 0 +263 216997.21 6156279.55 -0.368006 0 +264 211579.97 6153100.43 -0.361405 1 +265 215270.31 6157331.23 -1.57031 0 +266 213836.91 6158046.87 -1.35846 0 +267 220330.74 6157699.42 -1.04549 0 +268 212693.48 6153991.76 -0.993277 0 +269 214913.2 6162763.96 -0.691726 0 +270 216215.17 6156924.18 -1.15029 0 +271 216143.02 6156497.07 -0.6 0 +272 215940.23 6156839.76 -0.6 0 +273 216594.55 6156648.92 -0.6 0 +274 216557.95 6156239.49 -0.406105 0 +275 216494.2 6156532.14 -0.6 0 +276 216677.35 6159200.81 -1.83868 0 +277 219741.62 6161790.57 -9.71486 0 +278 219679.29 6162132.84 -5.48523 0 +279 219269.47 6162069.96 -2.43309 1 +280 219416.47 6162409.61 -3.92523 0 +281 218974.99 6163718.99 -5.93107 0 +282 219161.29 6164042.82 -8.57102 2 +283 218691.83 6163431.89 -3.59558 0 +284 219317.84 6163584.42 -7.23455 0 +285 219288.44 6163196.35 -6.30547 0 +286 219779.39 6163237.54 -7.55352 0 +287 218725.5 6162659.44 -2.05535 1 +288 218937.72 6162970.79 -4.15469 0 +289 212502.56 6157258.56 -8.83439 0 +290 212367.13 6155227.44 -1.05975 0 +291 212117.88 6154553.77 -0.847664 0 +292 216625.06 6160949.43 -3.00059 0 +293 216533.88 6160252.01 -1.66303 0 +294 219520.49 6160588.64 -9.60559 0 +295 219079.85 6160497.36 -4.51397 0 +296 219043.85 6160007.68 -10.779 0 +297 219532.33 6159589.95 -4.26439 0 +298 218736.71 6160281.27 -4.11802 0 +299 219365.18 6159850.27 -6.1352 0 +300 219662.91 6159914.05 -5.48951 0 +301 213505.01 6153751.3 -0.715253 0 +302 212505.72 6155940.44 -0.531543 0 +303 212777.7 6156426.95 -0.297721 1 +304 212360.49 6155710.46 -0.654236 0 +305 212430.06 6156606.77 -1.63917 0 +306 221855.85 6157305.2 -0.408597 1 +307 222144.41 6157775.19 -1.80588 0 +308 221278.27 6158633.15 -3.51989 0 +309 221043.39 6159156.85 -4.9721 0 +310 219324.97 6157151.67 -1.84161 0 +311 219680.31 6157053.84 -0.533754 0 +312 219199.94 6157444.11 -4.2507 0 +313 217136.79 6162822.53 -0.645951 0 +314 218245.77 6156617.62 -4.49561 1 +315 218659.37 6156928.68 -8.15802 0 +316 219189.43 6158677.37 -2.21315 0 +317 220148.47 6158721.69 -3.72889 0 +318 220772.73 6159682.18 -5.52171 0 +319 216998 6156678.67 -3.29532 0 +320 217335.69 6156901.5 -8.83633 0 +321 217207.47 6157304.36 -4.75492 0 +322 217893.02 6156389.38 -8.91868 1 +323 216903.52 6157683.23 -1.0882 0 +324 216758.28 6158180.66 -0.6744 0 +325 216970.79 6157871.32 -0.461028 0 +326 216833.04 6157434.27 -4.52014 0 +327 219999.59 6161064.36 -9.73154 0 +328 216427 6157497.91 -2.62999 0 +329 212460.01 6153275.25 -0.336601 1 +330 213706.03 6154316.88 -0.708942 0 +331 222213.69 6158707.51 -3.93689 0 +332 223160.86 6158033.04 -2.0614 0 +333 219478.48 6157595.35 -1.84872 0 +334 219807.94 6157531.63 -1.13165 0 +335 219904.22 6157970.32 -1.9009 0 +336 219544.24 6158112.57 -2.46743 0 +337 219814.67 6158425.55 -2.55085 0 +338 214128.49 6157310.98 -0.524839 1 +339 214355.13 6157199.83 -2.16899 0 +340 215730.63 6156995.82 -0.815037 0 +341 215660.38 6157342.08 -8.20107 0 +342 219923.27 6160664.29 -9.22174 0 +343 218944.05 6157681.65 -10.3006 0 +344 218949.69 6158042.73 -10.3903 0 +345 219252.99 6158167.17 -3.61992 0 +346 218588.96 6158096.85 -4.6602 0 +347 218525.01 6158468.45 -10.7273 0 +348 218880.3 6158594.36 -4.01785 0 +349 218661.75 6158816.86 -5.57251 0 +350 219063.8 6159209.64 -2.86018 0 +351 218753.13 6159118.76 -3.16893 0 +352 218811.69 6159430.71 -4.12365 0 +353 218535.25 6159667.9 -9.97155 0 +354 218850.89 6159723.67 -6.83915 0 +355 218238.27 6159498.26 -8.98717 0 +356 217626.99 6159015.27 -3.11921 0 +357 218131.22 6159132.1 -9.14887 0 +358 218325.58 6157749.21 -0.771965 0 +359 218652.8 6157545.22 -3.11197 0 +360 218651.13 6157229.56 -8.10287 0 +361 217620.89 6161108.32 -2.1825 0 +362 216857.48 6162066.25 -1.22023 0 +363 219980.3 6159982.72 -5.61352 0 +364 220304.52 6159812.33 -5.65347 0 +365 220618.89 6160332.98 -4.89302 0 +366 220978.99 6160151.82 -5.12911 0 +367 220498.25 6160590.08 -5.22388 0 +368 211941.66 6156242.87 -2.47094 0 +369 217753.59 6157457.86 -0.756878 0 +370 217692.68 6157731.7 -0.652208 0 +371 217911 6157184.44 -1.8478 0 +372 218144.22 6157396.39 -1.13119 0 +373 217961.96 6157615.77 -0.599876 0 +374 217911.98 6157945.57 -0.86021 0 +375 215136.66 6162190.77 -3.62733 0 +376 218299.76 6160093.99 -4.33448 0 +377 217964.9 6160097.44 -2.96524 0 +378 217874.13 6158330.04 -1.70051 0 +379 217952.8 6158720.5 -2.79955 0 +380 218181.72 6158495.63 -4.3994 0 +381 217553.04 6156003.38 -3.36264 1 +382 217221.84 6156013.75 -0.417111 0 +383 217411.78 6156266.15 -1.74455 0 +384 216708.49 6156788.32 -2.49886 0 +385 217213.04 6159372.44 -3.20132 0 +386 218908.42 6160852.17 -3.77635 0 +387 218626.27 6160873.02 -3.31798 0 +388 213341.99 6153273.84 -0.269388 1 +389 214121.28 6153317.96 -0.20001 1 +390 212459.31 6156243.6 -1.14157 0 +391 221671.6 6157737.09 -1.81736 0 +392 217978.5 6156825.59 -8.65325 0 +393 218984.27 6157090.09 -8.18421 0 +394 217672.48 6156580.85 -9.41826 0 +395 219080.99 6158377.46 -2.88416 0 +396 218471.7 6159031.87 -9.00116 0 +397 217558.87 6157227.68 -2.43737 0 +398 218449.45 6159936.78 -6.15918 0 +399 218506.7 6160149.79 -4.60333 0 +654 3 21 +1 69 328 326 +2 213 78 264 +3 215 108 238 +4 2 116 198 +5 8 213 264 +6 243 13 214 +7 268 183 291 +8 222 214 11 +9 48 150 302 +10 304 48 302 +11 175 253 180 +12 180 142 103 +13 216 99 48 +14 9 78 213 +15 345 395 344 +16 104 55 229 +17 348 316 83 +18 42 142 253 +19 77 134 194 +20 149 42 368 +21 16 111 181 +22 369 397 371 +23 175 195 368 +24 312 310 187 +25 47 181 146 +26 238 34 82 +27 67 147 47 +28 67 47 146 +29 56 67 160 +30 56 123 67 +31 33 198 116 +32 305 303 146 +33 180 103 63 +34 246 18 60 +35 320 321 41 +36 107 369 370 +37 295 298 296 +38 268 177 183 +39 217 99 216 +40 217 49 99 +41 262 277 93 +42 122 49 79 +43 137 191 192 +44 267 197 90 +45 161 57 162 +46 189 192 193 +47 391 307 196 +48 284 143 285 +49 289 181 47 +50 122 79 19 +51 186 267 220 +52 162 64 158 +53 314 392 20 +54 196 308 220 +55 230 151 229 +56 230 49 122 +57 55 104 100 +58 55 230 229 +59 229 151 234 +60 330 301 193 +61 151 230 163 +62 74 35 202 +63 135 236 235 +64 272 270 132 +65 233 341 265 +66 46 231 232 +67 169 270 271 +68 46 202 231 +69 270 169 72 +70 91 232 228 +71 167 184 255 +72 165 178 188 +73 273 169 275 +74 301 58 389 +75 221 333 96 +76 236 340 233 +77 246 16 181 +78 147 67 123 +79 178 194 134 +80 60 81 246 +81 292 293 185 +82 193 52 189 +83 147 123 26 +84 113 210 117 +85 123 139 54 +86 159 6 45 +87 170 88 45 +88 88 54 139 +89 213 268 291 +90 159 35 6 +91 123 56 139 +92 123 54 26 +93 147 18 289 +94 145 26 54 +95 145 170 22 +96 54 88 170 +97 266 170 45 +98 170 105 27 +99 158 64 192 +100 181 305 146 +101 266 136 105 +102 32 345 336 +103 6 40 136 +104 71 40 6 +105 248 247 212 +106 177 216 183 +107 110 70 269 +108 291 290 63 +109 145 54 170 +110 136 266 6 +111 171 45 88 +112 176 317 186 +113 6 35 71 +114 238 108 203 +115 71 74 73 +116 74 71 35 +117 64 217 193 +118 106 166 115 +119 166 68 73 +120 4 68 89 +121 73 74 115 +122 185 244 243 +123 212 247 249 +124 265 115 202 +125 68 166 182 +126 106 249 166 +127 89 182 200 +128 166 73 115 +129 69 212 328 +130 46 265 202 +131 74 202 115 +132 124 167 174 +133 43 124 174 +134 51 218 80 +135 70 38 269 +136 375 269 112 +137 112 269 61 +138 205 206 155 +139 167 128 12 +140 250 362 184 +141 28 50 293 +142 389 52 193 +143 201 110 36 +144 174 255 375 +145 167 255 174 +146 201 114 70 +147 50 29 293 +148 12 128 28 +149 72 85 270 +150 239 342 294 +151 89 200 50 +152 71 73 40 +153 340 341 233 +154 216 48 290 +155 209 323 326 +156 129 215 87 +157 319 384 144 +158 141 322 394 +159 210 209 107 +160 384 169 273 +161 382 119 98 +162 119 263 274 +163 41 384 319 +164 192 64 193 +165 248 97 247 +166 31 311 127 +167 315 204 2 +168 41 319 320 +169 308 196 179 +170 383 263 382 +171 191 161 158 +172 204 314 2 +173 200 324 113 +174 323 69 326 +175 117 356 113 +176 50 200 276 +177 323 325 69 +178 29 50 276 +179 210 370 374 +180 292 184 12 +181 349 351 396 +182 374 370 373 +183 353 355 257 +184 346 347 1 +185 83 205 350 +186 376 377 258 +187 344 242 343 +188 107 370 210 +189 254 369 371 +190 361 185 243 +191 33 127 198 +192 200 212 324 +193 393 127 310 +194 311 62 197 +195 311 187 310 +196 197 334 311 +197 334 96 333 +198 242 359 343 +199 217 64 79 +200 315 360 204 +201 63 9 291 +202 172 188 138 +203 218 179 331 +204 68 182 89 +205 241 133 44 +206 364 206 318 +207 220 75 391 +208 206 205 317 +209 62 90 197 +210 219 80 218 +211 95 350 205 +212 205 316 32 +213 211 252 367 +214 155 297 205 +215 364 318 25 +216 211 327 342 +217 186 337 335 +218 376 13 377 +219 225 157 224 +220 176 309 206 +221 225 15 157 +222 39 256 218 +223 110 201 70 +224 195 305 111 +225 268 329 131 +226 256 39 15 +227 37 80 332 +228 189 137 192 +229 44 332 241 +230 31 127 33 +231 313 36 362 +232 223 226 130 +233 286 165 173 +234 250 361 222 +235 148 313 126 +236 94 11 214 +237 126 222 148 +238 313 148 30 +239 22 170 27 +240 36 255 184 +241 122 19 163 +242 294 84 120 +243 195 111 149 +244 184 167 12 +245 278 53 277 +246 279 53 278 +247 278 168 194 +248 251 286 285 +249 387 260 386 +250 180 290 304 +251 17 92 164 +252 200 113 276 +253 211 342 252 +254 201 118 114 +255 176 308 309 +256 330 217 177 +257 150 303 390 +258 313 153 201 +259 24 287 288 +260 285 288 251 +261 3 5 283 +262 143 281 283 +263 3 281 282 +264 282 281 284 +265 178 134 21 +266 95 297 299 +267 387 13 260 +268 328 121 85 +269 191 158 192 +270 201 153 118 +271 67 146 160 +272 211 154 327 +273 154 66 262 +274 327 84 342 +275 171 159 45 +276 77 168 66 +277 5 164 92 +278 211 10 154 +279 76 14 245 +280 334 267 335 +281 129 76 245 +282 245 14 152 +283 331 196 219 +284 90 75 220 +285 394 383 141 +286 194 178 140 +287 241 101 133 +288 215 245 108 +289 140 278 194 +290 161 162 158 +291 128 167 124 +292 156 7 172 +293 165 188 172 +294 138 156 172 +295 182 166 97 +296 21 138 188 +297 238 7 34 +298 215 82 87 +299 2 198 315 +300 108 59 203 +301 207 179 256 +302 34 7 156 +303 200 248 212 +304 194 168 77 +305 88 139 171 +306 21 188 178 +307 39 218 51 +308 262 93 65 +309 25 366 365 +310 49 217 79 +311 306 307 391 +312 324 212 69 +313 186 220 176 +314 217 216 177 +315 148 222 11 +316 222 126 250 +317 252 25 365 +318 223 130 10 +319 225 226 366 +320 226 224 130 +321 225 207 256 +322 366 223 365 +323 225 224 226 +324 231 234 227 +325 231 202 234 +326 227 151 228 +327 339 229 234 +328 227 234 151 +329 49 230 55 +330 163 230 122 +331 231 228 232 +332 227 228 231 +333 232 91 235 +334 132 121 341 +335 135 23 271 +336 233 46 232 +337 202 35 234 +338 229 339 338 +339 236 233 232 +340 235 236 232 +341 236 272 340 +342 321 320 397 +343 328 72 326 +344 215 238 82 +345 7 238 203 +346 300 239 190 +347 252 363 364 +348 348 395 316 +349 347 349 261 +350 332 44 37 +351 219 196 307 +352 242 344 346 +353 199 343 359 +354 361 214 222 +355 292 12 293 +356 29 276 385 +357 377 86 258 +358 108 245 152 +359 215 129 245 +360 16 246 81 +361 246 181 289 +362 97 249 247 +363 166 249 97 +364 200 182 248 +365 182 97 248 +366 341 249 106 +367 212 249 121 +368 362 36 184 +369 292 250 184 +370 178 286 140 +371 280 251 109 +372 363 252 239 +373 365 223 367 +374 42 253 368 +375 142 180 253 +376 373 370 369 +377 254 371 372 +378 36 110 255 +379 375 255 110 +380 256 15 225 +381 218 256 179 +382 258 398 376 +383 86 357 355 +384 94 387 386 +385 351 352 257 +386 352 353 257 +387 295 296 190 +388 294 295 190 +389 376 399 13 +390 357 86 356 +391 261 380 347 +392 262 65 327 +393 168 262 66 +394 263 144 274 +395 319 263 208 +396 78 102 264 +397 233 265 46 +398 115 265 106 +399 170 266 105 +400 6 266 45 +401 220 267 90 +402 334 335 96 +403 268 213 329 +404 301 268 131 +405 112 43 375 +406 38 61 269 +407 271 270 272 +408 85 132 270 +409 135 271 236 +410 275 144 273 +411 340 272 132 +412 236 271 272 +413 271 275 169 +414 72 384 41 +415 271 23 274 +416 274 23 119 +417 271 274 275 +418 144 275 274 +419 356 385 113 +420 244 385 86 +421 277 262 168 +422 277 53 93 +423 279 278 280 +424 168 278 277 +425 280 278 140 +426 251 280 140 +427 109 279 280 +428 5 3 164 +429 24 288 283 +430 284 281 143 +431 3 283 281 +432 5 24 283 +433 283 288 143 +434 173 282 284 +435 286 173 284 +436 285 286 284 +437 140 286 251 +438 165 286 178 +439 285 143 288 +440 251 288 109 +441 109 288 287 +442 147 289 47 +443 246 289 18 +444 63 290 180 +445 216 290 183 +446 213 291 9 +447 290 291 183 +448 29 244 293 +449 250 292 185 +450 12 28 293 +451 244 185 293 +452 120 94 386 +453 239 294 190 +454 295 120 386 +455 298 295 260 +456 354 296 259 +457 95 205 297 +458 296 299 190 +459 190 299 300 +460 13 298 260 +461 296 298 259 +462 95 299 296 +463 300 297 155 +464 297 300 299 +465 300 155 363 +466 268 301 177 +467 301 131 388 +468 304 302 175 +469 175 302 390 +470 390 195 175 +471 180 304 175 +472 48 304 290 +473 111 305 181 +474 390 305 195 +475 307 241 219 +476 101 241 307 +477 306 101 307 +478 309 179 207 +479 220 308 176 +480 179 309 308 +481 309 207 318 +482 199 393 312 +483 310 312 393 +484 127 311 310 +485 62 311 31 +486 312 187 333 +487 343 312 221 +488 153 313 30 +489 36 313 201 +490 392 314 204 +491 198 393 315 +492 199 359 360 +493 337 317 205 +494 205 83 316 +495 206 317 176 +496 337 205 32 +497 309 318 206 +498 207 225 366 +499 263 319 144 +500 208 394 320 +501 208 320 319 +502 369 254 373 +503 107 209 321 +504 321 209 326 +505 237 320 394 +506 392 394 20 +507 69 325 324 +508 325 323 209 +509 210 113 324 +510 209 210 325 +511 210 324 325 +512 72 41 326 +513 321 326 41 +514 262 327 154 +515 84 327 65 +516 121 328 212 +517 72 328 85 +518 213 8 329 +519 301 330 177 +520 193 217 330 +521 196 331 179 +522 219 218 331 +523 80 219 332 +524 241 332 219 +525 334 187 311 +526 312 333 221 +527 334 333 187 +528 267 334 197 +529 267 186 335 +530 336 337 32 +531 96 335 336 +532 221 96 336 +533 186 317 337 +534 335 337 336 +535 338 339 35 +536 338 104 229 +537 234 35 339 +538 121 132 85 +539 340 132 341 +540 249 341 121 +541 265 341 106 +542 294 342 84 +543 252 342 239 +544 312 343 199 +545 344 343 221 +546 345 344 221 +547 346 344 240 +548 336 345 221 +549 32 316 395 +550 347 346 240 +551 346 358 242 +552 348 347 240 +553 210 378 117 +554 348 240 395 +555 349 348 83 +556 348 349 347 +557 349 83 351 +558 350 95 352 +559 350 352 351 +560 350 351 83 +561 257 357 396 +562 95 354 352 +563 352 354 353 +564 243 377 13 +565 355 258 86 +566 296 354 95 +567 353 354 259 +568 258 355 353 +569 385 356 86 +570 357 257 355 +571 378 379 117 +572 379 357 356 +573 396 357 261 +574 358 346 1 +575 125 359 358 +576 358 359 242 +577 360 359 125 +578 360 125 204 +579 360 315 393 +580 185 361 250 +581 214 361 243 +582 126 313 362 +583 250 126 362 +584 300 363 239 +585 364 25 252 +586 155 206 364 +587 363 155 364 +588 252 365 367 +589 366 25 318 +590 366 318 207 +591 223 366 226 +592 223 10 367 +593 211 367 10 +594 175 368 253 +595 149 368 195 +596 237 397 320 +597 107 397 369 +598 373 254 372 +599 358 374 373 +600 392 371 237 +601 125 358 372 +602 372 371 204 +603 204 125 372 +604 372 358 373 +605 374 358 1 +606 1 378 374 +607 374 378 210 +608 375 110 269 +609 174 375 43 +610 259 398 353 +611 298 399 259 +612 243 244 377 +613 86 377 244 +614 378 380 379 +615 347 380 1 +616 357 379 261 +617 356 117 379 +618 379 380 261 +619 1 380 378 +620 382 98 381 +621 263 119 382 +622 383 382 381 +623 141 383 381 +624 263 383 208 +625 169 384 72 +626 144 384 273 +627 29 385 244 +628 385 276 113 +629 120 295 294 +630 386 260 295 +631 94 214 387 +632 13 387 214 +633 389 193 301 +634 301 388 58 +635 150 390 302 +636 305 390 303 +637 391 75 306 +638 196 220 391 +639 371 392 204 +640 394 392 237 +641 127 393 198 +642 360 393 199 +643 383 394 208 +644 20 394 322 +645 344 395 240 +646 32 395 345 +647 349 396 261 +648 257 396 351 +649 371 397 237 +650 321 397 107 +651 398 259 399 +652 258 353 398 +653 13 399 298 +654 398 399 376 diff --git a/tests/data/mike21/odense_rough_quads.mesh b/tests/data/mike21/odense_rough_quads.mesh new file mode 100644 index 00000000..cbea959f --- /dev/null +++ b/tests/data/mike21/odense_rough_quads.mesh @@ -0,0 +1,1261 @@ +535 UTM-33 +1 212437.69349466471 6157513.1362837097 -2.125976238395296 1 +2 218661.80173662471 6164155.3142015915 -6.8990927853075954 2 +3 218981.17186214519 6162420.0454790518 -1.864207470158938 1 +4 217506.55474945641 6163895.7237048997 -1.701487655371454 1 +5 212827.81746849261 6156804.9152286667 -0.42102556956959569 1 +6 219432.20941088791 6161872.3470972246 -3.8025112167869328 1 +7 214916.99905651051 6161125.6014303304 -0.31831791363273149 1 +8 222217.70560862849 6157301.3746978324 -0.82208850699797453 1 +9 220232.6668709818 6156668.7930386886 -0.20000000000000001 1 +10 219617.98544602079 6162479.1347537162 -7.0287977143323888 0 +11 216978.85705232 6158769.891211817 -1.877662048874565 0 +12 221234.95576195861 6162681.4394650953 -3.5183501608921501 1 +13 214645.28860724519 6154674.1880934769 -0.39952976682489277 1 +14 220323.0851547702 6161234.2580892434 -4.1567005860097224 1 +15 217214.5788767706 6164499.4275166197 -2.6399654025703612 2 +16 212002.67110839559 6156776.0884557487 -7.4999999999999973 1 +17 214463.21197897199 6153558.2622943874 -0.2048588331974466 1 +18 219668.68834914561 6157730.9688468007 -2.0879058038921121 0 +19 222370.50485061129 6162092.8166377461 -1.905778956735575 1 +20 223747.62989629371 6158035.2920641676 -2 1 +21 211686.33268965111 6155924.175158998 -1.7122628449278881 1 +22 220744.21795485969 6157234.2703895364 -0.29991715695145937 1 +23 218448.36329230259 6156634.4662434114 -0.83621841771662286 1 +24 220286.2692721296 6161978.9313966408 -4.0833023096149388 1 +25 216205.45005422441 6155910.7477512006 -0.23331989200370329 1 +26 224082.14080952961 6161938.497960289 -1.9829115595429649 1 +27 212914.88339843001 6158366.5507264361 -0.20000000000000001 1 +28 223632.52915866821 6162430.4353205664 -2.5662075508729298 1 +29 214839.28659009541 6157880.2464879872 -2.9122061687827361 1 +30 215247.4139349288 6154189.5727774864 -0.20049442155004829 1 +31 213786.6834708091 6158391.1484665368 -0.37612694858987522 1 +32 216782.46683026489 6155689.5669169379 -0.20054189795081209 1 +33 214489.32220530661 6158007.4787637293 -1.8554401565690639 1 +34 211598.1176429909 6155186.1942998152 -0.62150827328641889 1 +35 219634.29309481519 6161580.2686005747 -7.7680750968981274 1 +36 215126.56129486891 6156467.615492098 -0.2450951782042548 1 +37 218459.84837450809 6161765.5327498792 -1.3573358699531961 1 +38 218064.49807710419 6163466.9485874008 -1.9966384238027279 1 +39 211813.04311254749 6156510.5466266358 -7.5000000000000009 1 +40 222026.7291554519 6162637.360174153 -2.4804818777772528 1 +41 214805.03880709701 6159196.8473001672 -0.20000000000000001 1 +42 212168.97101317739 6157573.7526645791 -0.82511271225857097 1 +43 223482.37154361219 6159408.1103523476 -1.995015838118064 1 +44 213519.40249668699 6156795.9973614439 -0.2057643065349089 1 +45 212921.26001021621 6157887.823885195 -0.73971510174107502 1 +46 214566.24113458549 6156705.4781966638 -0.82048653862604781 1 +47 217164.38958028459 6164017.0685854126 -0.60368978238531124 1 +48 213918.5094415514 6157164.5447746441 -0.42119524694637772 1 +49 218112.57877606209 6162395.2661937792 -0.44932783382121588 1 +50 220855.83261490919 6162535.1310766051 -3.7266784535668238 1 +51 214869.97063197251 6161766.2541998783 -0.36231017488506051 1 +52 218030.76787238239 6158659.1666285414 -2.4879838784314221 0 +53 223151.13124605251 6161140.3778755693 -2.2946402013133471 1 +54 217826.31555718361 6163323.6514497241 -0.56774044586630834 1 +55 211560.06714947711 6155687.3142843395 -2.6110884704921098 1 +56 211951.44512496301 6157057.0075504724 -4.0577053727573524 1 +57 219196.08736184819 6160966.4679136826 -3.3274804663331499 1 +58 223316.9486524841 6157425.351887593 -1.860197402886737 1 +59 215130.4491448616 6155135.8646102482 -0.20630409562540819 1 +60 222582.87099871779 6161485.5240860218 -1.9913138677775539 1 +61 216776.9036902035 6159745.9991287142 -1.55887735720428 0 +62 217364.62005071191 6155830.0781147322 -2.7210732318543691 1 +63 221671.0021800386 6160736.7435163194 -2.045179001521618 1 +64 222397.9389357809 6163313.8418594394 -8.7315053740766171 2 +65 218043.17335504029 6156600.7638633773 -10.453149717946889 1 +66 222314.64165596201 6160333.1279669469 -1.8152017700811289 1 +67 222831.4795718278 6157076.5982490042 -1.4587915942989409 1 +68 223437.25883581609 6158713.770830743 -2.0007004959192631 1 +69 217232.97556845919 6162129.7934208764 -1.54059710203605 0 +70 222976.4114849508 6159957.8897919534 -1.9032848976174039 1 +71 213257.75487927179 6157073.686932981 -1.9363128282774591 1 +72 213779.35296897861 6153077.6668180274 -0.20000000000000001 1 +73 219032.04956717169 6163515.795221556 -6.3985144719162541 0 +74 224171.61733650661 6161306.7431687396 -1.4719727357747969 1 +75 212904.62850500309 6153470.0114274649 -0.34605077556994362 1 +76 221493.9993435799 6157309.0250042137 -0.3306877181296996 1 +77 212803.80887311971 6155663.3062828677 -0.28647503403186331 1 +78 215506.80838425571 6159149.429759494 -0.23032535237784449 1 +79 214470.07748887481 6157549.1992363017 -2.1913395255263142 1 +80 216578.60497066291 6164492.7983573629 -0.62234272795404211 1 +81 219805.85988985901 6161258.6000752952 -1.5602861419113829 1 +82 215733.47798593459 6164188.9730952783 -0.20000000000000001 1 +83 214857.756379308 6155728.9272310464 -0.29899962716912287 1 +84 223652.97115209451 6163069.3431203607 -5.766479757871342 2 +85 213811.72051035901 6156396.8821933977 -0.29473389968423042 1 +86 215751.08177730261 6160059.9531132197 -0.38180175563160351 1 +87 211928.67197923001 6157352.1208906416 -0.74597374599250599 1 +88 219722.2644944104 6160938.7570733111 -2.9705046052230979 1 +89 219249.38656739381 6156304.5474551292 -0.27238985353388862 1 +90 219497.2412172266 6156614.3657674203 -0.26187561704391898 1 +91 218898.2591467973 6156180.620130213 -0.54183591154224198 1 +92 214478.22703690609 6155312.0556246862 -0.28166921658552119 1 +93 214623.1235890786 6163105.9446341963 -0.64373685084369536 1 +94 213339.14387777241 6158570.0468756119 -0.20149453516021351 1 +95 211198.22449989311 6153768.3913379237 -1.5357287283164771 1 +96 216105.75931311099 6159538.3507247651 -0.39643122570756623 1 +97 215215.02971239839 6160483.0482356241 -0.24758508688659181 1 +98 218469.83276101871 6162898.8347781282 -1.7059703582665431 1 +99 220514.29931874701 6162312.7103591114 -3.0556183870297979 1 +100 216036.4080291095 6160789.4248329829 -2.514838548343914 0 +101 221635.7137911492 6162750.3399759848 -2.3000311510763001 1 +102 212782.00238109671 6157615.8273879504 -1.816504526793862 1 +103 216312.5886757476 6162202.4039835464 -0.96650089965887087 0 +104 215425.89553398229 6162565.2199389618 -0.56769187206627969 0 +105 223728.72717270351 6160850.385133408 -1.8582752807778391 1 +106 211691.42236776941 6156239.7600242971 -7.4999999999999991 1 +107 214488.0989195492 6162270.4161551706 -0.72342447504832641 1 +108 214923.61215780411 6157030.4829009986 -0.59999999999999998 0 +109 211426.9930896021 6154493.0607115868 -1.270895672101124 1 +110 213346.14715547499 6155739.4819560414 -0.2319624762533882 1 +111 212785.41069544511 6157391.2274834206 -6.9564777719038826 1 +112 214251.953956276 6162820.5179407727 -0.81909681495051301 1 +113 220227.11918698929 6161601.6154344082 -4.4057097449997329 1 +114 213890.41008006371 6155906.258783089 -0.39254616708770929 1 +115 218897.41399242729 6161327.9671319602 -2.2218614646804959 1 +116 215363.2301553876 6163482.1363278702 -0.20000000000000001 1 +117 214854.01587742491 6158580.4818319678 -0.20000000000000001 1 +118 212727.5785620164 6156048.9858059976 -0.22806663539988631 1 +119 214103.9012844064 6158200.0802819049 -0.82577028202249103 1 +120 220914.79005001151 6160770.391912085 -2.5806152641227502 1 +121 211068.50117531279 6153123.8501268039 -0.31041715385059349 1 +122 213379.45982588091 6157440.1374700023 -6.4769561998594432 1 +123 215640.6126077302 6156138.7865083516 -0.28838113920568831 1 +124 212015.39102915241 6153080.4943799591 -0.29571209273241222 1 +125 220578.0998891955 6160950.308623815 -3.4975326359461021 1 +126 217742.8699549236 6156177.9952781871 -7.5 1 +127 213042.7861738822 6156939.3010808239 -0.29921222072901021 1 +128 213924.76865737789 6157494.6683531534 -3.2697662093467481 1 +129 219451.73308467769 6160953.0044669108 -3.475137939924128 1 +130 217894.92415081779 6156392.0579136591 -8.5367718997570936 1 +131 218210.80429471171 6164262.5500870319 -4.9395961947980478 2 +132 220659.75410229611 6163705.3249300439 -11.131344460942881 2 +133 215655.0386744827 6161108.8014117414 -2.7751659680666871 0 +134 217521.58093578031 6158712.7638634872 -1.45208097532601 0 +135 219940.26835331821 6161935.7514426317 -11 0 +136 213344.09388588299 6158133.7412807103 -0.46916317986791273 0 +137 213652.1142416294 6157467.4029115774 -2.1817023554172632 1 +138 221528.84651903849 6163509.5833947416 -10.360819511260461 2 +139 219660.77791946041 6163930.3195658177 -10.15508879122231 2 +140 215262.5046532276 6161437.5278058099 -2.0134936046307268 0 +141 216877.88037126171 6159257.9451702656 -1.8408226006881969 0 +142 219992.5597992558 6157121.0016123652 -0.31915728843924179 0 +143 212206.9556258338 6155986.5804824978 -1.4754226272088069 0 +144 214336.23589816829 6156868.4896996282 -2.4445540117244802 0 +145 214844.67029954589 6158136.1898717117 -1.1070067115227591 1 +146 217776.17440408139 6158685.9652460143 -1.811428099691514 0 +147 219830.62407420069 6157425.9852295844 -1.0007478831604699 0 +148 214801.88721445261 6156605.4435774414 -0.44959866343492177 1 +149 223150.41896834379 6163167.2476790249 -7.7805117818969904 2 +150 219325.0175065962 6162997.4649876356 -6.1201120836402163 0 +151 216406.65585965649 6160267.7119808486 -1.661784720836528 0 +152 215047.77510788589 6162819.9112662571 -0.69134570743203416 0 +153 218918.33230714209 6163712.215943425 -5.926804998343183 0 +154 219161.28982804259 6164042.8168837046 -8.5992440561180548 2 +155 219178.53353688389 6163256.6301045958 -6.3078576441816576 0 +156 218725.50231158201 6162659.44012859 -2.020402809842913 1 +157 219722.06329070649 6156631.0043656491 -0.20085777995553039 1 +158 212777.69801525449 6156426.9505173322 -0.29762486644400338 1 +159 221855.85247610419 6157305.199851023 -0.40994459086483043 1 +160 216772.78212210341 6162166.0987022109 -1.2199021573375399 0 +161 220112.61333511869 6156894.8973255269 -0.20000000000000001 0 +162 219977.3650808442 6156649.8987021688 -0.20037729557424369 1 +163 220576.1481740117 6157048.4831682267 -0.20000000000000001 1 +164 218323.59323145309 6157512.8453142019 -1.549889992491897 0 +165 218166.18472879511 6157487.8507868405 -1.379762159490594 0 +166 218008.77622613701 6157462.8562594801 -1.092099053834394 0 +167 217746.2583418742 6157443.1958619263 -0.8568545044860203 0 +168 217483.74045761139 6157423.5354643734 -0.99952617994634319 0 +169 217266.54506639921 6157500.3938099798 -0.97999885162492517 0 +170 217049.349675187 6157577.2521555871 -1.051948593021615 0 +171 216832.1542839749 6157654.1105011944 -1.064704023610503 0 +172 216614.95889276269 6157730.9688468007 -0.75440908332246415 0 +173 216456.4748080635 6157783.7968750354 -0.8149924019128415 0 +174 216297.9907233644 6157836.6249032672 -0.8479623485381147 0 +175 216112.81540303209 6157898.3500100449 -0.74648597652342996 0 +176 215927.64008269989 6157960.0751168216 -0.57691203073066077 0 +177 215742.4647623676 6158021.8002235992 -0.59263644372604518 0 +178 215516.67021929959 6157986.4117896967 -0.71983154029943297 0 +179 215290.87567623149 6157951.0233557932 -1.7664052820883851 0 +180 215065.08113316351 6157915.6349218898 -4.2390755538502543 0 +181 214856.15170363721 6157710.2937705889 -7.4801816266633043 0 +182 214873.0168171789 6157540.3410531934 -3.1536261299378512 0 +183 214889.88193072061 6157370.3883357942 -0.92322982953196742 0 +184 214906.74704426239 6157200.4356183968 -0.60000000000000009 0 +185 220221.35299246581 6159040.5547225149 -3.7017295600057221 0 +186 217778.26088729189 6156581.4211463444 -8.1692649416460714 0 +187 217513.34841954341 6156562.0784293097 -7.3806546795107382 0 +188 217313.09586970939 6156604.5319698751 -7.3992431126731999 0 +189 217112.84331987539 6156646.9855104396 -2.2414891497260729 0 +190 216912.59077004131 6156689.4390510041 -0.60985322633970185 0 +191 216712.33822020731 6156731.8925915696 -0.60000000000000009 0 +192 216549.857176019 6156766.3385729371 -0.60000000000000009 0 +193 216387.37613183071 6156800.7845543046 -0.7633149666284148 0 +194 216174.19204535711 6156862.3377060331 -0.60058683272929092 0 +195 215961.00795888339 6156923.8908577608 -0.60204283951672888 0 +196 215747.82387240979 6156985.4440094894 -0.59999999999999987 0 +197 215541.7709437584 6156996.7037323667 -0.60000000000000009 0 +198 215335.71801510701 6157007.963455244 -0.60000000000000009 0 +199 215129.6650864555 6157019.2231781213 -0.60000000000000009 0 +200 218348.547243623 6157337.1695000427 -3.936383227830635 0 +201 218373.50125579289 6157161.4936858863 -9.3206459199044307 0 +202 218398.4552679628 6156985.817871728 -9.1143720088699727 0 +203 218423.40928013271 6156810.1420575697 -2.8596889970591151 0 +204 218290.7805997578 6157796.842213233 -0.73775613801353068 0 +205 218257.9679680625 6158080.8391122641 -1.2079484543147689 0 +206 218180.25955875631 6158278.6423359532 -1.7342748130485011 0 +207 218105.51371556931 6158468.9044822473 -2.1754420447313771 0 +208 218002.9018635354 6158875.8642485561 -3.2767046812851359 0 +209 217975.03585468841 6159092.5618685707 -3.8660039155420609 0 +210 217948.17096510949 6159301.4743707404 -3.9949668748361882 0 +211 217921.30607553059 6159510.3868729109 -3.9726634857935239 0 +212 217991.5894343488 6159650.5298338272 -3.950139583864583 0 +213 218061.8727931669 6159790.6727947434 -4.1542169084219154 0 +214 218173.34888732879 6160012.9528645901 -4.4963984820046283 0 +215 218284.82498149079 6160235.2329344377 -4.1952726700677898 0 +216 218396.30107565271 6160457.5130042853 -2.9409982910421681 0 +217 218596.24764720161 6160584.7517316341 -2.8510575079758218 0 +218 218796.19421875049 6160711.9904589839 -3.3696058892897698 0 +219 218996.14079029931 6160839.2291863337 -3.8006720298280139 0 +220 219298.1223530529 6160828.6457329392 -4.361142528329415 0 +221 219400.1573442576 6160690.8235521922 -6.2466993866090359 0 +222 219502.1923354624 6160553.0013714479 -9.1402086765454431 0 +223 219604.22732666711 6160415.1791907037 -9.7546787328326943 0 +224 219706.26231787191 6160277.3570099594 -7.2404047935760198 0 +225 219808.29730907659 6160139.5348292142 -5.5014434745422314 0 +226 219910.3323002813 6160001.712648469 -4.7734829900816118 0 +227 219602.43062670081 6157916.4904696457 -2.3678929281321239 0 +228 219536.172904256 6158102.0120924907 -2.5070825252187099 0 +229 219486.91873864661 6158239.923756198 -2.4947776350786719 0 +230 219424.518659639 6158366.208395198 -2.3056015719451048 0 +231 219362.1185806313 6158492.4930341989 -2.1603951434743291 0 +232 219295.42529693621 6158627.4662167523 -2.1639939512559132 0 +233 219228.73201324101 6158762.4393993048 -2.327106626611112 0 +234 219199.1295299996 6158904.5313188639 -2.5842814041600199 0 +235 219169.52704675819 6159046.6232384238 -2.943628073655745 0 +236 219147.49314461779 6159152.3859686973 -3.0931642559039281 0 +237 219125.4592424774 6159258.1486989707 -3.3495541378331661 0 +238 219180.5380535514 6159409.6154294237 -3.8071607723900032 0 +239 219235.61686462531 6159561.0821598778 -4.4223825105294043 0 +240 219290.6956756993 6159712.5488903308 -4.8632558457831214 0 +241 219445.6048318448 6159784.8398298658 -4.586280421690784 0 +242 219600.5139879903 6159857.1307693999 -4.3230422985570804 0 +243 219755.4231441358 6159929.421708934 -4.3746017910355741 0 +244 218515.7496768377 6157544.0058188587 -1.9672162497085439 0 +245 218707.9061222224 6157575.1663235156 -4.1569601221143317 0 +246 218900.062567607 6157606.3268281724 -10.127913664310981 0 +247 219092.2190129917 6157637.4873328293 -6.6748256359561839 0 +248 219284.37545837631 6157668.647837487 -3.7196580973037978 0 +249 219476.531903761 6157699.8083421439 -2.424453859666857 0 +250 212970.9883096453 6157122.3418755904 -3.1021681751055952 0 +251 212721.57386375329 6157158.2354113674 -4.0675911337632922 0 +252 213772.96950767041 6157850.0469984636 -5.8343548155674094 0 +253 213076.013772134 6157393.3107793182 -7.4522047399777449 0 +254 213476.5353490939 6157679.2454638984 -7.2102630620572796 0 +255 214213.40601316089 6157803.7173519982 -7.4865609589598883 0 +256 214574.21249790621 6157743.01749699 -6.027296310057463 0 +257 213189.56650630941 6157687.4517140398 -1.8171461642865701 0 +258 219730.7038824418 6159181.8812294994 -4.1115253165942338 0 +259 220422.6561603297 6158040.1108517824 -1.656050745404738 0 +260 216251.01463427761 6158720.8599370839 -0.55003055264228895 0 +261 217476.60873677841 6160021.5963266762 -4.9359987839629529 0 +262 221983.58443824021 6158570.1718814811 -2.2498496973973952 0 +263 219895.01616706801 6158692.8697120342 -3.3786537857753931 0 +264 216671.9089227801 6158315.3147592396 -0.64139630867427377 0 +265 219040.18610563109 6156992.1613623686 -2.5528781815726012 0 +266 220438.31396247941 6160384.9077219637 -5.5682359683122229 0 +267 216561.44588225899 6156232.1112695523 -0.39998650317056189 0 +268 218091.15761665971 6161124.6430229312 -2.618683598720303 0 +269 217584.93179841901 6158063.6004549554 -0.78842016893244427 0 +270 220111.72228044079 6159517.3640882494 -3.097173369712046 0 +271 215587.85760215431 6158524.9141110713 -0.40000000000000002 0 +272 217369.497360821 6159356.7665556334 -2.9181492917598031 0 +273 219422.50133137929 6159119.5259550298 -3.8878169402938729 0 +274 220034.6194075605 6158279.2948453538 -2.3491507890615901 0 +275 217775.0246538698 6160603.5290648974 -2.210252991003526 0 +276 217643.0755443637 6159695.5231364369 -4.1024615417788741 0 +277 220033.90651897891 6160637.1277402937 -5.7632062662738983 0 +278 219569.28495145979 6158886.3765275041 -3.3065144340919961 0 +279 213084.6146347592 6154642.6640267586 -0.30544549948262278 0 +280 217031.00562001261 6156204.3343032226 -0.30352860306369578 0 +281 216494.3998271804 6163304.4119700482 -0.41233975387581961 0 +282 216922.55261064411 6161316.7525517195 -1.906553044508557 0 +283 218643.8122696089 6163426.3060932821 -4.0690009872797797 0 +284 215627.22311480669 6156639.5606350638 -0.59999999999999998 0 +285 219388.5365697188 6157279.3967142701 -1.951039649333387 0 +286 215979.43072685041 6158330.5423763553 -0.51717724833999867 0 +287 221658.59329439761 6158015.7214125032 -2.2893625971786551 0 +288 219676.35298167201 6158399.0593162617 -2.6710388035196639 0 +289 214558.66009520111 6157118.5830293112 -1.3249252734522809 0 +290 219677.7026819633 6159575.1968959374 -4.0876347420071548 0 +291 217091.8192335541 6158072.376924959 -0.63114290953513541 0 +292 216302.8333173671 6158185.1984435748 -0.55057674159318215 0 +293 220356.55132483281 6157497.6367745148 -0.54700800856676368 0 +294 219709.40797941489 6163330.369911341 -7.5095043423159282 0 +295 218725.09970448841 6156764.6854785336 -1.668646005052945 0 +296 218664.48194181811 6157178.3981532501 -10.787947564222319 0 +297 216136.16929044999 6156489.2713761767 -0.59999999999999987 0 +298 221108.11681657119 6159720.3001567144 -5.5580213546041248 0 +299 220320.5747338011 6162893.1884877402 -10.451405623790411 0 +300 219029.1492888905 6157378.0368293077 -6.049972830338735 0 +301 220021.8019208349 6160226.2115420299 -5.702268181391573 0 +302 220574.41903853501 6159851.5441200212 -5.4514983503122734 0 +303 218567.61082741251 6160974.2855601171 -3.153252771669973 0 +304 217892.49566445479 6158270.240853874 -1.0876805279505659 0 +305 216618.73756446951 6157960.5991556477 -0.41140248853767047 0 +306 212024.26210283281 6155569.3773327032 -1.679607602261147 0 +307 217961.65846717139 6157760.4891828373 -0.60355507464718938 0 +308 219683.97721375941 6156944.9109029891 -0.4693350801241683 0 +309 212360.22216231571 6157002.0439976947 -5.2112539881352351 0 +310 219411.6858092889 6159435.5368497614 -4.2422017944326207 0 +311 216485.0224006823 6156568.8694306323 -0.59999999999999987 0 +312 219259.7317048758 6159237.3436333202 -3.735702702354514 0 +313 212267.05825616201 6154892.7164510554 -1.014150039018386 0 +314 214269.57954578631 6156369.4927968234 -1.085811856594751 0 +315 215294.74708443211 6158205.3301972086 -0.40779397847128163 0 +316 217751.89845229531 6159102.3918463271 -3.008197922561517 0 +317 219926.59321826129 6157880.3677660944 -2.0893534428461189 0 +318 217969.8216594554 6160219.1748212567 -3.6116027839310911 0 +319 216284.62801237169 6161447.8687910233 -1.7950660426624301 0 +320 215213.68796647229 6156790.3723752396 -0.46349083686301451 0 +321 216786.86649304611 6156493.7126843296 -0.59989250875444922 0 +322 219882.7751095331 6159785.0699690646 -3.85007803261569 0 +323 217864.83205020381 6159842.9746918213 -4.5414866229626956 0 +324 219677.1512897108 6160588.7540303934 -10.11933342358922 0 +325 219508.75266543601 6158622.9982472723 -2.4767247341202632 0 +326 220898.40279792761 6163087.6750407284 -11.070614530313289 0 +327 214711.7660304681 6157451.5709948018 -2.2125733599653752 0 +328 217466.3696576216 6157690.8664731933 -0.50774267874462953 0 +329 217361.41249773311 6156337.0732118227 -2.1468772915544458 0 +330 217113.46834172509 6162615.6459531002 -0.85840968811768248 0 +331 219697.57344134909 6158162.4381150194 -2.616796502107948 0 +332 220161.3438131391 6159952.5160278277 -5.0611516646102244 0 +333 212229.48084684051 6156421.6950880392 -2.179558865898219 0 +334 219255.15227683901 6163677.4207629496 -7.2844914793484348 0 +335 220109.69201774331 6162352.238422445 -10.60460917856568 0 +336 222080.99741293251 6157798.2552971942 -2.0081324312966009 0 +337 222714.5504258174 6157708.2774756784 -1.885843650928932 0 +338 218915.2783208972 6162997.8207151042 -4.108198491057161 0 +339 219352.7888838264 6158859.0936278012 -2.8476886229864671 0 +340 216039.2593689659 6158109.7576552881 -0.54493032794631957 0 +341 221120.36563439589 6158709.9699133551 -3.826698396619781 0 +342 222839.82433902429 6159176.4147645216 -2.496098074573744 0 +343 223028.4725927517 6161929.8457980752 -5.3377571168732496 0 +344 219107.892760916 6156622.2865554541 -0.89143991441855397 0 +345 222033.6846773453 6159639.1671341797 -3.94856959585085 0 +346 222748.14540136591 6162630.3586818967 -7.8694098944372097 0 +347 213767.60636484381 6154021.5309840553 -0.58708660376772204 0 +348 217510.75173565661 6161204.1828731969 -2.1137116681384311 0 +349 217090.8290751357 6160558.6716365367 -3.7859780427182721 0 +350 223629.2464809599 6161590.1524669519 -4.7790718736939191 0 +351 212182.9034644301 6154015.9012932507 -1 0 +352 217860.19126615411 6161743.5501021203 -2 0 +353 221030.85917473861 6157941.1834050408 -2.7409013760030292 0 +354 215721.1439997048 6161824.1041584378 -1.9636140989681969 0 +355 216564.8320070022 6160836.2085227659 -3.7704610046580869 0 +356 219314.37218870001 6156884.619777536 -1.1044165032364039 0 +357 222646.9103692178 6158453.4950310988 -3.750455072674959 0 +358 223178.76821448529 6158090.9227600694 -2.0006783566741531 0 +359 221648.30339082671 6160013.8966480829 -3.4275349342715788 0 +360 213841.4155000652 6155051.901772473 -0.50016013687377203 0 +361 221515.25717654169 6158510.6380095063 -3.688038709482504 0 +362 220750.3766974101 6159235.371260494 -3.8083940600499679 0 +363 220557.08344808529 6158570.7654418657 -3.5602937768752101 0 +364 222243.52305337269 6159112.7519631386 -3.6282896524587618 0 +365 222478.80701159089 6159616.3409827612 -3.859974754048463 0 +366 221537.07572180079 6159219.8947832612 -5.0563861831551487 0 +367 215190.6406015926 6162102.7206838168 -3.4271525843341908 0 +368 221079.79026273379 6160261.4328771224 -3.9333465267461629 0 +369 218182.10144777031 6157313.8036401514 -3.5989414625647251 0 +370 218198.01816674561 6157139.7564934604 -7.4969498146431626 0 +371 218213.93488572101 6156965.709346774 -9.4837123411880704 0 +372 218229.85160469619 6156791.662200084 -7.1057069834167343 0 +373 218015.65565191771 6157290.4377802573 -2.5045588785469368 0 +374 218022.5350776983 6157118.0193010373 -4.7682389058017467 0 +375 218029.414503479 6156945.6008218182 -7.0992785134800211 0 +376 218036.29392925961 6156773.1823425991 -9.3604845700527353 0 +377 217752.6588509577 6157270.8409188082 -1.313596598263854 0 +378 217759.0593600412 6157098.4859756939 -2.4174618880199632 0 +379 217765.4598691249 6156926.1310325768 -3.8324023496210229 0 +380 217771.86037820831 6156753.7760894597 -5.5353791267664523 0 +381 217489.6620499978 6157251.2440573582 -1.8679280212731431 0 +382 217495.58364238421 6157078.9526503477 -3.6742615239309271 0 +383 217501.50523477071 6156906.6612433344 -5.2414941614665844 0 +384 217507.42682715709 6156734.369836322 -7.7832927615225369 0 +385 217275.85522706131 6157321.2214419572 -2.9659333711243798 0 +386 217285.1653877233 6157142.0490739401 -5.4603109099251856 0 +387 217294.47554838541 6156962.8767059147 -7.6576518762963186 0 +388 217303.78570904731 6156783.7043378949 -10.52648579288091 0 +389 217062.04840412471 6157391.1988265552 -2.9595657394996562 0 +390 217074.7471330624 6157205.145497527 -7.6860586737762562 0 +391 217087.44586199999 6157019.0921685006 -7.8514149068219146 0 +392 217100.14459093771 6156833.0388394687 -5.426585810284239 0 +393 216848.24158118811 6157461.176211156 -2.8195350398976502 0 +394 216864.3288784014 6157268.2419211157 -5.9800232406632574 0 +395 216880.41617561469 6157075.3076310791 -7.4264375626881867 0 +396 216896.50347282799 6156882.3733410425 -2.7747051620895542 0 +397 216634.43475825159 6157531.153595753 -3.0079660375237158 0 +398 216653.91062374061 6157331.3383447109 -5.5873971033025676 0 +399 216673.38648922939 6157131.5230936622 -6.602127119286199 0 +400 216692.86235471841 6156931.7078426182 -2.298826572149276 0 +401 216475.1512816546 6157580.3052146137 -2.3505894135657379 0 +402 216493.82775524579 6157376.8135541966 -5.1033085413848607 0 +403 216512.5042288368 6157173.3218937758 -6.3870786461542268 0 +404 216531.1807024279 6156969.8302333578 -2.0124948086909402 0 +405 216315.86780505761 6157629.4568334743 -1.9130071320763751 0 +406 216333.74488675091 6157422.2887636824 -5.1570869621547484 0 +407 216351.6219684442 6157215.1206938922 -6.1683719696169108 0 +408 216369.4990501375 6157007.9526240984 -2.773704559276553 0 +409 216125.0907314971 6157691.1475492427 -1.648592230471861 0 +410 216137.36605996211 6157483.9450884406 -4.7290313635972137 0 +411 216149.64138842709 6157276.7426276384 -5.5560036461307387 0 +412 216161.91671689221 6157069.5401668362 -2.7270265732606789 0 +413 215934.31365793649 6157752.8382650092 -1.6304511591087969 0 +414 215940.98723317319 6157545.6014131987 -5.1875955723628557 0 +415 215947.66080841 6157338.3645613864 -5.6609442904050233 0 +416 215954.33438364681 6157131.127709575 -2.5680257659827599 0 +417 215743.53658437601 6157814.5289807767 -1.5623634055466229 0 +418 215744.60840638439 6157607.2577379569 -5.215302325621594 0 +419 215745.68022839291 6157399.9864951354 -5.0460407696676297 0 +420 215746.75205040129 6157192.71525231 -2.368328236654929 0 +421 215521.69036419131 6157788.4701782307 -2.526905913082873 0 +422 215526.71050908309 6157590.5285667684 -7.0252734026122932 0 +423 215531.73065397481 6157392.5869552996 -3.415641079179931 0 +424 215536.75079886659 6157194.6453438336 -1.491229173954433 0 +425 215299.84414400661 6157762.4113756819 -5.2105015128079266 0 +426 215308.8126117817 6157573.7993955743 -4.9120405889963594 0 +427 215317.78107955671 6157385.187415462 -2.520635415335835 0 +428 215326.7495473318 6157196.5754353534 -0.61517765746617681 0 +429 215077.99792382191 6157736.3525731359 -6.7260126905945992 0 +430 215090.9147144802 6157557.070224382 -3.68837652422304 0 +431 215103.83150513869 6157377.78787563 -1.620782046797842 0 +432 215116.74829579701 6157198.5055268733 -0.60000000000000009 0 +433 218245.76832367139 6156617.6150533948 -4.5200875526946032 1 +434 218478.1591750354 6157813.9348212937 -1.305832243781119 0 +435 218665.537750313 6157831.0274293516 -2.5131092237013819 0 +436 218852.91632559049 6157848.1200374048 -6.2389412971340068 0 +437 219040.29490086809 6157865.2126454674 -10.09696001066348 0 +438 219227.6734761456 6157882.305253529 -5.1166407849886104 0 +439 219415.0520514232 6157899.3978615869 -2.8280491422274872 0 +440 218440.56867323301 6158083.863823724 -1.893768386649765 0 +441 218623.1693784036 6158086.8885351857 -4.1195840555664542 0 +442 218805.77008357391 6158089.9132466456 -7.7605206337399943 0 +443 218988.37078874451 6158092.9379581064 -10.749577239773121 0 +444 219170.97149391501 6158095.9626695663 -5.2109703045715126 0 +445 219353.57219908541 6158098.9873810299 -2.6702808503971909 0 +446 218366.92515588351 6158273.1111102737 -2.8013645970408372 0 +447 218553.59075301071 6158267.5798845924 -5.8002688414607073 0 +448 218740.2563501379 6158262.0486589158 -10.78527534260658 0 +449 218926.9219472651 6158256.5174332364 -8.3749149995024972 0 +450 219113.58754439221 6158250.986207555 -4.6432828003922149 0 +451 219300.2531415195 6158245.4549818765 -2.437206445008695 0 +452 218293.94299329349 6158454.2336126687 -3.678992935918461 0 +453 218482.37227101781 6158439.5627430892 -8.5745675699570256 0 +454 218670.80154874211 6158424.8918735124 -10.77047382648723 0 +455 218859.2308264662 6158410.2210039329 -6.6113849890319152 0 +456 219047.66010419049 6158395.5501343552 -3.8424989418889259 0 +457 219236.0893819147 6158380.8792647766 -2.224681644764138 0 +458 218220.9608307037 6158635.3561150664 -4.1767377973686441 0 +459 218411.153789025 6158611.5456015859 -10.34445299259497 0 +460 218601.34674734619 6158587.7350881109 -10.168908027042511 0 +461 218791.5397056675 6158563.9245746313 -5.8058862996077396 0 +462 218981.73266398889 6158540.1140611526 -3.0709246038200568 0 +463 219171.92562231011 6158516.3035476767 -2.2667734870056089 0 +464 218187.54806830699 6158840.3788154414 -6.1422674089779061 0 +465 218372.19427307841 6158804.8933823258 -10.80031965615777 0 +466 218556.84047785011 6158769.4079492101 -8.5484469398311145 0 +467 218741.48668262159 6158733.9225160964 -4.2942894944141594 0 +468 218926.13288739309 6158698.4370829836 -2.90476688260632 0 +469 219110.77909216451 6158662.951649867 -2.3803788133077521 0 +470 218154.13530591031 6159045.4015158182 -5.6071994109672891 0 +471 218333.23475713201 6158998.2411630666 -10.981807717018111 0 +472 218512.3342083538 6158951.080810315 -7.2347512490709098 0 +473 218691.43365957559 6158903.9204575606 -3.9958763955968859 0 +474 218870.53311079741 6158856.760104809 -2.7474777555203271 0 +475 219049.63256201919 6158809.5997520564 -2.3017657672815339 0 +476 218126.87933152239 6159244.7682204731 -6.0180282323328127 0 +477 218305.58769793529 6159188.0620702012 -10.95945893732951 0 +478 218484.29606434811 6159131.3559199357 -8.5451996895726552 0 +479 218663.00443076089 6159074.6497696713 -3.9613280567642262 0 +480 218841.71279717379 6159017.9436194012 -2.410280426077624 0 +481 219020.42116358681 6158961.237469133 -2.3334236503209178 0 +482 218099.62335713461 6159444.134925127 -5.0809461991281113 0 +483 218277.94063873851 6159377.8829773432 -9.3037650351416463 0 +484 218456.25792034229 6159311.6310295574 -8.2212160620121981 0 +485 218634.5752019464 6159245.3790817764 -4.1037319991050341 0 +486 218812.89248355039 6159179.1271339934 -2.7710340806755611 0 +487 218991.2097651542 6159112.8751862068 -2.4705608821767981 0 +488 218156.7185358158 6159579.3664245242 -4.7435210000038568 0 +489 218321.84763728271 6159508.2030152176 -8.8813351726508802 0 +490 218486.97673874971 6159437.0396059146 -7.692397340843721 0 +491 218652.10584021671 6159365.8761966117 -4.3517058155804067 0 +492 218817.2349416838 6159294.712787305 -3.1965635616904948 0 +493 218982.36404315071 6159223.5493780021 -2.720127671469498 0 +494 218213.813714497 6159714.5979239177 -4.7176474957602208 0 +495 218365.754635827 6159638.5230530929 -8.6174114762447438 0 +496 218517.6955571571 6159562.448182269 -8.2674925255664728 0 +497 218669.6364784872 6159486.3733114433 -5.2221695323817929 0 +498 218821.57739981721 6159410.2984406203 -3.783081612044974 0 +499 218973.51832114739 6159334.2235697974 -3.1566726529997049 0 +500 218317.233053932 6159926.7618024247 -5.4318694826119529 0 +501 218461.11722053529 6159840.5707402546 -9.4500864345032554 0 +502 218605.0013871385 6159754.3796780892 -10.707795068542771 0 +503 218748.88555374171 6159668.1886159256 -6.6977252490466732 0 +504 218892.76972034501 6159581.9975537583 -4.7647524801846544 0 +505 219036.6538869481 6159495.8064915929 -4.0753748090681183 0 +506 218420.65239336711 6160138.9256809289 -4.8752829498715924 0 +507 218556.47980524341 6160042.618427421 -6.5258156573515373 0 +508 218692.3072171199 6159946.3111739131 -10.210746271925339 0 +509 218828.13462899631 6159850.0039204014 -8.4623347070842865 0 +510 218963.9620408726 6159753.6966668954 -5.9782985818832506 0 +511 219099.7894527489 6159657.3894133884 -5.0233873928536896 0 +512 218524.07173280229 6160351.0895594377 -3.6104981944023722 0 +513 218651.84238995169 6160244.6661145836 -4.4696774487334769 0 +514 218779.6130471013 6160138.2426697342 -8.0038027379520713 0 +515 218907.38370425071 6160031.8192248847 -10.98619596848541 0 +516 219035.15436140029 6159925.3957800334 -8.4821238063207787 0 +517 219162.92501854981 6159818.9723351821 -6.0285684307565974 0 +518 218717.584387865 6160470.4786028117 -3.2381674267556981 0 +519 218838.92112852819 6160356.2054739837 -4.1803931431556212 0 +520 218960.2578691915 6160241.9323451612 -7.5215391451757201 0 +521 219081.59460985489 6160127.6592163397 -10.29670938569353 0 +522 219202.93135051831 6160013.3860875163 -7.8963283522859271 0 +523 219324.2680911815 6159899.1129586911 -5.7364648808063441 0 +524 218911.09704292761 6160589.8676461894 -3.4029203671570141 0 +525 219025.99986710461 6160467.7448333874 -4.8313937959134634 0 +526 219140.9026912819 6160345.6220205892 -9.0364428128207379 0 +527 219255.80551545901 6160223.4992077937 -9.6439680757103101 0 +528 219370.7083396361 6160101.3763949964 -7.1064524276013747 0 +529 219485.61116381321 6159979.2535821982 -5.3058195799571743 0 +530 219104.60969799029 6160709.2566895634 -4.0941918946732141 0 +531 219213.0786056811 6160579.2841927912 -4.8032951806416184 0 +532 219321.54751337209 6160449.3116960209 -9.2357794303201111 0 +533 219430.01642106299 6160319.3391992487 -9.8147821380895461 0 +534 219538.485328754 6160189.3667024747 -7.31191760351797 0 +535 219646.9542364449 6160059.3942057053 -5.4883192695354763 0 +724 4 25 +1 90 356 344 0 +2 95 121 124 0 +3 77 313 279 0 +4 351 95 124 0 +5 63 368 359 0 +6 355 349 282 0 +7 55 306 21 0 +8 177 340 286 0 +9 28 350 26 0 +10 143 106 21 0 +11 55 34 306 0 +12 285 356 308 0 +13 124 75 351 0 +14 262 364 366 0 +15 313 77 306 0 +16 21 306 143 0 +17 110 360 114 0 +18 279 110 77 0 +19 114 360 92 0 +20 68 342 357 0 +21 333 118 158 0 +22 143 77 118 0 +23 85 314 144 0 +24 343 346 19 0 +25 366 298 362 0 +26 333 106 143 0 +27 314 46 144 0 +28 279 313 351 0 +29 140 367 51 0 +30 367 354 104 0 +31 332 302 266 0 +32 333 39 106 0 +33 5 309 158 0 +34 126 187 329 0 +35 333 16 39 0 +36 5 251 309 0 +37 87 56 309 0 +38 262 366 361 0 +39 250 111 251 0 +40 1 42 309 0 +41 56 16 309 0 +42 111 1 251 0 +43 251 5 250 0 +44 61 349 151 0 +45 127 71 250 0 +46 62 329 280 0 +47 322 243 242 0 +48 64 346 149 0 +49 155 73 338 0 +50 44 85 48 0 +51 250 253 111 0 +52 250 71 253 0 +53 117 315 271 0 +54 253 71 122 0 +55 147 308 142 0 +56 111 253 102 0 +57 144 289 48 0 +58 127 250 5 0 +59 144 48 85 0 +60 122 257 253 0 +61 17 347 72 0 +62 353 361 341 0 +63 360 110 279 0 +64 13 17 30 0 +65 195 297 194 0 +66 30 59 13 0 +67 79 289 327 0 +68 260 271 286 0 +69 151 355 100 0 +70 314 83 46 0 +71 271 177 286 0 +72 260 292 264 0 +73 291 269 134 0 +74 148 36 320 0 +75 313 109 351 0 +76 13 360 347 0 +77 297 25 267 0 +78 277 301 266 0 +79 311 191 192 0 +80 320 199 108 0 +81 307 269 328 0 +82 329 62 126 0 +83 146 316 134 0 +84 329 189 280 0 +85 134 304 146 0 +86 329 188 189 0 +87 188 329 187 0 +88 310 290 241 0 +89 284 320 36 0 +90 123 284 36 0 +91 90 344 89 0 +92 190 191 321 0 +93 108 148 320 0 +94 320 198 199 0 +95 177 176 340 0 +96 196 197 284 0 +97 320 284 197 0 +98 120 125 266 0 +99 61 261 349 0 +100 46 289 144 0 +101 353 22 76 0 +102 108 46 148 0 +103 184 289 108 0 +104 331 288 229 0 +105 321 189 190 0 +106 46 108 289 0 +107 292 286 340 0 +108 193 311 192 0 +109 268 37 352 0 +110 193 194 297 0 +111 193 297 311 0 +112 348 282 349 0 +113 305 172 171 0 +114 196 284 195 0 +115 261 323 318 0 +116 277 88 324 0 +117 274 288 331 0 +118 10 294 150 0 +119 262 357 364 0 +120 195 284 297 0 +121 311 321 191 0 +122 182 327 183 0 +123 187 126 186 0 +124 83 114 92 0 +125 360 279 347 0 +126 167 307 328 0 +127 118 333 143 0 +128 42 87 309 0 +129 253 257 102 0 +130 259 317 293 0 +131 254 122 137 0 +132 221 324 88 0 +133 136 45 257 0 +134 257 45 102 0 +135 257 254 136 0 +136 252 254 137 0 +137 122 254 257 0 +138 254 252 136 0 +139 137 128 252 0 +140 341 366 362 0 +141 255 128 79 0 +142 219 303 218 0 +143 331 317 274 0 +144 327 256 79 0 +145 16 333 309 0 +146 256 327 181 0 +147 33 255 256 0 +148 256 255 79 0 +149 29 33 256 0 +150 29 256 181 0 +151 336 287 76 0 +152 255 119 252 0 +153 215 216 318 0 +154 128 255 252 0 +155 181 327 182 0 +156 145 29 180 0 +157 94 27 136 0 +158 136 27 45 0 +159 300 246 245 0 +160 31 252 119 0 +161 255 33 119 0 +162 136 252 31 0 +163 230 325 231 0 +164 31 94 136 0 +165 112 107 152 0 +166 43 70 342 0 +167 310 312 273 0 +168 309 333 158 0 +169 23 91 295 0 +170 343 53 350 0 +171 306 34 313 0 +172 323 261 276 0 +173 292 305 264 0 +174 315 179 178 0 +175 41 117 78 0 +176 311 267 321 0 +177 112 152 93 0 +178 107 367 152 0 +179 7 140 51 0 +180 107 51 367 0 +181 275 261 318 0 +182 93 152 116 0 +183 133 7 97 0 +184 48 289 79 0 +185 297 123 25 0 +186 357 337 358 0 +187 315 180 179 0 +188 336 357 262 0 +189 215 318 214 0 +190 229 288 230 0 +191 174 173 305 0 +192 197 198 320 0 +193 327 184 183 0 +194 174 292 175 0 +195 315 177 271 0 +196 117 145 315 0 +197 292 340 175 0 +198 78 260 96 0 +199 32 280 267 0 +200 132 139 294 0 +201 305 292 174 0 +202 132 294 299 0 +203 291 171 170 0 +204 297 267 311 0 +205 264 305 291 0 +206 147 317 18 0 +207 326 50 12 0 +208 291 170 328 0 +209 173 172 305 0 +210 260 141 96 0 +211 134 272 11 0 +212 291 305 171 0 +213 264 291 11 0 +214 261 61 272 0 +215 168 328 169 0 +216 270 332 322 0 +217 319 355 282 0 +218 96 141 61 0 +219 319 354 133 0 +220 140 7 133 0 +221 100 133 97 0 +222 100 86 151 0 +223 100 97 86 0 +224 319 100 355 0 +225 104 103 281 0 +226 116 152 104 0 +227 103 160 330 0 +228 281 82 116 0 +229 133 354 140 0 +230 351 75 279 0 +231 133 100 319 0 +232 140 354 367 0 +233 330 160 69 0 +234 103 319 160 0 +235 348 349 275 0 +236 272 61 141 0 +237 86 96 151 0 +238 47 281 54 0 +239 58 358 337 0 +240 82 281 80 0 +241 15 4 131 0 +242 95 351 109 0 +243 365 66 345 0 +244 263 363 185 0 +245 330 281 103 0 +246 261 275 349 0 +247 96 61 151 0 +248 362 363 341 0 +249 210 316 209 0 +250 177 315 178 0 +251 273 339 278 0 +252 363 362 185 0 +253 167 166 307 0 +254 302 362 298 0 +255 186 130 65 0 +256 130 186 126 0 +257 274 263 288 0 +258 332 301 226 0 +259 162 308 157 0 +260 38 98 283 0 +261 204 307 165 0 +262 325 263 278 0 +263 164 200 244 0 +264 258 185 270 0 +265 75 72 347 0 +266 164 204 165 0 +267 69 282 348 0 +268 307 166 165 0 +269 202 203 295 0 +270 360 13 92 0 +271 265 296 295 0 +272 362 270 185 0 +273 302 298 368 0 +274 247 246 300 0 +275 296 200 201 0 +276 296 244 200 0 +277 282 69 160 0 +278 295 296 202 0 +279 201 202 296 0 +280 286 292 260 0 +281 203 23 295 0 +282 302 270 362 0 +283 85 114 314 0 +284 223 324 222 0 +285 208 209 316 0 +286 208 146 52 0 +287 49 330 69 0 +288 207 52 146 0 +289 307 304 269 0 +290 13 347 17 0 +291 54 281 330 0 +292 272 316 211 0 +293 339 233 232 0 +294 75 347 279 0 +295 211 316 210 0 +296 318 323 214 0 +297 332 270 302 0 +298 323 212 213 0 +299 37 303 115 0 +300 206 304 205 0 +301 339 235 234 0 +302 268 348 275 0 +303 304 134 269 0 +304 175 340 176 0 +305 312 236 235 0 +306 349 355 151 0 +307 312 235 273 0 +308 310 239 238 0 +309 3 338 156 0 +310 331 228 227 0 +311 272 141 11 0 +312 180 315 145 0 +313 205 304 307 0 +314 214 323 213 0 +315 295 344 265 0 +316 317 259 274 0 +317 285 248 300 0 +318 189 321 280 0 +319 265 356 285 0 +320 291 328 269 0 +321 358 58 20 0 +322 162 161 308 0 +323 248 285 249 0 +324 147 249 285 0 +325 163 293 142 0 +326 308 147 285 0 +327 161 142 308 0 +328 163 142 161 0 +329 162 9 161 0 +330 11 260 264 0 +331 22 293 163 0 +332 267 280 321 0 +333 262 287 336 0 +334 83 314 114 0 +335 359 66 63 0 +336 163 161 9 0 +337 353 341 363 0 +338 184 327 289 0 +339 8 337 336 0 +340 337 67 58 0 +341 167 328 168 0 +342 8 336 159 0 +343 359 366 345 0 +344 293 147 142 0 +345 8 67 337 0 +346 337 357 336 0 +347 325 278 339 0 +348 361 287 262 0 +349 339 273 235 0 +350 277 266 125 0 +351 123 297 284 0 +352 278 258 273 0 +353 312 237 236 0 +354 310 238 312 0 +355 207 146 304 0 +356 239 310 240 0 +357 339 232 325 0 +358 258 310 273 0 +359 325 230 288 0 +360 1 309 251 0 +361 260 11 141 0 +362 331 227 317 0 +363 274 363 263 0 +364 18 249 147 0 +365 358 68 357 0 +366 342 68 43 0 +367 317 227 18 0 +368 359 345 66 0 +369 322 242 290 0 +370 353 287 361 0 +371 317 147 293 0 +372 263 185 258 0 +373 366 359 298 0 +374 352 37 49 0 +375 234 233 339 0 +376 342 364 357 0 +377 361 366 341 0 +378 356 90 308 0 +379 103 104 354 0 +380 290 310 258 0 +381 216 268 275 0 +382 363 259 353 0 +383 216 217 303 0 +384 353 76 287 0 +385 353 293 22 0 +386 318 216 275 0 +387 268 216 303 0 +388 331 229 228 0 +389 115 219 57 0 +390 115 303 219 0 +391 363 274 259 0 +392 217 218 303 0 +393 272 134 316 0 +394 303 37 268 0 +395 129 221 88 0 +396 258 278 263 0 +397 325 232 231 0 +398 223 224 324 0 +399 11 291 134 0 +400 221 222 324 0 +401 57 220 129 0 +402 300 245 296 0 +403 261 272 276 0 +404 117 271 78 0 +405 220 221 129 0 +406 281 47 80 0 +407 206 207 304 0 +408 2 283 153 0 +409 157 308 90 0 +410 300 248 247 0 +411 77 143 306 0 +412 69 352 49 0 +413 338 283 98 0 +414 238 237 312 0 +415 285 300 265 0 +416 160 319 282 0 +417 38 131 4 0 +418 263 325 288 0 +419 24 99 335 0 +420 2 131 38 0 +421 38 283 2 0 +422 334 73 155 0 +423 156 338 98 0 +424 49 54 330 0 +425 150 155 338 0 +426 150 3 10 0 +427 6 10 3 0 +428 135 10 6 0 +429 344 91 89 0 +430 155 150 294 0 +431 73 334 153 0 +432 73 153 283 0 +433 334 155 294 0 +434 334 154 153 0 +435 283 338 73 0 +436 153 154 2 0 +437 10 335 299 0 +438 150 338 3 0 +439 258 270 290 0 +440 346 28 149 0 +441 6 35 135 0 +442 276 211 323 0 +443 336 76 159 0 +444 260 78 271 0 +445 226 301 225 0 +446 322 226 243 0 +447 241 290 242 0 +448 224 301 277 0 +449 35 81 113 0 +450 81 88 14 0 +451 62 280 32 0 +452 88 277 14 0 +453 324 224 277 0 +454 113 81 14 0 +455 125 14 277 0 +456 25 32 267 0 +457 290 270 322 0 +458 266 301 332 0 +459 34 109 313 0 +460 302 368 266 0 +461 359 368 298 0 +462 132 299 326 0 +463 350 53 105 0 +464 319 103 354 0 +465 74 350 105 0 +466 91 344 295 0 +467 299 335 99 0 +468 350 74 26 0 +469 353 259 293 0 +470 104 281 116 0 +471 310 241 240 0 +472 307 204 205 0 +473 135 113 24 0 +474 135 35 113 0 +475 10 135 335 0 +476 211 212 323 0 +477 272 211 276 0 +478 50 299 99 0 +479 69 348 352 0 +480 334 294 139 0 +481 326 299 50 0 +482 296 265 300 0 +483 294 10 299 0 +484 326 138 132 0 +485 265 344 356 0 +486 24 335 135 0 +487 346 40 19 0 +488 328 170 169 0 +489 368 63 120 0 +490 343 19 60 0 +491 226 322 332 0 +492 28 346 343 0 +493 138 101 64 0 +494 101 138 12 0 +495 139 154 334 0 +496 64 101 40 0 +497 40 346 64 0 +498 138 326 12 0 +499 28 84 149 0 +500 53 343 60 0 +501 366 364 345 0 +502 244 296 245 0 +503 343 350 28 0 +504 68 358 20 0 +505 342 70 365 0 +506 301 224 225 0 +507 365 345 364 0 +508 268 352 348 0 +509 66 365 70 0 +510 316 146 208 0 +511 367 104 152 0 +512 365 364 342 0 +513 368 120 266 0 +514 164 165 369 200 +515 200 369 370 201 +516 201 370 371 202 +517 202 371 372 203 +518 203 372 433 23 +519 165 166 373 369 +520 369 373 374 370 +521 370 374 375 371 +522 371 375 376 372 +523 372 376 65 433 +524 166 167 377 373 +525 373 377 378 374 +526 374 378 379 375 +527 375 379 380 376 +528 376 380 186 65 +529 167 168 381 377 +530 377 381 382 378 +531 378 382 383 379 +532 379 383 384 380 +533 380 384 187 186 +534 168 169 385 381 +535 381 385 386 382 +536 382 386 387 383 +537 383 387 388 384 +538 384 388 188 187 +539 169 170 389 385 +540 385 389 390 386 +541 386 390 391 387 +542 387 391 392 388 +543 388 392 189 188 +544 170 171 393 389 +545 389 393 394 390 +546 390 394 395 391 +547 391 395 396 392 +548 392 396 190 189 +549 171 172 397 393 +550 393 397 398 394 +551 394 398 399 395 +552 395 399 400 396 +553 396 400 191 190 +554 172 173 401 397 +555 397 401 402 398 +556 398 402 403 399 +557 399 403 404 400 +558 400 404 192 191 +559 173 174 405 401 +560 401 405 406 402 +561 402 406 407 403 +562 403 407 408 404 +563 404 408 193 192 +564 174 175 409 405 +565 405 409 410 406 +566 406 410 411 407 +567 407 411 412 408 +568 408 412 194 193 +569 175 176 413 409 +570 409 413 414 410 +571 410 414 415 411 +572 411 415 416 412 +573 412 416 195 194 +574 176 177 417 413 +575 413 417 418 414 +576 414 418 419 415 +577 415 419 420 416 +578 416 420 196 195 +579 177 178 421 417 +580 417 421 422 418 +581 418 422 423 419 +582 419 423 424 420 +583 420 424 197 196 +584 178 179 425 421 +585 421 425 426 422 +586 422 426 427 423 +587 423 427 428 424 +588 424 428 198 197 +589 179 180 429 425 +590 425 429 430 426 +591 426 430 431 427 +592 427 431 432 428 +593 428 432 199 198 +594 180 29 181 429 +595 429 181 182 430 +596 430 182 183 431 +597 431 183 184 432 +598 432 184 108 199 +599 164 244 434 204 +600 244 245 435 434 +601 245 246 436 435 +602 246 247 437 436 +603 247 248 438 437 +604 248 249 439 438 +605 249 18 227 439 +606 204 434 440 205 +607 434 435 441 440 +608 435 436 442 441 +609 436 437 443 442 +610 437 438 444 443 +611 438 439 445 444 +612 439 227 228 445 +613 205 440 446 206 +614 440 441 447 446 +615 441 442 448 447 +616 442 443 449 448 +617 443 444 450 449 +618 444 445 451 450 +619 445 228 229 451 +620 206 446 452 207 +621 446 447 453 452 +622 447 448 454 453 +623 448 449 455 454 +624 449 450 456 455 +625 450 451 457 456 +626 451 229 230 457 +627 207 452 458 52 +628 452 453 459 458 +629 453 454 460 459 +630 454 455 461 460 +631 455 456 462 461 +632 456 457 463 462 +633 457 230 231 463 +634 52 458 464 208 +635 458 459 465 464 +636 459 460 466 465 +637 460 461 467 466 +638 461 462 468 467 +639 462 463 469 468 +640 463 231 232 469 +641 208 464 470 209 +642 464 465 471 470 +643 465 466 472 471 +644 466 467 473 472 +645 467 468 474 473 +646 468 469 475 474 +647 469 232 233 475 +648 209 470 476 210 +649 470 471 477 476 +650 471 472 478 477 +651 472 473 479 478 +652 473 474 480 479 +653 474 475 481 480 +654 475 233 234 481 +655 210 476 482 211 +656 476 477 483 482 +657 477 478 484 483 +658 478 479 485 484 +659 479 480 486 485 +660 480 481 487 486 +661 481 234 235 487 +662 211 482 488 212 +663 482 483 489 488 +664 483 484 490 489 +665 484 485 491 490 +666 485 486 492 491 +667 486 487 493 492 +668 487 235 236 493 +669 212 488 494 213 +670 488 489 495 494 +671 489 490 496 495 +672 490 491 497 496 +673 491 492 498 497 +674 492 493 499 498 +675 493 236 237 499 +676 213 494 500 214 +677 494 495 501 500 +678 495 496 502 501 +679 496 497 503 502 +680 497 498 504 503 +681 498 499 505 504 +682 499 237 238 505 +683 214 500 506 215 +684 500 501 507 506 +685 501 502 508 507 +686 502 503 509 508 +687 503 504 510 509 +688 504 505 511 510 +689 505 238 239 511 +690 215 506 512 216 +691 506 507 513 512 +692 507 508 514 513 +693 508 509 515 514 +694 509 510 516 515 +695 510 511 517 516 +696 511 239 240 517 +697 216 512 518 217 +698 512 513 519 518 +699 513 514 520 519 +700 514 515 521 520 +701 515 516 522 521 +702 516 517 523 522 +703 517 240 241 523 +704 217 518 524 218 +705 518 519 525 524 +706 519 520 526 525 +707 520 521 527 526 +708 521 522 528 527 +709 522 523 529 528 +710 523 241 242 529 +711 218 524 530 219 +712 524 525 531 530 +713 525 526 532 531 +714 526 527 533 532 +715 527 528 534 533 +716 528 529 535 534 +717 529 242 243 535 +718 219 530 220 57 +719 530 531 221 220 +720 531 532 222 221 +721 532 533 223 222 +722 533 534 224 223 +723 534 535 225 224 +724 535 243 226 225 diff --git a/tests/data/mike21/small.mesh b/tests/data/mike21/small.mesh new file mode 100644 index 00000000..bcac4fe5 --- /dev/null +++ b/tests/data/mike21/small.mesh @@ -0,0 +1,23 @@ +100079 1000 12 LONG/LAT + 1 0.464 0.418 -1.00 1 + 2 0.469 0.639 -2.00 1 + 3 0.624 0.354 -1.00 1 + 4 0.666 0.548 -4.13 0 + 5 0.659 0.697 -1.81 1 + 6 0.810 0.442 -3.00 0 + 7 0.801 0.283 -1.00 1 + 8 0.874 0.603 -6.00 0 + 9 0.811 0.777 -2.77 1 +10 0.993 0.436 -2.79 1 +11 1.060 0.757 -2.00 1 +12 1.116 0.573 -4.50 1 +9 4 25 +1 11 8 10 12 +2 9 8 11 +3 10 8 6 +4 6 7 10 +5 6 8 4 +6 4 8 9 5 +7 7 6 4 3 +8 2 1 3 4 +9 4 5 2 From 8ee3d051375a31325ac83e70ea7478c8d8a52efe Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 22 Nov 2023 10:34:22 +0100 Subject: [PATCH 05/25] add tests --- tests/CMakeLists.txt | 1 + tests/test_mike21.cpp | 134 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 tests/test_mike21.cpp diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 06cae299..9cd44a31 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -74,6 +74,7 @@ SET(TESTS test_selafin.cpp test_esri_tin.cpp test_h2i.cpp + test_mike21.cpp ) IF(BUILD_PLY) diff --git a/tests/test_mike21.cpp b/tests/test_mike21.cpp new file mode 100644 index 00000000..5463ae14 --- /dev/null +++ b/tests/test_mike21.cpp @@ -0,0 +1,134 @@ +/* + MDAL - Mesh Data Abstraction Library (MIT License) + Copyright (C) 2018 Peter Petrik (zilolv at gmail dot com) +*/ +#include "gtest/gtest.h" + +//mdal +#include "mdal.h" +#include "mdal_testutils.hpp" +#include "mdal_utils.hpp" + +#include + +TEST( MeshMike21Test, Driver ) +{ + MDAL_DriverH driver = MDAL_driverFromName( "Mike21" ); + EXPECT_EQ( strcmp( MDAL_DR_filters( driver ), "*.mesh" ), 0 ); + EXPECT_TRUE( MDAL_DR_meshLoadCapability( driver ) ); + EXPECT_TRUE( MDAL_DR_saveMeshCapability( driver ) ); + EXPECT_EQ( strcmp( MDAL_DR_saveMeshSuffix( driver ), "mesh" ), 0 ); + EXPECT_EQ( MDAL_DR_faceVerticesMaximumCount( driver ), 6 ); +} + +TEST( MeshMike21Test, MissingFile ) +{ + MDAL_MeshH m = MDAL_LoadMesh( "non/existent/path.mesh" ); + EXPECT_EQ( nullptr, m ); + MDAL_Status s = MDAL_LastStatus(); + EXPECT_EQ( MDAL_Status::Err_FileNotFound, s ); +} + +TEST( MeshMike21Test, WrongFile ) +{ + std::string path = test_file( "/mike21/not_a_mesh_file.mesh" ); + MDAL_MeshH m = MDAL_LoadMesh( path.c_str() ); + EXPECT_EQ( m, nullptr ); + MDAL_Status s = MDAL_LastStatus(); + EXPECT_EQ( MDAL_Status::Err_UnknownFormat, s ); +} + +TEST( MeshMike21Test, ReadSmallMesh ) +{ + std::string path = test_file( "/mike21/small.mesh" ); + EXPECT_EQ( MDAL_MeshNames( path.c_str() ), "Mike21:\"" + path + "\"" ); + MDAL_MeshH m = MDAL_LoadMesh( path.c_str() ); + EXPECT_NE( m, nullptr ); + MDAL_Status s = MDAL_LastStatus(); + EXPECT_EQ( MDAL_Status::None, s ); + + int v_count = MDAL_M_vertexCount( m ); + EXPECT_EQ( v_count, 12 ); + int f_count = MDAL_M_faceCount( m ); + EXPECT_EQ( f_count, 9 ); + int e_count = MDAL_M_edgeCount( m ); + EXPECT_EQ( 0, e_count ); + + EXPECT_STREQ( MDAL_M_projection( m ), "LONG/LAT"); + + EXPECT_EQ( MDAL_M_faceVerticesMaximumCount( m ), 4 ); + + EXPECT_EQ( MDAL_M_datasetGroupCount( m ), 2 ); + EXPECT_STREQ( MDAL_G_name( MDAL_M_datasetGroup( m, 0 ) ), "VertexType"); + EXPECT_STREQ( MDAL_G_name( MDAL_M_datasetGroup( m, 1 ) ), "Bed Elevation"); +} + +TEST( MeshMike21Test, ReadOdenseRoughQuads ) +{ + std::string path = test_file( "/mike21/odense_rough_quads.mesh" ); + EXPECT_EQ( MDAL_MeshNames( path.c_str() ), "Mike21:\"" + path + "\"" ); + MDAL_MeshH m = MDAL_LoadMesh( path.c_str() ); + EXPECT_NE( m, nullptr ); + MDAL_Status s = MDAL_LastStatus(); + // the file have a warning issue + EXPECT_EQ( s, MDAL_Status::Warn_ElementWithInvalidNode ); + + int v_count = MDAL_M_vertexCount( m ); + EXPECT_EQ( v_count, 535 ); + int f_count = MDAL_M_faceCount( m ); + EXPECT_EQ( f_count, 724 ); + int e_count = MDAL_M_edgeCount( m ); + EXPECT_EQ( 0, e_count ); + + EXPECT_STREQ(MDAL_M_projection( m ), "UTM-33"); + + EXPECT_EQ( MDAL_M_faceVerticesMaximumCount( m ), 4 ); + + EXPECT_EQ( MDAL_M_datasetGroupCount( m ), 2 ); + EXPECT_STREQ( MDAL_G_name( MDAL_M_datasetGroup( m, 0 ) ), "VertexType"); + EXPECT_STREQ( MDAL_G_name( MDAL_M_datasetGroup( m, 1 ) ), "Bed Elevation"); +} + +TEST( MeshMike21Test, ReadOdenseRough ) +{ + std::string path = test_file( "/mike21/odense_rough.mesh" ); + EXPECT_EQ( MDAL_MeshNames( path.c_str() ), "Mike21:\"" + path + "\"" ); + MDAL_MeshH m = MDAL_LoadMesh( path.c_str() ); + EXPECT_NE( m, nullptr ); + MDAL_Status s = MDAL_LastStatus(); + EXPECT_EQ( MDAL_Status::None, s ); + + int v_count = MDAL_M_vertexCount( m ); + EXPECT_EQ( v_count, 399 ); + int f_count = MDAL_M_faceCount( m ); + EXPECT_EQ( f_count, 654 ); + int e_count = MDAL_M_edgeCount( m ); + EXPECT_EQ( 0, e_count ); + + EXPECT_STREQ( MDAL_M_projection( m ), "UTM-33" ); + + EXPECT_EQ( MDAL_M_faceVerticesMaximumCount( m ), 3 ); + + EXPECT_EQ( MDAL_M_datasetGroupCount( m ), 2 ); + EXPECT_STREQ( MDAL_G_name( MDAL_M_datasetGroup( m, 0 ) ), "VertexType" ); + EXPECT_STREQ( MDAL_G_name( MDAL_M_datasetGroup( m, 1 ) ), "Bed Elevation" ); +} + +TEST( Mesh2DMTest, Save2DMeshToFile ) +{ + saveAndCompareMesh( + test_file( "/mike21/odense_rough_comparison.mesh" ), + tmp_file( "/odense_rough_saved.mesh" ), + "Mike21" + ); +} + +int main( int argc, char **argv ) +{ + testing::InitGoogleTest( &argc, argv ); + init_test(); + int ret = RUN_ALL_TESTS(); + finalize_test(); + return ret; +} + From 5bbb29a94e8e5712208ed64e7891abc85f3bd635 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 22 Nov 2023 10:59:48 +0100 Subject: [PATCH 06/25] fix copy typo --- tests/test_mike21.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_mike21.cpp b/tests/test_mike21.cpp index 5463ae14..1701c57e 100644 --- a/tests/test_mike21.cpp +++ b/tests/test_mike21.cpp @@ -1,7 +1,8 @@ /* MDAL - Mesh Data Abstraction Library (MIT License) - Copyright (C) 2018 Peter Petrik (zilolv at gmail dot com) + Copyright (C) 2023 Lutra Consulting Ltd. */ + #include "gtest/gtest.h" //mdal From da167c62a283ca70a415fee67c74227fdda465d6 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 22 Nov 2023 11:00:00 +0100 Subject: [PATCH 07/25] fix multiline comments --- mdal/frmts/mdal_mike21.hpp | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/mdal/frmts/mdal_mike21.hpp b/mdal/frmts/mdal_mike21.hpp index c58d8f23..9219d2cd 100644 --- a/mdal/frmts/mdal_mike21.hpp +++ b/mdal/frmts/mdal_mike21.hpp @@ -26,22 +26,27 @@ namespace MDAL ); ~MeshMike21() override; - - //! Mike21 may supports gaps in the vertex indexing, - //! but we use continuos array of vertices in MDAL - //! \param vertexID internal index/ID of the vertex that native format uses - //! \returns index of the vertex in the continuous array of vertices we returned by readVertices(). - //! For invalid vertexID it is returned index that is out of vertices array bounds. + /** + * Mike21 may supports gaps in the vertex indexing, + * but we use continuos array of vertices in MDAL + * \param vertexID internal index/ID of the vertex that native format uses + * \returns index of the vertex in the continuous array of vertices we returned by readVertices(). + * For invalid vertexID it is returned index that is out of vertices array bounds. + */ virtual size_t vertexIndex( size_t vertexID ) const; - //! Returns maximum vertex ID. - //! For meshes without gaps in vertex indexing, it is vertex count - 1 + /** + * Returns maximum vertex ID. + * For meshes without gaps in vertex indexing, it is vertex count - 1 + */ virtual size_t maximumVertexId() const; private: - //! Mike21 might supports "gaps" in the mesh indexing - //! Store only the indices that have different index and ID - //! https://github.com/lutraconsulting/MDAL/issues/51 + /** + * Mike21 might supports "gaps" in the mesh indexing + * Store only the indices that have different index and ID + * https://github.com/lutraconsulting/MDAL/issues/51 + */ std::map mVertexIDtoIndex; }; From 05625c750a5e5eaf0419d5fb8f4872cc460772e5 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 22 Nov 2023 11:08:56 +0100 Subject: [PATCH 08/25] add regex result size checks to prevent crashes --- mdal/frmts/mdal_mike21.cpp | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/mdal/frmts/mdal_mike21.cpp b/mdal/frmts/mdal_mike21.cpp index 2a60d2f2..2c141d61 100644 --- a/mdal/frmts/mdal_mike21.cpp +++ b/mdal/frmts/mdal_mike21.cpp @@ -135,13 +135,19 @@ size_t MDAL::DriverMike21::getVertexCount( const std::string &line ) { auto matchResults = std::smatch{}; if ( std::regex_search( line, matchResults, mRegexHeader2012 ) ) - { - return std::stoi( matchResults[3].str() ); + { + if (matchResults.size() > 4) + { + return std::stoi( matchResults[3].str() ); + } } if ( std::regex_search( line, matchResults, mRegexHeader2011 ) ) - { - return std::stoi( matchResults[1].str() ); + { + if (matchResults.size() > 2) + { + return std::stoi( matchResults[1].str() ); + } } return 0; @@ -151,13 +157,19 @@ std::string MDAL::DriverMike21::getCrs( const std::string &line ) { auto matchResults = std::smatch{}; if ( std::regex_search( line, matchResults, mRegexHeader2012 ) ) - { - return matchResults[4].str(); + { + if (matchResults.size() > 5) + { + return matchResults[4].str(); + } } if ( std::regex_search( line, matchResults, mRegexHeader2011 ) ) - { - return matchResults[2].str(); + { + if (matchResults.size() > 3) + { + return matchResults[2].str(); + } } return ""; From 495e7842d304900dc3b8aaf110a764f8da02f310 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 22 Nov 2023 11:32:43 +0100 Subject: [PATCH 09/25] add two more validity checks --- mdal/frmts/mdal_mike21.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/mdal/frmts/mdal_mike21.cpp b/mdal/frmts/mdal_mike21.cpp index 2c141d61..7b57d933 100644 --- a/mdal/frmts/mdal_mike21.cpp +++ b/mdal/frmts/mdal_mike21.cpp @@ -215,11 +215,23 @@ std::unique_ptr MDAL::DriverMike21::load( const std::string &meshFil return nullptr; } } + else + { + MDAL::Log::error( MDAL_Status::Err_InvalidData, name(), "element header not in valid format." ); + return nullptr; + } } lineNumber++; } + // number of lines in file does not match number of vertices and faces specifed in first and element line + if (lineNumber > 2 + vertexCount + faceCount) + { + MDAL::Log::error( MDAL_Status::Err_InvalidData, name(), "Number of lines in file does not fit with number of vertexes and faces specified." ); + return nullptr; + } + in.clear(); in.seekg( 0, std::ios::beg ); From e81bfb0b0f541776175672a35e1ff54d05840a6b Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 22 Nov 2023 11:33:24 +0100 Subject: [PATCH 10/25] more tests for invalid files with wrong data specification --- .../mike21/wrong_element_line_format.mesh | 23 ++++++++++++ tests/data/mike21/wrong_element_type.mesh | 23 ++++++++++++ tests/data/mike21/wrong_face_count.mesh | 25 +++++++++++++ tests/data/mike21/wrong_vertex_count.mesh | 25 +++++++++++++ tests/test_mike21.cpp | 36 +++++++++++++++++++ 5 files changed, 132 insertions(+) create mode 100644 tests/data/mike21/wrong_element_line_format.mesh create mode 100644 tests/data/mike21/wrong_element_type.mesh create mode 100644 tests/data/mike21/wrong_face_count.mesh create mode 100644 tests/data/mike21/wrong_vertex_count.mesh diff --git a/tests/data/mike21/wrong_element_line_format.mesh b/tests/data/mike21/wrong_element_line_format.mesh new file mode 100644 index 00000000..75715794 --- /dev/null +++ b/tests/data/mike21/wrong_element_line_format.mesh @@ -0,0 +1,23 @@ +100079 1000 12 LONG/LAT + 1 0.464 0.418 -1.00 1 + 2 0.469 0.639 -2.00 1 + 3 0.624 0.354 -1.00 1 + 4 0.666 0.548 -4.13 0 + 5 0.659 0.697 -1.81 1 + 6 0.810 0.442 -3.00 0 + 7 0.801 0.283 -1.00 1 + 8 0.874 0.603 -6.00 0 + 9 0.811 0.777 -2.77 1 +10 0.993 0.436 -2.79 1 +11 1.060 0.757 -2.00 1 +12 1.116 0.573 -4.50 1 +9 4 aaa 88 +1 11 8 10 12 +2 9 8 11 +3 10 8 6 +4 6 7 10 +5 6 8 4 +6 4 8 9 5 +7 7 6 4 3 +8 2 1 3 4 +9 4 5 2 diff --git a/tests/data/mike21/wrong_element_type.mesh b/tests/data/mike21/wrong_element_type.mesh new file mode 100644 index 00000000..abc8d74b --- /dev/null +++ b/tests/data/mike21/wrong_element_type.mesh @@ -0,0 +1,23 @@ +100079 1000 12 LONG/LAT + 1 0.464 0.418 -1.00 1 + 2 0.469 0.639 -2.00 1 + 3 0.624 0.354 -1.00 1 + 4 0.666 0.548 -4.13 0 + 5 0.659 0.697 -1.81 1 + 6 0.810 0.442 -3.00 0 + 7 0.801 0.283 -1.00 1 + 8 0.874 0.603 -6.00 0 + 9 0.811 0.777 -2.77 1 +10 0.993 0.436 -2.79 1 +11 1.060 0.757 -2.00 1 +12 1.116 0.573 -4.50 1 +9 4 88 +1 11 8 10 12 +2 9 8 11 +3 10 8 6 +4 6 7 10 +5 6 8 4 +6 4 8 9 5 +7 7 6 4 3 +8 2 1 3 4 +9 4 5 2 diff --git a/tests/data/mike21/wrong_face_count.mesh b/tests/data/mike21/wrong_face_count.mesh new file mode 100644 index 00000000..9025d88e --- /dev/null +++ b/tests/data/mike21/wrong_face_count.mesh @@ -0,0 +1,25 @@ +100079 1000 12 LONG/LAT + 1 0.464 0.418 -1.00 1 + 2 0.469 0.639 -2.00 1 + 3 0.624 0.354 -1.00 1 + 4 0.666 0.548 -4.13 0 + 5 0.659 0.697 -1.81 1 + 6 0.810 0.442 -3.00 0 + 7 0.801 0.283 -1.00 1 + 8 0.874 0.603 -6.00 0 + 9 0.811 0.777 -2.77 1 +10 0.993 0.436 -2.79 1 +11 1.060 0.757 -2.00 1 +12 1.116 0.573 -4.50 1 +9 4 25 +1 11 8 10 12 +2 9 8 11 +3 10 8 6 +4 6 7 10 +5 6 8 4 +6 4 8 9 5 +7 7 6 4 3 +8 2 1 3 4 +9 4 5 2 +10 4 5 2 +11 4 5 2 diff --git a/tests/data/mike21/wrong_vertex_count.mesh b/tests/data/mike21/wrong_vertex_count.mesh new file mode 100644 index 00000000..e2b864fc --- /dev/null +++ b/tests/data/mike21/wrong_vertex_count.mesh @@ -0,0 +1,25 @@ +100079 1000 12 LONG/LAT + 1 0.464 0.418 -1.00 1 + 2 0.469 0.639 -2.00 1 + 3 0.624 0.354 -1.00 1 + 4 0.666 0.548 -4.13 0 + 5 0.659 0.697 -1.81 1 + 6 0.810 0.442 -3.00 0 + 7 0.801 0.283 -1.00 1 + 8 0.874 0.603 -6.00 0 + 9 0.811 0.777 -2.77 1 +10 0.993 0.436 -2.79 1 +11 1.060 0.757 -2.00 1 +12 1.116 0.573 -4.50 1 +13 1.126 0.583 -4.60 0 +14 1.136 0.593 -4.70 0 +9 4 25 +1 11 8 10 12 +2 9 8 11 +3 10 8 6 +4 6 7 10 +5 6 8 4 +6 4 8 9 5 +7 7 6 4 3 +8 2 1 3 4 +9 4 5 2 diff --git a/tests/test_mike21.cpp b/tests/test_mike21.cpp index 1701c57e..909a983c 100644 --- a/tests/test_mike21.cpp +++ b/tests/test_mike21.cpp @@ -39,6 +39,42 @@ TEST( MeshMike21Test, WrongFile ) EXPECT_EQ( MDAL_Status::Err_UnknownFormat, s ); } +TEST( MeshMike21Test, WrongVertexCount ) +{ + std::string path = test_file( "/mike21/wrong_vertex_count.mesh" ); + MDAL_MeshH m = MDAL_LoadMesh( path.c_str() ); + EXPECT_EQ( m, nullptr ); + MDAL_Status s = MDAL_LastStatus(); + EXPECT_EQ( MDAL_Status::Err_UnknownFormat, s ); +} + +TEST( MeshMike21Test, WrongElementType ) +{ + std::string path = test_file( "/mike21/wrong_element_type.mesh" ); + MDAL_MeshH m = MDAL_LoadMesh( path.c_str() ); + EXPECT_EQ( m, nullptr ); + MDAL_Status s = MDAL_LastStatus(); + EXPECT_EQ( MDAL_Status::Err_UnknownFormat, s ); +} + +TEST( MeshMike21Test, WrongElementLineFormat ) +{ + std::string path = test_file( "/mike21/wrong_element_line_format.mesh" ); + MDAL_MeshH m = MDAL_LoadMesh( path.c_str() ); + EXPECT_EQ( m, nullptr ); + MDAL_Status s = MDAL_LastStatus(); + EXPECT_EQ( MDAL_Status::Err_UnknownFormat, s ); +} + +TEST( MeshMike21Test, WrongFaceCount ) +{ + std::string path = test_file( "/mike21/wrong_face_count.mesh" ); + MDAL_MeshH m = MDAL_LoadMesh( path.c_str() ); + EXPECT_EQ( m, nullptr ); + MDAL_Status s = MDAL_LastStatus(); + EXPECT_EQ( MDAL_Status::Err_UnknownFormat, s ); +} + TEST( MeshMike21Test, ReadSmallMesh ) { std::string path = test_file( "/mike21/small.mesh" ); From 724dd02f6e7abbdd51278b7781e8af2741606bc9 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 22 Nov 2023 11:41:20 +0100 Subject: [PATCH 11/25] at least for matches fro element header line --- mdal/frmts/mdal_mike21.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/mdal/frmts/mdal_mike21.cpp b/mdal/frmts/mdal_mike21.cpp index 7b57d933..3f5311e9 100644 --- a/mdal/frmts/mdal_mike21.cpp +++ b/mdal/frmts/mdal_mike21.cpp @@ -205,13 +205,21 @@ std::unique_ptr MDAL::DriverMike21::load( const std::string &meshFil auto matchResults = std::smatch{}; if ( std::regex_search( line, matchResults, mRegexElementHeader ) ) { - faceCount = MDAL::toSizeT( matchResults[1].str() ); - maxVerticesPerFace = MDAL::toSizeT( matchResults[2].str() ); - size_t meshType = MDAL::toSizeT( matchResults[3].str() ); - - if ( !( meshType == 21 || meshType == 25 ) ) + if (matchResults.size() >= 4) + { + faceCount = MDAL::toSizeT( matchResults[1].str() ); + maxVerticesPerFace = MDAL::toSizeT( matchResults[2].str() ); + size_t meshType = MDAL::toSizeT( matchResults[3].str() ); + + if ( !( meshType == 21 || meshType == 25 ) ) + { + MDAL::Log::error( MDAL_Status::Err_InvalidData, name(), "unknow mesh type." ); + return nullptr; + } + } + else { - MDAL::Log::error( MDAL_Status::Err_InvalidData, name(), "unknow mesh type." ); + MDAL::Log::error( MDAL_Status::Err_InvalidData, name(), "element header not in valid format." ); return nullptr; } } From fc32a1a07d5173213005989734df6f325a85f709 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 22 Nov 2023 11:42:06 +0100 Subject: [PATCH 12/25] vertex chunks need 5 elements --- mdal/frmts/mdal_mike21.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mdal/frmts/mdal_mike21.cpp b/mdal/frmts/mdal_mike21.cpp index 3f5311e9..b2be92ce 100644 --- a/mdal/frmts/mdal_mike21.cpp +++ b/mdal/frmts/mdal_mike21.cpp @@ -264,6 +264,12 @@ std::unique_ptr MDAL::DriverMike21::load( const std::string &meshFil if ( 0 < lineNumber && lineNumber < vertexCount + 1 ) { chunks = _regex_split( MDAL::trim( line ) ); + if (chunks.size() != 5) + { + MDAL::Log::error( MDAL_Status::Err_InvalidData, name(), "vertex line in invalid format." ); + return nullptr; + } + size_t nodeID = toSizeT( chunks[0] ); if ( nodeID != 0 ) From 6e7ade66c9866ffb4a45604d76497603d2f6c483 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 22 Nov 2023 11:47:28 +0100 Subject: [PATCH 13/25] astyle files --- mdal/frmts/mdal_mike21.cpp | 24 ++++++++++++------------ mdal/frmts/mdal_mike21.hpp | 2 +- tests/test_mike21.cpp | 12 ++++++------ 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/mdal/frmts/mdal_mike21.cpp b/mdal/frmts/mdal_mike21.cpp index b2be92ce..5496a89f 100644 --- a/mdal/frmts/mdal_mike21.cpp +++ b/mdal/frmts/mdal_mike21.cpp @@ -135,16 +135,16 @@ size_t MDAL::DriverMike21::getVertexCount( const std::string &line ) { auto matchResults = std::smatch{}; if ( std::regex_search( line, matchResults, mRegexHeader2012 ) ) - { - if (matchResults.size() > 4) + { + if ( matchResults.size() > 4 ) { return std::stoi( matchResults[3].str() ); } } if ( std::regex_search( line, matchResults, mRegexHeader2011 ) ) - { - if (matchResults.size() > 2) + { + if ( matchResults.size() > 2 ) { return std::stoi( matchResults[1].str() ); } @@ -157,16 +157,16 @@ std::string MDAL::DriverMike21::getCrs( const std::string &line ) { auto matchResults = std::smatch{}; if ( std::regex_search( line, matchResults, mRegexHeader2012 ) ) - { - if (matchResults.size() > 5) + { + if ( matchResults.size() > 5 ) { return matchResults[4].str(); } } if ( std::regex_search( line, matchResults, mRegexHeader2011 ) ) - { - if (matchResults.size() > 3) + { + if ( matchResults.size() > 3 ) { return matchResults[2].str(); } @@ -205,7 +205,7 @@ std::unique_ptr MDAL::DriverMike21::load( const std::string &meshFil auto matchResults = std::smatch{}; if ( std::regex_search( line, matchResults, mRegexElementHeader ) ) { - if (matchResults.size() >= 4) + if ( matchResults.size() >= 4 ) { faceCount = MDAL::toSizeT( matchResults[1].str() ); maxVerticesPerFace = MDAL::toSizeT( matchResults[2].str() ); @@ -233,8 +233,8 @@ std::unique_ptr MDAL::DriverMike21::load( const std::string &meshFil lineNumber++; } - // number of lines in file does not match number of vertices and faces specifed in first and element line - if (lineNumber > 2 + vertexCount + faceCount) + // number of lines in file does not match number of vertices and faces specifed in first and element line + if ( lineNumber > 2 + vertexCount + faceCount ) { MDAL::Log::error( MDAL_Status::Err_InvalidData, name(), "Number of lines in file does not fit with number of vertexes and faces specified." ); return nullptr; @@ -264,7 +264,7 @@ std::unique_ptr MDAL::DriverMike21::load( const std::string &meshFil if ( 0 < lineNumber && lineNumber < vertexCount + 1 ) { chunks = _regex_split( MDAL::trim( line ) ); - if (chunks.size() != 5) + if ( chunks.size() != 5 ) { MDAL::Log::error( MDAL_Status::Err_InvalidData, name(), "vertex line in invalid format." ); return nullptr; diff --git a/mdal/frmts/mdal_mike21.hpp b/mdal/frmts/mdal_mike21.hpp index 9219d2cd..8e6bf041 100644 --- a/mdal/frmts/mdal_mike21.hpp +++ b/mdal/frmts/mdal_mike21.hpp @@ -43,7 +43,7 @@ namespace MDAL private: /** - * Mike21 might supports "gaps" in the mesh indexing + * Mike21 might supports "gaps" in the mesh indexing * Store only the indices that have different index and ID * https://github.com/lutraconsulting/MDAL/issues/51 */ diff --git a/tests/test_mike21.cpp b/tests/test_mike21.cpp index 909a983c..98c2d310 100644 --- a/tests/test_mike21.cpp +++ b/tests/test_mike21.cpp @@ -91,13 +91,13 @@ TEST( MeshMike21Test, ReadSmallMesh ) int e_count = MDAL_M_edgeCount( m ); EXPECT_EQ( 0, e_count ); - EXPECT_STREQ( MDAL_M_projection( m ), "LONG/LAT"); + EXPECT_STREQ( MDAL_M_projection( m ), "LONG/LAT" ); EXPECT_EQ( MDAL_M_faceVerticesMaximumCount( m ), 4 ); EXPECT_EQ( MDAL_M_datasetGroupCount( m ), 2 ); - EXPECT_STREQ( MDAL_G_name( MDAL_M_datasetGroup( m, 0 ) ), "VertexType"); - EXPECT_STREQ( MDAL_G_name( MDAL_M_datasetGroup( m, 1 ) ), "Bed Elevation"); + EXPECT_STREQ( MDAL_G_name( MDAL_M_datasetGroup( m, 0 ) ), "VertexType" ); + EXPECT_STREQ( MDAL_G_name( MDAL_M_datasetGroup( m, 1 ) ), "Bed Elevation" ); } TEST( MeshMike21Test, ReadOdenseRoughQuads ) @@ -117,13 +117,13 @@ TEST( MeshMike21Test, ReadOdenseRoughQuads ) int e_count = MDAL_M_edgeCount( m ); EXPECT_EQ( 0, e_count ); - EXPECT_STREQ(MDAL_M_projection( m ), "UTM-33"); + EXPECT_STREQ( MDAL_M_projection( m ), "UTM-33" ); EXPECT_EQ( MDAL_M_faceVerticesMaximumCount( m ), 4 ); EXPECT_EQ( MDAL_M_datasetGroupCount( m ), 2 ); - EXPECT_STREQ( MDAL_G_name( MDAL_M_datasetGroup( m, 0 ) ), "VertexType"); - EXPECT_STREQ( MDAL_G_name( MDAL_M_datasetGroup( m, 1 ) ), "Bed Elevation"); + EXPECT_STREQ( MDAL_G_name( MDAL_M_datasetGroup( m, 0 ) ), "VertexType" ); + EXPECT_STREQ( MDAL_G_name( MDAL_M_datasetGroup( m, 1 ) ), "Bed Elevation" ); } TEST( MeshMike21Test, ReadOdenseRough ) From b4a0db008c727f4f2a5aa90737a7963399be8b98 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 22 Nov 2023 13:47:54 +0100 Subject: [PATCH 14/25] add better checks if the file can be read as Mesh21 to avoid colissions with other formats --- mdal/frmts/mdal_mike21.cpp | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/mdal/frmts/mdal_mike21.cpp b/mdal/frmts/mdal_mike21.cpp index 5496a89f..5e7d25a2 100644 --- a/mdal/frmts/mdal_mike21.cpp +++ b/mdal/frmts/mdal_mike21.cpp @@ -128,6 +128,39 @@ bool MDAL::DriverMike21::canReadMesh( const std::string &uri ) { return false; } + + in.clear(); + in.seekg( 0, std::ios::beg ); + + size_t vertexCount = getVertexCount(line); + size_t faceCount = 0; + + size_t lineNumber = 0; + while ( std::getline( in, line ) ) + { + if ( lineNumber == vertexCount + 1 ) + { + auto matchResults = std::smatch{}; + if ( std::regex_search( line, matchResults, mRegexElementHeader ) ) + { + if ( matchResults.size() >= 4 ) + { + faceCount = MDAL::toSizeT( matchResults[1].str() ); + } + else + { + return false; + } + } + } + lineNumber++; + } + + if ( lineNumber > 2 + vertexCount + faceCount ) + { + return false; + } + return true; } From d1243297ee9baaa1ac0a29d88bbb8579ef497da0 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 22 Nov 2023 13:48:30 +0100 Subject: [PATCH 15/25] test that files cannot be read because of invalid data --- tests/test_mike21.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/test_mike21.cpp b/tests/test_mike21.cpp index 98c2d310..9aca1d71 100644 --- a/tests/test_mike21.cpp +++ b/tests/test_mike21.cpp @@ -42,37 +42,41 @@ TEST( MeshMike21Test, WrongFile ) TEST( MeshMike21Test, WrongVertexCount ) { std::string path = test_file( "/mike21/wrong_vertex_count.mesh" ); + path = "Mike21:\"" + path + "\""; MDAL_MeshH m = MDAL_LoadMesh( path.c_str() ); EXPECT_EQ( m, nullptr ); MDAL_Status s = MDAL_LastStatus(); - EXPECT_EQ( MDAL_Status::Err_UnknownFormat, s ); + EXPECT_EQ( MDAL_Status::Err_InvalidData, s ); } TEST( MeshMike21Test, WrongElementType ) { std::string path = test_file( "/mike21/wrong_element_type.mesh" ); + path = "Mike21:\"" + path + "\""; MDAL_MeshH m = MDAL_LoadMesh( path.c_str() ); EXPECT_EQ( m, nullptr ); MDAL_Status s = MDAL_LastStatus(); - EXPECT_EQ( MDAL_Status::Err_UnknownFormat, s ); + EXPECT_EQ( MDAL_Status::Err_InvalidData, s ); } TEST( MeshMike21Test, WrongElementLineFormat ) { std::string path = test_file( "/mike21/wrong_element_line_format.mesh" ); + path = "Mike21:\"" + path + "\""; MDAL_MeshH m = MDAL_LoadMesh( path.c_str() ); EXPECT_EQ( m, nullptr ); MDAL_Status s = MDAL_LastStatus(); - EXPECT_EQ( MDAL_Status::Err_UnknownFormat, s ); + EXPECT_EQ( MDAL_Status::Err_InvalidData, s ); } TEST( MeshMike21Test, WrongFaceCount ) { std::string path = test_file( "/mike21/wrong_face_count.mesh" ); + path = "Mike21:\"" + path + "\""; MDAL_MeshH m = MDAL_LoadMesh( path.c_str() ); EXPECT_EQ( m, nullptr ); MDAL_Status s = MDAL_LastStatus(); - EXPECT_EQ( MDAL_Status::Err_UnknownFormat, s ); + EXPECT_EQ( MDAL_Status::Err_InvalidData, s ); } TEST( MeshMike21Test, ReadSmallMesh ) From f6bdd38fa8f29a1f19ed9d6afd0ec02248eb366e Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 22 Nov 2023 13:53:59 +0100 Subject: [PATCH 16/25] fix astyle issue --- mdal/frmts/mdal_mike21.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mdal/frmts/mdal_mike21.cpp b/mdal/frmts/mdal_mike21.cpp index 5e7d25a2..181f7e27 100644 --- a/mdal/frmts/mdal_mike21.cpp +++ b/mdal/frmts/mdal_mike21.cpp @@ -97,7 +97,7 @@ size_t MDAL::MeshMike21::maximumVertexId() const } } -MDAL::DriverMike21::DriverMike21(): +MDAL::DriverMike21::DriverMike21( ): Driver( DRIVER_NAME, "Mike21 Mesh File", "*.mesh", @@ -132,7 +132,7 @@ bool MDAL::DriverMike21::canReadMesh( const std::string &uri ) in.clear(); in.seekg( 0, std::ios::beg ); - size_t vertexCount = getVertexCount(line); + size_t vertexCount = getVertexCount( line ); size_t faceCount = 0; size_t lineNumber = 0; From 2c970b02f0a4ce878de16f216cf656496752775c Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 22 Nov 2023 16:11:45 +0100 Subject: [PATCH 17/25] move driver to the last position --- mdal/mdal_driver_manager.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mdal/mdal_driver_manager.cpp b/mdal/mdal_driver_manager.cpp index f639d6fa..02aa56a9 100644 --- a/mdal/mdal_driver_manager.cpp +++ b/mdal/mdal_driver_manager.cpp @@ -223,7 +223,6 @@ MDAL::DriverManager::DriverManager() mDrivers.push_back( std::make_shared() ); mDrivers.push_back( std::make_shared() ); mDrivers.push_back( std::make_shared() ); - mDrivers.push_back( std::make_shared() ); #ifdef BUILD_PLY mDrivers.push_back( std::make_shared() ); @@ -264,6 +263,8 @@ MDAL::DriverManager::DriverManager() mDrivers.push_back( std::make_shared() ); #endif + mDrivers.push_back( std::make_shared() ); + loadDynamicDrivers(); } From 08075aa506211b35d224b5d35f369e0781812861 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 22 Nov 2023 16:12:07 +0100 Subject: [PATCH 18/25] test can read based on first line and file extension --- mdal/frmts/mdal_mike21.cpp | 33 +-------------------------------- 1 file changed, 1 insertion(+), 32 deletions(-) diff --git a/mdal/frmts/mdal_mike21.cpp b/mdal/frmts/mdal_mike21.cpp index 181f7e27..3c531ca8 100644 --- a/mdal/frmts/mdal_mike21.cpp +++ b/mdal/frmts/mdal_mike21.cpp @@ -124,39 +124,8 @@ bool MDAL::DriverMike21::canReadMesh( const std::string &uri ) { std::ifstream in = MDAL::openInputFile( uri ); std::string line; - if ( !MDAL::getHeaderLine( in, line ) || !canReadHeader( line ) ) - { - return false; - } - - in.clear(); - in.seekg( 0, std::ios::beg ); - size_t vertexCount = getVertexCount( line ); - size_t faceCount = 0; - - size_t lineNumber = 0; - while ( std::getline( in, line ) ) - { - if ( lineNumber == vertexCount + 1 ) - { - auto matchResults = std::smatch{}; - if ( std::regex_search( line, matchResults, mRegexElementHeader ) ) - { - if ( matchResults.size() >= 4 ) - { - faceCount = MDAL::toSizeT( matchResults[1].str() ); - } - else - { - return false; - } - } - } - lineNumber++; - } - - if ( lineNumber > 2 + vertexCount + faceCount ) + if ( !MDAL::getHeaderLine( in, line ) || !canReadHeader( line ) || !MDAL::contains( filters(), MDAL::fileExtension( uri ) )) { return false; } From 8652a2ce0ae8ff98d51efa36e72b56dcc2c81210 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 22 Nov 2023 16:12:14 +0100 Subject: [PATCH 19/25] fix test name --- tests/test_mike21.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_mike21.cpp b/tests/test_mike21.cpp index 9aca1d71..bfba36d2 100644 --- a/tests/test_mike21.cpp +++ b/tests/test_mike21.cpp @@ -155,7 +155,7 @@ TEST( MeshMike21Test, ReadOdenseRough ) EXPECT_STREQ( MDAL_G_name( MDAL_M_datasetGroup( m, 1 ) ), "Bed Elevation" ); } -TEST( Mesh2DMTest, Save2DMeshToFile ) +TEST( MeshMike21Test, SaveMike21MeshToFile ) { saveAndCompareMesh( test_file( "/mike21/odense_rough_comparison.mesh" ), From 97c456e3fb0a0e050cd5981201011b3608969ea3 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 22 Nov 2023 16:26:28 +0100 Subject: [PATCH 20/25] astyle --- mdal/frmts/mdal_mike21.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mdal/frmts/mdal_mike21.cpp b/mdal/frmts/mdal_mike21.cpp index 3c531ca8..0b051603 100644 --- a/mdal/frmts/mdal_mike21.cpp +++ b/mdal/frmts/mdal_mike21.cpp @@ -125,7 +125,7 @@ bool MDAL::DriverMike21::canReadMesh( const std::string &uri ) std::ifstream in = MDAL::openInputFile( uri ); std::string line; - if ( !MDAL::getHeaderLine( in, line ) || !canReadHeader( line ) || !MDAL::contains( filters(), MDAL::fileExtension( uri ) )) + if ( !MDAL::getHeaderLine( in, line ) || !canReadHeader( line ) || !MDAL::contains( filters(), MDAL::fileExtension( uri ) ) ) { return false; } From 39adb4aae87533e366192371552b5e4ce81fcc8d Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 22 Nov 2023 16:39:47 +0100 Subject: [PATCH 21/25] update docs --- README.md | 2 ++ docs/source/drivers/mike21.rst | 12 ++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 docs/source/drivers/mike21.rst diff --git a/README.md b/README.md index dba286eb..6e623819 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,7 @@ You can use MDAL to load the following file formats: - [DFSU*](https://www.dhigroup.com):DHI Flexible File Format (External Driver) - [DFS2*](https://www.dhigroup.com):DHI Grid Series File (External Driver) - [H2i*](https://github.com/d2hydro/H2i_code_factory/blob/main/docs/data_format.md): Outputs of the H2i modelling package +- [MIKE 21](https://www.xmswiki.com/wiki/SMS:MIKE_21_*.mesh): Mesh Text/plain file with *.mesh extension \* Data lazy loaded @@ -76,6 +77,7 @@ You can use MDAL to load the following file formats: | DFSU | READ-ONLY | N/A | NO | READ-ONLY | READ-ONLY | YES | | DFS2 | READ-ONLY | N/A | NO | READ-ONLY | N/A | YES | | H2i | READ-ONLY | NO | NO | READ-ONLY | N/A | YES | +| Mike21 | READ-WRITE | N/A | N/A | N/A | N/A | N/A | # Standalone Installation diff --git a/docs/source/drivers/mike21.rst b/docs/source/drivers/mike21.rst new file mode 100644 index 00000000..979b7897 --- /dev/null +++ b/docs/source/drivers/mike21.rst @@ -0,0 +1,12 @@ +.. _driver.mike21: + +================================================================================ +Mike21 -- Text/plain file +================================================================================ + +.. shortname:: Mike21 + +.. built_in_by_default:: + +MDAL supports reading and writing to Mike21 format. Mike21 is a generic file format to save mesh with triangular and quadrangular faces. The MIKE 21 program is produced and distributed by the DHI group. +.. _SMS: https://www.xmswiki.com/wiki/SMS:MIKE_21_*.mesh From 19a2fa1a87f41ee917a66ee041141b4e24bcf1b4 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Thu, 23 Nov 2023 15:12:27 +0100 Subject: [PATCH 22/25] Update mdal/frmts/mdal_mike21.hpp Co-authored-by: Vincent Cloarec --- mdal/frmts/mdal_mike21.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mdal/frmts/mdal_mike21.hpp b/mdal/frmts/mdal_mike21.hpp index 8e6bf041..5b983eac 100644 --- a/mdal/frmts/mdal_mike21.hpp +++ b/mdal/frmts/mdal_mike21.hpp @@ -93,7 +93,7 @@ namespace MDAL // regex for header line in form of - integer integer integer string std::regex mRegexHeader2012 = std::regex( "(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(.+)(\\s+)?" ); // regex for element header line - integer integer integer(code with two number) - std::regex mRegexElementHeader = std::regex( "(\\d+)\\s+(\\d)\\s+(\\d{2})(\\s+)?" ); + const std::regex mRegexElementHeader = std::regex( "(\\d+)\\s+(\\d)\\s+(\\d{2})(\\s+)?" ); bool canReadHeader( const std::string &line ); size_t getVertexCount( const std::string &line ); From 6231f9806fcf97a616abadbacb97affa33b14538 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Thu, 23 Nov 2023 15:12:35 +0100 Subject: [PATCH 23/25] Update mdal/frmts/mdal_mike21.hpp Co-authored-by: Vincent Cloarec --- mdal/frmts/mdal_mike21.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mdal/frmts/mdal_mike21.hpp b/mdal/frmts/mdal_mike21.hpp index 5b983eac..f1c6f2a8 100644 --- a/mdal/frmts/mdal_mike21.hpp +++ b/mdal/frmts/mdal_mike21.hpp @@ -89,7 +89,7 @@ namespace MDAL private: std::string mMeshFile; // regex for header line in form of - integer string - std::regex mRegexHeader2011 = std::regex( "(\\d+)\\s+(.+)(\\s+)?" ); + const std::regex mRegexHeader2011 = std::regex( "(\\d+)\\s+(.+)(\\s+)?" ); // regex for header line in form of - integer integer integer string std::regex mRegexHeader2012 = std::regex( "(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(.+)(\\s+)?" ); // regex for element header line - integer integer integer(code with two number) From f3eafca8af3129d4bca3ed2b8b0b9bbacc2f442d Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Thu, 23 Nov 2023 15:12:55 +0100 Subject: [PATCH 24/25] Update mdal/frmts/mdal_mike21.hpp Co-authored-by: Vincent Cloarec --- mdal/frmts/mdal_mike21.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mdal/frmts/mdal_mike21.hpp b/mdal/frmts/mdal_mike21.hpp index f1c6f2a8..e01b57f0 100644 --- a/mdal/frmts/mdal_mike21.hpp +++ b/mdal/frmts/mdal_mike21.hpp @@ -91,7 +91,7 @@ namespace MDAL // regex for header line in form of - integer string const std::regex mRegexHeader2011 = std::regex( "(\\d+)\\s+(.+)(\\s+)?" ); // regex for header line in form of - integer integer integer string - std::regex mRegexHeader2012 = std::regex( "(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(.+)(\\s+)?" ); + const std::regex mRegexHeader2012 = std::regex( "(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(.+)(\\s+)?" ); // regex for element header line - integer integer integer(code with two number) const std::regex mRegexElementHeader = std::regex( "(\\d+)\\s+(\\d)\\s+(\\d{2})(\\s+)?" ); From 37c52cf3fbc357dc1ee7e2ea73be061af221c1b1 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Thu, 23 Nov 2023 16:53:10 +0100 Subject: [PATCH 25/25] fix astyle --- mdal/frmts/mdal_mike21.hpp | 2 +- mdal/mdal_driver_manager.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mdal/frmts/mdal_mike21.hpp b/mdal/frmts/mdal_mike21.hpp index e01b57f0..e54d9cf2 100644 --- a/mdal/frmts/mdal_mike21.hpp +++ b/mdal/frmts/mdal_mike21.hpp @@ -89,7 +89,7 @@ namespace MDAL private: std::string mMeshFile; // regex for header line in form of - integer string - const std::regex mRegexHeader2011 = std::regex( "(\\d+)\\s+(.+)(\\s+)?" ); + const std::regex mRegexHeader2011 = std::regex( "(\\d+)\\s+(.+)(\\s+)?" ); // regex for header line in form of - integer integer integer string const std::regex mRegexHeader2012 = std::regex( "(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(.+)(\\s+)?" ); // regex for element header line - integer integer integer(code with two number) diff --git a/mdal/mdal_driver_manager.cpp b/mdal/mdal_driver_manager.cpp index 02aa56a9..c9c4d5ca 100644 --- a/mdal/mdal_driver_manager.cpp +++ b/mdal/mdal_driver_manager.cpp @@ -264,7 +264,7 @@ MDAL::DriverManager::DriverManager() #endif mDrivers.push_back( std::make_shared() ); - + loadDynamicDrivers(); }