pax_global_header00006660000000000000000000000064132162233550014514gustar00rootroot0000000000000052 comment=4797ed66acaaf349c6f9b2cff238e0fe4d471844 libcitygml-2.0.8/000077500000000000000000000000001321622335500136625ustar00rootroot00000000000000libcitygml-2.0.8/.gitignore000066400000000000000000000003161321622335500156520ustar00rootroot00000000000000# Compiled Object files *.slo *.lo *.o # Compiled Dynamic libraries *.so *.dylib # Compiled Static libraries *.lai *.la *.a build build_debug CMakeLists.txt.user* install build/ buildRelease/ *.autosave libcitygml-2.0.8/.travis.yml000066400000000000000000000011671321622335500160000ustar00rootroot00000000000000language: cpp sudo: false compiler: - gcc - clang before_install: - echo $LANG - echo $LC_ALL - if [ "$CXX" = "g++" ]; then export CXX="g++-4.8" CC="gcc-4.8"; fi script: mkdir build && cd build && cmake ../ && make && ./bin/citygmltest ../data/berlin_open_data_sample_data.citygml && ./bin/citygmltest ../data/b1_lod2_s.gml addons: apt: sources: - ubuntu-toolchain-r-test - george-edison55-precise-backports packages: - libxerces-c-dev - libxerces-c3.1 - libgdal1h - libgdal-dev - cmake-data - cmake - g++-4.8 - gcc-4.8 - libopenscenegraph-dev libcitygml-2.0.8/CMakeLists.txt000066400000000000000000000241171321622335500164270ustar00rootroot00000000000000CMAKE_MINIMUM_REQUIRED(VERSION 3.0.0 FATAL_ERROR) PROJECT ( libcitygml ) set(META_VERSION_MAJOR "2") set(META_VERSION_MINOR "0") set(META_VERSION_PATCH "8") set(META_VERSION "${META_VERSION_MAJOR}.${META_VERSION_MINOR}.${META_VERSION_PATCH}") SET( CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMakeModules" ) IF(WIN32) IF(MSVC) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") # More MSVC specific compilation flags ADD_DEFINITIONS(-D_SCL_SECURE_NO_WARNINGS) ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE) ENDIF(MSVC) # Both Cygwin and Msys need -DNOMINMAX ??? IF(UNIX) ADD_DEFINITIONS(-DNOMINMAX) ENDIF(UNIX) ######################################################################################################## # the foolowing options are MSVC specific, # the first OSG_MSVC_VERSIONED_DLL activate a custom build-time layout that should allow to run examples and application # fron bin folder without requiring installation step. # it also prepend "osg${OPENSCENEGRAPH_SOVERSION}-" to only .dll files, leaving .lib files untouched in lib # it also use a hack to get rid of Debug and Release folder in MSVC projects # all the .dll and .pdb are in bin and all the .lib and .exp are in lib # # the second option disable incremental linking in debug build , that is enabled by default by CMake ########################################################################################################## IF(MSVC) # IF(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4 AND ${CMAKE_PATCH_VERSION} LESS 7) # MESSAGE("Warning: disabling versioned options 2.4.6 exibits inconsintencies in .pdb naming, at least under MSVC, suggested upgrading at least to 2.4.7") # SET(OSG_MSVC_VERSIONED_DLL OFF) # SET(OSG_MSVC_DEBUG_INCREMENTAL_LINK ON) # ELSE(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4 AND ${CMAKE_PATCH_VERSION} LESS 7) OPTION(LIBCITYGML_MSVC_VERSIONED_DLL "Set to ON to build libcitygml with versioned dll names" ON) MARK_AS_ADVANCED(LIBCITYGML_MSVC_VERSIONED_DLL) OPTION(LIBCITYGML_MSVC_DEBUG_INCREMENTAL_LINK "Set to OFF to build libcitygml without incremental linking in debug (release is off by default)" ON) MARK_AS_ADVANCED(LIBCITYGML_MSVC_DEBUG_INCREMENTAL_LINK) IF(NOT LIBCITYGML_MSVC_DEBUG_INCREMENTAL_LINK) SET(CMAKE_MODULE_LINKER_FLAGS_DEBUG "/debug /INCREMENTAL:NO") SET(CMAKE_SHARED_LINKER_FLAGS_DEBUG "/debug /INCREMENTAL:NO") SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "/debug /INCREMENTAL:NO") ENDIF(NOT LIBCITYGML_MSVC_DEBUG_INCREMENTAL_LINK) # ENDIF(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4 AND ${CMAKE_PATCH_VERSION} LESS 7) ENDIF(MSVC) ENDIF(WIN32) if(UNIX) if(APPLE) MESSAGE(STATUS "APPLE") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fPIC") else(APPLE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fPIC") MESSAGE(STATUS "Setting UNIX compile flags: ${CMAKE_CXX_FLAGS}") endif(APPLE) endif(UNIX) IF(MSVC_IDE) # From CMake 2.8.2, new way to manage output generation dirs ! # SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES PREFIX "../") SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/bin) SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/bin) SET( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/lib) SET( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/lib) SET( CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/bin) SET( CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/bin) ENDIF(MSVC_IDE) SET(OUTPUT_BINDIR ${PROJECT_BINARY_DIR}/bin) MAKE_DIRECTORY(${OUTPUT_BINDIR}) SET(EXECUTABLE_OUTPUT_PATH ${OUTPUT_BINDIR}) SET(OUTPUT_LIBDIR ${PROJECT_BINARY_DIR}/lib) MAKE_DIRECTORY(${OUTPUT_LIBDIR}) SET(LIBRARY_OUTPUT_PATH ${OUTPUT_LIBDIR}) if(NOT DEFINED BIN_INSTALL_DIR) set(BIN_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/bin") endif(NOT DEFINED BIN_INSTALL_DIR) if(NOT DEFINED LIB_INSTALL_DIR) set(LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib") endif(NOT DEFINED LIB_INSTALL_DIR) if(NOT DEFINED DATA_INSTALL_DIR) set(DATA_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share") endif(NOT DEFINED DATA_INSTALL_DIR) if(NOT DEFINED INCLUDE_INSTALL_DIR) set(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include/citygml") endif(NOT DEFINED INCLUDE_INSTALL_DIR) if(NOT DEFINED MAN_INSTALL_DIR) set(MAN_INSTALL_DIR "${DATA_INSTALL_DIR}/man") endif(NOT DEFINED MAN_INSTALL_DIR) if(NOT DEFINED RESOURCE_INSTALL_DIR) set(RESOURCE_INSTALL_DIR "${DATA_INSTALL_DIR}/libcitygml${META_VERSION_MAJOR}/resource/") endif(NOT DEFINED RESOURCE_INSTALL_DIR) if(NOT DEFINED LOCALE_INSTALL_DIR) set(LOCALE_INSTALL_DIR "${DATA_INSTALL_DIR}/locale/") endif(NOT DEFINED LOCALE_INSTALL_DIR) # IF( DEBUG_BUILD ) # SET( CMAKE_BUILD_TYPE "Debug" ) # ELSE( DEBUG_BUILD ) # SET( CMAKE_BUILD_TYPE "Release" ) # ENDIF( DEBUG_BUILD ) IF( COMMAND cmake_policy ) cmake_policy( SET CMP0003 NEW ) ENDIF( COMMAND cmake_policy ) IF(MSVC) OPTION(LIBCITYGML_STATIC_CRT "Set to ON to link libcitygml with the multithread CRT static library (instead of DLL)." ON) ENDIF(MSVC) IF( MSVC AND LIBCITYGML_STATIC_CRT ) #We statically link to reduce dependancies FOREACH( flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO ) IF( ${flag_var} MATCHES "/MD" ) string( REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}" ) ENDIF( ${flag_var} MATCHES "/MD" ) IF( ${flag_var} MATCHES "/MDd" ) string( REGEX REPLACE "/MDd" "/MTd" ${flag_var} "${${flag_var}}" ) ENDIF( ${flag_var} MATCHES "/MDd" ) ENDFOREACH( flag_var ) ENDIF( MSVC AND LIBCITYGML_STATIC_CRT ) # core ADD_SUBDIRECTORY( sources ) # osg plugin OPTION(LIBCITYGML_OSGPLUGIN "Set to ON to build libcitygml osgplugin programs." OFF) IF (LIBCITYGML_OSGPLUGIN) ADD_SUBDIRECTORY( osgplugin ) ENDIF(LIBCITYGML_OSGPLUGIN) # test OPTION(LIBCITYGML_TESTS "Set to ON to build libcitygml tests programs." ON) IF (LIBCITYGML_TESTS) ADD_SUBDIRECTORY( test ) ENDIF(LIBCITYGML_TESTS) #----------------------------------------------------------------------------- ### uninstall target #----------------------------------------------------------------------------- OPTION(LIBCITYGML_UNINSTALL "Set to ON to generate libcitygml uninstall project." OFF) IF (LIBCITYGML_UNINSTALL) CONFIGURE_FILE( "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY) ADD_CUSTOM_TARGET(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") ENDIF(LIBCITYGML_UNINSTALL) #----------------------------------------------------------------------------- ### Create debian package if linux #----------------------------------------------------------------------------- IF(UNIX AND NOT APPLE) option(BUILD_DEBIAN_PACKAGE "Creates a debian package" ON) if(BUILD_DEBIAN_PACKAGE) # set project description for packaging set(META_PROJECT_NAME "libcitygml") set(META_PROJECT_SUMMARY "Open source C++ library for parsing CityGML files") set(META_PROJECT_DESCRIPTION "libcitygml is a small and easy to use open source C++ library for parsing CityGML files in such a way that data can be easily exploited by 3D rendering applications (geometry data are tesselated and optimized for rendering during parsing). For instance, it can be used to develop readers of CityGML files in many 3D based applications (OpenGL, OpenSceneGraph, ...) Most metadata are not lost, they are available through a per-node hashmap. CityGML (City Geography Markup Language) is an XML-based schema for the modelling and exchange of georeferenced 3D city and landscape models that is quickly being adopted on an international level.") set(META_AUTHOR_ORGANIZATION "3D Content Logistics") set(META_AUTHOR_DOMAIN "https://github.com/jklimke/libcitygml.git") set(META_AUTHOR_MAINTAINER "Marcel Pursche ") # Package information string(TOLOWER ${META_PROJECT_NAME} package_name) # Package name set(CPACK_PACKAGE_NAME "${META_PROJECT_NAME}") set(CPACK_PACKAGE_VENDOR "${META_AUTHOR_ORGANIZATION}") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${META_PROJECT_SUMMARY}") set(CPACK_PACKAGE_DESCRIPTION "${META_PROJECT_DESCRIPTION}") set(CPACK_PACKAGE_VERSION "${META_VERSION}") set(CPACK_PACKAGE_VERSION_MAJOR "${META_VERSION_MAJOR}") set(CPACK_PACKAGE_VERSION_MINOR "${META_VERSION_MINOR}") set(CPACK_PACKAGE_VERSION_PATCH "${META_VERSION_PATCH}") set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE") set(CPACK_PACKAGE_RELOCATABLE OFF) # Debian package information set(CPACK_DEBIAN_PACKAGE_NAME "${package_name}") set(CPACK_DEBIAN_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION}") set(CPACK_DEBIAN_PACKAGE_MAINTAINER "${META_AUTHOR_MAINTAINER}") set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "${CPACK_PACKAGE_DESCRIPTION_SUMMARY}") set(CPACK_DEBIAN_PACKAGE_SECTION "Development") set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional") set(CPACK_DEBIAN_PACKAGE_DEPENDS "libgdal1h (>= 1.10.1), libxerces-c3.1 (>= 3.1.1-5)") set(CPACK_DEBIAN_PACKAGE_CONFLICTS "libcitygml0, libcitygml0-dev") set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "${META_AUTHOR_DOMAIN}") set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_CURRENT_SOURCE_DIR}/debian_scripts/postinst;") set(CPACK_GENERATOR "DEB") include(CPack) endif() ENDIF() libcitygml-2.0.8/CMakeModules/000077500000000000000000000000001321622335500161735ustar00rootroot00000000000000libcitygml-2.0.8/CMakeModules/FindCityGML.cmake000066400000000000000000000056721321622335500212600ustar00rootroot00000000000000# Locate libcitygml # This module defines # CITYGML_LIBRARY # CITYGML_LIBRARY_DEBUG # CITYGML_LIBRARIES, choses the correct debug or optimized library for linking, add this as Target Link library in your project # CITYGML_FOUND, if false, do not try to link to CITYGML # CITYGML_INCLUDE_DIR, where to find the headers # # $CITYGML_DIR is an environment variable that would # correspond to the ./configure --prefix=$CITYGML_DIR OPTION(CITYGML_DYNAMIC "Set to ON if libcitygml was built using dynamic linking. Use OFF for static." OFF) OPTION(CITYGML_USE_XERCESC "Set to ON to build libcitygml with Xerces-c library." ON) OPTION(CITYGML_USE_LIBXML2 "Set to ON to build libcitygml with LibXml2 library." OFF) IF( CITYGML_DYNAMIC ) ADD_DEFINITIONS( -DLIBCITYGML_DYNAMIC ) ENDIF( CITYGML_DYNAMIC ) IF ( CITYGML_USE_XERCESC AND CITYGML_USE_LIBXML2 ) MESSAGE("Error: You cannot build the library with Xerces-c AND LibXml2! Xerces library will be used by default.") SET( CITYGML_USE_LIBXML2 OFF CACHE BOOL "Set to ON to build libcitygml with LibXml2 library." FORCE) ENDIF( CITYGML_USE_XERCESC AND CITYGML_USE_LIBXML2 ) IF( CITYGML_USE_XERCESC ) FIND_PACKAGE( Xerces REQUIRED ) ADD_DEFINITIONS( -DUSE_XERCESC ) SET( LIBXML2_INCLUDE_DIR "" ) # SET( LIBXML2_LIBRARIES "" ) SET( LIBXML2_LIBRARY "" ) SET( LIBXML2_LIBRARY_DEBUG "" ) ENDIF( CITYGML_USE_XERCESC ) IF( CITYGML_USE_LIBXML2 ) FIND_PACKAGE( LibXml2 REQUIRED ) ADD_DEFINITIONS( -DUSE_LIBXML2 ) ADD_DEFINITIONS( ${LIBXML2_DEFINITIONS} ) SET( XERCESC_INCLUDE "" ) SET( XERCESC_LIBRARY "" ) SET( XERCESC_LIBRARY_DEBUG "" ) ENDIF( CITYGML_USE_LIBXML2 ) FIND_PATH( CITYGML_INCLUDE_DIR citygml/citygml.h ./include ../include $ENV{CITYGML_DIR}/include ~/Library/Frameworks /Library/Frameworks /usr/local/include /usr/include /sw/include # Fink /opt/local/include # DarwinPorts /opt/csw/include # Blastwave /opt/include /usr/freeware/include ) FIND_LIBRARY( CITYGML_LIBRARY NAMES citygml PATHS ./lib ../lib $ENV{CITYGML_DIR}/lib $ENV{CITYGML_DIR} ~/Library/Frameworks /Library/Frameworks /usr/local/lib /usr/lib /sw/lib /opt/local/lib /opt/csw/lib /opt/lib /usr/freeware/lib64 ) FIND_LIBRARY( CITYGML_LIBRARY_DEBUG NAMES citygmld PATHS ./lib ../lib $ENV{CITYGML_DIR}/lib $ENV{CITYGML_DIR} ~/Library/Frameworks /Library/Frameworks /usr/local/lib /usr/lib /sw/lib /opt/local/lib /opt/csw/lib /opt/lib /usr/freeware/lib64 ) SET( CITYGML_FOUND FALSE ) IF(CITYGML_LIBRARY AND CITYGML_INCLUDE_DIR) SET(CITYGML_FOUND TRUE) IF(NOT CITYGML_LIBRARY_DEBUG) MESSAGE("-- Warning Debug LibCityGML not found, using: ${CITYGML_LIBRARY}") SET(CITYGML_LIBRARY_DEBUG "${CITYGML_LIBRARY}" CACHE FILEPATH "Path to a library." FORCE) ENDIF(NOT CITYGML_LIBRARY_DEBUG) ENDIF(CITYGML_LIBRARY AND CITYGML_INCLUDE_DIR) SET(CITYGML_LIBRARIES optimized ${CITYGML_LIBRARY} debug ${CITYGML_LIBRARY_DEBUG}) libcitygml-2.0.8/CMakeModules/FindXerces.cmake000066400000000000000000000065361321622335500212410ustar00rootroot00000000000000# - Try to find Xerces-C # Once done this will define # # XERCESC_FOUND - system has Xerces-C # XERCESC_INCLUDE - the Xerces-C include directory # XERCESC_LIBRARY - Link these to use Xerces-C # XERCESC_VERSION - Xerces-C found version IF (XERCESC_INCLUDE AND XERCESC_LIBRARY) # in cache already SET(XERCESC_FIND_QUIETLY TRUE) ENDIF (XERCESC_INCLUDE AND XERCESC_LIBRARY) OPTION(XERCESC_STATIC "Set to ON to link your project with static library (instead of DLL)." ON) IF (NOT ${XERCESC_WAS_STATIC} STREQUAL ${XERCESC_STATIC}) UNSET(XERCESC_LIBRARY CACHE) UNSET(XERCESC_LIBRARY_DEBUG CACHE) ENDIF (NOT ${XERCESC_WAS_STATIC} STREQUAL ${XERCESC_STATIC}) SET(XERCESC_WAS_STATIC ${XERCESC_STATIC} CACHE INTERNAL "" ) FIND_PATH(XERCESC_INCLUDE NAMES xercesc/util/XercesVersion.hpp PATHS $ENV{XERCESC_INCLUDE_DIR} ${XERCESC_INCLUDE_DIR} /usr/local/include /usr/include ) IF (XERCESC_STATIC) FIND_LIBRARY(XERCESC_LIBRARY NAMES xerces-c_static_3 xerces-c-3.2 xerces-c-3.1 xerces-c PATHS $ENV{XERCESC_LIBRARY_DIR} ${XERCESC_LIBRARY_DIR} /usr/lib /usr/local/lib ) FIND_LIBRARY(XERCESC_LIBRARY_DEBUG NAMES xerces-c_static_3D xerces-c-3.2D xerces-c-3.1D PATHS $ENV{XERCESC_LIBRARY_DIR} ${XERCESC_LIBRARY_DIR} /usr/lib /usr/local/lib ) ADD_DEFINITIONS( -DXERCES_STATIC_LIBRARY ) ELSE (XERCESC_STATIC) FIND_LIBRARY(XERCESC_LIBRARY NAMES xerces-c_3 PATHS $ENV{XERCESC_LIBRARY_DIR} ${XERCESC_LIBRARY_DIR} ) FIND_LIBRARY(XERCESC_LIBRARY_DEBUG NAMES xerces-c_3D PATHS $ENV{XERCESC_LIBRARY_DIR} ${XERCESC_LIBRARY_DIR} ) ENDIF (XERCESC_STATIC) SET(XERCESC_FOUND FALSE) IF (XERCESC_INCLUDE AND XERCESC_LIBRARY) SET(XERCESC_FOUND TRUE) ENDIF (XERCESC_INCLUDE AND XERCESC_LIBRARY) IF(XERCESC_FOUND) IF(${XERCESC_LIBRARY_DEBUG}) SET(XERCESC_LIBRARIES optimized ${XERCESC_LIBRARY} debug ${XERCESC_LIBRARY_DEBUG}) ELSE(${XERCESC_LIBRARY_DEBUG}) SET(XERCESC_LIBRARIES ${XERCESC_LIBRARY}) ENDIF(${XERCESC_LIBRARY_DEBUG}) FIND_PATH(XERCESC_XVERHPPPATH NAMES XercesVersion.hpp PATHS ${XERCESC_INCLUDE} PATH_SUFFIXES xercesc/util) IF ( ${XERCESC_XVERHPPPATH} STREQUAL XERCESC_XVERHPPPATH-NOTFOUND ) SET(XERCES_VERSION "0") ELSE( ${XERCESC_XVERHPPPATH} STREQUAL XERCESC_XVERHPPPATH-NOTFOUND ) FILE(READ ${XERCESC_XVERHPPPATH}/XercesVersion.hpp XVERHPP) STRING(REGEX MATCHALL "\n *#define XERCES_VERSION_MAJOR +[0-9]+" XVERMAJ ${XVERHPP}) STRING(REGEX MATCH "\n *#define XERCES_VERSION_MINOR +[0-9]+" XVERMIN ${XVERHPP}) STRING(REGEX MATCH "\n *#define XERCES_VERSION_REVISION +[0-9]+" XVERREV ${XVERHPP}) STRING(REGEX REPLACE "\n *#define XERCES_VERSION_MAJOR +" "" XVERMAJ ${XVERMAJ}) STRING(REGEX REPLACE "\n *#define XERCES_VERSION_MINOR +" "" XVERMIN ${XVERMIN}) STRING(REGEX REPLACE "\n *#define XERCES_VERSION_REVISION +" "" XVERREV ${XVERREV}) SET(XERCESC_VERSION ${XVERMAJ}.${XVERMIN}.${XVERREV}) ENDIF ( ${XERCESC_XVERHPPPATH} STREQUAL XERCESC_XVERHPPPATH-NOTFOUND ) IF(NOT XERCESC_FIND_QUIETLY) MESSAGE(STATUS "Found Xerces-C: ${XERCESC_LIBRARY}") MESSAGE(STATUS " : ${XERCESC_INCLUDE}") MESSAGE(STATUS " Version: ${XERCESC_VERSION}") ENDIF(NOT XERCESC_FIND_QUIETLY) ELSE(XERCESC_FOUND) MESSAGE(FATAL_ERROR "Could not find Xerces-C !") ENDIF(XERCESC_FOUND) MARK_AS_ADVANCED(XERCESC_INCLUDE XERCESC_LIBRARY) libcitygml-2.0.8/CMakeModules/citygml_api.h.in000066400000000000000000000016001321622335500212470ustar00rootroot00000000000000#define LIBCITYGML_VERSION_MAJOR @META_VERSION_MAJOR@ #define LIBCITYGML_VERSION_MINOR @META_VERSION_MINOR@ #define LIBCITYGML_VERSION_REVISION @META_VERSION_PATCH@ #define LIBCITYGML_CREATE_VERSION_STRING_(x, y, z) #x"."#y"."#z #define LIBCITYGML_CREATE_VERSION_STRING(major,minor,revision) LIBCITYGML_CREATE_VERSION_STRING_(major, minor, revision) #define LIBCITYGML_VERSIONSTR LIBCITYGML_CREATE_VERSION_STRING(LIBCITYGML_VERSION_MAJOR, LIBCITYGML_VERSION_MINOR, LIBCITYGML_VERSION_REVISION) #define LIBCITYGML_VERSION_LESS(major, minor, revision) major > LIBCITYGML_VERSION_MAJOR || \ (major == LIBCITYGML_VERSION_MAJOR && (minor > LIBCITYGML_VERSION_MINOR || \ (minor == LIBCITYGML_VERSION_MINOR && revision > LIBCITYGML_VERSION_REVISION))) #include libcitygml-2.0.8/CMakeModules/cmake_uninstall.cmake.in000066400000000000000000000016031321622335500227530ustar00rootroot00000000000000IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) STRING(REGEX REPLACE "\n" ";" files "${files}") FOREACH(file ${files}) MESSAGE(STATUS "Uninstalling \"${file}\"") IF(EXISTS "${file}") EXEC_PROGRAM( "@CMAKE_COMMAND@" ARGS "-E remove \"${file}\"" OUTPUT_VARIABLE rm_out RETURN_VALUE rm_retval ) IF("${rm_retval}" STREQUAL 0) ELSE("${rm_retval}" STREQUAL 0) MESSAGE(FATAL_ERROR "Problem when removing \"${file}\"") ENDIF("${rm_retval}" STREQUAL 0) ELSE(EXISTS "${file}") MESSAGE(STATUS "File \"${file}\" does not exist.") ENDIF(EXISTS "${file}") ENDFOREACH(file) libcitygml-2.0.8/LICENSE000066400000000000000000000636311321622335500147000ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! libcitygml-2.0.8/README.md000066400000000000000000000056411321622335500151470ustar00rootroot00000000000000libcitygml ========== [![Build Status](https://travis-ci.org/jklimke/libcitygml.svg?branch=master)](https://travis-ci.org/jklimke/libcitygml) [CityGML](http://www.citygml.org/) (City Geography Markup Language) is an XML-based schema for the modelling and exchange of georeferenced 3D city and landscape models that is quickly being adopted on an international level. libcitygml is a small and easy to use open source C++ library for parsing CityGML files in such a way that data can be easily exploited by 3D rendering applications (geometry data are tesselated and optimized for rendering during parsing). For instance, it can be used to develop readers of CityGML files in many 3D based applications (OpenGL, OpenSceneGraph, ...) Most metadata are not lost, they are available through a per-node hashmap. The project also contains a loader plugin for [OpenSceneGraph](http://www.openscenegraph.org/). It enables OpenSceneGraph (if installed) to read citygml documents for easy rendering and further graphical optimization. libcitygml was initally developed by the 3D team of BRGM (the French leading public institution involved in the Earth Science field for the sustainable management of natural resources and surface and subsurface risks) for the research project DeepCity3D. It is now conducted as a Github open source project. It was moved to github due to inactivity of the project on google code (https://code.google.com/p/libcitygml/). How to Setup ============ The project is based on the CMAKE build system and should be pretty straight forward to setup. Dependencies: The XercesC xml parsing library is the only requirement compiling and using libcitygml. GDAL is required if coordinate transformations should be applied during paring. OpenSceneGraph is required for building the plugin. Test Data Attribution ===================== Overview over the testing data within the "data" directory: | Dataset | Attribution | Source | | ------------------------- |:---------------------------------------------------------:|:---------------------------------------------------------------------------------------------------------:| | data/b1_lod2_cs_w_sem.gml | https://www.citygml.org/samplefiles/building/ | [https://www.citygml.org](https://www.citygml.org/samplefiles/) | | data/b1_lod2_s.gml | https://www.citygml.org/samplefiles/building/ | [https://www.citygml.org](https://www.citygml.org/samplefiles/) | | data/berlin_open_data_sample_data.gml | Berlin Partner für Wirtschaft und Technologie GmbH | [Berlin Partner Download Portal](http://www.businesslocationcenter.de/berlin3d-downloadportal/?lang=en) | libcitygml-2.0.8/SpecsToCheck.md000066400000000000000000000041741321622335500165300ustar00rootroot00000000000000# Specification of Modules to check ## CityGML CityGML Module | Namespace identifier | schemaLocation | Recommended namespace prefix | Checked --- | --- | --- | ---- | --- Core | http://www.opengis.net/citygml/1.0 | http://schemas.opengis.net/citygml/1.0/cityGMLBase.xsd | core | ☑ Appearance | http://www.opengis.net/citygml/appearance/1.0 | http://schemas.opengis.net/citygml/appearance/1.0/appearance.xsd | app | ☑ Building | http://www.opengis.net/citygml/building/1.0 | http://schemas.opengis.net/citygml/building/1.0/building.xsd | bldg | ☑ CityFurniture | http://www.opengis.net/citygml/cityfurniture/1.0 | http://schemas.opengis.net/citygml/cityfurniture/1.0/cityFurniture.xsd | frn | ☑ CityObjectGroup | http://www.opengis.net/citygml/cityobjectgroup/1.0 | http://schemas.opengis.net/citygml/cityobjectgroup/1.0/cityObjectGroup.xsd | grp | ☑ Generics | http://www.opengis.net/citygml/generics/1.0 | http://schemas.opengis.net/citygml/generics/1.0/generics.xsd | gen | ☑ LandUse | http://www.opengis.net/citygml/landuse/1.0 | http://schemas.opengis.net/citygml/landuse/1.0/landUse.xsd | luse | ☑ Relief | http://www.opengis.net/citygml/relief/1.0 | http://schemas.opengis.net/citygml/relief/1.0/relief.xsd | dem | ☑ Transportation | http://www.opengis.net/citygml/transportation/1.0 | http://schemas.opengis.net/citygml/transportation/1.0/transportation.xsd | tran | ☑ Vegetation | http://www.opengis.net/citygml/vegetation/1.0 | http://schemas.opengis.net/citygml/vegetation/1.0/vegetation.xsd | veg | ☑ WaterBody | http://www.opengis.net/citygml/waterbody/1.0 | http://schemas.opengis.net/citygml/waterbody/1.0/waterBody.xsd | wtr | ☑ ## GML GML Module | schemaLocation | Checked --- | --- | --- Basic Types | http://schemas.opengis.net/gml/3.1.1/base/basicTypes.xsd | ☐ Geometry | http://schemas.opengis.net/gml/3.1.1/base/geometryBasic0d1d.xsd | ☐libcitygml-2.0.8/TODO.md000066400000000000000000000065531321622335500147620ustar00rootroot00000000000000# libcitygml TODO List # Correctness * Check if the normals calculated for tesselation is always correct even if the vertices are in a spherical coordinate system ... if not one should think about removing the tesselation from libcitygml * Check if OrientableSurfaces are supported properly... may be the vertices must be reverted if the orientation is '-' * Check if Appearance assignment is correct for shared polygons * Ensure that polygons that are children of shared geometries are not also children of non shared geometries (otherwise a coordinate transformation might be applied on the vertices which is not allowed for shared geometries) * The namespace of the different modules may differ from the recommended one... make a namespace mapping based on the uri * Currently different city object types are grouped under the same enum type (CityObjectType) e.g. WaterSurface, WaterGroundSurface, WaterClosureSurface and WaterBody are of type COT_WaterBody. The reason for this is that every enum type is identified by an individual bit... however there are only 32 bits. Check if the bitmask is actually used... if not remove that constraint and define an individual enum type for every CityObject type * Some polygon types (PolygonSurface, Polygon, Triangle etc.) have an implicit ("planar") or explicit gml:SurfaceInterpolationType attribute... currently its ignored # Completness * Implement parsing of CityObject `` member (contains a cityobject or references one that is the generalization of the current one) =>` requires cityobject sharing * Implement parsing of CityObject `` member * Implement complete address parsing: Currently the address attributes (street, postalcode, etc.) are stored as indivdual address attributes. However a address can be assigned zero or more 2D or 3D point geometries (one gml:MultiPoint geometry) locating the entrance. This requires parsing of the `
` as an individual element * Implement parsing of ImplicitGeometry `` member * Implement GeoreferencedTexture parsing * Implement appearence `` support * Implement `` support (Darunter kann eine beliebige GML Geometrie hängen) * Implement full support for `` and `` (requires city object sharing, currently only inline definitions are supported) * Implement sharing for all geometries (currently onl ImplicitGeometries) * Implement lod0 parsing * Implement Relief/Terrain Model (Namespace DEM) parsing. More precisely implement ReliefComponentPropertyType parsing. * Requires gml:MultiPointPropertyType parsing * Requires gml:MultiCurvePropertyType parsing (also required for wtr module) * Requires gml:RectifiedGridCoverage parsing * Implement gml:Tin parsing (possible child of `` element that uses delauny triangulation) # Refactoring * Change the NodeTypes so that typeID is a constant expression -> Use switch-case structures instead of if-then-else in the element parsers * Rename Appearance in SurfaceData (an Appearance is actually the objects that defines a Theme) # Features * Enable CityObject filering by type mask (ParserParams) # Optimization * Remove empty objects * In the finish step check if the geometry hierachy can be folded. It should be possible to merge all geometries of the same lod level together... however thats not so simple with shared geometries (ImplicitGeomentry) libcitygml-2.0.8/citygml_to_libcitygml_mapping.graphml000066400000000000000000002450311321622335500233470ustar00rootroot00000000000000 CityObject GenericCityObject Building, BuildingPart, Room, BuildingInstallation, BuildingFurniture, Door, Window, CityFurniture, Track, Road, Railway, Square, PlantCover, SolitaryVegetationObject, WaterBody, TINRelief, LandUse, Tunnel, Bridge, BridgeConstructionElement, BridgeInstallation, BridgePart _BoundarySurface WallSurface, RoofSurface, GroundSurface, ClosureSurface, FloorSurface, InteriorWallSurface, CeilingSurface Envelope Envelope lowerCorner upperCorner ImplicitGeometry ImplicitGeometry relativeGeometry referencePoint gml:Point TexturedSurface, MultiSurface, CompositeSurface, TriangulatedSurface, OrientableSurface Geometry _Polygon surfaceMember, baseSurface, patches, trianglePatches Polygon Triangle Polygon _SurfaceData Appearance theme X3DMaterial _AbstractTexture ParameterizedTexture GeoreferencedTexture Material Texture GeoreferencedTexture target target TexCoordGen TexCoordList MaterialTarget TextureTarget TextureCoordinates lodXMultiSurface, lodXGeometry lodXImplicitRepresentation LinearRing LinearRing interior, exterior exterior, interior Solid lodXSolid gml:Pos gml:posList boundedBy, outerBuildingInstallation, interiorBuildingInstallation, interiorFurniture, roomInstallation, interiorRoom, opening solidMember CompositeSolid, MultiSolid libcitygml-2.0.8/data/000077500000000000000000000000001321622335500145735ustar00rootroot00000000000000libcitygml-2.0.8/data/b1_lod2_cs_w_sem.gml000066400000000000000000000247451321622335500204110ustar00rootroot00000000000000 0.00 0.00 100.00 100.00 0.00 100.00 100.00 100.00 100.00 0.00 100.00 100.00 0.00 0.00 100.00 0.00 0.00 0.00 0.00 100.00 0.00 100.00 100.00 0.00 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 0.00 0.00 100.00 0.00 100.00 0.00 0.00 100.00 0.00 0.00 0.00 100.00 0.00 0.00 100.00 100.00 0.00 100.00 100.00 100.00 100.00 0.00 100.00 100.00 0.00 0.00 100.00 100.00 0.00 0.00 100.00 0.00 0.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 0.00 0.00 100.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 0.00 100.00 100.00 0.00 100.00 0.00 0.00 0.00 100.00 100.00 0.00 100.00 50.00 0.00 150.00 0.00 0.00 100.00 100.00 100.00 100.00 0.00 100.00 100.00 50.00 100.00 150.00 100.00 100.00 100.00 100.00 0.00 100.00 100.00 100.00 100.00 50.00 100.00 150.00 50.00 0.00 150.00 100.00 0.00 100.00 0.00 0.00 100.00 50.00 0.00 150.00 50.00 100.00 150.00 0.00 100.00 100.00 0.00 0.00 100.00 libcitygml-2.0.8/data/b1_lod2_s.gml000066400000000000000000000145651321622335500170530ustar00rootroot00000000000000 0.00 0.00 0.00 0.00 100.00 0.00 100.00 100.00 0.00 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 0.00 0.00 100.00 0.00 100.00 0.00 0.00 100.00 0.00 0.00 0.00 100.00 0.00 0.00 100.00 100.00 0.00 100.00 100.00 100.00 100.00 0.00 100.00 100.00 0.00 0.00 100.00 100.00 0.00 0.00 100.00 0.00 0.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 0.00 0.00 100.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 0.00 100.00 100.00 0.00 100.00 0.00 0.00 0.00 100.00 100.00 0.00 100.00 50.00 0.00 150.00 0.00 0.00 100.00 100.00 100.00 100.00 0.00 100.00 100.00 50.00 100.00 150.00 100.00 100.00 100.00 100.00 0.00 100.00 100.00 100.00 100.00 50.00 100.00 150.00 50.00 0.00 150.00 100.00 0.00 100.00 0.00 0.00 100.00 50.00 0.00 150.00 50.00 100.00 150.00 0.00 100.00 100.00 0.00 0.00 100.00 libcitygml-2.0.8/data/berlin_open_data_sample_data.citygml000077500000000000000000034344351321622335500240270ustar00rootroot00000000000000 390477.994899531 5819214.18602785 27.5200004577637 390703.083850149 5819552.649 64.2225904352854 BLDG_0003000e002837e8 1130 390515.519595831 5819426.2771978 31.9799995422363 390521.294081673 5819426.79320765 31.9799995422363 390521.793919073 5819421.19974635 31.9799995422363 390516.019429217 5819420.68373607 31.9799995422363 390506.177530677 5819419.80426081 31.9799995422363 390504.683488431 5819436.52370161 31.9799995422363 390514.525376041 5819437.40316837 31.9799995422363 390514.784552535 5819434.50281335 31.9799995422363 390516.678254041 5819434.67203395 31.9799995422363 390516.829523474 5819432.97923235 31.9799995422363 390514.935821747 5819432.81001173 31.9799995422363 390515.519595831 5819426.2771978 31.9799995422363 390516.01985746 5819420.6843585 52 390521.794346392 5819421.20037916 52 390521.294508992 5819426.79384045 52 390515.520023148 5819426.2778306 52 390516.01985746 5819420.6843585 52 390504.683915744 5819436.52433442 52 390504.943092366 5819433.62397805 52 390505.094361586 5819431.93117638 52 390505.678136217 5819425.39835651 52 390506.177969921 5819419.80489137 52 390511.099009772 5819420.24476718 56.5 390509.604955632 5819436.96421004 56.5 390504.683915744 5819436.52433442 52 390516.01985746 5819420.6843585 52 390515.520023148 5819426.2778306 52 390514.936249064 5819432.81064453 52 390514.784979852 5819434.50344616 52 390514.525803357 5819437.40380118 52 390509.604955632 5819436.96421004 56.5 390511.099009772 5819420.24476718 56.5 390516.01985746 5819420.6843585 52 390516.678681358 5819434.67266676 52 390514.784979852 5819434.50344616 52 390514.936249064 5819432.81064453 52 390516.829950791 5819432.97986516 52 390516.678681358 5819434.67266676 52 390514.525376041 5819437.40316837 31.9799995422363 390504.683488431 5819436.52370161 31.9799995422363 390504.683915744 5819436.52433442 52 390509.604955632 5819436.96421004 56.5 390514.525803357 5819437.40380118 52 390514.525376041 5819437.40316837 31.9799995422363 390516.829523474 5819432.97923235 31.9799995422363 390516.678254041 5819434.67203395 31.9799995422363 390516.678681358 5819434.67266676 52 390516.829950791 5819432.97986516 52 390516.829523474 5819432.97923235 31.9799995422363 390521.793919073 5819421.19974635 31.9799995422363 390521.794346392 5819421.20037916 52 390516.01985746 5819420.6843585 52 390511.099009772 5819420.24476718 56.5 390506.177969921 5819419.80489137 52 390506.177530677 5819419.80426081 31.9799995422363 390516.019429217 5819420.68373607 31.9799995422363 390521.793919073 5819421.19974635 31.9799995422363 390515.519595831 5819426.2771978 31.9799995422363 390514.935821747 5819432.81001173 31.9799995422363 390514.936249064 5819432.81064453 52 390515.520023148 5819426.2778306 52 390515.519595831 5819426.2771978 31.9799995422363 390521.793919073 5819421.19974635 31.9799995422363 390521.294081673 5819426.79320765 31.9799995422363 390521.294508992 5819426.79384045 52 390521.794346392 5819421.20037916 52 390521.793919073 5819421.19974635 31.9799995422363 390506.177530677 5819419.80426081 31.9799995422363 390506.177969921 5819419.80489137 52 390505.678136217 5819425.39835651 52 390505.094361586 5819431.93117638 52 390504.943092366 5819433.62397805 52 390504.683915744 5819436.52433442 52 390504.683488431 5819436.52370161 31.9799995422363 390506.177530677 5819419.80426081 31.9799995422363 390514.784552535 5819434.50281335 31.9799995422363 390514.525376041 5819437.40316837 31.9799995422363 390514.525803357 5819437.40380118 52 390514.784979852 5819434.50344616 52 390514.784552535 5819434.50281335 31.9799995422363 390514.935821747 5819432.81001173 31.9799995422363 390516.829523474 5819432.97923235 31.9799995422363 390516.829950791 5819432.97986516 52 390514.936249064 5819432.81064453 52 390514.935821747 5819432.81001173 31.9799995422363 390516.678254041 5819434.67203395 31.9799995422363 390514.784552535 5819434.50281335 31.9799995422363 390514.784979852 5819434.50344616 52 390516.678681358 5819434.67266676 52 390516.678254041 5819434.67203395 31.9799995422363 390521.294081673 5819426.79320765 31.9799995422363 390515.519595831 5819426.2771978 31.9799995422363 390515.520023148 5819426.2778306 52 390521.294508992 5819426.79384045 52 390521.294081673 5819426.79320765 31.9799995422363 BLDG_000300000016caa7 1000 390521.625935771 5819443.3646652 32.4300003051758 390521.626080738 5819443.36487987 39.2217172564882 390523.345457169 5819443.52692141 39.2217172564882 390524.421891257 5819443.62836925 39.2217172564882 390524.42174629 5819443.62815457 32.4300003051758 390523.345312202 5819443.52670673 32.4300003051758 390521.625935771 5819443.3646652 32.4300003051758 390524.455380786 5819431.74813933 32.4300003051758 390524.455525753 5819431.74835401 39.2217172564882 390522.736153013 5819431.58631333 39.2217172564882 390520.854256079 5819431.40895571 39.2217172564882 390520.854111112 5819431.40874103 32.4300003051758 390522.736008046 5819431.58609865 32.4300003051758 390524.455380786 5819431.74813933 32.4300003051758 390524.252607661 5819433.89969707 32.4300003051758 390525.329044794 5819434.00114522 32.4300003051758 390525.329189762 5819434.0013599 39.2217172564882 390524.252752628 5819433.89991175 39.2217172564882 390524.252607661 5819433.89969707 32.4300003051758 390519.90436043 5819441.48622835 32.4300003051758 390520.854111112 5819431.40874103 32.4300003051758 390520.854256079 5819431.40895571 39.2217172564882 390519.904505396 5819441.48644303 39.2217172564882 390519.90436043 5819441.48622835 32.4300003051758 390525.329044794 5819434.00114522 32.4300003051758 390524.42174629 5819443.62815457 32.4300003051758 390524.421891257 5819443.62836925 39.2217172564882 390525.329189762 5819434.0013599 39.2217172564882 390525.329044794 5819434.00114522 32.4300003051758 390521.625935771 5819443.3646652 32.4300003051758 390521.786254178 5819441.66358563 32.4300003051758 390521.786399145 5819441.66380031 39.2217172564882 390521.626080738 5819443.36487987 39.2217172564882 390521.625935771 5819443.3646652 32.4300003051758 390521.786254178 5819441.66358563 32.4300003051758 390519.90436043 5819441.48622835 32.4300003051758 390519.904505396 5819441.48644303 39.2217172564882 390521.786399145 5819441.66380031 39.2217172564882 390521.786254178 5819441.66358563 32.4300003051758 390524.455380786 5819431.74813933 32.4300003051758 390524.252607661 5819433.89969707 32.4300003051758 390524.252752628 5819433.89991175 39.2217172564882 390524.455525753 5819431.74835401 39.2217172564882 390524.455380786 5819431.74813933 32.4300003051758 390524.455380786 5819431.74813933 32.4300003051758 390522.736008046 5819431.58609865 32.4300003051758 390520.854111112 5819431.40874103 32.4300003051758 390519.90436043 5819441.48622835 32.4300003051758 390521.786254178 5819441.66358563 32.4300003051758 390521.625935771 5819443.3646652 32.4300003051758 390523.345312202 5819443.52670673 32.4300003051758 390524.42174629 5819443.62815457 32.4300003051758 390525.329044794 5819434.00114522 32.4300003051758 390524.252607661 5819433.89969707 32.4300003051758 390524.455380786 5819431.74813933 32.4300003051758 390519.904505396 5819441.48644303 39.2217172564882 390520.854256079 5819431.40895571 39.2217172564882 390522.736153013 5819431.58631333 39.2217172564882 390524.455525753 5819431.74835401 39.2217172564882 390524.252752628 5819433.89991175 39.2217172564882 390525.329189762 5819434.0013599 39.2217172564882 390524.421891257 5819443.62836925 39.2217172564882 390523.345457169 5819443.52692141 39.2217172564882 390521.626080738 5819443.36487987 39.2217172564882 390521.786399145 5819441.66380031 39.2217172564882 390519.904505396 5819441.48644303 39.2217172564882 BLDG_0003000e00531835 1130 390516.437711209 5819444.49022268 32.3400001525879 390516.599116835 5819443.01725646 32.3400001525879 390516.59960143 5819443.01797409 55.043529510498 390516.438195805 5819444.49094032 55.043529510498 390516.438192399 5819444.49093527 54.883979129797 390516.437711209 5819444.49022268 32.3400001525879 390505.143962454 5819436.34394496 32.3400001525879 390515.014290194 5819437.425555 32.3400001525879 390515.014778128 5819437.42627757 55.2 390515.014796271 5819437.42630444 56.05 390510.079688993 5819436.88558319 58.7 390505.144468526 5819436.3446944 56.05 390505.144450384 5819436.34466754 55.2 390505.143962454 5819436.34394496 32.3400001525879 390513.788735302 5819448.60938063 32.3400001525879 390503.918395 5819447.52778603 32.3400001525879 390503.918893807 5819447.52850824 55.2 390503.918911949 5819447.52853511 56.05 390508.854132447 5819448.06942377 58.7 390513.789239754 5819448.6101449 56.05 390513.789221612 5819448.61011803 55.2 390521.176835281 5819449.41963975 55.2 390521.176831941 5819449.4196348 55.043529510498 390521.176361433 5819449.41892328 32.3400001525879 390515.960264563 5819448.84733739 32.3400001525879 390513.788735302 5819448.60938063 32.3400001525879 390515.014290194 5819437.425555 32.3400001525879 390514.266199871 5819444.25226785 32.3400001525879 390514.266684466 5819444.25298549 55.043529510498 390514.266687806 5819444.25299043 55.2 390513.789221612 5819448.61011803 55.2 390513.789239754 5819448.6101449 56.05 390515.014796271 5819437.42630444 56.05 390515.014778128 5819437.42627757 55.2 390515.014290194 5819437.425555 32.3400001525879 390505.143962454 5819436.34394496 32.3400001525879 390505.144450384 5819436.34466754 55.2 390505.144468526 5819436.3446944 56.05 390503.918911949 5819447.52853511 56.05 390503.918893807 5819447.52850824 55.2 390503.918395 5819447.52778603 32.3400001525879 390504.395870301 5819443.17067433 32.3400001525879 390505.143962454 5819436.34394496 32.3400001525879 390514.266199871 5819444.25226785 32.3400001525879 390516.437711209 5819444.49022268 32.3400001525879 390516.438192399 5819444.49093527 54.883979129797 390516.438195805 5819444.49094032 55.043529510498 390521.654289269 5819445.06252131 55.043529510498 390521.654292609 5819445.06252626 55.2 390514.266687806 5819444.25299043 55.2 390514.266684466 5819444.25298549 55.043529510498 390514.266199871 5819444.25226785 32.3400001525879 390521.176361433 5819449.41892328 32.3400001525879 390521.176831941 5819449.4196348 55.043529510498 390521.176835281 5819449.41963975 55.2 390521.654292609 5819445.06252626 55.2 390521.654289269 5819445.06252131 55.043529510498 390521.815700184 5819443.58954273 55.043529510498 390521.815215587 5819443.5888251 32.3400001525879 390521.653808562 5819445.0618041 32.3400001525879 390521.176361433 5819449.41892328 32.3400001525879 390516.599116835 5819443.01725646 32.3400001525879 390521.815215587 5819443.5888251 32.3400001525879 390521.815700184 5819443.58954273 55.043529510498 390516.59960143 5819443.01797409 55.043529510498 390516.599116835 5819443.01725646 32.3400001525879 390515.014796271 5819437.42630444 56.05 390513.789239754 5819448.6101449 56.05 390508.854132447 5819448.06942377 58.7 390510.079688993 5819436.88558319 58.7 390515.014796271 5819437.42630444 56.05 390521.815700184 5819443.58954273 55.043529510498 390521.654289269 5819445.06252131 55.043529510498 390516.438195805 5819444.49094032 55.043529510498 390516.59960143 5819443.01797409 55.043529510498 390521.815700184 5819443.58954273 55.043529510498 390503.918911949 5819447.52853511 56.05 390505.144468526 5819436.3446944 56.05 390510.079688993 5819436.88558319 58.7 390508.854132447 5819448.06942377 58.7 390503.918911949 5819447.52853511 56.05 390513.789221612 5819448.61011803 55.2 390514.266687806 5819444.25299043 55.2 390521.654292609 5819445.06252626 55.2 390521.176835281 5819449.41963975 55.2 390513.789221612 5819448.61011803 55.2 390515.960264563 5819448.84733739 32.3400001525879 390521.176361433 5819449.41892328 32.3400001525879 390521.653808562 5819445.0618041 32.3400001525879 390521.815215587 5819443.5888251 32.3400001525879 390516.599116835 5819443.01725646 32.3400001525879 390516.437711209 5819444.49022268 32.3400001525879 390514.266199871 5819444.25226785 32.3400001525879 390515.014290194 5819437.425555 32.3400001525879 390505.143962454 5819436.34394496 32.3400001525879 390504.395870301 5819443.17067433 32.3400001525879 390503.918395 5819447.52778603 32.3400001525879 390513.788735302 5819448.60938063 32.3400001525879 390515.960264563 5819448.84733739 32.3400001525879 BLDG_0003000e002837ee 1130 390571.660640703 5819446.94910182 56.52 390573.518735798 5819428.55896998 56.52 390579.121964151 5819429.12509309 56.52 390577.263868156 5819447.51523412 56.52 390571.660640703 5819446.94910182 56.52 390586.176715365 5819429.85057537 56.515539338646 390579.121964151 5819429.12509309 56.52 390573.518735798 5819428.55896998 56.52 390574.172176916 5819422.09259755 58.8136137982317 390586.831378892 5819423.37162232 58.8136137982317 390586.176715365 5819429.85057537 56.515539338646 390574.826742472 5819415.61349905 56.515539338646 390587.485944406 5819416.89252401 56.515539338646 390586.831378892 5819423.37162232 58.8136137982317 390574.172176916 5819422.09259755 58.8136137982317 390574.826742472 5819415.61349905 56.515539338646 390574.826238169 5819415.61275229 32.8899993896484 390573.516960745 5819428.57079913 32.8899993896484 390571.660136307 5819446.9483549 32.8899993896484 390577.263363757 5819447.5144872 32.8899993896484 390579.120189095 5819429.13692225 32.8899993896484 390586.176211056 5819429.8498286 32.8899993896484 390587.485440098 5819416.89177724 32.8899993896484 390580.429439969 5819416.17887288 32.8899993896484 390574.826238169 5819415.61275229 32.8899993896484 390574.826238169 5819415.61275229 32.8899993896484 390574.826742472 5819415.61349905 56.515539338646 390574.172176916 5819422.09259755 58.8136137982317 390573.518735798 5819428.55896998 56.52 390571.660640703 5819446.94910182 56.52 390571.660136307 5819446.9483549 32.8899993896484 390573.516960745 5819428.57079913 32.8899993896484 390574.826238169 5819415.61275229 32.8899993896484 390577.263363757 5819447.5144872 32.8899993896484 390571.660136307 5819446.9483549 32.8899993896484 390571.660640703 5819446.94910182 56.52 390577.263868156 5819447.51523412 56.52 390577.263363757 5819447.5144872 32.8899993896484 390579.120189095 5819429.13692225 32.8899993896484 390577.263363757 5819447.5144872 32.8899993896484 390577.263868156 5819447.51523412 56.52 390579.121964151 5819429.12509309 56.52 390579.120189095 5819429.13692225 32.8899993896484 390574.826238169 5819415.61275229 32.8899993896484 390580.429439969 5819416.17887288 32.8899993896484 390587.485440098 5819416.89177724 32.8899993896484 390587.485944406 5819416.89252401 56.515539338646 390574.826742472 5819415.61349905 56.515539338646 390574.826238169 5819415.61275229 32.8899993896484 390586.176211056 5819429.8498286 32.8899993896484 390579.120189095 5819429.13692225 32.8899993896484 390579.121964151 5819429.12509309 56.52 390586.176715365 5819429.85057537 56.515539338646 390586.176211056 5819429.8498286 32.8899993896484 390587.485440098 5819416.89177724 32.8899993896484 390586.176211056 5819429.8498286 32.8899993896484 390586.176715365 5819429.85057537 56.515539338646 390586.831378892 5819423.37162232 58.8136137982317 390587.485944406 5819416.89252401 56.515539338646 390587.485440098 5819416.89177724 32.8899993896484 BLDG_0003000e009a2243 1000 390563.34314028 5819452.56810233 32.2900009155273 390563.70179482 5819445.76285101 32.2900009155273 390543.301025248 5819444.215051 32.2900009155273 390542.714811176 5819451.17867883 32.2900009155273 390544.484164071 5819451.32483596 32.2900009155273 390563.34314028 5819452.56810233 32.2900009155273 390537.123505578 5819415.30691671 32.2099990844727 390536.194238913 5819425.26457801 32.2099990844727 390544.894651375 5819426.13254551 32.2099990844727 390553.067504185 5819426.98188364 32.2099990844727 390561.225814506 5819428.0496267 32.2099990844727 390564.980013984 5819428.41878189 32.2099990844727 390573.442039968 5819429.31227653 32.2099990844727 390573.535812129 5819428.38419173 32.2099990844727 390574.516633244 5819418.66631489 32.2099990844727 390574.824726056 5819415.61260734 32.2099990844727 390566.784256405 5819414.8894695 32.2099990844727 390560.054549227 5819414.28573473 32.2099990844727 390547.794560321 5819413.18391649 32.2099990844727 390537.40837404 5819412.25151486 32.2099990844727 390537.123505578 5819415.30691671 32.2099990844727 390562.285574876 5819428.80691212 31.8500003814697 390561.225806822 5819428.04961532 31.8500003814697 390553.067496501 5819426.98187226 31.8500003814697 390551.534191337 5819429.56046237 31.8500003814697 390551.24156665 5819432.85182877 31.8500003814697 390551.984213465 5819433.9377708 31.8500003814697 390553.161076678 5819434.5256859 31.8500003814697 390555.114158585 5819434.37104974 31.8500003814697 390555.403013237 5819431.33266078 31.8500003814697 390562.080563472 5819431.89309684 31.8500003814697 390562.285574876 5819428.80691212 31.8500003814697 390564.436933004 5819431.47176147 31.8799991607666 390563.701786069 5819445.76283805 31.8799991607666 390563.343131528 5819452.56808937 31.8799991607666 390563.602090846 5819452.5851611 31.8799991607666 390563.921065241 5819452.60594716 31.8799991607666 390568.056169162 5819452.87820975 31.8799991607666 390570.931458577 5819453.11066058 31.8799991607666 390571.490342914 5819448.38636443 31.8799991607666 390571.660115912 5819446.94831519 31.8799991607666 390573.442032924 5819429.3122661 31.8799991607666 390564.98000694 5819428.41877146 31.8799991607666 390564.436933004 5819431.47176147 31.8799991607666 390542.714803278 5819451.17866713 31.9200000762939 390543.30101735 5819444.2150393 31.9200000762939 390544.894645185 5819426.13253634 31.9200000762939 390536.194232723 5819425.26456885 31.9200000762939 390535.770989438 5819429.80441495 31.9200000762939 390534.428418553 5819444.18272511 31.9200000762939 390533.893639263 5819449.91752855 31.9200000762939 390533.843296897 5819450.44731201 31.9200000762939 390542.051941722 5819451.12422365 31.9200000762939 390542.466373547 5819451.15814563 31.9200000762939 390542.714803278 5819451.17866713 31.9200000762939 390574.824726056 5819415.61260734 32.2099990844727 390574.825320582 5819415.61348771 60.0623332818349 390566.784850927 5819414.89034986 60.0623332818349 390566.784256405 5819414.8894695 32.2099990844727 390574.824726056 5819415.61260734 32.2099990844727 390551.534191337 5819429.56046237 31.8500003814697 390551.534804271 5819429.56137002 60.5653523189921 390551.242179584 5819432.85273642 60.5653523189921 390551.24156665 5819432.85182877 31.8500003814697 390551.534191337 5819429.56046237 31.8500003814697 390563.602090846 5819452.5851611 31.8799991607666 390563.602690024 5819452.58604839 59.9505640141617 390563.92166442 5819452.60683445 59.9505640141617 390563.921065241 5819452.60594716 31.8799991607666 390563.602090846 5819452.5851611 31.8799991607666 390555.114158585 5819434.37104974 31.8500003814697 390555.114771522 5819434.3719574 60.5653523189921 390555.403626174 5819431.33356844 60.5653523189921 390555.403013237 5819431.33266078 31.8500003814697 390555.114158585 5819434.37104974 31.8500003814697 390563.343131528 5819452.56808937 31.8799991607666 390563.343730706 5819452.56897665 59.9505640141617 390563.602690024 5819452.58604839 59.9505640141617 390563.602090846 5819452.5851611 31.8799991607666 390563.343131528 5819452.56808937 31.8799991607666 390568.056169162 5819452.87820975 31.8799991607666 390568.056768342 5819452.87909703 59.9505640141617 390570.932057759 5819453.11154787 59.9505640141617 390570.931458577 5819453.11066058 31.8799991607666 390568.056169162 5819452.87820975 31.8799991607666 390551.984213465 5819433.9377708 31.8500003814697 390551.9848264 5819433.93867845 60.5653523189921 390553.161689614 5819434.52659356 60.5653523189921 390553.161076678 5819434.5256859 31.8500003814697 390551.984213465 5819433.9377708 31.8500003814697 390563.921065241 5819452.60594716 31.8799991607666 390563.92166442 5819452.60683445 59.9505640141617 390568.056768342 5819452.87909703 59.9505640141617 390568.056169162 5819452.87820975 31.8799991607666 390563.921065241 5819452.60594716 31.8799991607666 390564.98000694 5819428.41877146 31.8799991607666 390564.980606119 5819428.41965873 59.9505640141617 390564.437532183 5819431.47264874 59.9505640141617 390564.436933004 5819431.47176147 31.8799991607666 390564.98000694 5819428.41877146 31.8799991607666 390543.301025248 5819444.215051 32.2900009155273 390543.301497404 5819444.21575019 54.4101635585321 390542.715283332 5819451.17937803 54.4101635585321 390542.714811176 5819451.17867883 32.2900009155273 390543.301025248 5819444.215051 32.2900009155273 390563.701786069 5819445.76283805 31.8799991607666 390563.702385247 5819445.76372534 59.9505640141617 390563.343730706 5819452.56897665 59.9505640141617 390563.343131528 5819452.56808937 31.8799991607666 390563.701786069 5819445.76283805 31.8799991607666 390563.34314028 5819452.56810233 32.2900009155273 390563.343612445 5819452.56880153 54.4101635585321 390563.702266985 5819445.76355021 54.4101635585321 390563.70179482 5819445.76285101 32.2900009155273 390563.34314028 5819452.56810233 32.2900009155273 390533.893639263 5819449.91752855 31.9200000762939 390533.894243415 5819449.91842322 60.2243957519531 390533.84390105 5819450.44820669 60.2243957519531 390533.843296897 5819450.44731201 31.9200000762939 390533.893639263 5819449.91752855 31.9200000762939 390537.40837404 5819412.25151486 32.2099990844727 390537.408968545 5819412.25239523 60.0623332818349 390537.124100083 5819415.30779708 60.0623332818349 390537.123505578 5819415.30691671 32.2099990844727 390537.40837404 5819412.25151486 32.2099990844727 390542.714803278 5819451.17866713 31.9200000762939 390542.715407436 5819451.17956181 60.2243957519531 390543.301621508 5819444.21593397 60.2243957519531 390543.30101735 5819444.2150393 31.9200000762939 390542.714803278 5819451.17866713 31.9200000762939 390562.080563472 5819431.89309684 31.8500003814697 390562.081176413 5819431.8940045 60.5653523189921 390562.286187816 5819428.80781977 60.5653523189921 390562.285574876 5819428.80691212 31.8500003814697 390562.080563472 5819431.89309684 31.8500003814697 390555.403013237 5819431.33266078 31.8500003814697 390555.403626174 5819431.33356844 60.5653523189921 390562.081176413 5819431.8940045 60.5653523189921 390562.080563472 5819431.89309684 31.8500003814697 390555.403013237 5819431.33266078 31.8500003814697 390553.067504185 5819426.98188364 32.2099990844727 390553.068098699 5819426.98276401 60.0623332818349 390561.226409025 5819428.05050707 60.0623332818349 390561.225814506 5819428.0496267 32.2099990844727 390553.067504185 5819426.98188364 32.2099990844727 390566.784256405 5819414.8894695 32.2099990844727 390566.784850927 5819414.89034986 60.0623332818349 390560.055143745 5819414.2866151 60.0623332818349 390560.054549227 5819414.28573473 32.2099990844727 390566.784256405 5819414.8894695 32.2099990844727 390574.516633244 5819418.66631489 32.2099990844727 390574.51722777 5819418.66719526 60.0623332818349 390574.825320582 5819415.61348771 60.0623332818349 390574.824726056 5819415.61260734 32.2099990844727 390574.516633244 5819418.66631489 32.2099990844727 390544.894651375 5819426.13254551 32.2099990844727 390544.895245885 5819426.13342588 60.0623332818349 390553.068098699 5819426.98276401 60.0623332818349 390553.067504185 5819426.98188364 32.2099990844727 390544.894651375 5819426.13254551 32.2099990844727 390551.24156665 5819432.85182877 31.8500003814697 390551.242179584 5819432.85273642 60.5653523189921 390551.9848264 5819433.93867845 60.5653523189921 390551.984213465 5819433.9377708 31.8500003814697 390551.24156665 5819432.85182877 31.8500003814697 390547.794560321 5819413.18391649 32.2099990844727 390547.795154832 5819413.18479685 60.0623332818349 390537.408968545 5819412.25239523 60.0623332818349 390537.40837404 5819412.25151486 32.2099990844727 390547.794560321 5819413.18391649 32.2099990844727 390562.285574876 5819428.80691212 31.8500003814697 390562.286187816 5819428.80781977 60.5653523189921 390561.226419762 5819428.05052297 60.5653523189921 390561.225806822 5819428.04961532 31.8500003814697 390562.285574876 5819428.80691212 31.8500003814697 390544.484164071 5819451.32483596 32.2900009155273 390544.484636227 5819451.32553516 54.4101635585321 390563.343612445 5819452.56880153 54.4101635585321 390563.34314028 5819452.56810233 32.2900009155273 390544.484164071 5819451.32483596 32.2900009155273 390571.660115912 5819446.94831519 31.8799991607666 390571.660715095 5819446.94920247 59.9505640141617 390573.442632108 5819429.31315337 59.9505640141617 390573.442032924 5819429.3122661 31.8799991607666 390571.660115912 5819446.94831519 31.8799991607666 390570.931458577 5819453.11066058 31.8799991607666 390570.932057759 5819453.11154787 59.9505640141617 390571.490942097 5819448.38725171 59.9505640141617 390571.490342914 5819448.38636443 31.8799991607666 390570.931458577 5819453.11066058 31.8799991607666 390533.843296897 5819450.44731201 31.9200000762939 390533.84390105 5819450.44820669 60.2243957519531 390542.052545879 5819451.12511832 60.2243957519531 390542.051941722 5819451.12422365 31.9200000762939 390533.843296897 5819450.44731201 31.9200000762939 390573.442032924 5819429.3122661 31.8799991607666 390573.442632108 5819429.31315337 59.9505640141617 390564.980606119 5819428.41965873 59.9505640141617 390564.98000694 5819428.41877146 31.8799991607666 390573.442032924 5819429.3122661 31.8799991607666 390536.194238913 5819425.26457801 32.2099990844727 390536.194833418 5819425.26545839 60.0623332818349 390544.895245885 5819426.13342588 60.0623332818349 390544.894651375 5819426.13254551 32.2099990844727 390536.194238913 5819425.26457801 32.2099990844727 390563.70179482 5819445.76285101 32.2900009155273 390563.702266985 5819445.76355021 54.4101635585321 390543.301497404 5819444.21575019 54.4101635585321 390543.301025248 5819444.215051 32.2900009155273 390563.70179482 5819445.76285101 32.2900009155273 390571.490342914 5819448.38636443 31.8799991607666 390571.490942097 5819448.38725171 59.9505640141617 390571.660715095 5819446.94920247 59.9505640141617 390571.660115912 5819446.94831519 31.8799991607666 390571.490342914 5819448.38636443 31.8799991607666 390542.714811176 5819451.17867883 32.2900009155273 390542.715283332 5819451.17937803 54.4101635585321 390544.484636227 5819451.32553516 54.4101635585321 390544.484164071 5819451.32483596 32.2900009155273 390542.714811176 5819451.17867883 32.2900009155273 390544.894645185 5819426.13253634 31.9200000762939 390544.895249344 5819426.133431 60.2243957519531 390536.194836877 5819425.26546351 60.2243957519531 390536.194232723 5819425.26456885 31.9200000762939 390544.894645185 5819426.13253634 31.9200000762939 390560.054549227 5819414.28573473 32.2099990844727 390560.055143745 5819414.2866151 60.0623332818349 390547.795154832 5819413.18479685 60.0623332818349 390547.794560321 5819413.18391649 32.2099990844727 390560.054549227 5819414.28573473 32.2099990844727 390573.442039968 5819429.31227653 32.2099990844727 390573.442634493 5819429.31315691 60.0623332818349 390573.536406655 5819428.38507211 60.0623332818349 390573.535812129 5819428.38419173 32.2099990844727 390573.442039968 5819429.31227653 32.2099990844727 390564.980013984 5819428.41878189 32.2099990844727 390564.980608504 5819428.41966226 60.0623332818349 390573.442634493 5819429.31315691 60.0623332818349 390573.442039968 5819429.31227653 32.2099990844727 390564.980013984 5819428.41878189 32.2099990844727 390543.30101735 5819444.2150393 31.9200000762939 390543.301621508 5819444.21593397 60.2243957519531 390544.895249344 5819426.133431 60.2243957519531 390544.894645185 5819426.13253634 31.9200000762939 390543.30101735 5819444.2150393 31.9200000762939 390553.161076678 5819434.5256859 31.8500003814697 390553.161689614 5819434.52659356 60.5653523189921 390555.114771522 5819434.3719574 60.5653523189921 390555.114158585 5819434.37104974 31.8500003814697 390553.161076678 5819434.5256859 31.8500003814697 390561.225814506 5819428.0496267 32.2099990844727 390561.226409025 5819428.05050707 60.0623332818349 390564.980608504 5819428.41966226 60.0623332818349 390564.980013984 5819428.41878189 32.2099990844727 390561.225814506 5819428.0496267 32.2099990844727 390537.123505578 5819415.30691671 32.2099990844727 390537.124100083 5819415.30779708 60.0623332818349 390536.194833418 5819425.26545839 60.0623332818349 390536.194238913 5819425.26457801 32.2099990844727 390537.123505578 5819415.30691671 32.2099990844727 390553.067496501 5819426.98187226 31.8500003814697 390553.068109436 5819426.98277991 60.5653523189921 390551.534804271 5819429.56137002 60.5653523189921 390551.534191337 5819429.56046237 31.8500003814697 390553.067496501 5819426.98187226 31.8500003814697 390542.466373547 5819451.15814563 31.9200000762939 390542.466977705 5819451.15904031 60.2243957519531 390542.715407436 5819451.17956181 60.2243957519531 390542.714803278 5819451.17866713 31.9200000762939 390542.466373547 5819451.15814563 31.9200000762939 390534.428418553 5819444.18272511 31.9200000762939 390534.429022706 5819444.18361978 60.2243957519531 390533.894243415 5819449.91842322 60.2243957519531 390533.893639263 5819449.91752855 31.9200000762939 390534.428418553 5819444.18272511 31.9200000762939 390535.770989438 5819429.80441495 31.9200000762939 390535.771593592 5819429.80530961 60.2243957519531 390534.429022706 5819444.18361978 60.2243957519531 390534.428418553 5819444.18272511 31.9200000762939 390535.770989438 5819429.80441495 31.9200000762939 390561.225806822 5819428.04961532 31.8500003814697 390561.226419762 5819428.05052297 60.5653523189921 390553.068109436 5819426.98277991 60.5653523189921 390553.067496501 5819426.98187226 31.8500003814697 390561.225806822 5819428.04961532 31.8500003814697 390573.535812129 5819428.38419173 32.2099990844727 390573.536406655 5819428.38507211 60.0623332818349 390574.51722777 5819418.66719526 60.0623332818349 390574.516633244 5819418.66631489 32.2099990844727 390573.535812129 5819428.38419173 32.2099990844727 390564.436933004 5819431.47176147 31.8799991607666 390564.437532183 5819431.47264874 59.9505640141617 390563.702385247 5819445.76372534 59.9505640141617 390563.701786069 5819445.76283805 31.8799991607666 390564.436933004 5819431.47176147 31.8799991607666 390536.194232723 5819425.26456885 31.9200000762939 390536.194836877 5819425.26546351 60.2243957519531 390535.771593592 5819429.80530961 60.2243957519531 390535.770989438 5819429.80441495 31.9200000762939 390536.194232723 5819425.26456885 31.9200000762939 390542.051941722 5819451.12422365 31.9200000762939 390542.052545879 5819451.12511832 60.2243957519531 390542.466977705 5819451.15904031 60.2243957519531 390542.466373547 5819451.15814563 31.9200000762939 390542.051941722 5819451.12422365 31.9200000762939 390536.194833418 5819425.26545839 60.0623332818349 390537.124100083 5819415.30779708 60.0623332818349 390537.408968545 5819412.25239523 60.0623332818349 390547.795154832 5819413.18479685 60.0623332818349 390560.055143745 5819414.2866151 60.0623332818349 390566.784850927 5819414.89034986 60.0623332818349 390574.825320582 5819415.61348771 60.0623332818349 390574.51722777 5819418.66719526 60.0623332818349 390573.536406655 5819428.38507211 60.0623332818349 390573.442634493 5819429.31315691 60.0623332818349 390564.980608504 5819428.41966226 60.0623332818349 390561.226409025 5819428.05050707 60.0623332818349 390553.068098699 5819426.98276401 60.0623332818349 390544.895245885 5819426.13342588 60.0623332818349 390536.194833418 5819425.26545839 60.0623332818349 390543.301621508 5819444.21593397 60.2243957519531 390542.715407436 5819451.17956181 60.2243957519531 390542.466977705 5819451.15904031 60.2243957519531 390542.052545879 5819451.12511832 60.2243957519531 390533.84390105 5819450.44820669 60.2243957519531 390533.894243415 5819449.91842322 60.2243957519531 390534.429022706 5819444.18361978 60.2243957519531 390535.771593592 5819429.80530961 60.2243957519531 390536.194836877 5819425.26546351 60.2243957519531 390544.895249344 5819426.133431 60.2243957519531 390543.301621508 5819444.21593397 60.2243957519531 390563.702385247 5819445.76372534 59.9505640141617 390564.437532183 5819431.47264874 59.9505640141617 390564.980606119 5819428.41965873 59.9505640141617 390573.442632108 5819429.31315337 59.9505640141617 390571.660715095 5819446.94920247 59.9505640141617 390571.490942097 5819448.38725171 59.9505640141617 390570.932057759 5819453.11154787 59.9505640141617 390568.056768342 5819452.87909703 59.9505640141617 390563.92166442 5819452.60683445 59.9505640141617 390563.602690024 5819452.58604839 59.9505640141617 390563.343730706 5819452.56897665 59.9505640141617 390563.702385247 5819445.76372534 59.9505640141617 390563.702266985 5819445.76355021 54.4101635585321 390563.343612445 5819452.56880153 54.4101635585321 390544.484636227 5819451.32553516 54.4101635585321 390542.715283332 5819451.17937803 54.4101635585321 390543.301497404 5819444.21575019 54.4101635585321 390563.702266985 5819445.76355021 54.4101635585321 390561.226419762 5819428.05052297 60.5653523189921 390562.286187816 5819428.80781977 60.5653523189921 390562.081176413 5819431.8940045 60.5653523189921 390555.403626174 5819431.33356844 60.5653523189921 390555.114771522 5819434.3719574 60.5653523189921 390553.161689614 5819434.52659356 60.5653523189921 390551.9848264 5819433.93867845 60.5653523189921 390551.242179584 5819432.85273642 60.5653523189921 390551.534804271 5819429.56137002 60.5653523189921 390553.068109436 5819426.98277991 60.5653523189921 390561.226419762 5819428.05052297 60.5653523189921 BLDG_0003000e002837ea 1130 390537.408405284 5819412.25155858 32.2599983215332 390532.480926391 5819411.79214978 32.2599983215332 390527.134024362 5819411.29364037 32.2599983215332 390526.622571773 5819411.24589759 32.2599983215332 390522.794458689 5819410.88898886 32.2599983215332 390521.557500807 5819424.15618621 32.2599983215332 390520.880859123 5819431.41441417 32.2599983215332 390524.709003842 5819431.77130626 32.2599983215332 390524.970117222 5819428.97053817 32.2599983215332 390525.481486141 5819429.01821491 32.2599983215332 390525.897071999 5819424.56077869 32.2599983215332 390531.243971481 5819425.05928769 32.2599983215332 390529.491984643 5819443.85048211 32.2599983215332 390521.635489337 5819443.1180012 32.2599983215332 390521.11264296 5819448.72594032 32.2599983215332 390528.969131699 5819449.45842051 32.2599983215332 390533.896583158 5819449.91781919 32.2599983215332 390534.419464269 5819444.30988348 32.2599983215332 390536.171450738 5819425.51869277 32.2599983215332 390537.408405284 5819412.25155858 32.2599983215332 390521.635489337 5819443.1180012 32.2599983215332 390529.491984643 5819443.85048211 32.2599983215332 390529.492441762 5819443.85115905 53.6759744843904 390529.492480695 5819443.8512167 55.5 390521.635985385 5819443.11873579 55.5 390521.635489337 5819443.1180012 32.2599983215332 390533.896583158 5819449.91781919 32.2599983215332 390528.969131699 5819449.45842051 32.2599983215332 390521.11264296 5819448.72594032 32.2599983215332 390521.113139008 5819448.72667491 55.5 390533.897079212 5819449.91855379 55.5 390533.896583158 5819449.91781919 32.2599983215332 390524.709003842 5819431.77130626 32.2599983215332 390520.880859123 5819431.41441417 32.2599983215332 390520.881307391 5819431.415078 53.2614999771118 390524.709452113 5819431.7719701 53.2614999771118 390524.709003842 5819431.77130626 32.2599983215332 390525.482042964 5819429.01903949 58.3472221162584 390525.897628881 5819424.56160336 58.35 390525.897568049 5819424.56151327 55.5 390525.897071999 5819424.56077869 32.2599983215332 390525.481486141 5819429.01821491 32.2599983215332 390525.481934412 5819429.01887874 53.2614999771118 390525.482042964 5819429.01903949 58.3472221162584 390524.970117222 5819428.97053817 32.2599983215332 390524.709003842 5819431.77130626 32.2599983215332 390524.709452113 5819431.7719701 53.2614999771118 390524.970565493 5819428.971202 53.2614999771118 390524.970117222 5819428.97053817 32.2599983215332 390529.491984643 5819443.85048211 32.2599983215332 390531.243971481 5819425.05928769 32.2599983215332 390531.244419753 5819425.05995152 53.2614999771118 390531.244467534 5819425.06002228 55.5 390529.492480695 5819443.8512167 55.5 390529.492441762 5819443.85115905 53.6759744843904 390529.491984643 5819443.85048211 32.2599983215332 390522.795016869 5819410.88987305 58.35 390522.794458689 5819410.88898886 32.2599983215332 390526.622571773 5819411.24589759 32.2599983215332 390527.134024362 5819411.29364037 32.2599983215332 390532.480926391 5819411.79214978 32.2599983215332 390537.408405284 5819412.25155858 32.2599983215332 390537.408841298 5819412.25228395 55.5 390537.408902131 5819412.25237403 58.35 390527.134581246 5819411.29446503 58.35 390522.795016869 5819410.88987305 58.35 390521.14242257 5819428.61429064 53.2614999771118 390521.142471872 5819428.61444587 58.3472221162584 390525.482042964 5819429.01903949 58.3472221162584 390525.481934412 5819429.01887874 53.2614999771118 390525.481486141 5819429.01821491 32.2599983215332 390524.970117222 5819428.97053817 32.2599983215332 390524.970565493 5819428.971202 53.2614999771118 390521.14242257 5819428.61429064 53.2614999771118 390531.244419753 5819425.05995152 53.2614999771118 390531.243971481 5819425.05928769 32.2599983215332 390525.897071999 5819424.56077869 32.2599983215332 390525.897568049 5819424.56151327 55.5 390525.897628881 5819424.56160336 58.35 390536.171953428 5819425.51951239 58.35 390536.171892596 5819425.5194223 55.5 390531.244467534 5819425.06002228 55.5 390531.244419753 5819425.05995152 53.2614999771118 390534.419464269 5819444.30988348 32.2599983215332 390533.896583158 5819449.91781919 32.2599983215332 390533.897079212 5819449.91855379 55.5 390534.419960323 5819444.31061808 55.5 390536.171892596 5819425.5194223 55.5 390536.171953428 5819425.51951239 58.35 390536.790462949 5819418.88599535 60 390537.408902131 5819412.25237403 58.35 390537.408841298 5819412.25228395 55.5 390537.408405284 5819412.25155858 32.2599983215332 390536.171450738 5819425.51869277 32.2599983215332 390534.419464269 5819444.30988348 32.2599983215332 390521.142471872 5819428.61444587 58.3472221162584 390521.14242257 5819428.61429064 53.2614999771118 390520.881307391 5819431.415078 53.2614999771118 390520.880859123 5819431.41441417 32.2599983215332 390521.557500807 5819424.15618621 32.2599983215332 390522.794458689 5819410.88898886 32.2599983215332 390522.795016869 5819410.88987305 58.35 390522.17657764 5819417.52349459 60 390521.558068075 5819424.15701184 58.35 390521.142471872 5819428.61444587 58.3472221162584 390521.11264296 5819448.72594032 32.2599983215332 390521.635489337 5819443.1180012 32.2599983215332 390521.635985385 5819443.11873579 55.5 390521.113139008 5819448.72667491 55.5 390521.11264296 5819448.72594032 32.2599983215332 390531.244467534 5819425.06002228 55.5 390536.171892596 5819425.5194223 55.5 390534.419960323 5819444.31061808 55.5 390533.897079212 5819449.91855379 55.5 390521.113139008 5819448.72667491 55.5 390521.635985385 5819443.11873579 55.5 390529.492480695 5819443.8512167 55.5 390531.244467534 5819425.06002228 55.5 390536.171953428 5819425.51951239 58.35 390525.897628881 5819424.56160336 58.35 390521.558068075 5819424.15701184 58.35 390522.17657764 5819417.52349459 60 390536.790462949 5819418.88599535 60 390536.171953428 5819425.51951239 58.35 390522.795016869 5819410.88987305 58.35 390527.134581246 5819411.29446503 58.35 390537.408902131 5819412.25237403 58.35 390536.790462949 5819418.88599535 60 390522.17657764 5819417.52349459 60 390522.795016869 5819410.88987305 58.35 390521.14242257 5819428.61429064 53.2614999771118 390524.970565493 5819428.971202 53.2614999771118 390524.709452113 5819431.7719701 53.2614999771118 390520.881307391 5819431.415078 53.2614999771118 390521.14242257 5819428.61429064 53.2614999771118 390525.897628881 5819424.56160336 58.35 390525.482042964 5819429.01903949 58.3472221162584 390521.142471872 5819428.61444587 58.3472221162584 390521.558068075 5819424.15701184 58.35 390525.897628881 5819424.56160336 58.35 BLDG_000300000016c977 1000 390506.932918106 5819409.72051178 32.5900001525879 390506.387907195 5819416.28136946 32.5900001525879 390506.093511525 5819419.82531384 32.5900001525879 390515.097513655 5819420.57327083 32.5900001525879 390515.391910302 5819417.02931458 32.5900001525879 390518.91057312 5819417.3216031 32.5900001525879 390518.616202595 5819420.86556365 32.5900001525879 390521.941386746 5819421.14175983 32.5900001525879 390522.235755583 5819417.59781957 32.5900001525879 390522.780718284 5819411.0369519 32.5900001525879 390519.455530291 5819410.76080205 32.5900001525879 390506.932918106 5819409.72051178 32.5900001525879 390515.392403573 5819417.03004505 55.7 390515.098006926 5819420.5740013 55.7 390506.094004792 5819419.82604431 55.7 390506.388400462 5819416.28209993 55.7 390506.933411373 5819409.72124224 55.7 390515.937409435 5819410.469248 55.7 390519.456023564 5819410.76153252 55.7 390522.781211558 5819411.03768237 55.7 390521.94188002 5819421.1424903 55.7 390518.616695867 5819420.86629412 55.7 390518.911066393 5819417.32233357 55.7 390515.392403573 5819417.03004505 55.7 390518.91057312 5819417.3216031 32.5900001525879 390515.391910302 5819417.02931458 32.5900001525879 390515.392403573 5819417.03004505 55.7 390518.911066393 5819417.32233357 55.7 390518.91057312 5819417.3216031 32.5900001525879 390515.391910302 5819417.02931458 32.5900001525879 390515.097513655 5819420.57327083 32.5900001525879 390515.098006926 5819420.5740013 55.7 390515.392403573 5819417.03004505 55.7 390515.391910302 5819417.02931458 32.5900001525879 390522.780718284 5819411.0369519 32.5900001525879 390522.235755583 5819417.59781957 32.5900001525879 390521.941386746 5819421.14175983 32.5900001525879 390521.94188002 5819421.1424903 55.7 390522.781211558 5819411.03768237 55.7 390522.780718284 5819411.0369519 32.5900001525879 390506.932918106 5819409.72051178 32.5900001525879 390506.933411373 5819409.72124224 55.7 390506.388400462 5819416.28209993 55.7 390506.094004792 5819419.82604431 55.7 390506.093511525 5819419.82531384 32.5900001525879 390506.387907195 5819416.28136946 32.5900001525879 390506.932918106 5819409.72051178 32.5900001525879 390518.616202595 5819420.86556365 32.5900001525879 390518.91057312 5819417.3216031 32.5900001525879 390518.911066393 5819417.32233357 55.7 390518.616695867 5819420.86629412 55.7 390518.616202595 5819420.86556365 32.5900001525879 390515.097513655 5819420.57327083 32.5900001525879 390506.093511525 5819419.82531384 32.5900001525879 390506.094004792 5819419.82604431 55.7 390515.098006926 5819420.5740013 55.7 390515.097513655 5819420.57327083 32.5900001525879 390506.933411373 5819409.72124224 55.7 390506.932918106 5819409.72051178 32.5900001525879 390519.455530291 5819410.76080205 32.5900001525879 390522.780718284 5819411.0369519 32.5900001525879 390522.781211558 5819411.03768237 55.7 390519.456023564 5819410.76153252 55.7 390515.937409435 5819410.469248 55.7 390506.933411373 5819409.72124224 55.7 390521.941386746 5819421.14175983 32.5900001525879 390518.616202595 5819420.86556365 32.5900001525879 390518.616695867 5819420.86629412 55.7 390521.94188002 5819421.1424903 55.7 390521.941386746 5819421.14175983 32.5900001525879 BLDG_0003000e0028382e 1000 390657.060141633 5819438.01317202 27.7700004577637 390619.377211628 5819435.24190253 27.7700004577637 390619.377867634 5819435.24287391 58.5012108416519 390657.060797662 5819438.0141434 58.5012108416519 390657.060141633 5819438.01317202 27.7700004577637 390619.377211628 5819435.24190253 27.7700004577637 390620.303677216 5819422.64419278 27.7700004577637 390620.304333223 5819422.64516415 58.5012108416519 390619.377867634 5819435.24287391 58.5012108416519 390619.377211628 5819435.24190253 27.7700004577637 390620.303677216 5819422.64419278 27.7700004577637 390657.986607046 5819425.41546335 27.7700004577637 390657.987263075 5819425.41643472 58.5012108416519 390620.304333223 5819422.64516415 58.5012108416519 390620.303677216 5819422.64419278 27.7700004577637 390657.986607046 5819425.41546335 27.7700004577637 390657.060141633 5819438.01317202 27.7700004577637 390657.060797662 5819438.0141434 58.5012108416519 390657.987263075 5819425.41643472 58.5012108416519 390657.986607046 5819425.41546335 27.7700004577637 390657.987263075 5819425.41643472 58.5012108416519 390657.060797662 5819438.0141434 58.5012108416519 390619.377867634 5819435.24287391 58.5012108416519 390620.304333223 5819422.64516415 58.5012108416519 390657.987263075 5819425.41643472 58.5012108416519 390620.303677216 5819422.64419278 27.7700004577637 390619.377211628 5819435.24190253 27.7700004577637 390657.060141633 5819438.01317202 27.7700004577637 390657.986607046 5819425.41546335 27.7700004577637 390620.303677216 5819422.64419278 27.7700004577637 BLDG_0003000e0028382b 1000 390620.526419692 5819420.22914465 58.483435246801 390619.58481922 5819432.48360353 58.483435246801 390597.686667604 5819430.80102072 58.483435246801 390598.628268179 5819418.54656123 58.483435246801 390620.526419692 5819420.22914465 58.483435246801 390619.584279079 5819432.48280372 33.1800003051758 390597.686127474 5819430.80022091 33.1800003051758 390597.686667604 5819430.80102072 58.483435246801 390619.58481922 5819432.48360353 58.483435246801 390619.584279079 5819432.48280372 33.1800003051758 390597.686127474 5819430.80022091 33.1800003051758 390598.627728049 5819418.54576142 33.1800003051758 390598.628268179 5819418.54656123 58.483435246801 390597.686667604 5819430.80102072 58.483435246801 390597.686127474 5819430.80022091 33.1800003051758 390598.627728049 5819418.54576142 33.1800003051758 390620.52587955 5819420.22834485 33.1800003051758 390620.526419692 5819420.22914465 58.483435246801 390598.628268179 5819418.54656123 58.483435246801 390598.627728049 5819418.54576142 33.1800003051758 390620.52587955 5819420.22834485 33.1800003051758 390619.584279079 5819432.48280372 33.1800003051758 390619.58481922 5819432.48360353 58.483435246801 390620.526419692 5819420.22914465 58.483435246801 390620.52587955 5819420.22834485 33.1800003051758 390598.627728049 5819418.54576142 33.1800003051758 390597.686127474 5819430.80022091 33.1800003051758 390619.584279079 5819432.48280372 33.1800003051758 390620.52587955 5819420.22834485 33.1800003051758 390598.627728049 5819418.54576142 33.1800003051758 BLDG_0003000e002837f6 1000 390657.181099699 5819436.37908298 62.1251574388639 390658.107949475 5819423.81761891 62.1251574388639 390688.278163944 5819426.04371589 62.1251574388639 390687.351314309 5819438.6051791 62.1251574388639 390657.181099699 5819436.37908298 62.1251574388639 390688.277515283 5819426.04275545 31.7399997711182 390687.35066565 5819438.60421866 31.7399997711182 390687.351314309 5819438.6051791 62.1251574388639 390688.278163944 5819426.04371589 62.1251574388639 390688.277515283 5819426.04275545 31.7399997711182 390658.107300833 5819423.81665848 31.7399997711182 390688.277515283 5819426.04275545 31.7399997711182 390688.278163944 5819426.04371589 62.1251574388639 390658.107949475 5819423.81761891 62.1251574388639 390658.107300833 5819423.81665848 31.7399997711182 390687.35066565 5819438.60421866 31.7399997711182 390657.180451059 5819436.37812254 31.7399997711182 390657.181099699 5819436.37908298 62.1251574388639 390687.351314309 5819438.6051791 62.1251574388639 390687.35066565 5819438.60421866 31.7399997711182 390657.180451059 5819436.37812254 31.7399997711182 390658.107300833 5819423.81665848 31.7399997711182 390658.107949475 5819423.81761891 62.1251574388639 390657.181099699 5819436.37908298 62.1251574388639 390657.180451059 5819436.37812254 31.7399997711182 390687.35066565 5819438.60421866 31.7399997711182 390688.277515283 5819426.04275545 31.7399997711182 390658.107300833 5819423.81665848 31.7399997711182 390657.180451059 5819436.37812254 31.7399997711182 390687.35066565 5819438.60421866 31.7399997711182 BLDG_0003000e00613bd9 1000 390597.938725908 5819417.47987903 32.2099990844727 390596.07985579 5819441.66048121 32.2099990844727 390596.080454355 5819441.66136755 60.2509286130946 390597.939324473 5819417.48076536 60.2509286130946 390597.938725908 5819417.47987903 32.2099990844727 390596.07985579 5819441.66048121 32.2099990844727 390585.490736708 5819440.84645547 32.2099990844727 390585.491335266 5819440.84734182 60.2509286130946 390596.080454355 5819441.66136755 60.2509286130946 390596.07985579 5819441.66048121 32.2099990844727 390585.490736708 5819440.84645547 32.2099990844727 390587.349606924 5819416.66585271 32.2099990844727 390587.350205483 5819416.66673904 60.2509286130946 390585.491335266 5819440.84734182 60.2509286130946 390585.490736708 5819440.84645547 32.2099990844727 390587.349606924 5819416.66585271 32.2099990844727 390597.938725908 5819417.47987903 32.2099990844727 390597.939324473 5819417.48076536 60.2509286130946 390587.350205483 5819416.66673904 60.2509286130946 390587.349606924 5819416.66585271 32.2099990844727 390596.07985579 5819441.66048121 32.2099990844727 390597.938725908 5819417.47987903 32.2099990844727 390587.349606924 5819416.66585271 32.2099990844727 390585.490736708 5819440.84645547 32.2099990844727 390596.07985579 5819441.66048121 32.2099990844727 390585.491335266 5819440.84734182 60.2509286130946 390587.350205483 5819416.66673904 60.2509286130946 390597.939324473 5819417.48076536 60.2509286130946 390596.080454355 5819441.66136755 60.2509286130946 390585.491335266 5819440.84734182 60.2509286130946 DEB_LOD2_UUID_d076c73f-9d9c-4ab9-a89a-ea3adca61066 2100 390596.033 5819442.593 56.568 390596.465 5819436.845 51.811 390603.438 5819437.457 51.811 390596.007 5819442.939 56.854 390596.033 5819442.593 56.568 390595.674 5819447.375 33.12 390595.674 5819447.375 56.854 390602.306 5819447.904 52.06 390602.306 5819447.904 33.12 390595.674 5819447.375 33.12 390602.306 5819447.904 33.12 390602.306 5819447.904 52.06 390602.637 5819447.897 51.823 390602.637 5819447.897 33.12 390602.306 5819447.904 33.12 390595.977 5819443.349 33.12 390595.977 5819443.349 56.853 390595.833 5819445.256 56.854 390595.833 5819445.256 33.12 390595.977 5819443.349 33.12 390595.833 5819445.256 33.12 390595.833 5819445.256 56.854 390595.674 5819447.375 56.854 390595.674 5819447.375 33.12 390595.833 5819445.256 33.12 390596.465 5819436.845 33.12 390596.465 5819436.845 51.811 390596.033 5819442.593 56.568 390596.033 5819442.593 33.12 390596.465 5819436.845 33.12 390603.438 5819437.457 33.12 390596.465 5819436.845 33.12 390596.033 5819442.593 33.12 390596.007 5819442.939 33.12 390596.004 5819442.983 33.12 390595.977 5819443.349 33.12 390595.833 5819445.256 33.12 390595.674 5819447.375 33.12 390602.306 5819447.904 33.12 390602.637 5819447.897 33.12 390602.978 5819443.594 33.12 390603.465 5819437.459 33.12 390603.438 5819437.457 33.12 390596.004 5819442.983 33.12 390596.007 5819442.939 33.12 390596.033 5819442.593 33.12 390596.033 5819442.593 56.568 390596.007 5819442.939 56.854 390596.004 5819442.983 56.854 390595.977 5819443.349 56.853 390595.977 5819443.349 33.12 390596.004 5819442.983 33.12 390596.465 5819436.845 33.12 390603.438 5819437.457 33.12 390603.465 5819437.459 33.12 390603.465 5819437.459 51.791 390603.438 5819437.457 51.811 390596.465 5819436.845 51.811 390596.465 5819436.845 33.12 390602.978 5819443.594 51.81 390603.465 5819437.459 51.791 390603.465 5819437.459 33.12 390602.978 5819443.594 33.12 390602.637 5819447.897 33.12 390602.637 5819447.897 51.823 390602.978 5819443.594 51.81 390595.833 5819445.256 56.854 390595.977 5819443.349 56.853 390596.004 5819442.983 56.854 390596.007 5819442.939 56.854 390603.438 5819437.457 51.811 390603.465 5819437.459 51.791 390602.978 5819443.594 51.81 390602.637 5819447.897 51.823 390602.306 5819447.904 52.06 390595.674 5819447.375 56.854 390595.833 5819445.256 56.854 BLDG_0003000f001c07a3 1130 390517.275396005 5819450.89310331 31.5599994659424 390517.02046657 5819456.1670139 31.5599994659424 390517.020965391 5819456.16775261 54.93 390517.275894827 5819450.89384202 54.93 390517.275396005 5819450.89310331 31.5599994659424 390523.10088362 5819449.11939638 31.5599994659424 390523.101382445 5819449.12013508 54.93 390517.375006904 5819448.84343879 54.93 390510.675601292 5819448.51975974 59.93 390503.975982118 5819448.1957646 54.93 390503.975421412 5819448.19498868 31.5599994659424 390517.374512018 5819448.84261865 31.5599994659424 390523.10088362 5819449.11939638 31.5599994659424 390523.10088362 5819449.11939638 31.5599994659424 390523.001774847 5819451.16988136 31.5599994659424 390523.002273671 5819451.17062006 54.93 390523.101382445 5819449.12013508 54.93 390523.10088362 5819449.11939638 31.5599994659424 390503.975421412 5819448.19498868 31.5599994659424 390503.975982118 5819448.1957646 54.93 390503.876867749 5819450.24621518 54.93 390503.621940581 5819455.52007864 54.93 390503.621441766 5819455.51933994 31.5599994659424 390503.975421412 5819448.19498868 31.5599994659424 390523.001774847 5819451.16988136 31.5599994659424 390517.275396005 5819450.89310331 31.5599994659424 390517.275894827 5819450.89384202 54.93 390523.002273671 5819451.17062006 54.93 390523.001774847 5819451.16988136 31.5599994659424 390517.02046657 5819456.1670139 31.5599994659424 390503.621441766 5819455.51933994 31.5599994659424 390503.621940581 5819455.52007864 54.93 390510.321559768 5819455.84407367 59.93 390517.020965391 5819456.16775261 54.93 390517.02046657 5819456.1670139 31.5599994659424 390517.375006904 5819448.84343879 54.93 390523.101382445 5819449.12013508 54.93 390523.002273671 5819451.17062006 54.93 390517.275894827 5819450.89384202 54.93 390517.375006904 5819448.84343879 54.93 390503.621940581 5819455.52007864 54.93 390503.876867749 5819450.24621518 54.93 390503.975982118 5819448.1957646 54.93 390510.675601292 5819448.51975974 59.93 390510.321559768 5819455.84407367 59.93 390503.621940581 5819455.52007864 54.93 390517.375006904 5819448.84343879 54.93 390517.275894827 5819450.89384202 54.93 390517.020965391 5819456.16775261 54.93 390510.321559768 5819455.84407367 59.93 390510.675601292 5819448.51975974 59.93 390517.375006904 5819448.84343879 54.93 390503.975421412 5819448.19498868 31.5599994659424 390503.621441766 5819455.51933994 31.5599994659424 390517.02046657 5819456.1670139 31.5599994659424 390517.275396005 5819450.89310331 31.5599994659424 390523.001774847 5819451.16988136 31.5599994659424 390523.10088362 5819449.11939638 31.5599994659424 390517.374512018 5819448.84261865 31.5599994659424 390503.975421412 5819448.19498868 31.5599994659424 DEB_LOD2_UUID_aafe396c-a5cf-46c2-896d-e2fcaba7db3f 2100 390595.674 5819447.375 48.56 390595.976 5819447.399 48.56 390595.417 5819454.995 48.56 390595.103 5819454.972 48.56 390595.674 5819447.375 48.56 390595.674 5819447.375 33.06 390595.674 5819447.375 48.56 390595.103 5819454.972 48.56 390595.103 5819454.972 33.06 390595.674 5819447.375 33.06 390595.976 5819447.399 48.56 390595.976 5819447.399 54.28 390595.417 5819454.995 54.28 390595.417 5819454.995 48.56 390595.976 5819447.399 48.56 390603.9 5819469.496 33.06 390603.9 5819469.496 54.243 390604.249 5819461.915 48.635 390604.249 5819461.915 33.06 390603.9 5819469.496 33.06 390601.48 5819461.714 48.631 390601.486 5819461.618 48.632 390601.848 5819455.564 48.704 390602.306 5819447.904 48.795 390602.306 5819447.904 33.06 390601.848 5819455.564 33.06 390601.486 5819461.618 33.06 390601.48 5819461.714 33.06 390601.478 5819461.753 33.06 390601.478 5819461.753 48.66 390601.48 5819461.714 48.631 390594.542 5819468.729 33.06 390595.092 5819461.168 33.06 390595.532 5819455.119 33.06 390595.54 5819455.004 33.06 390595.54 5819455.004 54.173 390595.532 5819455.119 54.173 390595.092 5819461.168 54.169 390594.542 5819468.729 54.163 390594.534 5819468.837 54.243 390594.534 5819468.837 33.06 390594.542 5819468.729 33.06 390601.559 5819461.758 33.06 390601.478 5819461.753 33.06 390601.48 5819461.714 33.06 390601.486 5819461.618 33.06 390601.848 5819455.564 33.06 390602.306 5819447.904 33.06 390595.976 5819447.399 33.06 390595.674 5819447.375 33.06 390595.103 5819454.972 33.06 390595.417 5819454.995 33.06 390595.54 5819455.004 33.06 390595.532 5819455.119 33.06 390595.092 5819461.168 33.06 390594.542 5819468.729 33.06 390594.534 5819468.837 33.06 390601.005 5819469.292 33.06 390603.9 5819469.496 33.06 390604.249 5819461.915 33.06 390601.559 5819461.758 33.06 390595.092 5819461.168 54.169 390595.532 5819455.119 54.173 390595.54 5819455.004 54.173 390595.417 5819454.995 54.28 390595.976 5819447.399 54.28 390602.306 5819447.904 48.795 390601.848 5819455.564 48.704 390601.486 5819461.618 48.632 390601.48 5819461.714 48.631 390594.542 5819468.729 54.163 390595.092 5819461.168 54.169 390595.976 5819447.399 48.56 390595.674 5819447.375 48.56 390595.674 5819447.375 33.06 390595.976 5819447.399 33.06 390602.306 5819447.904 33.06 390602.306 5819447.904 48.795 390595.976 5819447.399 54.28 390595.976 5819447.399 48.56 390595.103 5819454.972 48.56 390595.417 5819454.995 48.56 390595.417 5819454.995 54.28 390595.54 5819455.004 54.173 390595.54 5819455.004 33.06 390595.417 5819454.995 33.06 390595.103 5819454.972 33.06 390595.103 5819454.972 48.56 390601.478 5819461.753 33.06 390601.559 5819461.758 33.06 390604.249 5819461.915 33.06 390604.249 5819461.915 48.635 390601.559 5819461.758 48.659 390601.478 5819461.753 48.66 390601.478 5819461.753 33.06 390594.534 5819468.837 54.243 390601.005 5819469.292 54.243 390603.9 5819469.496 54.243 390603.9 5819469.496 33.06 390601.005 5819469.292 33.06 390594.534 5819468.837 33.06 390594.534 5819468.837 54.243 390594.542 5819468.729 54.163 390601.48 5819461.714 48.631 390601.478 5819461.753 48.66 390601.559 5819461.758 48.659 390604.249 5819461.915 48.635 390603.9 5819469.496 54.243 390601.005 5819469.292 54.243 390594.534 5819468.837 54.243 390594.542 5819468.729 54.163 BLDG_0003000900014026 1000 390686.388002632 5819448.3978606 59.2751795396671 390686.037370637 5819453.10055658 59.2751795396671 390685.05202517 5819453.02709002 59.2751795396671 390682.991364493 5819480.66551591 59.2751795396671 390670.192910927 5819479.71129916 59.2751795396671 390672.253573568 5819452.0728479 59.2751795396671 390672.604196558 5819447.3701511 59.2751795396671 390673.341093493 5819437.48659477 59.2751795396671 390686.139546856 5819438.44081275 59.2751795396671 390685.402648137 5819448.32439336 59.2751795396671 390686.388002632 5819448.3978606 59.2751795396671 390686.13947902 5819438.4407123 56.0974998474121 390687.124759569 5819438.51423693 56.0974998474121 390686.954557564 5819440.79707083 56.0974998474121 390685.969270929 5819440.72361108 56.0974998474121 390686.13947902 5819438.4407123 56.0974998474121 390684.091364736 5819465.91149872 58.1428576878139 390685.076696518 5819465.98496529 58.1428576878139 390684.710552387 5819470.89564199 58.1428576878139 390683.725235339 5819470.82217652 58.1428576878139 390684.091364736 5819465.91149872 58.1428576878139 390673.340555745 5819437.48585539 33.5699996948242 390672.603647814 5819447.36933858 33.5699996948242 390672.253024824 5819452.07203538 33.5699996948242 390671.292389532 5819464.9564664 33.5699996948242 390670.926260113 5819469.86714435 33.5699996948242 390670.192362184 5819479.71048663 33.5699996948242 390682.990815744 5819480.66470338 33.5699996948242 390683.724710762 5819470.82139979 33.5699996948242 390684.710027809 5819470.89486526 33.5699996948242 390685.07617194 5819465.98418856 33.5699996948242 390684.090840158 5819465.91072198 33.5699996948242 390685.051476419 5819453.02627751 33.5699996948242 390686.036821886 5819453.09974406 33.5699996948242 390686.387453881 5819448.39704808 33.5699996948242 390685.402099386 5819448.32358084 33.5699996948242 390685.968790015 5819440.72289901 33.5699996948242 390686.954076648 5819440.79635877 33.5699996948242 390687.124278654 5819438.51352486 33.5699996948242 390686.138993261 5819438.4400652 33.5699996948242 390673.340555745 5819437.48585539 33.5699996948242 390673.340555745 5819437.48585539 33.5699996948242 390686.138993261 5819438.4400652 33.5699996948242 390687.124278654 5819438.51352486 33.5699996948242 390687.124759569 5819438.51423693 56.0974998474121 390686.13947902 5819438.4407123 56.0974998474121 390686.139546856 5819438.44081275 59.2751795396671 390673.341093493 5819437.48659477 59.2751795396671 390673.341025657 5819437.48649432 56.0974998474121 390673.340555745 5819437.48585539 33.5699996948242 390684.090840158 5819465.91072198 33.5699996948242 390685.07617194 5819465.98418856 33.5699996948242 390685.076696518 5819465.98496529 58.1428576878139 390684.091364736 5819465.91149872 58.1428576878139 390684.091321071 5819465.91143406 56.0974998474121 390684.090840158 5819465.91072198 33.5699996948242 390687.124278654 5819438.51352486 33.5699996948242 390686.954076648 5819440.79635877 33.5699996948242 390686.954557564 5819440.79707083 56.0974998474121 390687.124759569 5819438.51423693 56.0974998474121 390687.124278654 5819438.51352486 33.5699996948242 390683.725235339 5819470.82217652 58.1428576878139 390683.725191675 5819470.82211187 56.0974998474121 390683.724710762 5819470.82139979 33.5699996948242 390682.990815744 5819480.66470338 33.5699996948242 390682.991340321 5819480.66548012 58.1428576878139 390682.991364493 5819480.66551591 59.2751795396671 390685.05202517 5819453.02709002 59.2751795396671 390685.052000997 5819453.02705423 58.1428576878139 390685.051957333 5819453.02698958 56.0974998474121 390685.051476419 5819453.02627751 33.5699996948242 390684.090840158 5819465.91072198 33.5699996948242 390684.091321071 5819465.91143406 56.0974998474121 390684.091364736 5819465.91149872 58.1428576878139 390683.725235339 5819470.82217652 58.1428576878139 390685.402099386 5819448.32358084 33.5699996948242 390686.387453881 5819448.39704808 33.5699996948242 390686.388002632 5819448.3978606 59.2751795396671 390685.402648137 5819448.32439336 59.2751795396671 390685.402623965 5819448.32435757 58.1428576878139 390685.402580301 5819448.32429292 56.0974998474121 390685.402099386 5819448.32358084 33.5699996948242 390686.954076648 5819440.79635877 33.5699996948242 390685.968790015 5819440.72289901 33.5699996948242 390685.969270929 5819440.72361108 56.0974998474121 390686.954557564 5819440.79707083 56.0974998474121 390686.954076648 5819440.79635877 33.5699996948242 390670.192910927 5819479.71129916 59.2751795396671 390682.991364493 5819480.66551591 59.2751795396671 390682.991340321 5819480.66548012 58.1428576878139 390682.990815744 5819480.66470338 33.5699996948242 390670.192362184 5819479.71048663 33.5699996948242 390670.192886755 5819479.71126337 58.1428576878139 390670.192910927 5819479.71129916 59.2751795396671 390672.253573568 5819452.0728479 59.2751795396671 390670.192910927 5819479.71129916 59.2751795396671 390670.192886755 5819479.71126337 58.1428576878139 390670.192362184 5819479.71048663 33.5699996948242 390670.926260113 5819469.86714435 33.5699996948242 390671.292389532 5819464.9564664 33.5699996948242 390672.253024824 5819452.07203538 33.5699996948242 390672.603647814 5819447.36933858 33.5699996948242 390673.340555745 5819437.48585539 33.5699996948242 390673.341025657 5819437.48649432 56.0974998474121 390673.341093493 5819437.48659477 59.2751795396671 390672.604196558 5819447.3701511 59.2751795396671 390672.253573568 5819452.0728479 59.2751795396671 390684.710027809 5819470.89486526 33.5699996948242 390683.724710762 5819470.82139979 33.5699996948242 390683.725191675 5819470.82211187 56.0974998474121 390683.725235339 5819470.82217652 58.1428576878139 390684.710552387 5819470.89564199 58.1428576878139 390684.710027809 5819470.89486526 33.5699996948242 390685.07617194 5819465.98418856 33.5699996948242 390684.710027809 5819470.89486526 33.5699996948242 390684.710552387 5819470.89564199 58.1428576878139 390685.076696518 5819465.98496529 58.1428576878139 390685.07617194 5819465.98418856 33.5699996948242 390686.387453881 5819448.39704808 33.5699996948242 390686.036821886 5819453.09974406 33.5699996948242 390686.037370637 5819453.10055658 59.2751795396671 390686.388002632 5819448.3978606 59.2751795396671 390686.387453881 5819448.39704808 33.5699996948242 390685.402623965 5819448.32435757 58.1428576878139 390685.402648137 5819448.32439336 59.2751795396671 390686.139546856 5819438.44081275 59.2751795396671 390686.13947902 5819438.4407123 56.0974998474121 390685.969270929 5819440.72361108 56.0974998474121 390685.968790015 5819440.72289901 33.5699996948242 390685.402099386 5819448.32358084 33.5699996948242 390685.402580301 5819448.32429292 56.0974998474121 390685.402623965 5819448.32435757 58.1428576878139 390686.036821886 5819453.09974406 33.5699996948242 390685.051476419 5819453.02627751 33.5699996948242 390685.051957333 5819453.02698958 56.0974998474121 390685.052000997 5819453.02705423 58.1428576878139 390685.05202517 5819453.02709002 59.2751795396671 390686.037370637 5819453.10055658 59.2751795396671 390686.036821886 5819453.09974406 33.5699996948242 BLDG_0003000200647534 1000 390682.522346298 5819501.13585711 33.439998626709 390656.191355988 5819499.05430124 33.439998626709 390656.19190124 5819499.05510862 58.9819695535147 390682.522891563 5819501.13666448 58.9819695535147 390682.522346298 5819501.13585711 33.439998626709 390657.749693979 5819479.34200508 33.439998626709 390684.080684083 5819481.42356212 33.439998626709 390684.081229349 5819481.4243695 58.9819695535147 390657.750239231 5819479.34281245 58.9819695535147 390657.749693979 5819479.34200508 33.439998626709 390656.191355988 5819499.05430124 33.439998626709 390657.749693979 5819479.34200508 33.439998626709 390657.750239231 5819479.34281245 58.9819695535147 390656.19190124 5819499.05510862 58.9819695535147 390656.191355988 5819499.05430124 33.439998626709 390684.080684083 5819481.42356212 33.439998626709 390682.522346298 5819501.13585711 33.439998626709 390682.522891563 5819501.13666448 58.9819695535147 390684.081229349 5819481.4243695 58.9819695535147 390684.080684083 5819481.42356212 33.439998626709 390656.191355988 5819499.05430124 33.439998626709 390682.522346298 5819501.13585711 33.439998626709 390684.080684083 5819481.42356212 33.439998626709 390657.749693979 5819479.34200508 33.439998626709 390656.191355988 5819499.05430124 33.439998626709 390657.750239231 5819479.34281245 58.9819695535147 390684.081229349 5819481.4243695 58.9819695535147 390682.522891563 5819501.13666448 58.9819695535147 390656.19190124 5819499.05510862 58.9819695535147 390657.750239231 5819479.34281245 58.9819695535147 BLDG_000300000016c6bf 1000 390490.87731189 5819232.7227899 36.9282811880112 390490.702971199 5819236.23076421 36.9282811880112 390483.692071293 5819235.8823369 36.9282811880112 390483.86641199 5819232.37436254 36.9282811880112 390490.87731189 5819232.7227899 36.9282811880112 390483.692012207 5819235.88224941 34.1599998474121 390483.866352904 5819232.37427505 34.1599998474121 390483.86641199 5819232.37436254 36.9282811880112 390483.692071293 5819235.8823369 36.9282811880112 390483.692012207 5819235.88224941 34.1599998474121 390490.877252804 5819232.72270241 34.1599998474121 390490.702912113 5819236.23067672 34.1599998474121 390490.702971199 5819236.23076421 36.9282811880112 390490.87731189 5819232.7227899 36.9282811880112 390490.877252804 5819232.72270241 34.1599998474121 390490.702912113 5819236.23067672 34.1599998474121 390483.692012207 5819235.88224941 34.1599998474121 390483.692071293 5819235.8823369 36.9282811880112 390490.702971199 5819236.23076421 36.9282811880112 390490.702912113 5819236.23067672 34.1599998474121 390483.866352904 5819232.37427505 34.1599998474121 390490.877252804 5819232.72270241 34.1599998474121 390490.87731189 5819232.7227899 36.9282811880112 390483.86641199 5819232.37436254 36.9282811880112 390483.866352904 5819232.37427505 34.1599998474121 390483.866352904 5819232.37427505 34.1599998474121 390483.692012207 5819235.88224941 34.1599998474121 390490.702912113 5819236.23067672 34.1599998474121 390490.877252804 5819232.72270241 34.1599998474121 390483.866352904 5819232.37427505 34.1599998474121 BLDG_0003000e0087b6fe 1130 390516.59375343 5819290.24607566 45.5 390517.599463425 5819277.66327135 45.5 390523.437023802 5819284.46157648 50 390516.59375343 5819290.24607566 45.5 390517.599463425 5819277.66327135 45.5 390530.231205061 5819278.67288485 45.5 390523.437023802 5819284.46157648 50 390517.599463425 5819277.66327135 45.5 390529.225495131 5819291.2556888 45.5 390516.59375343 5819290.24607566 45.5 390523.437023802 5819284.46157648 50 390529.225495131 5819291.2556888 45.5 390530.231205061 5819278.67288485 45.5 390529.225495131 5819291.2556888 45.5 390523.437023802 5819284.46157648 50 390530.231205061 5819278.67288485 45.5 390529.735112065 5819284.87774351 39 390534.094074611 5819285.22614298 39 390533.584296809 5819291.60412279 39 390529.22535639 5819291.25548336 39 390529.735112065 5819284.87774351 39 390530.230953833 5819278.67251285 33.7299995422363 390517.599212199 5819277.66289935 33.7299995422363 390516.592792355 5819290.24588286 33.7299995422363 390529.225224699 5819291.25555705 33.7299995422363 390533.584184321 5819291.60395622 33.7299995422363 390534.093962123 5819285.22597642 33.7299995422363 390529.734999578 5819284.87757695 33.7299995422363 390530.230953833 5819278.67251285 33.7299995422363 390529.734999578 5819284.87757695 33.7299995422363 390534.093962123 5819285.22597642 33.7299995422363 390534.094074611 5819285.22614298 39 390529.735112065 5819284.87774351 39 390529.734999578 5819284.87757695 33.7299995422363 390517.599212199 5819277.66289935 33.7299995422363 390530.230953833 5819278.67251285 33.7299995422363 390530.23106632 5819278.67267942 39 390530.231205061 5819278.67288485 45.5 390517.599463425 5819277.66327135 45.5 390517.599324685 5819277.66306591 39 390517.599212199 5819277.66289935 33.7299995422363 390534.093962123 5819285.22597642 33.7299995422363 390533.584184321 5819291.60395622 33.7299995422363 390533.584296809 5819291.60412279 39 390534.094074611 5819285.22614298 39 390534.093962123 5819285.22597642 33.7299995422363 390530.230953833 5819278.67251285 33.7299995422363 390529.734999578 5819284.87757695 33.7299995422363 390529.735112065 5819284.87774351 39 390529.22535639 5819291.25548336 39 390529.225495131 5819291.2556888 45.5 390530.231205061 5819278.67288485 45.5 390530.23106632 5819278.67267942 39 390530.230953833 5819278.67251285 33.7299995422363 390516.592792355 5819290.24588286 33.7299995422363 390517.599212199 5819277.66289935 33.7299995422363 390517.599324685 5819277.66306591 39 390517.599463425 5819277.66327135 45.5 390516.59375343 5819290.24607566 45.5 390516.593614691 5819290.24587022 39 390516.592792355 5819290.24588286 33.7299995422363 390533.584296809 5819291.60412279 39 390533.584184321 5819291.60395622 33.7299995422363 390529.225224699 5819291.25555705 33.7299995422363 390516.592792355 5819290.24588286 33.7299995422363 390516.593614691 5819290.24587022 39 390516.59375343 5819290.24607566 45.5 390529.225495131 5819291.2556888 45.5 390529.22535639 5819291.25548336 39 390533.584296809 5819291.60412279 39 BLDG_000300000016cafa 1000 390524.972085586 5819270.15034734 33.9000015258789 390524.823015954 5819272.67678065 33.9000015258789 390529.983496188 5819272.98126692 33.9000015258789 390530.132565816 5819270.45483364 33.9000015258789 390524.972085586 5819270.15034734 33.9000015258789 390530.132568804 5819270.45483807 34.04 390529.983499176 5819272.98127135 34.04 390524.823018942 5819272.67678508 34.04 390524.972088574 5819270.15035176 34.04 390530.132568804 5819270.45483807 34.04 390529.983496188 5819272.98126692 33.9000015258789 390524.823015954 5819272.67678065 33.9000015258789 390524.823018942 5819272.67678508 34.04 390529.983499176 5819272.98127135 34.04 390529.983496188 5819272.98126692 33.9000015258789 390524.823015954 5819272.67678065 33.9000015258789 390524.972085586 5819270.15034734 33.9000015258789 390524.972088574 5819270.15035176 34.04 390524.823018942 5819272.67678508 34.04 390524.823015954 5819272.67678065 33.9000015258789 390530.132565816 5819270.45483364 33.9000015258789 390529.983496188 5819272.98126692 33.9000015258789 390529.983499176 5819272.98127135 34.04 390530.132568804 5819270.45483807 34.04 390530.132565816 5819270.45483364 33.9000015258789 390524.972085586 5819270.15034734 33.9000015258789 390530.132565816 5819270.45483364 33.9000015258789 390530.132568804 5819270.45483807 34.04 390524.972088574 5819270.15035176 34.04 390524.972085586 5819270.15034734 33.9000015258789 BLDG_0003000b0071e1f7 1130 390628.717301579 5819260.15690457 32.0999984741211 390637.639148561 5819260.79893689 32.0999984741211 390637.639726889 5819260.79979314 59.1918845166591 390628.717879903 5819260.15776082 59.1918845166591 390628.717301579 5819260.15690457 32.0999984741211 390634.864634476 5819299.36338274 59.1918845166591 390634.864020281 5819299.36254914 32.0999984741211 390590.922040916 5819296.20038066 32.0999984741211 390590.922619218 5819296.20123693 59.1918845166591 390625.942753338 5819298.72134827 59.1918845166591 390634.864634476 5819299.36338274 59.1918845166591 390626.986841664 5819284.20363732 32.0999984741211 390628.717301579 5819260.15690457 32.0999984741211 390628.717879903 5819260.15776082 59.1918845166591 390626.987419986 5819284.20449358 59.1918845166591 390626.986841664 5819284.20363732 32.0999984741211 390590.922040916 5819296.20038066 32.0999984741211 390591.966708517 5819281.68352487 32.0999984741211 390591.967286821 5819281.68438114 59.1918845166591 390591.445057165 5819288.94296331 64.0736525127015 390590.922619218 5819296.20123693 59.1918845166591 390590.922040916 5819296.20038066 32.0999984741211 390637.639726889 5819260.79979314 59.1918845166591 390637.639148561 5819260.79893689 32.0999984741211 390635.908688689 5819284.84566962 32.0999984741211 390634.864020281 5819299.36254914 32.0999984741211 390634.864634476 5819299.36338274 59.1918845166591 390635.387072311 5819292.10510985 64.0736525127015 390635.909301846 5819284.84652839 59.1918845166591 390637.639726889 5819260.79979314 59.1918845166591 390591.966708517 5819281.68352487 32.0999984741211 390626.986841664 5819284.20363732 32.0999984741211 390626.987419986 5819284.20449358 59.1918845166591 390591.967286821 5819281.68438114 59.1918845166591 390591.966708517 5819281.68352487 32.0999984741211 390591.966708517 5819281.68352487 32.0999984741211 390590.922040916 5819296.20038066 32.0999984741211 390634.864020281 5819299.36254914 32.0999984741211 390635.908688689 5819284.84566962 32.0999984741211 390637.639148561 5819260.79893689 32.0999984741211 390628.717301579 5819260.15690457 32.0999984741211 390626.986841664 5819284.20363732 32.0999984741211 390591.966708517 5819281.68352487 32.0999984741211 390626.987419986 5819284.20449358 59.1918845166591 390628.717879903 5819260.15776082 59.1918845166591 390637.639726889 5819260.79979314 59.1918845166591 390635.909301846 5819284.84652839 59.1918845166591 390626.987419986 5819284.20449358 59.1918845166591 390591.967286821 5819281.68438114 59.1918845166591 390626.987419986 5819284.20449358 59.1918845166591 390635.909301846 5819284.84652839 59.1918845166591 390635.387072311 5819292.10510985 64.0736525127015 390591.445057165 5819288.94296331 64.0736525127015 390591.967286821 5819281.68438114 59.1918845166591 390634.864634476 5819299.36338274 59.1918845166591 390625.942753338 5819298.72134827 59.1918845166591 390590.922619218 5819296.20123693 59.1918845166591 390591.445057165 5819288.94296331 64.0736525127015 390635.387072311 5819292.10510985 64.0736525127015 390634.864634476 5819299.36338274 59.1918845166591 BLDG_0003000e002837a8 1130 390536.320663991 5819286.35574192 33.5200004577637 390540.724606509 5819286.69527482 33.5200004577637 390540.72472348 5819286.69544802 39 390536.320780961 5819286.35591513 39 390536.320663991 5819286.35574192 33.5200004577637 390540.724606509 5819286.69527482 33.5200004577637 390541.293496061 5819279.3167788 33.5200004577637 390541.293613032 5819279.316952 39 390541.293762447 5819279.31717324 46 390540.304818327 5819292.14377695 46 390540.304668913 5819292.14355571 39 390540.72472348 5819286.69544802 39 390540.724606509 5819286.69527482 33.5200004577637 390541.293496061 5819279.3167788 33.5200004577637 390554.025339625 5819280.29840909 33.5200004577637 390554.025456597 5819280.29858229 39 390554.025606014 5819280.29880353 46 390541.293762447 5819279.31717324 46 390541.293613032 5819279.316952 39 390541.293496061 5819279.3167788 33.5200004577637 390554.025339625 5819280.29840909 33.5200004577637 390553.036347885 5819293.12502393 33.5200004577637 390553.036512541 5819293.12518563 39 390553.036661958 5819293.12540688 46 390554.025606014 5819280.29880353 46 390554.025456597 5819280.29858229 39 390554.025339625 5819280.29840909 33.5200004577637 390540.304818327 5819292.14377695 46 390553.036661958 5819293.12540688 46 390553.036512541 5819293.12518563 39 390553.036347885 5819293.12502393 33.5200004577637 390540.304547945 5819292.14343436 33.5200004577637 390535.900621147 5819291.80390274 33.5200004577637 390535.900738117 5819291.80407594 39 390540.304668913 5819292.14355571 39 390540.304818327 5819292.14377695 46 390535.900621147 5819291.80390274 33.5200004577637 390536.320663991 5819286.35574192 33.5200004577637 390536.320780961 5819286.35591513 39 390535.900738117 5819291.80407594 39 390535.900621147 5819291.80390274 33.5200004577637 390553.036347885 5819293.12502393 33.5200004577637 390554.025339625 5819280.29840909 33.5200004577637 390541.293496061 5819279.3167788 33.5200004577637 390540.724606509 5819286.69527482 33.5200004577637 390536.320663991 5819286.35574192 33.5200004577637 390535.900621147 5819291.80390274 33.5200004577637 390540.304547945 5819292.14343436 33.5200004577637 390553.036347885 5819293.12502393 33.5200004577637 390540.304818327 5819292.14377695 46 390541.293762447 5819279.31717324 46 390547.165297575 5819286.22141657 50 390540.304818327 5819292.14377695 46 390553.036661958 5819293.12540688 46 390540.304818327 5819292.14377695 46 390547.165297575 5819286.22141657 50 390553.036661958 5819293.12540688 46 390540.304668913 5819292.14355571 39 390535.900738117 5819291.80407594 39 390536.320780961 5819286.35591513 39 390540.72472348 5819286.69544802 39 390540.304668913 5819292.14355571 39 390554.025606014 5819280.29880353 46 390553.036661958 5819293.12540688 46 390547.165297575 5819286.22141657 50 390554.025606014 5819280.29880353 46 390541.293762447 5819279.31717324 46 390554.025606014 5819280.29880353 46 390547.165297575 5819286.22141657 50 390541.293762447 5819279.31717324 46 BLDG_000300000016d166 1130 390579.579611026 5819256.01746082 59.5675052850726 390587.015050612 5819256.54582908 59.57 390586.523718936 5819263.45988063 59.57 390579.088276379 5819262.93150175 59.5675052850726 390579.579611026 5819256.01746082 59.5675052850726 390568.808391324 5819274.93346832 59.5675052850726 390569.708656832 5819262.26496547 59.5675052850726 390570.199991858 5819255.35091937 59.5675052850726 390574.889836245 5819255.68424159 61.1966139058983 390573.498235744 5819275.26679033 61.1966139058983 390568.808391324 5819274.93346832 59.5675052850726 390579.579611026 5819256.01746082 59.5675052850726 390579.088276379 5819262.93150175 59.5675052850726 390578.188010557 5819275.60000935 59.5675052850726 390573.498235744 5819275.26679033 61.1966139058983 390574.889836245 5819255.68424159 61.1966139058983 390579.579611026 5819256.01746082 59.5675052850726 390570.19937855 5819255.34990874 27.6100006103516 390568.807709174 5819274.93245828 27.6100006103516 390578.1873284 5819275.59899931 27.6100006103516 390579.087594222 5819262.93049172 27.6100006103516 390586.523036721 5819263.45887052 27.6100006103516 390587.014368397 5819256.54481897 27.6100006103516 390579.578929614 5819256.01644031 27.6100006103516 390570.19937855 5819255.34990874 27.6100006103516 390586.523036721 5819263.45887052 27.6100006103516 390579.087594222 5819262.93049172 27.6100006103516 390579.088276379 5819262.93150175 59.5675052850726 390586.523718936 5819263.45988063 59.57 390586.523036721 5819263.45887052 27.6100006103516 390587.014368397 5819256.54481897 27.6100006103516 390586.523036721 5819263.45887052 27.6100006103516 390586.523718936 5819263.45988063 59.57 390587.015050612 5819256.54582908 59.57 390587.014368397 5819256.54481897 27.6100006103516 390570.19937855 5819255.34990874 27.6100006103516 390570.199991858 5819255.35091937 59.5675052850726 390569.708656832 5819262.26496547 59.5675052850726 390568.808391324 5819274.93346832 59.5675052850726 390568.807709174 5819274.93245828 27.6100006103516 390570.19937855 5819255.34990874 27.6100006103516 390578.1873284 5819275.59899931 27.6100006103516 390568.807709174 5819274.93245828 27.6100006103516 390568.808391324 5819274.93346832 59.5675052850726 390573.498235744 5819275.26679033 61.1966139058983 390578.188010557 5819275.60000935 59.5675052850726 390578.1873284 5819275.59899931 27.6100006103516 390579.087594222 5819262.93049172 27.6100006103516 390578.1873284 5819275.59899931 27.6100006103516 390578.188010557 5819275.60000935 59.5675052850726 390579.088276379 5819262.93150175 59.5675052850726 390579.087594222 5819262.93049172 27.6100006103516 390587.014368397 5819256.54481897 27.6100006103516 390587.015050612 5819256.54582908 59.57 390579.579611026 5819256.01746082 59.5675052850726 390574.889836245 5819255.68424159 61.1966139058983 390570.199991858 5819255.35091937 59.5675052850726 390570.19937855 5819255.34990874 27.6100006103516 390579.578929614 5819256.01644031 27.6100006103516 390587.014368397 5819256.54481897 27.6100006103516 BLDG_0003000b0071e1de 1000 390599.777652672 5819282.24685543 31.0400009155273 390626.962091029 5819284.28373546 31.0400009155273 390628.813494688 5819259.57536993 31.0400009155273 390601.629022471 5819257.53846685 31.0400009155273 390593.711349027 5819256.94520413 31.0400009155273 390593.163546374 5819264.25611033 31.0400009155273 390601.08122491 5819264.84937329 31.0400009155273 390599.777652672 5819282.24685543 31.0400009155273 390593.164134396 5819264.25698097 58.5871517502259 390593.71193705 5819256.94607477 58.5871517502259 390601.629610498 5819257.53933749 58.5871517502259 390628.81408273 5819259.57624056 58.5871517502259 390628.266249718 5819266.8871439 58.5871517502259 390626.96267907 5819284.28460611 58.5871517502259 390599.778240698 5819282.24772608 58.5871517502259 390601.081812937 5819264.85024393 58.5871517502259 390593.164134396 5819264.25698097 58.5871517502259 390601.08122491 5819264.84937329 31.0400009155273 390593.163546374 5819264.25611033 31.0400009155273 390593.164134396 5819264.25698097 58.5871517502259 390601.081812937 5819264.85024393 58.5871517502259 390601.08122491 5819264.84937329 31.0400009155273 390628.81408273 5819259.57624056 58.5871517502259 390628.813494688 5819259.57536993 31.0400009155273 390626.962091029 5819284.28373546 31.0400009155273 390626.96267907 5819284.28460611 58.5871517502259 390628.266249718 5819266.8871439 58.5871517502259 390628.81408273 5819259.57624056 58.5871517502259 390593.163546374 5819264.25611033 31.0400009155273 390593.711349027 5819256.94520413 31.0400009155273 390593.71193705 5819256.94607477 58.5871517502259 390593.164134396 5819264.25698097 58.5871517502259 390593.163546374 5819264.25611033 31.0400009155273 390599.777652672 5819282.24685543 31.0400009155273 390601.08122491 5819264.84937329 31.0400009155273 390601.081812937 5819264.85024393 58.5871517502259 390599.778240698 5819282.24772608 58.5871517502259 390599.777652672 5819282.24685543 31.0400009155273 390628.813494688 5819259.57536993 31.0400009155273 390628.81408273 5819259.57624056 58.5871517502259 390601.629610498 5819257.53933749 58.5871517502259 390593.71193705 5819256.94607477 58.5871517502259 390593.711349027 5819256.94520413 31.0400009155273 390601.629022471 5819257.53846685 31.0400009155273 390628.813494688 5819259.57536993 31.0400009155273 390626.962091029 5819284.28373546 31.0400009155273 390599.777652672 5819282.24685543 31.0400009155273 390599.778240698 5819282.24772608 58.5871517502259 390626.96267907 5819284.28460611 58.5871517502259 390626.962091029 5819284.28373546 31.0400009155273 BLDG_0003000e0028377e 1130 390534.253124992 5819226.83144833 56.5 390533.836265176 5819232.21292008 56.5 390532.272203329 5819252.40425902 56.5 390526.057555922 5819251.9230586 63 390528.489683551 5819220.5253844 63 390534.253124992 5819226.83144833 56.5 390522.72846844 5819214.18658644 56.5 390535.158031279 5819215.14952026 56.5 390541.169246448 5819215.61514023 56.5 390540.716948932 5819221.45631092 63 390528.489683551 5819220.5253844 63 390522.72846844 5819214.18658644 56.5 390539.845632981 5819232.67850458 56.5 390533.836265176 5819232.21292008 56.5 390534.253124992 5819226.83144833 56.5 390540.264374011 5819227.29707076 56.5 390539.845632981 5819232.67850458 56.5 390522.72846844 5819214.18658644 56.5 390528.489683551 5819220.5253844 63 390526.057555922 5819251.9230586 63 390519.842630932 5819251.4414473 56.5 390521.40670727 5819231.24992199 56.5 390522.72846844 5819214.18658644 56.5 390540.716948932 5819221.45631092 63 390540.264374011 5819227.29707076 56.5 390534.253124992 5819226.83144833 56.5 390528.489683551 5819220.5253844 63 390540.716948932 5819221.45631092 63 390522.728752925 5819214.18602785 31.8400001525879 390519.842104576 5819251.44066791 31.8400001525879 390532.271676966 5819252.40347963 31.8400001525879 390533.835738813 5819232.2121407 31.8400001525879 390539.845106614 5819232.67772521 31.8400001525879 390541.16872008 5819215.61436086 31.8400001525879 390535.156703603 5819215.14867882 31.8400001525879 390522.728752925 5819214.18602785 31.8400001525879 390533.835738813 5819232.2121407 31.8400001525879 390532.271676966 5819252.40347963 31.8400001525879 390532.272203329 5819252.40425902 56.5 390533.836265176 5819232.21292008 56.5 390533.835738813 5819232.2121407 31.8400001525879 390540.716948932 5819221.45631092 63 390541.169246448 5819215.61514023 56.5 390541.16911225 5819215.61494153 50.2129146341297 390541.16872008 5819215.61436086 31.8400001525879 390539.845106614 5819232.67772521 31.8400001525879 390539.845498825 5819232.67830594 50.2148381326762 390539.845632981 5819232.67850458 56.5 390540.264374011 5819227.29707076 56.5 390540.716948932 5819221.45631092 63 390522.72846844 5819214.18658644 56.5 390522.728752925 5819214.18602785 31.8400001525879 390535.156703603 5819215.14867882 31.8400001525879 390541.16872008 5819215.61436086 31.8400001525879 390541.16911225 5819215.61494153 50.2129146341297 390541.169246448 5819215.61514023 56.5 390535.158031279 5819215.14952026 56.5 390522.72846844 5819214.18658644 56.5 390522.728752925 5819214.18602785 31.8400001525879 390522.72846844 5819214.18658644 56.5 390521.40670727 5819231.24992199 56.5 390519.842630932 5819251.4414473 56.5 390519.842104576 5819251.44066791 31.8400001525879 390522.728752925 5819214.18602785 31.8400001525879 390532.271676966 5819252.40347963 31.8400001525879 390519.842104576 5819251.44066791 31.8400001525879 390519.842630932 5819251.4414473 56.5 390526.057555922 5819251.9230586 63 390532.272203329 5819252.40425902 56.5 390532.271676966 5819252.40347963 31.8400001525879 390539.845106614 5819232.67772521 31.8400001525879 390533.835738813 5819232.2121407 31.8400001525879 390533.836265176 5819232.21292008 56.5 390539.845632981 5819232.67850458 56.5 390539.845498825 5819232.67830594 50.2148381326762 390539.845106614 5819232.67772521 31.8400001525879 BLDG_000300000016d850 1000 390637.740231634 5819260.8070533 59.5 390656.373962243 5819262.1965348 59.5 390655.880855841 5819268.8093177 59.5 390643.337595662 5819267.87399108 59.5 390642.104467121 5819284.41144401 59.5 390636.013968108 5819283.95730478 59.5 390637.247097967 5819267.41983445 59.5 390637.740231634 5819260.8070533 59.5 390655.880813147 5819268.80925449 57.5 390655.824631337 5819269.563803 57.5 390646.987535801 5819268.90488482 57.5 390647.043800505 5819268.15029557 57.5 390655.880813147 5819268.80925449 57.5 390647.043242918 5819268.14947003 31.3799991607666 390646.986978215 5819268.90405929 31.3799991607666 390655.824073746 5819269.56297746 31.3799991607666 390655.880334968 5819268.80843488 31.3799991607666 390656.373406881 5819262.1956437 31.3799991607666 390643.830083178 5819261.26031785 31.3799991607666 390637.739631359 5819260.80616455 31.3799991607666 390637.246497692 5819267.4189457 31.3799991607666 390636.013367834 5819283.95641602 31.3799991607666 390642.103866843 5819284.41055525 31.3799991607666 390643.336995384 5819267.87310233 31.3799991607666 390647.043242918 5819268.14947003 31.3799991607666 390637.739631359 5819260.80616455 31.3799991607666 390637.74018894 5819260.80699009 57.5 390637.740231634 5819260.8070533 59.5 390637.247097967 5819267.41983445 59.5 390636.013968108 5819283.95730478 59.5 390636.013367834 5819283.95641602 31.3799991607666 390637.246497692 5819267.4189457 31.3799991607666 390637.739631359 5819260.80616455 31.3799991607666 390655.880855841 5819268.8093177 59.5 390656.373962243 5819262.1965348 59.5 390656.373919549 5819262.19647159 57.5 390656.373406881 5819262.1956437 31.3799991607666 390655.880334968 5819268.80843488 31.3799991607666 390655.824073746 5819269.56297746 31.3799991607666 390655.824631337 5819269.563803 57.5 390655.880813147 5819268.80925449 57.5 390655.880855841 5819268.8093177 59.5 390646.986978215 5819268.90405929 31.3799991607666 390647.043242918 5819268.14947003 31.3799991607666 390647.043800505 5819268.15029557 57.5 390646.987535801 5819268.90488482 57.5 390646.986978215 5819268.90405929 31.3799991607666 390637.739631359 5819260.80616455 31.3799991607666 390643.830083178 5819261.26031785 31.3799991607666 390656.373406881 5819262.1956437 31.3799991607666 390656.373919549 5819262.19647159 57.5 390656.373962243 5819262.1965348 59.5 390637.740231634 5819260.8070533 59.5 390637.74018894 5819260.80699009 57.5 390637.739631359 5819260.80616455 31.3799991607666 390643.336995384 5819267.87310233 31.3799991607666 390642.103866843 5819284.41055525 31.3799991607666 390642.104467121 5819284.41144401 59.5 390643.337595662 5819267.87399108 59.5 390643.337552968 5819267.87392787 57.5 390643.336995384 5819267.87310233 31.3799991607666 390655.824073746 5819269.56297746 31.3799991607666 390646.986978215 5819268.90405929 31.3799991607666 390646.987535801 5819268.90488482 57.5 390655.824631337 5819269.563803 57.5 390655.824073746 5819269.56297746 31.3799991607666 390647.043242918 5819268.14947003 31.3799991607666 390643.336995384 5819267.87310233 31.3799991607666 390643.337552968 5819267.87392787 57.5 390643.337595662 5819267.87399108 59.5 390655.880855841 5819268.8093177 59.5 390655.880813147 5819268.80925449 57.5 390647.043800505 5819268.15029557 57.5 390647.043242918 5819268.14947003 31.3799991607666 390642.103866843 5819284.41055525 31.3799991607666 390636.013367834 5819283.95641602 31.3799991607666 390636.013968108 5819283.95730478 59.5 390642.104467121 5819284.41144401 59.5 390642.103866843 5819284.41055525 31.3799991607666 BLDG_0003000e002837ac 390636.013488103 5819283.95645602 34.1300010681152 390654.827322184 5819285.35893092 34.1300010681152 390654.827863191 5819285.35973191 59.4731860042297 390636.014029101 5819283.95725702 59.4731860042297 390636.013488103 5819283.95645602 34.1300010681152 390653.652106902 5819301.1240148 34.1300010681152 390634.838272709 5819299.72154059 34.1300010681152 390634.838813706 5819299.72234159 59.4731860042297 390653.652647908 5819301.12481581 59.4731860042297 390653.652106902 5819301.1240148 34.1300010681152 390634.838272709 5819299.72154059 34.1300010681152 390636.013488103 5819283.95645602 34.1300010681152 390636.014029101 5819283.95725702 59.4731860042297 390635.426518538 5819291.83994321 64.0268377091194 390634.838813706 5819299.72234159 59.4731860042297 390634.838272709 5819299.72154059 34.1300010681152 390654.827322184 5819285.35893092 34.1300010681152 390653.652106902 5819301.1240148 34.1300010681152 390653.652647908 5819301.12481581 59.4731860042297 390654.240352686 5819293.24241777 64.0268377091194 390654.827863191 5819285.35973191 59.4731860042297 390654.827322184 5819285.35893092 34.1300010681152 390653.652647908 5819301.12481581 59.4731860042297 390634.838813706 5819299.72234159 59.4731860042297 390635.426518538 5819291.83994321 64.0268377091194 390654.240352686 5819293.24241777 64.0268377091194 390653.652647908 5819301.12481581 59.4731860042297 390636.014029101 5819283.95725702 59.4731860042297 390654.827863191 5819285.35973191 59.4731860042297 390654.240352686 5819293.24241777 64.0268377091194 390635.426518538 5819291.83994321 64.0268377091194 390636.014029101 5819283.95725702 59.4731860042297 390653.652106902 5819301.1240148 34.1300010681152 390654.827322184 5819285.35893092 34.1300010681152 390636.013488103 5819283.95645602 34.1300010681152 390634.838272709 5819299.72154059 34.1300010681152 390653.652106902 5819301.1240148 34.1300010681152 BLDG_0003000b0071e1f0 1000 390656.302204614 5819269.70889247 34.0400009155273 390644.34381988 5819268.58723527 34.0400009155273 390642.842033411 5819284.59819297 34.0400009155273 390654.800418236 5819285.71984974 34.0400009155273 390656.302204614 5819269.70889247 34.0400009155273 390654.800526556 5819285.72001012 39.1141811804505 390642.84214173 5819284.59835335 39.1141811804505 390644.343928198 5819268.58739564 39.1141811804505 390656.302312934 5819269.70905284 39.1141811804505 390654.800526556 5819285.72001012 39.1141811804505 390656.302204614 5819269.70889247 34.0400009155273 390654.800418236 5819285.71984974 34.0400009155273 390654.800526556 5819285.72001012 39.1141811804505 390656.302312934 5819269.70905284 39.1141811804505 390656.302204614 5819269.70889247 34.0400009155273 390642.842033411 5819284.59819297 34.0400009155273 390644.34381988 5819268.58723527 34.0400009155273 390644.343928198 5819268.58739564 39.1141811804505 390642.84214173 5819284.59835335 39.1141811804505 390642.842033411 5819284.59819297 34.0400009155273 390644.34381988 5819268.58723527 34.0400009155273 390656.302204614 5819269.70889247 34.0400009155273 390656.302312934 5819269.70905284 39.1141811804505 390644.343928198 5819268.58739564 39.1141811804505 390644.34381988 5819268.58723527 34.0400009155273 390654.800418236 5819285.71984974 34.0400009155273 390642.842033411 5819284.59819297 34.0400009155273 390642.84214173 5819284.59835335 39.1141811804505 390654.800526556 5819285.72001012 39.1141811804505 390654.800418236 5819285.71984974 34.0400009155273 BLDG_0003000e0028379d 1130 390591.938595411 5819282.08033653 31.2999992370605 390592.154546991 5819279.02515643 31.2999992370605 390578.171302624 5819278.0367763 31.2999992370605 390578.346234372 5819275.56014057 31.2999992370605 390568.523262143 5819274.86632204 31.2999992370605 390568.348365557 5819277.34245989 31.2999992370605 390554.347820096 5819276.35285682 31.2999992370605 390554.131733011 5819279.40995364 31.2999992370605 390553.311942314 5819291.00796349 31.2999992370605 390553.133722371 5819293.52933526 31.2999992370605 390590.940449498 5819296.2016334 31.2999992370605 390591.118804869 5819293.67834538 31.2999992370605 390591.938595411 5819282.08033653 31.2999992370605 390577.648910107 5819285.44291559 62 390577.95604711 5819281.09355174 59 390585.371732818 5819281.61733813 59 390585.064595826 5819285.96670191 62 390584.962216839 5819287.41648983 63 390559.183147428 5819285.59565709 63 390559.285526429 5819284.14586908 62 390559.592663462 5819279.79650505 59 390568.133074856 5819280.39973334 59 390567.825937836 5819284.74909728 62 390577.648910107 5819285.44291559 62 390584.552476165 5819293.21530873 56.47 390585.371678813 5819281.61725817 56.47 390577.955993106 5819281.09347178 56.47 390578.171839896 5819278.03757182 56.47 390592.15508427 5819279.02595195 56.47 390591.939132689 5819282.08113205 56.47 390591.119342147 5819293.67914091 56.47 390590.940986776 5819296.20242892 56.47 390553.134259631 5819293.53013079 56.47 390553.312479573 5819291.00875902 56.47 390554.132270271 5819279.41074916 56.47 390554.348357356 5819276.35365234 56.47 390568.348902824 5819277.34325541 56.47 390568.133020852 5819280.39965338 56.47 390559.592609459 5819279.79642509 56.47 390558.773406704 5819291.39447633 56.47 390584.552476165 5819293.21530873 56.47 390578.346889685 5819275.56111087 62 390577.648910107 5819285.44291559 62 390567.825937836 5819284.74909728 62 390568.52391745 5819274.86729234 62 390578.346889685 5819275.56111087 62 390584.55253017 5819293.21538869 59 390558.773460708 5819291.39455629 59 390559.08072574 5819287.04538189 62 390559.183147428 5819285.59565709 63 390584.962216839 5819287.41648983 63 390584.859795164 5819288.86621455 62 390584.55253017 5819293.21538869 59 390578.346234372 5819275.56014057 31.2999992370605 390578.171302624 5819278.0367763 31.2999992370605 390578.171839896 5819278.03757182 56.47 390577.955993106 5819281.09347178 56.47 390577.95604711 5819281.09355174 59 390577.648910107 5819285.44291559 62 390578.346889685 5819275.56111087 62 390578.346744189 5819275.56089544 55.1838168668775 390578.346234372 5819275.56014057 31.2999992370605 390558.773460708 5819291.39455629 59 390558.773406704 5819291.39447633 56.47 390559.592609459 5819279.79642509 56.47 390559.592663462 5819279.79650505 59 390559.285526429 5819284.14586908 62 390559.183147428 5819285.59565709 63 390559.08072574 5819287.04538189 62 390558.773460708 5819291.39455629 59 390554.347820096 5819276.35285682 31.2999992370605 390554.348357356 5819276.35365234 56.47 390554.132270271 5819279.41074916 56.47 390553.312479573 5819291.00875902 56.47 390553.134259631 5819293.53013079 56.47 390553.133722371 5819293.52933526 31.2999992370605 390553.311942314 5819291.00796349 31.2999992370605 390554.131733011 5819279.40995364 31.2999992370605 390554.347820096 5819276.35285682 31.2999992370605 390578.171302624 5819278.0367763 31.2999992370605 390592.154546991 5819279.02515643 31.2999992370605 390592.15508427 5819279.02595195 56.47 390578.171839896 5819278.03757182 56.47 390578.171302624 5819278.0367763 31.2999992370605 390554.347820096 5819276.35285682 31.2999992370605 390568.348365557 5819277.34245989 31.2999992370605 390568.348902824 5819277.34325541 56.47 390554.348357356 5819276.35365234 56.47 390554.347820096 5819276.35285682 31.2999992370605 390577.955993106 5819281.09347178 56.47 390585.371678813 5819281.61725817 56.47 390585.371732818 5819281.61733813 59 390577.95604711 5819281.09355174 59 390577.955993106 5819281.09347178 56.47 390568.133020852 5819280.39965338 56.47 390568.348902824 5819277.34325541 56.47 390568.348365557 5819277.34245989 31.2999992370605 390568.523262143 5819274.86632204 31.2999992370605 390568.523771956 5819274.86707691 55.1838168668795 390568.52391745 5819274.86729234 62 390567.825937836 5819284.74909728 62 390568.133074856 5819280.39973334 59 390568.133020852 5819280.39965338 56.47 390553.133722371 5819293.52933526 31.2999992370605 390553.134259631 5819293.53013079 56.47 390590.940986776 5819296.20242892 56.47 390590.940449498 5819296.2016334 31.2999992370605 390553.133722371 5819293.52933526 31.2999992370605 390585.371732818 5819281.61733813 59 390585.371678813 5819281.61725817 56.47 390584.552476165 5819293.21530873 56.47 390584.55253017 5819293.21538869 59 390584.859795164 5819288.86621455 62 390584.962216839 5819287.41648983 63 390585.064595826 5819285.96670191 62 390585.371732818 5819281.61733813 59 390590.940449498 5819296.2016334 31.2999992370605 390590.940986776 5819296.20242892 56.47 390591.119342147 5819293.67914091 56.47 390591.939132689 5819282.08113205 56.47 390592.15508427 5819279.02595195 56.47 390592.154546991 5819279.02515643 31.2999992370605 390591.938595411 5819282.08033653 31.2999992370605 390591.118804869 5819293.67834538 31.2999992370605 390590.940449498 5819296.2016334 31.2999992370605 390578.346889685 5819275.56111087 62 390568.52391745 5819274.86729234 62 390568.523771956 5819274.86707691 55.1838168668795 390568.523262143 5819274.86632204 31.2999992370605 390578.346234372 5819275.56014057 31.2999992370605 390578.346744189 5819275.56089544 55.1838168668775 390578.346889685 5819275.56111087 62 390559.592609459 5819279.79642509 56.47 390568.133020852 5819280.39965338 56.47 390568.133074856 5819280.39973334 59 390559.592663462 5819279.79650505 59 390559.592609459 5819279.79642509 56.47 390558.773406704 5819291.39447633 56.47 390558.773460708 5819291.39455629 59 390584.55253017 5819293.21538869 59 390584.552476165 5819293.21530873 56.47 390558.773406704 5819291.39447633 56.47 DEB_LOD2_UUID_02467df1-5a4d-4e19-b75b-b5844a36608a 2100 390540.03 5819228.443 55.48 390548.753 5819229.137 55.48 390556.721 5819229.771 55.48 390564.615 5819230.399 55.48 390564.592 5819230.697 55.48 390540.007 5819228.74 55.48 390540.03 5819228.443 55.48 390549.092 5819224.751 60.44 390557.049 5819225.385 60.44 390556.711 5819229.77 60.44 390548.743 5819229.136 60.44 390549.092 5819224.751 60.44 390597.572 5819233.024 56.928 390600.833 5819233.282 59.98 390600.798 5819233.715 59.98 390597.537 5819233.455 56.939 390597.572 5819233.024 56.928 390601.063 5819230.45 59.98 390600.833 5819233.282 59.98 390597.572 5819233.024 56.928 390601.063 5819230.45 59.98 390610.204 5819231.178 59.98 390612.972 5819234.248 58.5 390609.973 5819234.009 59.98 390610.204 5819231.178 59.98 390613.203 5819231.416 59.98 390612.972 5819234.248 58.5 390610.204 5819231.178 59.98 390613.203 5819231.416 59.98 390612.851 5819235.729 56.5 390612.972 5819234.248 58.5 390626.242 5819235.304 58.5 390626.098 5819237.042 56.153 390615.433 5819236.211 56.129 390612.828 5819236.009 56.122 390612.851 5819235.729 56.5 390613.203 5819231.416 63.117 390626.477 5819232.473 63.117 390626.242 5819235.304 58.5 390612.972 5819234.248 58.5 390613.203 5819231.416 63.117 390613.524 5819227.495 63.12 390626.803 5819228.552 63.12 390626.761 5819229.054 63.12 390626.477 5819232.473 63.117 390613.203 5819231.416 63.117 390613.524 5819227.495 63.12 390541.048 5819215.239 55.48 390541.051 5819215.174 55.48 390541.099 5819215.178 55.48 390540.569 5819221.689 55.48 390540.551 5819221.687 55.48 390541.048 5819215.239 55.48 390540.569 5819221.689 55.48 390540.569 5819221.689 63.12 390540.551 5819221.687 63.12 390540.551 5819221.687 55.48 390540.569 5819221.689 55.48 390541.099 5819215.178 55.48 390541.099 5819215.178 56.828 390540.569 5819221.689 63.12 390540.569 5819221.689 55.48 390541.099 5819215.178 55.48 390548.753 5819229.137 55.48 390548.743 5819229.136 60.44 390556.711 5819229.77 60.44 390556.721 5819229.771 55.48 390548.753 5819229.137 55.48 390556.721 5819229.771 55.48 390556.711 5819229.77 60.44 390557.049 5819225.385 60.44 390556.721 5819229.771 55.48 390549.092 5819224.751 60.44 390548.743 5819229.136 60.44 390548.753 5819229.137 55.48 390549.092 5819224.751 60.44 390562.783 5819254.8 32.62 390562.783 5819254.8 55.526 390567.39 5819255.169 59.485 390567.39 5819255.169 32.62 390562.783 5819254.8 32.62 390567.39 5819255.169 32.62 390567.39 5819255.169 59.485 390567.416 5819254.429 59.457 390567.416 5819254.429 32.62 390567.39 5819255.169 32.62 390567.416 5819254.429 32.62 390567.416 5819254.429 59.457 390569.818 5819254.543 61.516 390569.818 5819254.543 32.62 390567.416 5819254.429 32.62 390569.818 5819254.543 32.62 390569.818 5819254.543 61.516 390569.802 5819255.283 61.552 390569.802 5819255.283 32.62 390569.818 5819254.543 32.62 390581.554 5819231.749 32.62 390581.554 5819231.749 56.935 390584.515 5819231.984 56.929 390584.515 5819231.984 32.62 390581.554 5819231.749 32.62 390593.606 5819225.91 63.12 390593.606 5819225.91 63.155 390586.711 5819225.361 63.155 390586.711 5819225.361 63.12 390593.606 5819225.91 63.12 390593.425 5819257.114 32.62 390593.425 5819257.114 59.98 390593.459 5819256.783 59.98 390593.459 5819256.783 32.62 390593.425 5819257.114 32.62 390612.828 5819236.009 56.122 390612.828 5819236.009 56.5 390612.851 5819235.729 56.5 390612.828 5819236.009 56.122 390609.973 5819234.009 59.98 390612.972 5819234.248 58.5 390612.972 5819234.248 56.5 390609.973 5819234.009 59.98 390618.964 5819259.288 32.62 390618.964 5819259.288 59.98 390625.042 5819259.881 59.98 390625.042 5819259.881 32.62 390618.964 5819259.288 32.62 390615.433 5819236.211 32.62 390615.433 5819236.211 56.129 390626.098 5819237.042 56.153 390626.098 5819237.042 32.62 390615.433 5819236.211 32.62 390612.972 5819234.248 56.5 390612.972 5819234.248 58.5 390612.851 5819235.729 56.5 390612.972 5819234.248 56.5 390627.343 5819222.042 32.62 390627.343 5819222.042 56.828 390616.629 5819221.188 56.827 390616.629 5819221.188 32.62 390627.343 5819222.042 32.62 390541.051 5819215.174 32.62 390541.051 5819215.174 55.48 390541.048 5819215.239 55.48 390541.048 5819215.239 32.62 390541.051 5819215.174 32.62 390563.016 5819251.778 55.52 390563.079 5819250.962 55.522 390563.327 5819247.749 55.52 390564.522 5819232.261 55.523 390572.192 5819248.443 63.123 390571.93 5819251.666 63.121 390571.863 5819252.482 63.123 390571.624 5819255.424 63.118 390569.802 5819255.283 61.552 390569.818 5819254.543 61.516 390567.416 5819254.429 59.457 390567.39 5819255.169 59.485 390562.783 5819254.8 55.526 390563.016 5819251.778 55.52 390593.606 5819225.91 63.12 390598.112 5819226.268 63.12 390601.383 5819226.529 63.12 390610.525 5819227.256 63.12 390613.524 5819227.495 63.12 390613.203 5819231.416 59.98 390610.204 5819231.178 59.98 390601.063 5819230.45 59.98 390597.793 5819230.19 59.98 390593.285 5819229.831 59.98 390593.606 5819225.91 63.12 390540.03 5819228.443 32.62 390540.223 5819225.943 32.62 390540.551 5819221.687 32.62 390541.048 5819215.239 32.62 390541.048 5819215.239 55.48 390540.551 5819221.687 55.48 390540.551 5819221.687 63.12 390540.223 5819225.943 58.307 390540.03 5819228.443 55.48 390540.007 5819228.74 55.48 390540.007 5819228.74 32.62 390540.03 5819228.443 32.62 390626.761 5819229.054 63.12 390626.803 5819228.552 63.12 390627.343 5819222.042 56.828 390627.343 5819222.042 32.62 390626.803 5819228.552 32.62 390626.761 5819229.054 32.62 390626.477 5819232.473 32.62 390626.242 5819235.304 32.62 390626.098 5819237.042 32.62 390626.098 5819237.042 56.153 390626.242 5819235.304 58.5 390626.477 5819232.473 63.117 390626.761 5819229.054 63.12 390593.459 5819256.783 59.98 390595.61 5819256.994 59.98 390598.876 5819257.315 59.98 390607.994 5819258.211 59.98 390610.988 5819258.505 59.98 390618.964 5819259.288 59.98 390618.964 5819259.288 32.62 390610.988 5819258.505 32.62 390607.994 5819258.211 32.62 390598.876 5819257.315 32.62 390595.61 5819256.994 32.62 390593.459 5819256.783 32.62 390593.459 5819256.783 59.98 390589.425 5819219.023 32.62 390594.138 5819219.398 32.62 390598.643 5819219.757 32.62 390601.913 5819220.017 32.62 390611.058 5819220.745 32.62 390613.908 5819220.972 32.62 390613.908 5819220.972 56.828 390611.058 5819220.745 56.827 390601.913 5819220.017 56.827 390598.643 5819219.757 56.827 390594.138 5819219.398 56.827 390589.425 5819219.023 56.827 390589.425 5819219.023 32.62 390569.802 5819255.283 61.552 390571.624 5819255.424 63.118 390576.155 5819255.776 59.98 390579.573 5819256.04 59.98 390584.173 5819256.397 59.98 390586.47 5819256.575 59.98 390591.069 5819256.931 59.98 390593.425 5819257.114 59.98 390593.425 5819257.114 32.62 390591.069 5819256.931 32.62 390586.47 5819256.575 32.62 390584.173 5819256.397 32.62 390579.573 5819256.04 32.62 390576.155 5819255.776 32.62 390571.624 5819255.424 32.62 390569.802 5819255.283 32.62 390569.802 5819255.283 61.552 390563.016 5819251.778 32.62 390563.079 5819250.962 32.62 390563.327 5819247.749 32.62 390564.522 5819232.261 32.62 390564.528 5819232.174 32.62 390564.632 5819230.836 32.62 390564.642 5819230.701 32.62 390564.642 5819230.701 55.523 390564.632 5819230.836 55.521 390564.528 5819232.174 55.522 390564.522 5819232.261 55.523 390563.327 5819247.749 55.52 390563.079 5819250.962 55.522 390563.016 5819251.778 55.52 390562.783 5819254.8 55.526 390562.783 5819254.8 32.62 390563.016 5819251.778 32.62 390541.099 5819215.178 55.48 390541.051 5819215.174 55.48 390541.051 5819215.174 32.62 390541.099 5819215.178 32.62 390549.767 5819215.868 32.62 390557.745 5819216.503 32.62 390565.639 5819217.131 32.62 390574.683 5819217.851 32.62 390579.214 5819218.211 32.62 390582.644 5819218.484 32.62 390586.664 5819218.804 32.62 390586.664 5819218.804 56.828 390582.644 5819218.484 56.828 390579.214 5819218.211 56.828 390574.683 5819217.851 56.828 390565.639 5819217.131 56.828 390557.745 5819216.503 56.828 390549.767 5819215.868 56.828 390541.099 5819215.178 56.828 390541.099 5819215.178 55.48 390616.629 5819221.188 32.62 390614.056 5819220.984 32.62 390613.908 5819220.972 32.62 390611.058 5819220.745 32.62 390601.913 5819220.017 32.62 390598.643 5819219.757 32.62 390594.138 5819219.398 32.62 390589.425 5819219.023 32.62 390587.243 5819218.85 32.62 390586.664 5819218.804 32.62 390582.644 5819218.484 32.62 390579.214 5819218.211 32.62 390574.683 5819217.851 32.62 390565.639 5819217.131 32.62 390557.745 5819216.503 32.62 390549.767 5819215.868 32.62 390541.099 5819215.178 32.62 390541.051 5819215.174 32.62 390541.048 5819215.239 32.62 390540.551 5819221.687 32.62 390540.223 5819225.943 32.62 390540.03 5819228.443 32.62 390540.007 5819228.74 32.62 390564.592 5819230.697 32.62 390564.642 5819230.701 32.62 390564.632 5819230.836 32.62 390564.528 5819232.174 32.62 390564.522 5819232.261 32.62 390563.327 5819247.749 32.62 390563.079 5819250.962 32.62 390563.016 5819251.778 32.62 390562.783 5819254.8 32.62 390567.39 5819255.169 32.62 390567.416 5819254.429 32.62 390569.818 5819254.543 32.62 390569.802 5819255.283 32.62 390571.624 5819255.424 32.62 390576.155 5819255.776 32.62 390579.573 5819256.04 32.62 390584.173 5819256.397 32.62 390586.47 5819256.575 32.62 390591.069 5819256.931 32.62 390593.425 5819257.114 32.62 390593.459 5819256.783 32.62 390595.61 5819256.994 32.62 390598.876 5819257.315 32.62 390607.994 5819258.211 32.62 390610.988 5819258.505 32.62 390618.964 5819259.288 32.62 390625.042 5819259.881 32.62 390625.291 5819256.735 32.62 390625.355 5819255.918 32.62 390625.56 5819253.323 32.62 390611.501 5819252.227 32.62 390611.449 5819252.223 32.62 390611.499 5819251.576 32.62 390611.504 5819251.516 32.62 390612.712 5819236 32.62 390612.828 5819236.009 32.62 390615.433 5819236.211 32.62 390626.098 5819237.042 32.62 390626.242 5819235.304 32.62 390626.477 5819232.473 32.62 390626.761 5819229.054 32.62 390626.803 5819228.552 32.62 390627.343 5819222.042 32.62 390616.629 5819221.188 32.62 390597.537 5819233.455 32.62 390597.428 5819234.792 32.62 390596.164 5819250.314 32.62 390591.639 5819249.963 32.62 390584.743 5819249.429 32.62 390580.134 5819249.072 32.62 390581.409 5819233.517 32.62 390581.519 5819232.18 32.62 390581.554 5819231.749 32.62 390584.515 5819231.984 32.62 390586.158 5819232.115 32.62 390587.096 5819232.19 32.62 390593.054 5819232.664 32.62 390597.572 5819233.024 32.62 390597.537 5819233.455 32.62 390541.099 5819215.178 56.828 390549.767 5819215.868 56.828 390557.745 5819216.503 56.828 390565.639 5819217.131 56.828 390574.683 5819217.851 56.828 390579.214 5819218.211 56.828 390582.644 5819218.484 56.828 390586.664 5819218.804 56.828 390587.243 5819218.85 56.828 390589.425 5819219.023 56.827 390594.138 5819219.398 56.827 390598.643 5819219.757 56.827 390601.913 5819220.017 56.827 390611.058 5819220.745 56.827 390613.908 5819220.972 56.828 390614.056 5819220.984 56.828 390616.629 5819221.188 56.827 390627.343 5819222.042 56.828 390626.803 5819228.552 63.12 390613.524 5819227.495 63.12 390610.525 5819227.256 63.12 390601.383 5819226.529 63.12 390598.112 5819226.268 63.12 390593.606 5819225.91 63.12 390586.711 5819225.361 63.12 390582.112 5819224.995 63.12 390578.684 5819224.722 63.12 390574.153 5819224.362 63.12 390565.136 5819223.644 63.12 390557.242 5819223.016 63.12 390549.265 5819222.381 63.12 390540.569 5819221.689 63.12 390541.099 5819215.178 56.828 390576.394 5819252.843 59.98 390576.46 5819252.027 59.98 390579.879 5819252.299 59.98 390584.478 5819252.665 59.98 390591.373 5819253.214 59.98 390595.889 5819253.573 59.98 390599.159 5819253.834 59.98 390599.425 5819250.572 59.98 390600.689 5819235.052 59.98 390600.798 5819233.715 59.98 390600.833 5819233.282 59.98 390601.063 5819230.45 59.98 390610.204 5819231.178 59.98 390609.973 5819234.009 59.98 390609.937 5819234.442 59.98 390609.828 5819235.779 59.98 390608.56 5819251.286 59.98 390608.292 5819254.56 59.98 390611.291 5819254.799 59.98 390625.355 5819255.918 59.98 390625.291 5819256.735 59.98 390625.042 5819259.881 59.98 390618.964 5819259.288 59.98 390610.988 5819258.505 59.98 390607.994 5819258.211 59.98 390598.876 5819257.315 59.98 390595.61 5819256.994 59.98 390593.459 5819256.783 59.98 390593.425 5819257.114 59.98 390591.069 5819256.931 59.98 390586.47 5819256.575 59.98 390584.173 5819256.397 59.98 390579.573 5819256.04 59.98 390576.155 5819255.776 59.98 390576.394 5819252.843 59.98 390576.723 5819248.797 59.98 390577.99 5819233.245 59.98 390578.099 5819231.908 59.98 390578.134 5819231.475 59.98 390578.365 5819228.644 59.98 390581.554 5819231.749 56.935 390581.519 5819232.18 56.935 390581.409 5819233.517 56.934 390580.134 5819249.072 56.938 390576.46 5819252.027 59.98 390576.723 5819248.797 59.98 390571.863 5819252.482 63.123 390571.93 5819251.666 63.121 390572.192 5819248.443 63.123 390573.459 5819232.884 63.12 390573.568 5819231.548 63.121 390573.603 5819231.115 63.12 390573.834 5819228.283 63.12 390574.153 5819224.362 63.12 390578.365 5819228.644 59.98 390578.134 5819231.475 59.98 390578.099 5819231.908 59.98 390577.99 5819233.245 59.98 390576.723 5819248.797 59.98 390576.46 5819252.027 59.98 390576.394 5819252.843 59.98 390576.155 5819255.776 59.98 390571.624 5819255.424 63.118 390571.863 5819252.482 63.123 390540.223 5819225.943 58.307 390540.551 5819221.687 63.12 390540.569 5819221.689 63.12 390549.265 5819222.381 63.12 390557.242 5819223.016 63.12 390565.136 5819223.644 63.12 390574.153 5819224.362 63.12 390564.615 5819230.399 55.48 390556.721 5819229.771 55.48 390557.049 5819225.385 60.44 390549.092 5819224.751 60.44 390548.753 5819229.137 55.48 390540.03 5819228.443 55.48 390540.223 5819225.943 58.307 390564.528 5819232.174 55.522 390564.632 5819230.836 55.521 390564.642 5819230.701 55.523 390564.592 5819230.697 55.48 390564.615 5819230.399 55.48 390574.153 5819224.362 63.12 390573.834 5819228.283 63.12 390573.603 5819231.115 63.12 390573.568 5819231.548 63.121 390573.459 5819232.884 63.12 390572.192 5819248.443 63.123 390564.522 5819232.261 55.523 390564.528 5819232.174 55.522 390578.684 5819224.722 63.12 390582.112 5819224.995 63.12 390586.711 5819225.361 63.12 390586.39 5819229.282 59.98 390581.791 5819228.916 59.98 390578.365 5819228.644 59.98 390574.153 5819224.362 63.12 390578.684 5819224.722 63.12 390584.743 5819249.429 56.933 390591.639 5819249.963 56.928 390596.164 5819250.314 56.926 390599.159 5819253.834 59.98 390595.889 5819253.573 59.98 390591.373 5819253.214 59.98 390584.478 5819252.665 59.98 390584.743 5819249.429 56.933 390597.428 5819234.792 56.939 390597.537 5819233.455 56.939 390600.798 5819233.715 59.98 390600.689 5819235.052 59.98 390599.425 5819250.572 59.98 390599.159 5819253.834 59.98 390596.164 5819250.314 56.926 390597.428 5819234.792 56.939 390608.56 5819251.286 59.98 390609.828 5819235.779 59.98 390609.937 5819234.442 59.98 390609.973 5819234.009 59.98 390612.972 5819234.248 56.5 390612.851 5819235.729 56.5 390612.828 5819236.009 56.5 390612.712 5819236 56.634 390611.504 5819251.516 56.564 390611.499 5819251.576 56.564 390608.292 5819254.56 59.98 390608.56 5819251.286 59.98 390581.409 5819233.517 56.934 390581.519 5819232.18 56.935 390581.554 5819231.749 56.935 390581.554 5819231.749 32.62 390581.519 5819232.18 32.62 390581.409 5819233.517 32.62 390580.134 5819249.072 32.62 390580.134 5819249.072 56.938 390581.409 5819233.517 56.934 390580.134 5819249.072 32.62 390584.743 5819249.429 32.62 390591.639 5819249.963 32.62 390596.164 5819250.314 32.62 390596.164 5819250.314 56.926 390591.639 5819249.963 56.928 390584.743 5819249.429 56.933 390580.134 5819249.072 56.938 390580.134 5819249.072 32.62 390597.428 5819234.792 32.62 390597.537 5819233.455 32.62 390597.572 5819233.024 32.62 390597.572 5819233.024 56.928 390597.537 5819233.455 56.939 390597.428 5819234.792 56.939 390596.164 5819250.314 56.926 390596.164 5819250.314 32.62 390597.428 5819234.792 32.62 390625.291 5819256.735 59.98 390625.355 5819255.918 59.98 390625.56 5819253.323 57.239 390625.56 5819253.323 32.62 390625.355 5819255.918 32.62 390625.291 5819256.735 32.62 390625.042 5819259.881 32.62 390625.042 5819259.881 59.98 390625.291 5819256.735 59.98 390611.499 5819251.576 56.564 390611.504 5819251.516 56.564 390612.712 5819236 56.634 390612.712 5819236 32.62 390611.504 5819251.516 32.62 390611.499 5819251.576 32.62 390611.449 5819252.223 32.62 390611.449 5819252.223 57.25 390611.499 5819251.576 56.564 390613.203 5819231.416 59.98 390613.524 5819227.495 63.12 390613.203 5819231.416 63.117 390612.972 5819234.248 58.5 390613.203 5819231.416 59.98 390613.908 5819220.972 32.62 390614.056 5819220.984 32.62 390616.629 5819221.188 32.62 390616.629 5819221.188 56.827 390614.056 5819220.984 56.828 390613.908 5819220.972 56.828 390613.908 5819220.972 32.62 390612.712 5819236 56.634 390612.828 5819236.009 56.5 390612.828 5819236.009 56.122 390615.433 5819236.211 56.129 390615.433 5819236.211 32.62 390612.828 5819236.009 32.62 390612.712 5819236 32.62 390612.712 5819236 56.634 390611.449 5819252.223 32.62 390611.501 5819252.227 32.62 390625.56 5819253.323 32.62 390625.56 5819253.323 57.239 390611.501 5819252.227 57.25 390611.449 5819252.223 57.25 390611.449 5819252.223 32.62 390586.39 5819229.282 59.98 390586.711 5819225.361 63.12 390586.711 5819225.361 63.155 390586.39 5819229.282 63.155 390586.158 5819232.115 63.155 390586.158 5819232.115 56.929 390586.39 5819229.282 59.98 390593.285 5819229.831 63.155 390593.606 5819225.91 63.155 390593.606 5819225.91 63.12 390593.285 5819229.831 59.98 390593.054 5819232.664 56.928 390593.054 5819232.664 63.155 390593.285 5819229.831 63.155 390587.096 5819232.19 63.155 390593.054 5819232.664 63.155 390593.054 5819232.664 56.928 390597.572 5819233.024 56.928 390597.572 5819233.024 32.62 390593.054 5819232.664 32.62 390587.096 5819232.19 32.62 390587.096 5819232.19 63.155 390586.664 5819218.804 32.62 390587.243 5819218.85 32.62 390589.425 5819219.023 32.62 390589.425 5819219.023 56.827 390587.243 5819218.85 56.828 390586.664 5819218.804 56.828 390586.664 5819218.804 32.62 390584.515 5819231.984 56.929 390586.158 5819232.115 56.929 390586.158 5819232.115 63.155 390587.096 5819232.19 63.155 390587.096 5819232.19 32.62 390586.158 5819232.115 32.62 390584.515 5819231.984 32.62 390584.515 5819231.984 56.929 390540.007 5819228.74 55.48 390564.592 5819230.697 55.48 390564.642 5819230.701 55.523 390564.642 5819230.701 32.62 390564.592 5819230.697 32.62 390540.007 5819228.74 32.62 390540.007 5819228.74 55.48 390611.499 5819251.576 56.564 390611.449 5819252.223 57.25 390611.501 5819252.227 57.25 390625.56 5819253.323 57.239 390625.355 5819255.918 59.98 390611.291 5819254.799 59.98 390608.292 5819254.56 59.98 390611.499 5819251.576 56.564 390593.285 5819229.831 59.98 390597.793 5819230.19 59.98 390601.063 5819230.45 59.98 390597.572 5819233.024 56.928 390593.054 5819232.664 56.928 390593.285 5819229.831 59.98 390586.39 5819229.282 63.155 390586.711 5819225.361 63.155 390593.606 5819225.91 63.155 390593.285 5819229.831 63.155 390593.054 5819232.664 63.155 390587.096 5819232.19 63.155 390586.158 5819232.115 63.155 390586.39 5819229.282 63.155 390581.791 5819228.916 59.98 390586.39 5819229.282 59.98 390586.158 5819232.115 56.929 390584.515 5819231.984 56.929 390581.554 5819231.749 56.935 390578.365 5819228.644 59.98 390581.791 5819228.916 59.98 390580.134 5819249.072 56.938 390584.743 5819249.429 56.933 390584.478 5819252.665 59.98 390579.879 5819252.299 59.98 390576.46 5819252.027 59.98 390580.134 5819249.072 56.938 DEB_LOD2_UUID_18aa324c-c0c8-4503-8c97-88da5b7566ab 1000 390554.246 5819273.332 40 390555.371 5819273.421 40 390555.24 5819274.927 40 390555.169 5819276.018 40 390554.045 5819275.914 40 390554.246 5819273.332 40 390554.045 5819275.914 34.51 390555.169 5819276.018 34.51 390555.24 5819274.927 34.51 390555.371 5819273.421 34.51 390554.246 5819273.332 34.51 390554.045 5819275.914 34.51 390554.045 5819275.914 34.51 390554.045 5819275.914 40 390555.169 5819276.018 40 390555.169 5819276.018 34.51 390554.045 5819275.914 34.51 390555.169 5819276.018 34.51 390555.169 5819276.018 40 390555.24 5819274.927 40 390555.24 5819274.927 34.51 390555.169 5819276.018 34.51 390555.24 5819274.927 34.51 390555.24 5819274.927 40 390555.371 5819273.421 40 390555.371 5819273.421 34.51 390555.24 5819274.927 34.51 390555.371 5819273.421 34.51 390555.371 5819273.421 40 390554.246 5819273.332 40 390554.246 5819273.332 34.51 390555.371 5819273.421 34.51 390554.246 5819273.332 34.51 390554.246 5819273.332 40 390554.045 5819275.914 40 390554.045 5819275.914 34.51 390554.246 5819273.332 34.51 DEB_LOD2_UUID_c35a998b-a396-4642-86bf-b64e3dbf4b5b 1000 390673.206 5819269.43 60.12 390680.008 5819269.962 60.12 390682.6 5819270.165 60.12 390684.646 5819272.705 55.915 390684.642 5819272.758 55.82 390682.432 5819272.585 55.82 390679.84 5819272.383 55.82 390673.037 5819271.85 55.82 390673.206 5819269.43 60.12 390664.272 5819260.662 61.43 390664.516 5819257.636 61.43 390664.695 5819255.408 61.43 390664.695 5819255.408 60.04 390664.516 5819257.636 60.04 390664.272 5819260.662 60.04 390664.21 5819261.428 60.04 390664.21 5819261.428 61.43 390664.272 5819260.662 61.43 390656.482 5819260.052 60.05 390656.71 5819257.025 60.04 390656.879 5819254.793 60.04 390656.879 5819254.793 61.43 390656.71 5819257.025 61.43 390656.482 5819260.052 61.43 390656.424 5819260.819 61.43 390656.424 5819260.819 60.05 390656.482 5819260.052 60.05 390666.006 5819255.512 60.04 390666.006 5819255.512 59.949 390667.233 5819240.288 59.949 390667.233 5819240.288 60.04 390667.44 5819237.718 60.04 390667.44 5819237.718 60.104 390667.233 5819240.288 60.136 390667.233 5819240.288 60.12 390666.006 5819255.512 60.12 390665.826 5819257.739 60.12 390665.826 5819257.739 60.04 390666.006 5819255.512 60.04 390668.835 5819241.995 56.264 390668.956 5819240.424 56.276 390669.041 5819239.327 56.258 390669.041 5819239.327 33.28 390668.956 5819240.424 33.28 390668.835 5819241.995 33.28 390668.105 5819251.46 33.28 390668.105 5819251.46 56.41 390668.835 5819241.995 56.264 390669.529 5819232.406 63.07 390669.529 5819232.406 33.28 390669.224 5819235.91 33.28 390669.055 5819237.846 33.28 390668.93 5819239.279 33.28 390668.93 5819239.279 56.514 390669.055 5819237.846 56.475 390669.055 5819237.846 60.96 390669.224 5819235.91 63.07 390669.529 5819232.406 63.07 390673.206 5819269.43 60.04 390680.008 5819269.962 60.04 390682.6 5819270.165 60.04 390682.642 5819270.168 60.04 390682.6 5819270.165 60.12 390680.008 5819269.962 60.12 390673.206 5819269.43 60.12 390673.206 5819269.43 60.04 390682.963 5819264.951 62.67 390683.105 5819262.907 62.67 390683.159 5819262.14 62.67 390683.159 5819262.14 60.04 390683.105 5819262.907 60.04 390682.963 5819264.951 60.04 390682.743 5819268.116 60.04 390682.743 5819268.116 62.67 390682.963 5819264.951 62.67 390680.371 5819264.748 60.04 390680.513 5819262.704 60.04 390680.566 5819261.937 60.04 390680.566 5819261.937 62.67 390680.513 5819262.704 62.67 390680.371 5819264.748 62.67 390680.151 5819267.913 62.67 390680.151 5819267.913 60.04 390680.371 5819264.748 60.04 390685.734 5819257.066 55.821 390685.736 5819257.038 55.767 390685.736 5819257.038 33.28 390685.734 5819257.066 33.28 390685.58 5819259.285 33.28 390685.511 5819260.279 33.28 390685.511 5819260.279 60.04 390685.58 5819259.285 60.04 390685.58 5819259.285 60.12 390685.734 5819257.066 55.821 390669.568 5819231.959 63.07 390670.137 5819225.447 57.364 390670.137 5819225.447 33.28 390669.568 5819231.959 33.28 390669.529 5819232.406 33.28 390669.529 5819232.406 63.07 390669.568 5819231.959 63.07 390660.811 5819286.744 44.34 390661.439 5819286.795 44.34 390661.977 5819286.838 44.34 390661.977 5819286.838 33.28 390661.439 5819286.795 33.28 390660.811 5819286.744 33.28 390660.811 5819286.744 44.34 390656.879 5819254.793 60.04 390662.908 5819255.268 60.04 390664.695 5819255.408 60.04 390664.695 5819255.408 61.43 390662.908 5819255.268 61.43 390656.879 5819254.793 61.43 390656.879 5819254.793 60.04 390656.424 5819260.819 61.43 390662.488 5819261.294 61.43 390664.21 5819261.428 61.43 390664.21 5819261.428 60.04 390662.488 5819261.294 60.04 390656.424 5819260.819 60.05 390656.424 5819260.819 61.43 390654.551 5819286.236 40.09 390660.718 5819286.737 40.09 390660.718 5819286.737 44.34 390660.811 5819286.744 44.34 390660.811 5819286.744 33.28 390660.718 5819286.737 33.28 390654.551 5819286.236 33.28 390654.551 5819286.236 40.09 390625.631 5819252.331 33.28 390625.999 5819247.15 33.28 390625.999 5819247.15 57.75 390625.631 5819252.331 57.796 390625.56 5819253.323 57.805 390625.56 5819253.323 33.28 390625.631 5819252.331 33.28 390639.171 5819253.424 57.075 390654.253 5819254.627 57.097 390654.256 5819254.586 57.04 390656.71 5819257.025 60.04 390654.083 5819256.82 60.04 390639.008 5819255.64 60.043 390639.171 5819253.424 57.075 390639.008 5819255.64 60.043 390654.083 5819256.82 60.04 390656.71 5819257.025 60.04 390656.482 5819260.052 60.05 390655.167 5819259.949 60.05 390653.852 5819259.846 60.05 390638.772 5819258.666 60.05 390639.008 5819255.64 60.043 390625.222 5819257.605 60.04 390627.61 5819257.792 60.04 390627.548 5819258.559 60.05 390625.161 5819258.372 60.05 390625.222 5819257.605 60.04 390625.4 5819255.353 57.808 390627.61 5819257.792 60.04 390625.222 5819257.605 60.04 390625.4 5819255.353 57.808 390626.314 5819234.446 60.04 390629.471 5819234.697 60.04 390626.102 5819236.99 57.087 390626.314 5819234.446 60.04 390627.61 5819257.792 60.04 390637.128 5819258.537 60.048 390637.066 5819259.304 60.05 390627.548 5819258.559 60.05 390627.61 5819257.792 60.04 390637.128 5819258.537 60.048 390638.772 5819258.666 60.05 390638.713 5819259.433 60.05 390637.066 5819259.304 60.05 390637.128 5819258.537 60.048 390637.372 5819255.512 60.05 390639.008 5819255.64 60.043 390638.772 5819258.666 60.05 390637.128 5819258.537 60.048 390637.372 5819255.512 60.05 390639.173 5819253.398 57.04 390639.171 5819253.424 57.075 390639.008 5819255.64 60.043 390637.372 5819255.512 60.05 390639.173 5819253.398 57.04 390637.553 5819253.27 60.05 390638.424 5819253.339 58.441 390639.173 5819253.398 57.057 390637.372 5819255.512 60.05 390637.553 5819253.27 60.05 390638.167 5819245.653 60.05 390638.78 5819238.035 60.03 390639.575 5819238.094 58.544 390640.361 5819238.153 57.074 390640.098 5819241.531 57.066 390639.539 5819248.697 57.05 390639.173 5819253.398 57.04 390639.173 5819253.398 57.057 390638.424 5819253.339 58.441 390637.553 5819253.27 60.05 390637.553 5819253.27 60.07 390638.167 5819245.653 60.05 390638.988 5819235.454 60.05 390640.361 5819238.153 57.055 390640.361 5819238.153 57.074 390639.575 5819238.094 58.544 390638.78 5819238.035 60.03 390638.78 5819238.035 60.05 390638.988 5819235.454 60.05 390640.569 5819235.58 60.04 390640.361 5819238.153 57.055 390638.988 5819235.454 60.05 390640.569 5819235.58 60.04 390640.569 5819235.58 60.04 390655.609 5819236.777 60.038 390655.422 5819239.326 57.072 390640.361 5819238.153 57.055 390640.569 5819235.58 60.04 390650.35 5819223.873 60.02 390650.117 5819226.907 60.02 390641.678 5819223.183 57.364 390650.35 5819223.873 60.02 390650.35 5819223.873 60.02 390659.023 5819224.563 57.364 390650.117 5819226.907 60.02 390650.35 5819223.873 60.02 390655.422 5819239.326 57.072 390655.609 5819236.777 60.038 390658.226 5819236.985 60.04 390655.42 5819239.352 57.05 390655.422 5819239.326 57.072 390656.482 5819260.052 61.43 390656.71 5819257.025 61.43 390656.879 5819254.793 61.43 390662.908 5819255.268 61.43 390664.695 5819255.408 61.43 390664.516 5819257.636 61.43 390664.272 5819260.662 61.43 390664.21 5819261.428 61.43 390662.488 5819261.294 61.43 390656.424 5819260.819 61.43 390656.482 5819260.052 61.43 390665.922 5819240.184 59.949 390667.233 5819240.288 59.949 390666.006 5819255.512 59.949 390664.695 5819255.408 59.949 390665.922 5819240.184 59.949 390666.006 5819255.512 60.12 390667.78 5819255.655 56.477 390668.1 5819255.68 55.826 390665.826 5819257.739 60.12 390666.006 5819255.512 60.12 390668.835 5819241.995 56.264 390668.105 5819251.46 56.41 390667.78 5819255.655 56.477 390666.006 5819255.512 60.12 390668.835 5819241.995 56.264 390667.233 5819240.288 60.12 390668.197 5819240.364 57.97 390668.956 5819240.424 56.276 390668.835 5819241.995 56.264 390666.006 5819255.512 60.12 390667.233 5819240.288 60.12 390667.44 5819237.718 60.104 390669.055 5819237.846 56.475 390668.93 5819239.279 56.514 390668.931 5819239.319 56.505 390669.041 5819239.327 56.258 390668.956 5819240.424 56.276 390668.197 5819240.364 57.97 390667.233 5819240.288 60.12 390667.233 5819240.288 60.136 390667.44 5819237.718 60.104 390670.302 5819269.203 60.04 390673.206 5819269.43 55.82 390673.037 5819271.85 55.82 390670.247 5819269.198 60.12 390670.302 5819269.203 60.04 390680.371 5819264.748 62.67 390680.513 5819262.704 62.67 390680.566 5819261.937 62.67 390683.159 5819262.14 62.67 390683.105 5819262.907 62.67 390682.963 5819264.951 62.67 390682.743 5819268.116 62.67 390680.151 5819267.913 62.67 390680.371 5819264.748 62.67 390682.642 5819270.168 60.04 390684.811 5819270.338 55.915 390684.658 5819272.531 55.915 390684.646 5819272.705 55.915 390682.6 5819270.165 60.12 390682.642 5819270.168 60.04 390680.933 5819256.668 40.09 390683.525 5819256.868 40.09 390683.524 5819256.892 40.09 390680.932 5819256.687 40.09 390680.933 5819256.668 40.09 390683.525 5819256.868 55.773 390685.736 5819257.038 55.767 390685.734 5819257.066 55.821 390683.524 5819256.892 55.821 390683.525 5819256.868 55.773 390626.098 5819237.042 33.28 390626.098 5819237.042 57.087 390626.842 5819237.1 57.781 390626.842 5819237.1 33.28 390626.098 5819237.042 33.28 390626.842 5819237.1 33.28 390626.842 5819237.1 57.781 390626.574 5819240.489 57.786 390626.574 5819240.489 33.28 390626.842 5819237.1 33.28 390626.574 5819240.489 33.28 390626.574 5819240.489 57.786 390625.999 5819247.15 57.75 390625.999 5819247.15 33.28 390626.574 5819240.489 33.28 390638.167 5819245.653 60.05 390638.78 5819238.035 60.05 390638.78 5819238.035 60.03 390638.167 5819245.653 60.05 390637.372 5819255.512 60.05 390639.173 5819253.398 57.057 390639.173 5819253.398 57.04 390637.372 5819255.512 60.05 390639.173 5819253.398 57.04 390639.173 5819253.398 57.057 390638.424 5819253.339 58.441 390639.173 5819253.398 57.04 390637.553 5819253.27 60.05 390637.553 5819253.27 60.07 390638.424 5819253.339 58.441 390637.553 5819253.27 60.05 390640.361 5819238.153 57.055 390640.361 5819238.153 57.074 390639.575 5819238.094 58.544 390640.361 5819238.153 57.055 390638.167 5819245.653 60.05 390637.553 5819253.27 60.07 390637.553 5819253.27 60.05 390638.167 5819245.653 60.05 390638.78 5819238.035 60.03 390638.78 5819238.035 60.05 390639.575 5819238.094 58.544 390638.78 5819238.035 60.03 390654.253 5819254.627 33.28 390654.253 5819254.627 57.097 390639.171 5819253.424 57.075 390639.171 5819253.424 33.28 390654.253 5819254.627 33.28 390640.361 5819238.153 33.28 390640.361 5819238.153 57.055 390655.422 5819239.326 57.072 390655.422 5819239.326 33.28 390640.361 5819238.153 33.28 390655.811 5819269.576 33.28 390655.811 5819269.576 57.456 390655.758 5819270.286 56.194 390655.758 5819270.286 33.28 390655.811 5819269.576 33.28 390664.695 5819255.408 59.949 390664.695 5819255.408 60.04 390665.922 5819240.184 60.04 390665.922 5819240.184 59.949 390664.695 5819255.408 59.949 390666.006 5819255.512 59.949 390666.006 5819255.512 60.04 390664.695 5819255.408 60.04 390664.695 5819255.408 59.949 390666.006 5819255.512 59.949 390665.922 5819240.184 59.949 390665.922 5819240.184 60.04 390667.233 5819240.288 60.04 390667.233 5819240.288 59.949 390665.922 5819240.184 59.949 390667.78 5819255.655 33.28 390667.78 5819255.655 56.477 390668.105 5819251.46 56.41 390668.105 5819251.46 33.28 390667.78 5819255.655 33.28 390667.233 5819240.288 60.12 390667.233 5819240.288 60.136 390668.197 5819240.364 57.97 390667.233 5819240.288 60.12 390669.041 5819239.327 33.28 390669.041 5819239.327 56.258 390668.931 5819239.319 56.505 390668.931 5819239.319 33.28 390669.041 5819239.327 33.28 390668.931 5819239.319 33.28 390668.931 5819239.319 56.505 390668.93 5819239.279 56.514 390668.93 5819239.279 33.28 390668.931 5819239.319 33.28 390670.302 5819269.203 60.04 390673.206 5819269.43 60.04 390673.206 5819269.43 55.82 390670.302 5819269.203 60.04 390673.206 5819269.43 55.82 390673.206 5819269.43 60.04 390673.206 5819269.43 60.12 390673.037 5819271.85 55.82 390673.206 5819269.43 55.82 390680.932 5819256.687 40.09 390680.932 5819256.687 55.822 390680.933 5819256.668 55.784 390680.933 5819256.668 40.09 390680.932 5819256.687 40.09 390680.151 5819267.913 60.04 390680.151 5819267.913 62.67 390682.743 5819268.116 62.67 390682.743 5819268.116 60.04 390680.151 5819267.913 60.04 390683.159 5819262.14 60.04 390683.159 5819262.14 62.67 390680.566 5819261.937 62.67 390680.566 5819261.937 60.04 390683.159 5819262.14 60.04 390683.524 5819256.892 40.09 390683.524 5819256.892 55.821 390680.932 5819256.687 55.822 390680.932 5819256.687 40.09 390683.524 5819256.892 40.09 390682.642 5819270.168 60.04 390684.811 5819270.338 60.04 390684.811 5819270.338 55.915 390682.642 5819270.168 60.04 390683.525 5819256.868 40.09 390683.525 5819256.868 55.773 390683.524 5819256.892 55.821 390683.524 5819256.892 40.09 390683.525 5819256.868 40.09 390625.461 5819254.579 57.806 390625.56 5819253.323 57.805 390625.631 5819252.331 57.796 390625.999 5819247.15 57.75 390626.574 5819240.489 57.786 390626.842 5819237.1 57.781 390626.098 5819237.042 57.087 390626.099 5819237.031 57.087 390626.102 5819236.99 57.087 390629.471 5819234.697 60.04 390629.263 5819237.281 60.04 390628.035 5819252.521 60.04 390627.854 5819254.767 60.04 390627.61 5819257.792 60.04 390625.4 5819255.353 57.808 390625.461 5819254.579 57.806 390627.854 5819254.767 60.04 390628.035 5819252.521 60.04 390629.263 5819237.281 60.04 390629.471 5819234.697 60.04 390638.988 5819235.454 60.05 390638.78 5819238.035 60.05 390638.167 5819245.653 60.05 390637.553 5819253.27 60.05 390637.372 5819255.512 60.05 390637.128 5819258.537 60.048 390627.61 5819257.792 60.04 390627.854 5819254.767 60.04 390626.761 5819229.054 63.07 390626.802 5819228.556 63.07 390629.946 5819228.807 63.07 390639.463 5819229.564 63.07 390641.028 5819229.688 63.07 390649.85 5819230.39 63.07 390656.058 5819230.884 63.07 390658.672 5819231.092 63.07 390664.557 5819231.56 63.07 390666.604 5819231.723 63.07 390667.914 5819231.828 63.07 390669.568 5819231.959 63.07 390669.529 5819232.406 63.07 390669.224 5819235.91 63.07 390667.596 5819235.78 63.07 390666.285 5819235.676 63.07 390664.282 5819235.516 63.07 390658.373 5819235.046 63.07 390655.757 5819234.838 63.07 390640.72 5819233.642 63.07 390639.145 5819233.516 63.07 390629.628 5819232.759 63.07 390626.474 5819232.508 63.07 390626.761 5819229.054 63.07 390655.758 5819270.286 56.194 390655.811 5819269.576 57.456 390655.924 5819268.077 60.12 390661.983 5819268.551 60.12 390663.625 5819268.68 60.12 390664.936 5819268.783 60.12 390667.176 5819268.958 60.12 390670.247 5819269.198 60.12 390673.037 5819271.85 55.82 390670.078 5819271.619 55.82 390667.008 5819271.378 55.82 390664.741 5819271.201 55.82 390663.431 5819271.098 55.82 390662.623 5819271.035 55.82 390661.815 5819270.972 55.82 390655.742 5819270.496 55.82 390655.758 5819270.286 56.194 390660.962 5819283.236 44.34 390661.145 5819280.607 44.34 390661.331 5819277.921 44.34 390661.544 5819274.869 44.34 390661.815 5819270.972 44.34 390662.623 5819271.035 44.34 390663.431 5819271.098 44.34 390664.741 5819271.201 44.34 390667.008 5819271.378 44.34 390670.078 5819271.619 44.34 390673.037 5819271.85 44.34 390679.84 5819272.383 44.34 390682.432 5819272.585 44.34 390684.642 5819272.758 44.34 390684.371 5819276.655 44.34 390684.159 5819279.708 44.34 390683.972 5819282.394 44.34 390683.789 5819285.023 44.34 390683.541 5819288.585 44.34 390681.331 5819288.406 44.34 390681.295 5819288.403 44.34 390678.739 5819288.196 44.34 390671.939 5819287.644 44.34 390669.332 5819287.433 44.34 390668.98 5819287.405 44.34 390665.91 5819287.156 44.34 390663.521 5819286.963 44.34 390663.471 5819286.959 44.34 390662.161 5819286.853 44.34 390661.977 5819286.838 44.34 390661.439 5819286.795 44.34 390660.811 5819286.744 44.34 390660.718 5819286.737 44.34 390660.962 5819283.236 44.34 390625.042 5819259.881 60.05 390627.423 5819260.114 60.05 390628.902 5819260.258 60.05 390636.926 5819261.041 60.05 390637.658 5819261.112 60.05 390637.658 5819261.112 33.28 390636.926 5819261.041 33.28 390628.902 5819260.258 33.28 390627.423 5819260.114 33.28 390625.042 5819259.881 33.28 390625.042 5819259.881 60.05 390639.173 5819253.398 57.04 390639.539 5819248.697 57.05 390640.098 5819241.531 57.066 390640.361 5819238.153 57.074 390640.361 5819238.153 57.055 390640.361 5819238.153 33.28 390640.098 5819241.531 33.28 390639.539 5819248.697 33.28 390639.173 5819253.398 33.28 390639.171 5819253.424 33.28 390639.171 5819253.424 57.075 390639.173 5819253.398 57.04 390637.658 5819261.112 60.05 390638.576 5819261.193 60.05 390653.649 5819262.521 60.05 390656.277 5819262.753 60.05 390656.327 5819262.757 60.05 390656.327 5819262.757 33.28 390656.277 5819262.753 33.28 390653.649 5819262.521 33.28 390638.576 5819261.193 33.28 390637.658 5819261.112 33.28 390637.658 5819261.112 60.05 390654.256 5819254.586 33.28 390654.575 5819250.41 33.28 390655.42 5819239.352 33.28 390655.422 5819239.326 33.28 390655.422 5819239.326 57.072 390655.42 5819239.352 57.05 390654.575 5819250.41 57.044 390654.256 5819254.586 57.04 390654.253 5819254.627 57.097 390654.253 5819254.627 33.28 390654.256 5819254.586 33.28 390655.924 5819268.077 33.28 390656.079 5819266.029 33.28 390656.319 5819262.865 33.28 390656.327 5819262.757 33.28 390656.327 5819262.757 60.05 390656.319 5819262.865 60.048 390656.079 5819266.029 60.04 390655.924 5819268.077 60.04 390655.924 5819268.077 60.12 390655.811 5819269.576 57.456 390655.811 5819269.576 33.28 390655.924 5819268.077 33.28 390661.977 5819286.838 44.34 390662.161 5819286.853 44.34 390663.471 5819286.959 44.34 390663.521 5819286.963 44.34 390665.91 5819287.156 44.34 390668.98 5819287.405 44.34 390669.332 5819287.433 44.34 390669.332 5819287.433 33.28 390668.98 5819287.405 33.28 390665.91 5819287.156 33.28 390663.521 5819286.963 33.28 390663.471 5819286.959 33.28 390662.161 5819286.853 33.28 390661.977 5819286.838 33.28 390661.977 5819286.838 44.34 390655.924 5819268.077 60.04 390661.983 5819268.551 60.04 390663.625 5819268.68 60.04 390664.936 5819268.783 60.04 390667.176 5819268.958 60.04 390670.247 5819269.198 60.04 390670.302 5819269.203 60.04 390670.247 5819269.198 60.12 390667.176 5819268.958 60.12 390664.936 5819268.783 60.12 390663.625 5819268.68 60.12 390661.983 5819268.551 60.12 390655.924 5819268.077 60.12 390655.924 5819268.077 60.04 390655.742 5819270.496 55.82 390661.815 5819270.972 55.82 390662.623 5819271.035 55.82 390663.431 5819271.098 55.82 390664.741 5819271.201 55.82 390667.008 5819271.378 55.82 390670.078 5819271.619 55.82 390673.037 5819271.85 55.82 390679.84 5819272.383 55.82 390682.432 5819272.585 55.82 390684.642 5819272.758 55.82 390684.642 5819272.758 44.34 390682.432 5819272.585 44.34 390679.84 5819272.383 44.34 390673.037 5819271.85 44.34 390670.078 5819271.619 44.34 390667.008 5819271.378 44.34 390664.741 5819271.201 44.34 390663.431 5819271.098 44.34 390662.623 5819271.035 44.34 390661.815 5819270.972 44.34 390661.815 5819270.972 40.09 390655.742 5819270.496 40.09 390655.742 5819270.496 55.82 390665.826 5819257.739 60.12 390667.946 5819257.905 60.12 390671.016 5819258.145 60.119 390673.975 5819258.377 60.119 390680.777 5819258.909 60.118 390683.369 5819259.112 60.119 390685.58 5819259.285 60.12 390685.58 5819259.285 60.04 390683.369 5819259.112 60.04 390680.777 5819258.909 60.04 390673.975 5819258.377 60.04 390671.016 5819258.145 60.04 390667.946 5819257.905 60.04 390665.826 5819257.739 60.04 390665.826 5819257.739 60.12 390684.884 5819269.285 60.04 390684.953 5819268.289 60.04 390685.174 5819265.124 60.04 390685.316 5819263.08 60.04 390685.369 5819262.313 60.04 390685.511 5819260.279 60.04 390685.511 5819260.279 33.28 390685.369 5819262.313 33.28 390685.316 5819263.08 33.28 390685.174 5819265.124 33.28 390684.953 5819268.289 33.28 390684.884 5819269.285 33.28 390684.811 5819270.338 33.28 390684.658 5819272.531 33.28 390684.646 5819272.705 33.28 390684.642 5819272.758 33.28 390684.371 5819276.655 33.28 390684.159 5819279.708 33.28 390683.972 5819282.394 33.28 390683.789 5819285.023 33.28 390683.541 5819288.585 33.28 390683.541 5819288.585 44.34 390683.789 5819285.023 44.34 390683.972 5819282.394 44.34 390684.159 5819279.708 44.34 390684.371 5819276.655 44.34 390684.642 5819272.758 44.34 390684.642 5819272.758 55.82 390684.646 5819272.705 55.915 390684.658 5819272.531 55.915 390684.811 5819270.338 55.915 390684.811 5819270.338 60.04 390684.884 5819269.285 60.04 390667.78 5819255.655 33.28 390668.1 5819255.68 33.28 390671.171 5819255.916 33.28 390674.13 5819256.144 33.28 390680.933 5819256.668 33.28 390683.525 5819256.868 33.28 390685.736 5819257.038 33.28 390685.736 5819257.038 55.767 390683.525 5819256.868 55.773 390683.525 5819256.868 40.09 390680.933 5819256.668 40.09 390680.933 5819256.668 55.784 390674.13 5819256.144 55.806 390671.171 5819255.916 55.816 390668.1 5819255.68 55.826 390667.78 5819255.655 56.477 390667.78 5819255.655 33.28 390669.332 5819287.433 44.34 390671.939 5819287.644 44.34 390678.739 5819288.196 44.34 390681.295 5819288.403 44.34 390681.331 5819288.406 44.34 390683.541 5819288.585 44.34 390683.541 5819288.585 33.28 390681.331 5819288.406 33.28 390681.295 5819288.403 33.28 390678.739 5819288.196 33.28 390671.939 5819287.644 33.28 390669.332 5819287.433 33.28 390669.332 5819287.433 44.34 390627.343 5819222.042 33.28 390630.471 5819222.291 33.28 390639.988 5819223.048 33.28 390641.535 5819223.171 33.28 390641.678 5819223.183 33.28 390650.35 5819223.873 33.28 390659.023 5819224.563 33.28 390659.165 5819224.574 33.28 390665.011 5819225.039 33.28 390667.129 5819225.208 33.28 390668.439 5819225.312 33.28 390670.137 5819225.447 33.28 390670.137 5819225.447 57.364 390668.439 5819225.312 57.364 390667.129 5819225.208 57.364 390665.011 5819225.039 57.364 390659.165 5819224.574 57.364 390659.023 5819224.563 57.364 390650.35 5819223.873 60.02 390641.678 5819223.183 57.364 390641.535 5819223.171 57.364 390639.988 5819223.048 57.364 390630.471 5819222.291 57.364 390627.343 5819222.042 57.364 390627.343 5819222.042 33.28 390626.314 5819234.446 60.96 390629.471 5819234.697 60.96 390638.988 5819235.454 60.96 390640.569 5819235.58 60.96 390655.609 5819236.777 60.96 390658.226 5819236.985 60.96 390664.147 5819237.456 60.96 390666.129 5819237.614 60.96 390667.44 5819237.718 60.96 390669.055 5819237.846 60.96 390669.055 5819237.846 56.475 390667.44 5819237.718 60.104 390667.44 5819237.718 60.04 390666.129 5819237.614 60.04 390664.147 5819237.456 60.04 390658.226 5819236.985 60.04 390655.609 5819236.777 60.038 390640.569 5819235.58 60.04 390638.988 5819235.454 60.05 390629.471 5819234.697 60.04 390626.314 5819234.446 60.04 390626.314 5819234.446 60.96 390660.962 5819283.236 40.09 390661.145 5819280.607 40.09 390661.331 5819277.921 40.09 390661.544 5819274.869 40.09 390661.815 5819270.972 40.09 390661.815 5819270.972 44.34 390661.544 5819274.869 44.34 390661.331 5819277.921 44.34 390661.145 5819280.607 44.34 390660.962 5819283.236 44.34 390660.718 5819286.737 44.34 390660.718 5819286.737 40.09 390660.962 5819283.236 40.09 390654.607 5819285.496 33.28 390654.814 5819282.755 33.28 390655.013 5819280.128 33.28 390655.015 5819280.106 33.28 390655.215 5819277.465 33.28 390655.216 5819277.443 33.28 390655.447 5819274.391 33.28 390655.742 5819270.496 33.28 390655.758 5819270.286 33.28 390655.758 5819270.286 56.194 390655.742 5819270.496 55.82 390655.742 5819270.496 40.09 390655.447 5819274.391 40.09 390655.216 5819277.443 40.09 390655.215 5819277.465 40.09 390655.015 5819280.106 40.09 390655.013 5819280.128 40.09 390654.814 5819282.755 40.09 390654.607 5819285.496 40.09 390654.551 5819286.236 40.09 390654.551 5819286.236 33.28 390654.607 5819285.496 33.28 390626.099 5819237.031 33.28 390626.102 5819236.99 33.28 390626.314 5819234.446 33.28 390626.474 5819232.508 33.28 390626.761 5819229.054 33.28 390626.802 5819228.556 33.28 390627.343 5819222.042 33.28 390627.343 5819222.042 57.364 390626.802 5819228.556 63.07 390626.761 5819229.054 63.07 390626.474 5819232.508 63.07 390626.314 5819234.446 60.96 390626.314 5819234.446 60.04 390626.102 5819236.99 57.087 390626.099 5819237.031 57.087 390626.098 5819237.042 57.087 390626.098 5819237.042 33.28 390626.099 5819237.031 33.28 390625.161 5819258.372 33.28 390625.222 5819257.605 33.28 390625.4 5819255.353 33.28 390625.461 5819254.579 33.28 390625.56 5819253.323 33.28 390625.56 5819253.323 57.805 390625.461 5819254.579 57.806 390625.4 5819255.353 57.808 390625.222 5819257.605 60.04 390625.161 5819258.372 60.05 390625.042 5819259.881 60.05 390625.042 5819259.881 33.28 390625.161 5819258.372 33.28 390668.1 5819255.68 55.826 390671.171 5819255.916 55.816 390674.13 5819256.144 55.806 390680.933 5819256.668 55.784 390680.932 5819256.687 55.822 390683.524 5819256.892 55.821 390685.734 5819257.066 55.821 390685.58 5819259.285 60.12 390683.369 5819259.112 60.119 390680.777 5819258.909 60.118 390673.975 5819258.377 60.119 390671.016 5819258.145 60.119 390667.946 5819257.905 60.12 390665.826 5819257.739 60.12 390668.1 5819255.68 55.826 390627.343 5819222.042 57.364 390630.471 5819222.291 57.364 390639.988 5819223.048 57.364 390641.535 5819223.171 57.364 390641.678 5819223.183 57.364 390650.117 5819226.907 60.02 390659.023 5819224.563 57.364 390659.165 5819224.574 57.364 390665.011 5819225.039 57.364 390667.129 5819225.208 57.364 390668.439 5819225.312 57.364 390670.137 5819225.447 57.364 390669.568 5819231.959 63.07 390667.914 5819231.828 63.07 390666.604 5819231.723 63.07 390664.557 5819231.56 63.07 390658.672 5819231.092 63.07 390656.058 5819230.884 63.07 390649.85 5819230.39 63.07 390641.028 5819229.688 63.07 390639.463 5819229.564 63.07 390629.946 5819228.807 63.07 390626.802 5819228.556 63.07 390627.343 5819222.042 57.364 390625.161 5819258.372 60.05 390627.548 5819258.559 60.05 390637.066 5819259.304 60.05 390638.713 5819259.433 60.05 390638.772 5819258.666 60.05 390653.852 5819259.846 60.05 390655.167 5819259.949 60.05 390656.482 5819260.052 60.05 390656.424 5819260.819 60.05 390662.488 5819261.294 60.04 390664.21 5819261.428 60.04 390664.272 5819260.662 60.04 390664.516 5819257.636 60.04 390664.695 5819255.408 60.04 390666.006 5819255.512 60.04 390665.826 5819257.739 60.04 390667.946 5819257.905 60.04 390671.016 5819258.145 60.04 390673.975 5819258.377 60.04 390680.777 5819258.909 60.04 390683.369 5819259.112 60.04 390685.58 5819259.285 60.04 390685.511 5819260.279 60.04 390685.369 5819262.313 60.04 390685.316 5819263.08 60.04 390685.174 5819265.124 60.04 390684.953 5819268.289 60.04 390684.884 5819269.285 60.04 390684.811 5819270.338 60.04 390682.642 5819270.168 60.04 390682.6 5819270.165 60.04 390680.008 5819269.962 60.04 390673.206 5819269.43 60.04 390670.302 5819269.203 60.04 390670.247 5819269.198 60.04 390667.176 5819268.958 60.04 390664.936 5819268.783 60.04 390663.625 5819268.68 60.04 390661.983 5819268.551 60.04 390655.924 5819268.077 60.04 390656.079 5819266.029 60.04 390656.319 5819262.865 60.048 390656.327 5819262.757 60.05 390656.277 5819262.753 60.05 390653.649 5819262.521 60.05 390638.576 5819261.193 60.05 390637.658 5819261.112 60.05 390636.926 5819261.041 60.05 390628.902 5819260.258 60.05 390627.423 5819260.114 60.05 390625.042 5819259.881 60.05 390625.161 5819258.372 60.05 390682.743 5819268.116 60.04 390682.963 5819264.951 60.04 390683.105 5819262.907 60.04 390683.159 5819262.14 60.04 390680.566 5819261.937 60.04 390680.513 5819262.704 60.04 390680.371 5819264.748 60.04 390680.151 5819267.913 60.04 390682.743 5819268.116 60.04 390626.474 5819232.508 63.07 390629.628 5819232.759 63.07 390639.145 5819233.516 63.07 390640.72 5819233.642 63.07 390655.757 5819234.838 63.07 390658.373 5819235.046 63.07 390664.282 5819235.516 63.07 390666.285 5819235.676 63.07 390667.596 5819235.78 63.07 390669.224 5819235.91 63.07 390669.055 5819237.846 60.96 390667.44 5819237.718 60.96 390666.129 5819237.614 60.96 390664.147 5819237.456 60.96 390658.226 5819236.985 60.96 390655.609 5819236.777 60.96 390640.569 5819235.58 60.96 390638.988 5819235.454 60.96 390629.471 5819234.697 60.96 390626.314 5819234.446 60.96 390626.474 5819232.508 63.07 390683.525 5819256.868 33.28 390680.933 5819256.668 33.28 390674.13 5819256.144 33.28 390671.171 5819255.916 33.28 390668.1 5819255.68 33.28 390667.78 5819255.655 33.28 390668.105 5819251.46 33.28 390668.835 5819241.995 33.28 390668.956 5819240.424 33.28 390669.041 5819239.327 33.28 390668.931 5819239.319 33.28 390668.93 5819239.279 33.28 390669.055 5819237.846 33.28 390669.224 5819235.91 33.28 390669.529 5819232.406 33.28 390669.568 5819231.959 33.28 390670.137 5819225.447 33.28 390668.439 5819225.312 33.28 390667.129 5819225.208 33.28 390665.011 5819225.039 33.28 390659.165 5819224.574 33.28 390659.023 5819224.563 33.28 390650.35 5819223.873 33.28 390641.678 5819223.183 33.28 390641.535 5819223.171 33.28 390639.988 5819223.048 33.28 390630.471 5819222.291 33.28 390627.343 5819222.042 33.28 390626.802 5819228.556 33.28 390626.761 5819229.054 33.28 390626.474 5819232.508 33.28 390626.314 5819234.446 33.28 390626.102 5819236.99 33.28 390626.099 5819237.031 33.28 390626.098 5819237.042 33.28 390626.842 5819237.1 33.28 390626.574 5819240.489 33.28 390625.999 5819247.15 33.28 390625.631 5819252.331 33.28 390625.56 5819253.323 33.28 390625.461 5819254.579 33.28 390625.4 5819255.353 33.28 390625.222 5819257.605 33.28 390625.161 5819258.372 33.28 390625.042 5819259.881 33.28 390627.423 5819260.114 33.28 390628.902 5819260.258 33.28 390636.926 5819261.041 33.28 390637.658 5819261.112 33.28 390638.576 5819261.193 33.28 390653.649 5819262.521 33.28 390656.277 5819262.753 33.28 390656.327 5819262.757 33.28 390656.319 5819262.865 33.28 390656.079 5819266.029 33.28 390655.924 5819268.077 33.28 390655.811 5819269.576 33.28 390655.758 5819270.286 33.28 390655.742 5819270.496 33.28 390655.447 5819274.391 33.28 390655.216 5819277.443 33.28 390655.215 5819277.465 33.28 390655.015 5819280.106 33.28 390655.013 5819280.128 33.28 390654.814 5819282.755 33.28 390654.607 5819285.496 33.28 390654.551 5819286.236 33.28 390660.718 5819286.737 33.28 390660.811 5819286.744 33.28 390661.439 5819286.795 33.28 390661.977 5819286.838 33.28 390662.161 5819286.853 33.28 390663.471 5819286.959 33.28 390663.521 5819286.963 33.28 390665.91 5819287.156 33.28 390668.98 5819287.405 33.28 390669.332 5819287.433 33.28 390671.939 5819287.644 33.28 390678.739 5819288.196 33.28 390681.295 5819288.403 33.28 390681.331 5819288.406 33.28 390683.541 5819288.585 33.28 390683.789 5819285.023 33.28 390683.972 5819282.394 33.28 390684.159 5819279.708 33.28 390684.371 5819276.655 33.28 390684.642 5819272.758 33.28 390684.646 5819272.705 33.28 390684.658 5819272.531 33.28 390684.811 5819270.338 33.28 390684.884 5819269.285 33.28 390684.953 5819268.289 33.28 390685.174 5819265.124 33.28 390685.316 5819263.08 33.28 390685.369 5819262.313 33.28 390685.511 5819260.279 33.28 390685.58 5819259.285 33.28 390685.734 5819257.066 33.28 390685.736 5819257.038 33.28 390683.525 5819256.868 33.28 390655.42 5819239.352 33.28 390654.575 5819250.41 33.28 390654.256 5819254.586 33.28 390654.253 5819254.627 33.28 390639.171 5819253.424 33.28 390639.173 5819253.398 33.28 390639.539 5819248.697 33.28 390640.098 5819241.531 33.28 390640.361 5819238.153 33.28 390655.422 5819239.326 33.28 390655.42 5819239.352 33.28 390658.032 5819239.559 60.038 390658.226 5819236.985 60.04 390664.147 5819237.456 60.04 390666.129 5819237.614 60.04 390667.44 5819237.718 60.04 390667.233 5819240.288 60.04 390665.922 5819240.184 60.04 390664.695 5819255.408 60.04 390662.908 5819255.268 60.04 390656.879 5819254.793 60.04 390658.032 5819239.559 60.038 390654.607 5819285.496 40.09 390654.814 5819282.755 40.09 390655.013 5819280.128 40.09 390655.015 5819280.106 40.09 390655.215 5819277.465 40.09 390655.216 5819277.443 40.09 390655.447 5819274.391 40.09 390655.742 5819270.496 40.09 390661.815 5819270.972 40.09 390661.544 5819274.869 40.09 390661.331 5819277.921 40.09 390661.145 5819280.607 40.09 390660.962 5819283.236 40.09 390660.718 5819286.737 40.09 390654.551 5819286.236 40.09 390654.607 5819285.496 40.09 390654.575 5819250.41 57.044 390655.42 5819239.352 57.05 390658.226 5819236.985 60.04 390658.032 5819239.559 60.038 390656.879 5819254.793 60.04 390656.71 5819257.025 60.04 390654.256 5819254.586 57.04 390654.575 5819250.41 57.044 DEB_LOD2_UUID_5a2423e9-e656-45e2-adec-489fca27ae1b 2100 390586.26 5819259.58 61.25 390593.187 5819260.117 61.25 390592.862 5819264.204 59.683 390585.972 5819263.691 59.675 390586.26 5819259.58 61.25 390586.47 5819256.575 61.447 390593.425 5819257.114 61.447 390593.187 5819260.117 61.25 390586.26 5819259.58 61.25 390586.47 5819256.575 61.447 390585.972 5819263.691 32.36 390585.972 5819263.691 59.675 390592.862 5819264.204 59.683 390592.862 5819264.204 32.36 390585.972 5819263.691 32.36 390593.425 5819257.114 32.36 390593.425 5819257.114 61.447 390586.47 5819256.575 61.447 390586.47 5819256.575 32.36 390593.425 5819257.114 32.36 390586.26 5819259.58 32.36 390586.47 5819256.575 32.36 390586.47 5819256.575 61.447 390586.26 5819259.58 61.25 390585.972 5819263.691 59.675 390585.972 5819263.691 32.36 390586.26 5819259.58 32.36 390593.425 5819257.114 61.447 390593.425 5819257.114 32.36 390593.187 5819260.117 32.36 390592.862 5819264.204 32.36 390592.862 5819264.204 59.683 390593.187 5819260.117 61.25 390593.425 5819257.114 61.447 390586.47 5819256.575 32.36 390586.26 5819259.58 32.36 390585.972 5819263.691 32.36 390592.862 5819264.204 32.36 390593.187 5819260.117 32.36 390593.425 5819257.114 32.36 390586.47 5819256.575 32.36 DEB_LOD2_UUID_cadc9fac-9e07-4c9a-9612-674fd790c039 1000 390578.981 5819263.17 40.219 390585.972 5819263.691 40.219 390585.139 5819278.575 40.219 390579.938 5819278.129 40.219 390578.193 5819275.573 40.219 390578.981 5819263.17 40.219 390578.193 5819275.573 32.803 390579.938 5819278.129 32.803 390585.139 5819278.575 32.803 390585.972 5819263.691 32.803 390578.981 5819263.17 32.803 390578.193 5819275.573 32.803 390578.193 5819275.573 32.803 390578.193 5819275.573 40.219 390579.938 5819278.129 40.219 390579.938 5819278.129 32.803 390578.193 5819275.573 32.803 390579.938 5819278.129 32.803 390579.938 5819278.129 40.219 390585.139 5819278.575 40.219 390585.139 5819278.575 32.803 390579.938 5819278.129 32.803 390585.139 5819278.575 32.803 390585.139 5819278.575 40.219 390585.972 5819263.691 40.219 390585.972 5819263.691 32.803 390585.139 5819278.575 32.803 390585.972 5819263.691 32.803 390585.972 5819263.691 40.219 390578.981 5819263.17 40.219 390578.981 5819263.17 32.803 390585.972 5819263.691 32.803 390578.981 5819263.17 32.803 390578.981 5819263.17 40.219 390578.193 5819275.573 40.219 390578.193 5819275.573 32.803 390578.981 5819263.17 32.803 BLDG_0003000f0008f90b 1130 390532.67663224 5819384.59121228 30.25 390532.677276997 5819384.59216705 60.456743974488 390532.677277066 5819384.59216715 60.46 390532.220165221 5819389.88898818 54.0184499022097 390532.219657887 5819389.88823691 30.25 390532.67663224 5819384.59121228 30.25 390554.132908053 5819360.25519808 59.16 390554.692813186 5819353.59759921 59.16 390554.692196094 5819353.59668545 30.25 390554.132290962 5819360.25428431 30.25 390552.78639733 5819376.25775019 30.25 390552.288753692 5819382.17502715 30.25 390552.289370707 5819382.17594082 59.1564915287359 390552.289370782 5819382.17594092 59.16 390552.787014421 5819376.25866397 59.16 390554.132908053 5819360.25519808 59.16 390546.98569831 5819359.6266657 30.25 390546.986286022 5819359.62753597 57.7837736035848 390545.637615602 5819375.66401917 57.7837736035848 390545.637027891 5819375.66314889 30.25 390546.98569831 5819359.6266657 30.25 390533.023921908 5819380.57366539 59.1564915287359 390533.02396638 5819380.57373124 61.24 390540.205497524 5819381.17100728 61.24 390540.205453127 5819381.17094154 59.16 390540.205453052 5819381.17094143 59.1564915287359 390533.023921908 5819380.57366539 59.1564915287359 390551.505180165 5819391.4921814 30.25 390551.505687507 5819391.49293267 54.0184499022097 390551.951385053 5819386.19516258 60.46 390551.951384983 5819386.19516247 60.456743974488 390551.950740214 5819386.1942077 30.25 390551.505180165 5819391.4921814 30.25 390546.986286022 5819359.62753597 57.7837736035848 390546.98569831 5819359.6266657 30.25 390542.100395371 5819359.19763508 30.25 390534.921724955 5819358.56719937 30.25 390534.92231266 5819358.56806964 57.7837736035848 390542.10098308 5819359.19850535 57.7837736035848 390546.986286022 5819359.62753597 57.7837736035848 390540.205453127 5819381.17094154 59.16 390540.205497524 5819381.17100728 61.24 390540.715889715 5819375.25479043 61.24 390540.715815942 5819375.25468119 57.7837736035848 390540.205453127 5819381.17094154 59.16 390539.401189055 5819390.4855128 30.25 390532.219657887 5819389.88823691 30.25 390532.220165221 5819389.88898818 54.0184499022097 390539.401696392 5819390.48626407 54.0184499022097 390544.356318019 5819390.89833163 54.0184499022097 390551.505687507 5819391.49293267 54.0184499022097 390551.505180165 5819391.4921814 30.25 390544.355810679 5819390.89758036 30.25 390539.401189055 5819390.4855128 30.25 390532.677276997 5819384.59216705 60.456743974488 390532.67663224 5819384.59121228 30.25 390533.023304904 5819380.57275172 30.25 390533.533697112 5819374.65653477 30.25 390533.534358589 5819374.65751429 61.24 390533.02396638 5819380.57373124 61.24 390533.023921908 5819380.57366539 59.1564915287359 390532.677276997 5819384.59216705 60.456743974488 390535.495967944 5819351.91085937 30.25 390535.496585024 5819351.91177314 59.16 390534.92231266 5819358.56806964 57.7837736035848 390534.921724955 5819358.56719937 30.25 390535.495967944 5819351.91085937 30.25 390542.675255423 5819352.54220896 59.16 390535.496585024 5819351.91177314 59.16 390535.495967944 5819351.91085937 30.25 390542.674638339 5819352.54129519 30.25 390547.545603463 5819352.96906673 30.25 390554.692196094 5819353.59668545 30.25 390554.692813186 5819353.59759921 59.16 390547.54622055 5819352.96998049 59.16 390542.675255423 5819352.54220896 59.16 390545.637027891 5819375.66314889 30.25 390545.637615602 5819375.66401917 57.7837736035848 390540.715815942 5819375.25468119 57.7837736035848 390540.715889715 5819375.25479043 61.24 390533.534358589 5819374.65751429 61.24 390533.533697112 5819374.65653477 30.25 390540.715228234 5819375.25381091 30.25 390545.637027891 5819375.66314889 30.25 390551.950740214 5819386.1942077 30.25 390551.951384983 5819386.19516247 60.456743974488 390552.289370707 5819382.17594082 59.1564915287359 390552.288753692 5819382.17502715 30.25 390551.950740214 5819386.1942077 30.25 390532.219657887 5819389.88823691 30.25 390539.401189055 5819390.4855128 30.25 390544.355810679 5819390.89758036 30.25 390551.505180165 5819391.4921814 30.25 390551.950740214 5819386.1942077 30.25 390552.288753692 5819382.17502715 30.25 390552.78639733 5819376.25775019 30.25 390554.132290962 5819360.25428431 30.25 390554.692196094 5819353.59668545 30.25 390547.545603463 5819352.96906673 30.25 390542.674638339 5819352.54129519 30.25 390535.495967944 5819351.91085937 30.25 390534.921724955 5819358.56719937 30.25 390542.100395371 5819359.19763508 30.25 390546.98569831 5819359.6266657 30.25 390545.637027891 5819375.66314889 30.25 390540.715228234 5819375.25381091 30.25 390533.533697112 5819374.65653477 30.25 390533.023304904 5819380.57275172 30.25 390532.67663224 5819384.59121228 30.25 390532.219657887 5819389.88823691 30.25 390542.10098308 5819359.19850535 57.7837736035848 390534.92231266 5819358.56806964 57.7837736035848 390535.496585024 5819351.91177314 59.16 390542.675255423 5819352.54220896 59.16 390547.54622055 5819352.96998049 59.16 390554.692813186 5819353.59759921 59.16 390546.986286022 5819359.62753597 57.7837736035848 390542.10098308 5819359.19850535 57.7837736035848 390533.534358589 5819374.65751429 61.24 390540.715889715 5819375.25479043 61.24 390540.205497524 5819381.17100728 61.24 390533.02396638 5819380.57373124 61.24 390533.534358589 5819374.65751429 61.24 390552.289370782 5819382.17594092 59.16 390545.140001321 5819381.58133973 59.16 390540.205453127 5819381.17094154 59.16 390540.715815942 5819375.25468119 57.7837736035848 390545.637615602 5819375.66401917 57.7837736035848 390552.289370782 5819382.17594092 59.16 390539.858808153 5819385.18944303 60.456743974488 390532.677276997 5819384.59216705 60.456743974488 390533.023921908 5819380.57366539 59.1564915287359 390540.205453052 5819381.17094143 59.1564915287359 390545.140001246 5819381.58133962 59.1564915287359 390552.289370707 5819382.17594082 59.1564915287359 390551.951384983 5819386.19516247 60.456743974488 390544.80201551 5819385.60056134 60.456743974488 390539.858808153 5819385.18944303 60.456743974488 390546.986286022 5819359.62753597 57.7837736035848 390554.692813186 5819353.59759921 59.16 390554.132908053 5819360.25519808 59.16 390552.787014421 5819376.25866397 59.16 390552.289370782 5819382.17594092 59.16 390545.637615602 5819375.66401917 57.7837736035848 390546.986286022 5819359.62753597 57.7837736035848 390539.401696392 5819390.48626407 54.0184499022097 390532.220165221 5819389.88898818 54.0184499022097 390532.677277066 5819384.59216715 60.46 390539.858808222 5819385.18944313 60.46 390544.802015579 5819385.60056144 60.46 390551.951385053 5819386.19516258 60.46 390551.505687507 5819391.49293267 54.0184499022097 390544.356318019 5819390.89833163 54.0184499022097 390539.401696392 5819390.48626407 54.0184499022097 BLDG_0003000f0008f903 1130 390594.033679155 5819318.17316 61 390601.811422651 5819318.77084853 61 390601.371480539 5819323.97430962 63 390593.593737026 5819323.37662118 63 390594.033679155 5819318.17316 61 390600.7974115 5819330.76242232 59.45 390599.077782046 5819351.09930879 59.45 390591.297540738 5819350.53115954 59.45 390593.019667966 5819330.16473399 59.45 390600.7974115 5819330.76242232 59.45 390584.604064845 5819317.44853177 61 390594.033679155 5819318.17316 61 390593.593737026 5819323.37662118 63 390584.170605363 5819322.65249123 63 390584.604064845 5819317.44853177 61 390601.371501885 5819323.97434123 64 390600.797508624 5819330.76256613 64 390593.01976509 5819330.1648778 64 390593.593758372 5819323.37665279 64 390601.371501885 5819323.97434123 64 390581.905331899 5819349.84538569 62.4030612081449 390581.422758138 5819355.63835791 62.4030612081449 390573.712054456 5819355.07528671 62.4030612081449 390574.194628235 5819349.28231439 62.4030612081449 390581.905331899 5819349.84538569 62.4030612081449 390591.297603774 5819350.53125288 62.4030612081449 390590.807811219 5819356.32369782 62.4030612081449 390581.422758138 5819355.63835791 62.4030612081449 390581.905331899 5819349.84538569 62.4030612081449 390591.297603774 5819350.53125288 62.4030612081449 390584.170626709 5819322.65252284 64 390583.605090528 5819329.44139789 64 390575.896825841 5819328.84904872 64 390576.462362043 5819322.06017354 64 390584.170626709 5819322.65252284 64 390576.895800196 5819316.85618239 61 390584.604064845 5819317.44853177 61 390584.170605363 5819322.65249123 63 390576.462340697 5819322.06014194 63 390576.895800196 5819316.85618239 61 390593.593758372 5819323.37665279 64 390593.01976509 5819330.1648778 64 390583.605090528 5819329.44139789 64 390584.170626709 5819322.65252284 64 390593.593758372 5819323.37665279 64 390583.604985934 5819329.44124302 59.1 390581.905261393 5819349.84528129 59.1 390574.194557729 5819349.28220999 59.1 390575.896721248 5819328.84889385 59.1 390583.604985934 5819329.44124302 59.1 390599.077845017 5819351.09940202 62.4 390598.588052479 5819356.89184687 62.4 390590.807811153 5819356.32369773 62.4 390591.297603708 5819350.53125278 62.4 390599.077845017 5819351.09940202 62.4 390575.896721248 5819328.84889385 59.1 390575.896825841 5819328.84904872 64 390583.605090528 5819329.44139789 64 390583.604985934 5819329.44124302 59.1 390575.896721248 5819328.84889385 59.1 390594.033039628 5819318.17221307 31.0400009155273 390594.033679155 5819318.17316 61 390584.604064845 5819317.44853177 61 390584.603425324 5819317.44758484 31.0400009155273 390594.033039628 5819318.17221307 31.0400009155273 390599.077175602 5819351.09841082 31.0400009155273 390599.077782046 5819351.09930879 59.45 390600.7974115 5819330.76242232 59.45 390600.796805055 5819330.76152437 31.0400009155273 390599.077175602 5819351.09841082 31.0400009155273 390575.896122288 5819328.84800696 31.0400009155273 390575.896721248 5819328.84889385 59.1 390574.194557729 5819349.28220999 59.1 390574.19395877 5819349.28132309 31.0400009155273 390575.896122288 5819328.84800696 31.0400009155273 390590.807141744 5819356.32270652 31.0400009155273 390590.807811153 5819356.32369773 62.4 390598.588052479 5819356.89184687 62.4 390598.587383065 5819356.89085566 31.0400009155273 390590.807141744 5819356.32270652 31.0400009155273 390583.60438697 5819329.44035614 31.0400009155273 390583.605090528 5819329.44139789 64 390593.01976509 5819330.1648778 64 390593.019061526 5819330.16383604 31.0400009155273 390583.60438697 5819329.44035614 31.0400009155273 390600.796805055 5819330.76152437 31.0400009155273 390600.797508624 5819330.76256613 64 390601.371501885 5819323.97434123 64 390601.370798315 5819323.97329948 31.0400009155273 390600.796805055 5819330.76152437 31.0400009155273 390584.170605363 5819322.65249123 63 390584.170626709 5819322.65252284 64 390576.462362043 5819322.06017354 64 390576.462340697 5819322.06014194 63 390584.170605363 5819322.65249123 63 390601.371480539 5819323.97430962 63 390601.371501885 5819323.97434123 64 390593.593758372 5819323.37665279 64 390593.593737026 5819323.37662118 63 390601.371480539 5819323.97430962 63 390601.810783119 5819318.7699016 31.0400009155273 390601.811422651 5819318.77084853 61 390594.033679155 5819318.17316 61 390594.033039628 5819318.17221307 31.0400009155273 390601.810783119 5819318.7699016 31.0400009155273 390593.019667966 5819330.16473399 59.45 390593.01976509 5819330.1648778 64 390600.797508624 5819330.76256613 64 390600.7974115 5819330.76242232 59.45 390593.019667966 5819330.16473399 59.45 390598.587383065 5819356.89085566 31.0400009155273 390598.588052479 5819356.89184687 62.4 390599.077845017 5819351.09940202 62.4 390599.077175602 5819351.09841082 31.0400009155273 390598.587383065 5819356.89085566 31.0400009155273 390601.370798315 5819323.97329948 31.0400009155273 390601.371480539 5819323.97430962 63 390601.811422651 5819318.77084853 61 390601.810783119 5819318.7699016 31.0400009155273 390601.370798315 5819323.97329948 31.0400009155273 390581.905261393 5819349.84528129 59.1 390581.905331899 5819349.84538569 62.4030612081449 390574.194628235 5819349.28231439 62.4030612081449 390574.194557729 5819349.28220999 59.1 390581.905261393 5819349.84528129 59.1 390593.593737026 5819323.37662118 63 390593.593758372 5819323.37665279 64 390584.170626709 5819322.65252284 64 390584.170605363 5819322.65249123 63 390593.593737026 5819323.37662118 63 390573.711384992 5819355.07429541 31.0400009155273 390573.712054456 5819355.07528671 62.4030612081449 390581.422758138 5819355.63835791 62.4030612081449 390581.422088669 5819355.63736661 31.0400009155273 390573.711384992 5819355.07429541 31.0400009155273 390576.89516068 5819316.85523546 31.0400009155273 390576.895800196 5819316.85618239 61 390576.462340697 5819322.06014194 63 390576.46165849 5819322.05913179 31.0400009155273 390576.89516068 5819316.85523546 31.0400009155273 390591.296934298 5819350.53026158 31.0400009155273 390591.297603774 5819350.53125288 62.4030612081449 390581.905331899 5819349.84538569 62.4030612081449 390581.90466243 5819349.84439439 31.0400009155273 390591.296934298 5819350.53026158 31.0400009155273 390593.019061526 5819330.16383604 31.0400009155273 390593.019667966 5819330.16473399 59.45 390591.297540738 5819350.53115954 59.45 390591.296934298 5819350.53026158 31.0400009155273 390593.019061526 5819330.16383604 31.0400009155273 390574.19395877 5819349.28132309 31.0400009155273 390574.194628235 5819349.28231439 62.4030612081449 390573.712054456 5819355.07528671 62.4030612081449 390573.711384992 5819355.07429541 31.0400009155273 390574.19395877 5819349.28132309 31.0400009155273 390584.603425324 5819317.44758484 31.0400009155273 390584.604064845 5819317.44853177 61 390576.895800196 5819316.85618239 61 390576.89516068 5819316.85523546 31.0400009155273 390584.603425324 5819317.44758484 31.0400009155273 390599.077782046 5819351.09930879 59.45 390599.077845017 5819351.09940202 62.4 390591.297603708 5819350.53125278 62.4 390591.297540738 5819350.53115954 59.45 390599.077782046 5819351.09930879 59.45 390581.422088669 5819355.63736661 31.0400009155273 390581.422758138 5819355.63835791 62.4030612081449 390590.807811219 5819356.32369782 62.4030612081449 390590.807141744 5819356.32270652 31.0400009155273 390581.422088669 5819355.63736661 31.0400009155273 390576.46165849 5819322.05913179 31.0400009155273 390576.462362043 5819322.06017354 64 390575.896825841 5819328.84904872 64 390575.896122288 5819328.84800696 31.0400009155273 390576.46165849 5819322.05913179 31.0400009155273 390581.90466243 5819349.84439439 31.0400009155273 390581.905261393 5819349.84528129 59.1 390583.604985934 5819329.44124302 59.1 390583.60438697 5819329.44035614 31.0400009155273 390581.90466243 5819349.84439439 31.0400009155273 390593.019061526 5819330.16383604 31.0400009155273 390600.796805055 5819330.76152437 31.0400009155273 390601.370798315 5819323.97329948 31.0400009155273 390593.593054808 5819323.37561103 31.0400009155273 390593.019061526 5819330.16383604 31.0400009155273 390591.296934298 5819350.53026158 31.0400009155273 390599.077175602 5819351.09841082 31.0400009155273 390600.796805055 5819330.76152437 31.0400009155273 390593.019061526 5819330.16383604 31.0400009155273 390591.296934298 5819350.53026158 31.0400009155273 390581.422088669 5819355.63736661 31.0400009155273 390590.807141744 5819356.32270652 31.0400009155273 390591.296934298 5819350.53026158 31.0400009155273 390581.90466243 5819349.84439439 31.0400009155273 390581.422088669 5819355.63736661 31.0400009155273 390573.711384992 5819355.07429541 31.0400009155273 390581.422088669 5819355.63736661 31.0400009155273 390581.90466243 5819349.84439439 31.0400009155273 390574.19395877 5819349.28132309 31.0400009155273 390573.711384992 5819355.07429541 31.0400009155273 390574.19395877 5819349.28132309 31.0400009155273 390581.90466243 5819349.84439439 31.0400009155273 390583.60438697 5819329.44035614 31.0400009155273 390575.896122288 5819328.84800696 31.0400009155273 390574.19395877 5819349.28132309 31.0400009155273 390590.807141744 5819356.32270652 31.0400009155273 390598.587383065 5819356.89085566 31.0400009155273 390599.077175602 5819351.09841082 31.0400009155273 390591.296934298 5819350.53026158 31.0400009155273 390590.807141744 5819356.32270652 31.0400009155273 390601.370798315 5819323.97329948 31.0400009155273 390601.810783119 5819318.7699016 31.0400009155273 390594.033039628 5819318.17221307 31.0400009155273 390593.593054808 5819323.37561103 31.0400009155273 390601.370798315 5819323.97329948 31.0400009155273 390575.896122288 5819328.84800696 31.0400009155273 390583.60438697 5819329.44035614 31.0400009155273 390584.169923151 5819322.65148109 31.0400009155273 390576.46165849 5819322.05913179 31.0400009155273 390575.896122288 5819328.84800696 31.0400009155273 390593.593054808 5819323.37561103 31.0400009155273 390594.033039628 5819318.17221307 31.0400009155273 390584.603425324 5819317.44758484 31.0400009155273 390584.169923151 5819322.65148109 31.0400009155273 390593.593054808 5819323.37561103 31.0400009155273 390584.169923151 5819322.65148109 31.0400009155273 390584.603425324 5819317.44758484 31.0400009155273 390576.89516068 5819316.85523546 31.0400009155273 390576.46165849 5819322.05913179 31.0400009155273 390584.169923151 5819322.65148109 31.0400009155273 390583.60438697 5819329.44035614 31.0400009155273 390593.019061526 5819330.16383604 31.0400009155273 390593.593054808 5819323.37561103 31.0400009155273 390584.169923151 5819322.65148109 31.0400009155273 390583.60438697 5819329.44035614 31.0400009155273 BLDG_0003000f001c079c 1000 390649.414317022 5819387.52914499 34.0099983215332 390650.393219337 5819376.28282313 34.0099983215332 390636.714163274 5819375.10967041 34.0099983215332 390635.976450678 5819384.61389234 34.0099983215332 390636.098349391 5819386.64933353 34.0099983215332 390649.414317022 5819387.52914499 34.0099983215332 390633.981537223 5819335.31375101 31.2299995422363 390639.905181829 5819335.79702923 31.2299995422363 390639.841743393 5819333.79205171 31.2299995422363 390680.827606032 5819337.57866339 31.2299995422363 390676.880729307 5819389.34381937 31.2299995422363 390636.098290047 5819386.64924566 31.2299995422363 390635.976391333 5819384.61380447 31.2299995422363 390631.486792134 5819384.25002673 31.2299995422363 390628.876776578 5819384.03877116 31.2299995422363 390622.501503841 5819383.52319602 31.2299995422363 390594.029748192 5819381.21987915 31.2299995422363 390591.562149701 5819381.01995226 31.2299995422363 390590.222300364 5819380.91147752 31.2299995422363 390589.962603952 5819383.39729368 31.2299995422363 390589.799533184 5819384.96307389 31.2299995422363 390589.509831428 5819387.7323357 31.2299995422363 390589.018555389 5819392.44954796 31.2299995422363 390588.865788786 5819393.91534632 31.2299995422363 390588.795687598 5819394.59350447 31.2299995422363 390608.235933102 5819396.21053904 31.2299995422363 390608.316801888 5819394.10925753 31.2299995422363 390608.527064019 5819394.12600811 31.2299995422363 390608.899581987 5819394.77987879 31.2299995422363 390612.203468078 5819395.05300099 31.2299995422363 390612.282602281 5819394.4326503 31.2299995422363 390613.578450445 5819394.53799434 31.2299995422363 390613.42563299 5819396.64278029 31.2299995422363 390635.811587294 5819398.50465712 31.2299995422363 390635.992434014 5819396.36546687 31.2299995422363 390636.324962892 5819396.39301354 31.2299995422363 390636.492039078 5819397.05903053 31.2299995422363 390640.036158316 5819397.35230082 31.2299995422363 390640.215578975 5819396.71020709 31.2299995422363 390641.272425733 5819396.7959905 31.2299995422363 390641.132093799 5819398.94753196 31.2299995422363 390663.810234618 5819400.83375595 31.2299995422363 390663.899364266 5819398.97430274 31.2299995422363 390664.436636162 5819399.04921948 31.2299995422363 390664.827394798 5819400.05244542 31.2299995422363 390668.022367119 5819400.31085673 31.2299995422363 390668.548488044 5819399.47877195 31.2299995422363 390669.590181089 5819399.57003119 31.2299995422363 390669.470003816 5819401.30526921 31.2299995422363 390676.580917116 5819401.89686988 31.2299995422363 390681.191724568 5819402.28000892 31.2299995422363 390690.28805188 5819403.03707223 31.2299995422363 390696.178255488 5819326.59126046 31.2299995422363 390676.373813225 5819324.95002664 31.2299995422363 390676.322479185 5819327.03182652 31.2299995422363 390675.498927071 5819326.98646145 31.2299995422363 390675.352804087 5819326.04235869 31.2299995422363 390671.95368751 5819325.76799579 31.2299995422363 390671.820951595 5819326.68261597 31.2299995422363 390670.651332987 5819326.57181981 31.2299995422363 390670.808228917 5819324.48892678 31.2299995422363 390647.972496744 5819322.59562746 31.2299995422363 390647.849004584 5819324.63790945 31.2299995422363 390647.574560843 5819324.61597125 31.2299995422363 390647.176355427 5819323.76668226 31.2299995422363 390643.630534773 5819323.4801572 31.2299995422363 390643.642808782 5819324.2858277 31.2299995422363 390642.229633861 5819324.17264512 31.2299995422363 390642.356181481 5819322.13060996 31.2299995422363 390626.758462897 5819320.8371748 31.2299995422363 390626.665494298 5819322.10989622 31.2299995422363 390626.049166308 5819330.58406238 31.2299995422363 390625.934925063 5819332.15013348 31.2299995422363 390625.753487269 5819334.64331002 31.2299995422363 390626.974771703 5819334.74305418 31.2299995422363 390633.397788033 5819335.26596215 31.2299995422363 390633.981537223 5819335.31375101 31.2299995422363 390653.120385516 5819346.53808773 33.9900016784668 390654.159948216 5819335.11496726 33.9900016784668 390639.841802311 5819333.79213894 33.9900016784668 390639.905240747 5819335.79711647 33.9900016784668 390639.091473897 5819345.37785284 33.9900016784668 390653.120385516 5819346.53808773 33.9900016784668 390680.827664099 5819337.57874936 33.9500007629395 390654.159947362 5819335.114966 33.9500007629395 390653.120384662 5819346.53808647 33.9500007629395 390660.004053211 5819347.10738739 33.9500007629395 390657.83141111 5819376.9207407 33.9500007629395 390650.393218057 5819376.28282123 33.9500007629395 390649.41431574 5819387.52914309 33.9500007629395 390676.880787372 5819389.34390535 33.9500007629395 390680.827664099 5819337.57874936 33.9500007629395 390660.004054705 5819347.1073896 34.0200004577637 390639.091474538 5819345.37785378 34.0200004577637 390633.318044711 5819344.86669629 34.0200004577637 390632.811258477 5819344.82232502 34.0200004577637 390630.129609762 5819374.53277287 34.0200004577637 390632.321207783 5819374.72513404 34.0200004577637 390636.714163487 5819375.10967073 34.0200004577637 390657.831412604 5819376.92074291 34.0200004577637 390660.004054705 5819347.1073896 34.0200004577637 390639.091795562 5819345.3783291 49.0583964349642 390660.004375735 5819347.10786492 49.0583964349642 390657.831733634 5819376.92121824 49.0583964349642 390636.71448451 5819375.11014606 49.0583964349642 390632.321528805 5819374.72560937 49.0583964349642 390630.129930783 5819374.5332482 49.0583964349642 390632.811579499 5819344.82280034 49.0583964349642 390633.318365733 5819344.86717161 49.0583964349642 390639.091795562 5819345.3783291 49.0583964349642 390654.160141595 5819335.11525358 43.0487570187599 390653.120578895 5819346.53837405 43.0487570187599 390639.091667274 5819345.37813916 43.0487570187599 390639.905434125 5819335.79740279 43.0487570187599 390639.841995688 5819333.79242526 43.0487570187599 390654.160141595 5819335.11525358 43.0487570187599 390650.393412151 5819376.28310861 43.0422709817851 390649.414509835 5819387.52943048 43.0422709817851 390636.098542203 5819386.64961903 43.0422709817851 390635.976643489 5819384.61417783 43.0422709817851 390636.714356085 5819375.1099559 43.0422709817851 390650.393412151 5819376.28310861 43.0422709817851 390639.905819045 5819335.79797272 61.0804342524917 390633.982174436 5819335.31469449 61.0804342524917 390633.398425245 5819335.26690563 61.0804342524917 390626.975408911 5819334.74399766 61.0804342524917 390625.754124476 5819334.64425349 61.0804342524917 390625.93556227 5819332.15107696 61.0804342524917 390626.049803516 5819330.58500586 61.0804342524917 390626.666131505 5819322.1108397 61.0804342524917 390626.759100105 5819320.83811827 61.0804342524917 390642.356818697 5819322.13155343 61.0804342524917 390642.230271078 5819324.17358859 61.0804342524917 390643.643446 5819324.28677117 61.0804342524917 390643.631171992 5819323.48110067 61.0804342524917 390647.176992648 5819323.76762573 61.0804342524917 390647.575198063 5819324.61691472 61.0804342524917 390647.849641804 5819324.63885292 61.0804342524917 390647.973133965 5819322.59657093 61.0804342524917 390670.808866151 5819324.48987025 61.0804342524917 390670.651970222 5819326.57276328 61.0804342524917 390671.82158883 5819326.68355944 61.0804342524917 390671.954324744 5819325.76893926 61.0804342524917 390675.353441324 5819326.04330217 61.0804342524917 390675.499564308 5819326.98740493 61.0804342524917 390676.323116423 5819327.03277 61.0804342524917 390676.374450463 5819324.95097011 61.0804342524917 390696.178892737 5819326.59220393 61.0804342524917 390690.288689126 5819403.03801574 61.0804342524917 390681.192361809 5819402.28095244 61.0804342524917 390676.581554354 5819401.89781339 61.0804342524917 390669.47064105 5819401.30621273 61.0804342524917 390669.590818323 5819399.5709747 61.0804342524917 390668.549125277 5819399.47971547 61.0804342524917 390668.023004351 5819400.31180024 61.0804342524917 390664.828032029 5819400.05338894 61.0804342524917 390664.437273392 5819399.050163 61.0804342524917 390663.900001497 5819398.97524625 61.0804342524917 390663.810871849 5819400.83469947 61.0804342524917 390641.132731016 5819398.94847548 61.0804342524917 390641.27306295 5819396.79693402 61.0804342524917 390640.216216191 5819396.7111506 61.0804342524917 390640.036795531 5819397.35324433 61.0804342524917 390636.492676291 5819397.05997404 61.0804342524917 390636.325600106 5819396.39395706 61.0804342524917 390635.993071227 5819396.36641038 61.0804342524917 390635.812224507 5819398.50560064 61.0804342524917 390613.42627019 5819396.6437238 61.0804342524917 390613.579087646 5819394.53893785 61.0804342524917 390612.283239481 5819394.43359381 61.0804342524917 390612.204105278 5819395.0539445 61.0804342524917 390608.900219184 5819394.7808223 61.0804342524917 390608.527701216 5819394.12695163 61.0804342524917 390608.317439085 5819394.11020104 61.0804342524917 390608.236570299 5819396.21148255 61.0804342524917 390588.796324783 5819394.59444798 61.0804342524917 390588.866425972 5819393.91628984 61.0804342524917 390589.019192574 5819392.45049147 61.0804342524917 390589.510468613 5819387.73327921 61.0804342524917 390589.80017037 5819384.96401739 61.0804342524917 390589.963241138 5819383.39823718 61.0804342524917 390590.22293755 5819380.91242102 61.0804342524917 390591.562786888 5819381.02089577 61.0804342524917 390594.03038538 5819381.22082266 61.0804342524917 390622.502141046 5819383.52413953 61.0804342524917 390628.877413787 5819384.03971467 61.0804342524917 390631.487429345 5819384.25097024 61.0804342524917 390635.977028547 5819384.61474798 61.0804342524917 390636.09892726 5819386.65018917 61.0804342524917 390676.881366545 5819389.34476288 61.0804342524917 390680.828243273 5819337.57960687 61.0804342524917 390639.842380609 5819333.79299518 61.0804342524917 390639.905819045 5819335.79797272 61.0804342524917 390654.160217126 5819335.11536541 46.5869539610315 390680.82793387 5819337.57914878 46.5869539610315 390676.881057143 5819389.34430478 46.5869539610315 390649.414585504 5819387.52954252 46.5869539610315 390650.39348782 5819376.28322065 46.5869539610315 390657.831680876 5819376.92114013 46.5869539610315 390660.004322976 5819347.10778681 46.5869539610315 390653.120654426 5819346.53848588 46.5869539610315 390654.160217126 5819335.11536541 46.5869539610315 390675.498927071 5819326.98646145 31.2299995422363 390675.499564308 5819326.98740493 61.0804342524917 390675.353441324 5819326.04330217 61.0804342524917 390675.352804087 5819326.04235869 31.2299995422363 390675.498927071 5819326.98646145 31.2299995422363 390654.159947362 5819335.114966 33.9500007629395 390654.160217126 5819335.11536541 46.5869539610315 390653.120654426 5819346.53848588 46.5869539610315 390653.120384662 5819346.53808647 33.9500007629395 390654.159947362 5819335.114966 33.9500007629395 390671.820951595 5819326.68261597 31.2299995422363 390671.82158883 5819326.68355944 61.0804342524917 390670.651970222 5819326.57276328 61.0804342524917 390670.651332987 5819326.57181981 31.2299995422363 390671.820951595 5819326.68261597 31.2299995422363 390675.352804087 5819326.04235869 31.2299995422363 390675.353441324 5819326.04330217 61.0804342524917 390671.954324744 5819325.76893926 61.0804342524917 390671.95368751 5819325.76799579 31.2299995422363 390675.352804087 5819326.04235869 31.2299995422363 390631.486792134 5819384.25002673 31.2299995422363 390631.487429345 5819384.25097024 61.0804342524917 390628.877413787 5819384.03971467 61.0804342524917 390628.876776578 5819384.03877116 31.2299995422363 390631.486792134 5819384.25002673 31.2299995422363 390633.981537223 5819335.31375101 31.2299995422363 390633.982174436 5819335.31469449 61.0804342524917 390639.905819045 5819335.79797272 61.0804342524917 390639.905181829 5819335.79702923 31.2299995422363 390633.981537223 5819335.31375101 31.2299995422363 390669.470003816 5819401.30526921 31.2299995422363 390669.47064105 5819401.30621273 61.0804342524917 390676.581554354 5819401.89781339 61.0804342524917 390676.580917116 5819401.89686988 31.2299995422363 390669.470003816 5819401.30526921 31.2299995422363 390668.548488044 5819399.47877195 31.2299995422363 390668.549125277 5819399.47971547 61.0804342524917 390669.590818323 5819399.5709747 61.0804342524917 390669.590181089 5819399.57003119 31.2299995422363 390668.548488044 5819399.47877195 31.2299995422363 390680.827606032 5819337.57866339 31.2299995422363 390680.828243273 5819337.57960687 61.0804342524917 390676.881366545 5819389.34476288 61.0804342524917 390676.880729307 5819389.34381937 31.2299995422363 390680.827606032 5819337.57866339 31.2299995422363 390635.976391333 5819384.61380447 31.2299995422363 390635.977028547 5819384.61474798 61.0804342524917 390631.487429345 5819384.25097024 61.0804342524917 390631.486792134 5819384.25002673 31.2299995422363 390635.976391333 5819384.61380447 31.2299995422363 390639.091474538 5819345.37785378 34.0200004577637 390639.091795562 5819345.3783291 49.0583964349642 390633.318365733 5819344.86717161 49.0583964349642 390633.318044711 5819344.86669629 34.0200004577637 390639.091474538 5819345.37785378 34.0200004577637 390639.091473897 5819345.37785284 33.9900016784668 390639.091667274 5819345.37813916 43.0487570187599 390653.120578895 5819346.53837405 43.0487570187599 390653.120385516 5819346.53808773 33.9900016784668 390639.091473897 5819345.37785284 33.9900016784668 390612.282602281 5819394.4326503 31.2299995422363 390612.283239481 5819394.43359381 61.0804342524917 390613.579087646 5819394.53893785 61.0804342524917 390613.578450445 5819394.53799434 31.2299995422363 390612.282602281 5819394.4326503 31.2299995422363 390636.714163274 5819375.10967041 34.0099983215332 390636.714356085 5819375.1099559 43.0422709817851 390635.976643489 5819384.61417783 43.0422709817851 390635.976450678 5819384.61389234 34.0099983215332 390636.714163274 5819375.10967041 34.0099983215332 390650.393218057 5819376.28282123 33.9500007629395 390650.39348782 5819376.28322065 46.5869539610315 390649.414585504 5819387.52954252 46.5869539610315 390649.41431574 5819387.52914309 33.9500007629395 390650.393218057 5819376.28282123 33.9500007629395 390588.795687598 5819394.59350447 31.2299995422363 390588.796324783 5819394.59444798 61.0804342524917 390608.236570299 5819396.21148255 61.0804342524917 390608.235933102 5819396.21053904 31.2299995422363 390588.795687598 5819394.59350447 31.2299995422363 390680.827664099 5819337.57874936 33.9500007629395 390680.82793387 5819337.57914878 46.5869539610315 390654.160217126 5819335.11536541 46.5869539610315 390654.159947362 5819335.114966 33.9500007629395 390680.827664099 5819337.57874936 33.9500007629395 390650.393219337 5819376.28282313 34.0099983215332 390650.393412151 5819376.28310861 43.0422709817851 390636.714356085 5819375.1099559 43.0422709817851 390636.714163274 5819375.10967041 34.0099983215332 390650.393219337 5819376.28282313 34.0099983215332 390588.865788786 5819393.91534632 31.2299995422363 390588.866425972 5819393.91628984 61.0804342524917 390588.796324783 5819394.59444798 61.0804342524917 390588.795687598 5819394.59350447 31.2299995422363 390588.865788786 5819393.91534632 31.2299995422363 390639.841743393 5819333.79205171 31.2299995422363 390639.842380609 5819333.79299518 61.0804342524917 390680.828243273 5819337.57960687 61.0804342524917 390680.827606032 5819337.57866339 31.2299995422363 390639.841743393 5819333.79205171 31.2299995422363 390633.318044711 5819344.86669629 34.0200004577637 390633.318365733 5819344.86717161 49.0583964349642 390632.811579499 5819344.82280034 49.0583964349642 390632.811258477 5819344.82232502 34.0200004577637 390633.318044711 5819344.86669629 34.0200004577637 390632.811258477 5819344.82232502 34.0200004577637 390632.811579499 5819344.82280034 49.0583964349642 390630.129930783 5819374.5332482 49.0583964349642 390630.129609762 5819374.53277287 34.0200004577637 390632.811258477 5819344.82232502 34.0200004577637 390639.905181829 5819335.79702923 31.2299995422363 390639.905819045 5819335.79797272 61.0804342524917 390639.842380609 5819333.79299518 61.0804342524917 390639.841743393 5819333.79205171 31.2299995422363 390639.905181829 5819335.79702923 31.2299995422363 390676.373813225 5819324.95002664 31.2299995422363 390676.374450463 5819324.95097011 61.0804342524917 390676.323116423 5819327.03277 61.0804342524917 390676.322479185 5819327.03182652 31.2299995422363 390676.373813225 5819324.95002664 31.2299995422363 390676.322479185 5819327.03182652 31.2299995422363 390676.323116423 5819327.03277 61.0804342524917 390675.499564308 5819326.98740493 61.0804342524917 390675.498927071 5819326.98646145 31.2299995422363 390676.322479185 5819327.03182652 31.2299995422363 390690.28805188 5819403.03707223 31.2299995422363 390690.288689126 5819403.03801574 61.0804342524917 390696.178892737 5819326.59220393 61.0804342524917 390696.178255488 5819326.59126046 31.2299995422363 390690.28805188 5819403.03707223 31.2299995422363 390639.905240747 5819335.79711647 33.9900016784668 390639.905434125 5819335.79740279 43.0487570187599 390639.091667274 5819345.37813916 43.0487570187599 390639.091473897 5819345.37785284 33.9900016784668 390639.905240747 5819335.79711647 33.9900016784668 390636.714163487 5819375.10967073 34.0200004577637 390636.71448451 5819375.11014606 49.0583964349642 390657.831733634 5819376.92121824 49.0583964349642 390657.831412604 5819376.92074291 34.0200004577637 390636.714163487 5819375.10967073 34.0200004577637 390641.132093799 5819398.94753196 31.2299995422363 390641.132731016 5819398.94847548 61.0804342524917 390663.810871849 5819400.83469947 61.0804342524917 390663.810234618 5819400.83375595 31.2299995422363 390641.132093799 5819398.94753196 31.2299995422363 390630.129609762 5819374.53277287 34.0200004577637 390630.129930783 5819374.5332482 49.0583964349642 390632.321528805 5819374.72560937 49.0583964349642 390632.321207783 5819374.72513404 34.0200004577637 390630.129609762 5819374.53277287 34.0200004577637 390657.83141111 5819376.9207407 33.9500007629395 390657.831680876 5819376.92114013 46.5869539610315 390650.39348782 5819376.28322065 46.5869539610315 390650.393218057 5819376.28282123 33.9500007629395 390657.83141111 5819376.9207407 33.9500007629395 390676.880729307 5819389.34381937 31.2299995422363 390676.881366545 5819389.34476288 61.0804342524917 390636.09892726 5819386.65018917 61.0804342524917 390636.098290047 5819386.64924566 31.2299995422363 390676.880729307 5819389.34381937 31.2299995422363 390643.630534773 5819323.4801572 31.2299995422363 390643.631171992 5819323.48110067 61.0804342524917 390643.643446 5819324.28677117 61.0804342524917 390643.642808782 5819324.2858277 31.2299995422363 390643.630534773 5819323.4801572 31.2299995422363 390608.899581987 5819394.77987879 31.2299995422363 390608.900219184 5819394.7808223 61.0804342524917 390612.204105278 5819395.0539445 61.0804342524917 390612.203468078 5819395.05300099 31.2299995422363 390608.899581987 5819394.77987879 31.2299995422363 390647.972496744 5819322.59562746 31.2299995422363 390647.973133965 5819322.59657093 61.0804342524917 390647.849641804 5819324.63885292 61.0804342524917 390647.849004584 5819324.63790945 31.2299995422363 390647.972496744 5819322.59562746 31.2299995422363 390681.191724568 5819402.28000892 31.2299995422363 390681.192361809 5819402.28095244 61.0804342524917 390690.288689126 5819403.03801574 61.0804342524917 390690.28805188 5819403.03707223 31.2299995422363 390681.191724568 5819402.28000892 31.2299995422363 390660.004053211 5819347.10738739 33.9500007629395 390660.004322976 5819347.10778681 46.5869539610315 390657.831680876 5819376.92114013 46.5869539610315 390657.83141111 5819376.9207407 33.9500007629395 390660.004053211 5819347.10738739 33.9500007629395 390671.95368751 5819325.76799579 31.2299995422363 390671.954324744 5819325.76893926 61.0804342524917 390671.82158883 5819326.68355944 61.0804342524917 390671.820951595 5819326.68261597 31.2299995422363 390671.95368751 5819325.76799579 31.2299995422363 390608.235933102 5819396.21053904 31.2299995422363 390608.236570299 5819396.21148255 61.0804342524917 390608.317439085 5819394.11020104 61.0804342524917 390608.316801888 5819394.10925753 31.2299995422363 390608.235933102 5819396.21053904 31.2299995422363 390670.808228917 5819324.48892678 31.2299995422363 390670.808866151 5819324.48987025 61.0804342524917 390647.973133965 5819322.59657093 61.0804342524917 390647.972496744 5819322.59562746 31.2299995422363 390670.808228917 5819324.48892678 31.2299995422363 390635.992434014 5819396.36546687 31.2299995422363 390635.993071227 5819396.36641038 61.0804342524917 390636.325600106 5819396.39395706 61.0804342524917 390636.324962892 5819396.39301354 31.2299995422363 390635.992434014 5819396.36546687 31.2299995422363 390696.178255488 5819326.59126046 31.2299995422363 390696.178892737 5819326.59220393 61.0804342524917 390676.374450463 5819324.95097011 61.0804342524917 390676.373813225 5819324.95002664 31.2299995422363 390696.178255488 5819326.59126046 31.2299995422363 390608.527064019 5819394.12600811 31.2299995422363 390608.527701216 5819394.12695163 61.0804342524917 390608.900219184 5819394.7808223 61.0804342524917 390608.899581987 5819394.77987879 31.2299995422363 390608.527064019 5819394.12600811 31.2299995422363 390640.036158316 5819397.35230082 31.2299995422363 390640.036795531 5819397.35324433 61.0804342524917 390640.216216191 5819396.7111506 61.0804342524917 390640.215578975 5819396.71020709 31.2299995422363 390640.036158316 5819397.35230082 31.2299995422363 390647.574560843 5819324.61597125 31.2299995422363 390647.575198063 5819324.61691472 61.0804342524917 390647.176992648 5819323.76762573 61.0804342524917 390647.176355427 5819323.76668226 31.2299995422363 390647.574560843 5819324.61597125 31.2299995422363 390670.651332987 5819326.57181981 31.2299995422363 390670.651970222 5819326.57276328 61.0804342524917 390670.808866151 5819324.48987025 61.0804342524917 390670.808228917 5819324.48892678 31.2299995422363 390670.651332987 5819326.57181981 31.2299995422363 390608.316801888 5819394.10925753 31.2299995422363 390608.317439085 5819394.11020104 61.0804342524917 390608.527701216 5819394.12695163 61.0804342524917 390608.527064019 5819394.12600811 31.2299995422363 390608.316801888 5819394.10925753 31.2299995422363 390647.849004584 5819324.63790945 31.2299995422363 390647.849641804 5819324.63885292 61.0804342524917 390647.575198063 5819324.61691472 61.0804342524917 390647.574560843 5819324.61597125 31.2299995422363 390647.849004584 5819324.63790945 31.2299995422363 390635.976450678 5819384.61389234 34.0099983215332 390635.976643489 5819384.61417783 43.0422709817851 390636.098542203 5819386.64961903 43.0422709817851 390636.098349391 5819386.64933353 34.0099983215332 390635.976450678 5819384.61389234 34.0099983215332 390594.029748192 5819381.21987915 31.2299995422363 390594.03038538 5819381.22082266 61.0804342524917 390591.562786888 5819381.02089577 61.0804342524917 390591.562149701 5819381.01995226 31.2299995422363 390594.029748192 5819381.21987915 31.2299995422363 390664.827394798 5819400.05244542 31.2299995422363 390664.828032029 5819400.05338894 61.0804342524917 390668.023004351 5819400.31180024 61.0804342524917 390668.022367119 5819400.31085673 31.2299995422363 390664.827394798 5819400.05244542 31.2299995422363 390636.098349391 5819386.64933353 34.0099983215332 390636.098542203 5819386.64961903 43.0422709817851 390649.414509835 5819387.52943048 43.0422709817851 390649.414317022 5819387.52914499 34.0099983215332 390636.098349391 5819386.64933353 34.0099983215332 390649.414317022 5819387.52914499 34.0099983215332 390649.414509835 5819387.52943048 43.0422709817851 390650.393412151 5819376.28310861 43.0422709817851 390650.393219337 5819376.28282313 34.0099983215332 390649.414317022 5819387.52914499 34.0099983215332 390653.120385516 5819346.53808773 33.9900016784668 390653.120578895 5819346.53837405 43.0487570187599 390654.160141595 5819335.11525358 43.0487570187599 390654.159948216 5819335.11496726 33.9900016784668 390653.120385516 5819346.53808773 33.9900016784668 390663.810234618 5819400.83375595 31.2299995422363 390663.810871849 5819400.83469947 61.0804342524917 390663.900001497 5819398.97524625 61.0804342524917 390663.899364266 5819398.97430274 31.2299995422363 390663.810234618 5819400.83375595 31.2299995422363 390647.176355427 5819323.76668226 31.2299995422363 390647.176992648 5819323.76762573 61.0804342524917 390643.631171992 5819323.48110067 61.0804342524917 390643.630534773 5819323.4801572 31.2299995422363 390647.176355427 5819323.76668226 31.2299995422363 390653.120384662 5819346.53808647 33.9500007629395 390653.120654426 5819346.53848588 46.5869539610315 390660.004322976 5819347.10778681 46.5869539610315 390660.004053211 5819347.10738739 33.9500007629395 390653.120384662 5819346.53808647 33.9500007629395 390622.501503841 5819383.52319602 31.2299995422363 390622.502141046 5819383.52413953 61.0804342524917 390594.03038538 5819381.22082266 61.0804342524917 390594.029748192 5819381.21987915 31.2299995422363 390622.501503841 5819383.52319602 31.2299995422363 390641.272425733 5819396.7959905 31.2299995422363 390641.27306295 5819396.79693402 61.0804342524917 390641.132731016 5819398.94847548 61.0804342524917 390641.132093799 5819398.94753196 31.2299995422363 390641.272425733 5819396.7959905 31.2299995422363 390612.203468078 5819395.05300099 31.2299995422363 390612.204105278 5819395.0539445 61.0804342524917 390612.283239481 5819394.43359381 61.0804342524917 390612.282602281 5819394.4326503 31.2299995422363 390612.203468078 5819395.05300099 31.2299995422363 390628.876776578 5819384.03877116 31.2299995422363 390628.877413787 5819384.03971467 61.0804342524917 390622.502141046 5819383.52413953 61.0804342524917 390622.501503841 5819383.52319602 31.2299995422363 390628.876776578 5819384.03877116 31.2299995422363 390636.324962892 5819396.39301354 31.2299995422363 390636.325600106 5819396.39395706 61.0804342524917 390636.492676291 5819397.05997404 61.0804342524917 390636.492039078 5819397.05903053 31.2299995422363 390636.324962892 5819396.39301354 31.2299995422363 390635.811587294 5819398.50465712 31.2299995422363 390635.812224507 5819398.50560064 61.0804342524917 390635.993071227 5819396.36641038 61.0804342524917 390635.992434014 5819396.36546687 31.2299995422363 390635.811587294 5819398.50465712 31.2299995422363 390591.562149701 5819381.01995226 31.2299995422363 390591.562786888 5819381.02089577 61.0804342524917 390590.22293755 5819380.91242102 61.0804342524917 390590.222300364 5819380.91147752 31.2299995422363 390591.562149701 5819381.01995226 31.2299995422363 390613.578450445 5819394.53799434 31.2299995422363 390613.579087646 5819394.53893785 61.0804342524917 390613.42627019 5819396.6437238 61.0804342524917 390613.42563299 5819396.64278029 31.2299995422363 390613.578450445 5819394.53799434 31.2299995422363 390589.509831428 5819387.7323357 31.2299995422363 390589.510468613 5819387.73327921 61.0804342524917 390589.019192574 5819392.45049147 61.0804342524917 390589.018555389 5819392.44954796 31.2299995422363 390589.509831428 5819387.7323357 31.2299995422363 390633.397788033 5819335.26596215 31.2299995422363 390633.398425245 5819335.26690563 61.0804342524917 390633.982174436 5819335.31469449 61.0804342524917 390633.981537223 5819335.31375101 31.2299995422363 390633.397788033 5819335.26596215 31.2299995422363 390636.098290047 5819386.64924566 31.2299995422363 390636.09892726 5819386.65018917 61.0804342524917 390635.977028547 5819384.61474798 61.0804342524917 390635.976391333 5819384.61380447 31.2299995422363 390636.098290047 5819386.64924566 31.2299995422363 390632.321207783 5819374.72513404 34.0200004577637 390632.321528805 5819374.72560937 49.0583964349642 390636.71448451 5819375.11014606 49.0583964349642 390636.714163487 5819375.10967073 34.0200004577637 390632.321207783 5819374.72513404 34.0200004577637 390639.841802311 5819333.79213894 33.9900016784668 390639.841995688 5819333.79242526 43.0487570187599 390639.905434125 5819335.79740279 43.0487570187599 390639.905240747 5819335.79711647 33.9900016784668 390639.841802311 5819333.79213894 33.9900016784668 390654.159948216 5819335.11496726 33.9900016784668 390654.160141595 5819335.11525358 43.0487570187599 390639.841995688 5819333.79242526 43.0487570187599 390639.841802311 5819333.79213894 33.9900016784668 390654.159948216 5819335.11496726 33.9900016784668 390660.004054705 5819347.1073896 34.0200004577637 390660.004375735 5819347.10786492 49.0583964349642 390639.091795562 5819345.3783291 49.0583964349642 390639.091474538 5819345.37785378 34.0200004577637 390660.004054705 5819347.1073896 34.0200004577637 390642.229633861 5819324.17264512 31.2299995422363 390642.230271078 5819324.17358859 61.0804342524917 390642.356818697 5819322.13155343 61.0804342524917 390642.356181481 5819322.13060996 31.2299995422363 390642.229633861 5819324.17264512 31.2299995422363 390589.799533184 5819384.96307389 31.2299995422363 390589.80017037 5819384.96401739 61.0804342524917 390589.510468613 5819387.73327921 61.0804342524917 390589.509831428 5819387.7323357 31.2299995422363 390589.799533184 5819384.96307389 31.2299995422363 390643.642808782 5819324.2858277 31.2299995422363 390643.643446 5819324.28677117 61.0804342524917 390642.230271078 5819324.17358859 61.0804342524917 390642.229633861 5819324.17264512 31.2299995422363 390643.642808782 5819324.2858277 31.2299995422363 390657.831412604 5819376.92074291 34.0200004577637 390657.831733634 5819376.92121824 49.0583964349642 390660.004375735 5819347.10786492 49.0583964349642 390660.004054705 5819347.1073896 34.0200004577637 390657.831412604 5819376.92074291 34.0200004577637 390664.436636162 5819399.04921948 31.2299995422363 390664.437273392 5819399.050163 61.0804342524917 390664.828032029 5819400.05338894 61.0804342524917 390664.827394798 5819400.05244542 31.2299995422363 390664.436636162 5819399.04921948 31.2299995422363 390590.222300364 5819380.91147752 31.2299995422363 390590.22293755 5819380.91242102 61.0804342524917 390589.963241138 5819383.39823718 61.0804342524917 390589.962603952 5819383.39729368 31.2299995422363 390590.222300364 5819380.91147752 31.2299995422363 390663.899364266 5819398.97430274 31.2299995422363 390663.900001497 5819398.97524625 61.0804342524917 390664.437273392 5819399.050163 61.0804342524917 390664.436636162 5819399.04921948 31.2299995422363 390663.899364266 5819398.97430274 31.2299995422363 390642.356181481 5819322.13060996 31.2299995422363 390642.356818697 5819322.13155343 61.0804342524917 390626.759100105 5819320.83811827 61.0804342524917 390626.758462897 5819320.8371748 31.2299995422363 390642.356181481 5819322.13060996 31.2299995422363 390613.42563299 5819396.64278029 31.2299995422363 390613.42627019 5819396.6437238 61.0804342524917 390635.812224507 5819398.50560064 61.0804342524917 390635.811587294 5819398.50465712 31.2299995422363 390613.42563299 5819396.64278029 31.2299995422363 390626.665494298 5819322.10989622 31.2299995422363 390626.666131505 5819322.1108397 61.0804342524917 390626.049803516 5819330.58500586 61.0804342524917 390626.049166308 5819330.58406238 31.2299995422363 390626.665494298 5819322.10989622 31.2299995422363 390636.492039078 5819397.05903053 31.2299995422363 390636.492676291 5819397.05997404 61.0804342524917 390640.036795531 5819397.35324433 61.0804342524917 390640.036158316 5819397.35230082 31.2299995422363 390636.492039078 5819397.05903053 31.2299995422363 390668.022367119 5819400.31085673 31.2299995422363 390668.023004351 5819400.31180024 61.0804342524917 390668.549125277 5819399.47971547 61.0804342524917 390668.548488044 5819399.47877195 31.2299995422363 390668.022367119 5819400.31085673 31.2299995422363 390640.215578975 5819396.71020709 31.2299995422363 390640.216216191 5819396.7111506 61.0804342524917 390641.27306295 5819396.79693402 61.0804342524917 390641.272425733 5819396.7959905 31.2299995422363 390640.215578975 5819396.71020709 31.2299995422363 390626.758462897 5819320.8371748 31.2299995422363 390626.759100105 5819320.83811827 61.0804342524917 390626.666131505 5819322.1108397 61.0804342524917 390626.665494298 5819322.10989622 31.2299995422363 390626.758462897 5819320.8371748 31.2299995422363 390626.974771703 5819334.74305418 31.2299995422363 390626.975408911 5819334.74399766 61.0804342524917 390633.398425245 5819335.26690563 61.0804342524917 390633.397788033 5819335.26596215 31.2299995422363 390626.974771703 5819334.74305418 31.2299995422363 390669.590181089 5819399.57003119 31.2299995422363 390669.590818323 5819399.5709747 61.0804342524917 390669.47064105 5819401.30621273 61.0804342524917 390669.470003816 5819401.30526921 31.2299995422363 390669.590181089 5819399.57003119 31.2299995422363 390625.753487269 5819334.64331002 31.2299995422363 390625.754124476 5819334.64425349 61.0804342524917 390626.975408911 5819334.74399766 61.0804342524917 390626.974771703 5819334.74305418 31.2299995422363 390625.753487269 5819334.64331002 31.2299995422363 390649.41431574 5819387.52914309 33.9500007629395 390649.414585504 5819387.52954252 46.5869539610315 390676.881057143 5819389.34430478 46.5869539610315 390676.880787372 5819389.34390535 33.9500007629395 390649.41431574 5819387.52914309 33.9500007629395 390589.018555389 5819392.44954796 31.2299995422363 390589.019192574 5819392.45049147 61.0804342524917 390588.866425972 5819393.91628984 61.0804342524917 390588.865788786 5819393.91534632 31.2299995422363 390589.018555389 5819392.44954796 31.2299995422363 390676.580917116 5819401.89686988 31.2299995422363 390676.581554354 5819401.89781339 61.0804342524917 390681.192361809 5819402.28095244 61.0804342524917 390681.191724568 5819402.28000892 31.2299995422363 390676.580917116 5819401.89686988 31.2299995422363 390676.880787372 5819389.34390535 33.9500007629395 390676.881057143 5819389.34430478 46.5869539610315 390680.82793387 5819337.57914878 46.5869539610315 390680.827664099 5819337.57874936 33.9500007629395 390676.880787372 5819389.34390535 33.9500007629395 390626.049166308 5819330.58406238 31.2299995422363 390626.049803516 5819330.58500586 61.0804342524917 390625.93556227 5819332.15107696 61.0804342524917 390625.934925063 5819332.15013348 31.2299995422363 390626.049166308 5819330.58406238 31.2299995422363 390625.934925063 5819332.15013348 31.2299995422363 390625.93556227 5819332.15107696 61.0804342524917 390625.754124476 5819334.64425349 61.0804342524917 390625.753487269 5819334.64331002 31.2299995422363 390625.934925063 5819332.15013348 31.2299995422363 390589.962603952 5819383.39729368 31.2299995422363 390589.963241138 5819383.39823718 61.0804342524917 390589.80017037 5819384.96401739 61.0804342524917 390589.799533184 5819384.96307389 31.2299995422363 390589.962603952 5819383.39729368 31.2299995422363 BLDG_0003000e00613bcc 1000 390626.909301943 5819320.85530083 31.2800006866455 390625.720127482 5819335.10289384 31.2800006866455 390625.720761905 5819335.10383319 61 390626.909936366 5819320.85624018 61 390626.909301943 5819320.85530083 31.2800006866455 390607.976368943 5819344.90616645 31.2800006866455 390599.687742337 5819344.21436379 31.2800006866455 390599.688376745 5819344.21530315 61 390607.977003355 5819344.90710581 61 390607.976368943 5819344.90616645 31.2800006866455 390608.911689734 5819333.69998989 31.2800006866455 390607.976368943 5819344.90616645 31.2800006866455 390607.977003355 5819344.90710581 61 390608.912324147 5819333.70092925 61 390608.911689734 5819333.69998989 31.2800006866455 390601.81286732 5819318.76156421 61 390601.812232911 5819318.76062487 31.2800006866455 390626.909301943 5819320.85530083 31.2800006866455 390626.909936366 5819320.85624018 61 390610.101496499 5819319.4533355 61 390601.81286732 5819318.76156421 61 390601.812232911 5819318.76062487 31.2800006866455 390601.81286732 5819318.76156421 61 390600.623697684 5819333.0091251 61 390599.688376745 5819344.21530315 61 390599.687742337 5819344.21436379 31.2800006866455 390600.623063276 5819333.00818574 31.2800006866455 390601.812232911 5819318.76062487 31.2800006866455 390625.720127482 5819335.10289384 31.2800006866455 390608.911689734 5819333.69998989 31.2800006866455 390608.912324147 5819333.70092925 61 390625.720761905 5819335.10383319 61 390625.720127482 5819335.10289384 31.2800006866455 390607.977003355 5819344.90710581 61 390599.688376745 5819344.21530315 61 390600.623697684 5819333.0091251 61 390601.81286732 5819318.76156421 61 390610.101496499 5819319.4533355 61 390626.909936366 5819320.85624018 61 390625.720761905 5819335.10383319 61 390608.912324147 5819333.70092925 61 390607.977003355 5819344.90710581 61 390625.720127482 5819335.10289384 31.2800006866455 390626.909301943 5819320.85530083 31.2800006866455 390601.812232911 5819318.76062487 31.2800006866455 390600.623063276 5819333.00818574 31.2800006866455 390599.687742337 5819344.21436379 31.2800006866455 390607.976368943 5819344.90616645 31.2800006866455 390608.911689734 5819333.69998989 31.2800006866455 390625.720127482 5819335.10289384 31.2800006866455 BLDG_000300000016d7a8 1000 390635.976506686 5819384.61402464 37.25 390631.486907245 5819384.25024615 37.25 390632.256798765 5819374.74864851 37.25 390636.746398188 5819375.11242709 37.25 390635.976506686 5819384.61402464 37.25 390636.746327743 5819375.11232278 33.9500007629395 390632.256728321 5819374.7485442 33.9500007629395 390631.486836801 5819384.25014185 33.9500007629395 390635.976436241 5819384.61392033 33.9500007629395 390636.746327743 5819375.11232278 33.9500007629395 390636.746327743 5819375.11232278 33.9500007629395 390635.976436241 5819384.61392033 33.9500007629395 390635.976506686 5819384.61402464 37.25 390636.746398188 5819375.11242709 37.25 390636.746327743 5819375.11232278 33.9500007629395 390632.256728321 5819374.7485442 33.9500007629395 390636.746327743 5819375.11232278 33.9500007629395 390636.746398188 5819375.11242709 37.25 390632.256798765 5819374.74864851 37.25 390632.256728321 5819374.7485442 33.9500007629395 390631.486836801 5819384.25014185 33.9500007629395 390632.256728321 5819374.7485442 33.9500007629395 390632.256798765 5819374.74864851 37.25 390631.486907245 5819384.25024615 37.25 390631.486836801 5819384.25014185 33.9500007629395 390635.976436241 5819384.61392033 33.9500007629395 390631.486836801 5819384.25014185 33.9500007629395 390631.486907245 5819384.25024615 37.25 390635.976506686 5819384.61402464 37.25 390635.976436241 5819384.61392033 33.9500007629395 DEB_LOD2_UUID_07ef6137-571b-4037-a62f-d1e11637a461 1000 390608.928 5819333.675 34.425 390608.752 5819335.646 34.425 390611.469 5819335.901 34.425 390611.617 5819333.9 34.425 390608.928 5819333.675 34.425 390611.617 5819333.9 35.536 390611.469 5819335.901 35.536 390608.752 5819335.646 35.536 390608.928 5819333.675 35.536 390611.617 5819333.9 35.536 390608.928 5819333.675 35.536 390608.752 5819335.646 35.536 390608.752 5819335.646 34.425 390608.928 5819333.675 34.425 390608.928 5819333.675 35.536 390608.752 5819335.646 35.536 390611.469 5819335.901 35.536 390611.469 5819335.901 34.425 390608.752 5819335.646 34.425 390608.752 5819335.646 35.536 390611.469 5819335.901 35.536 390611.617 5819333.9 35.536 390611.617 5819333.9 34.425 390611.469 5819335.901 34.425 390611.469 5819335.901 35.536 390611.617 5819333.9 35.536 390608.928 5819333.675 35.536 390608.928 5819333.675 34.425 390611.617 5819333.9 34.425 390611.617 5819333.9 35.536 BLDG_000300000016d3f8 1000 390597.086903901 5819362.73761685 38.9445728704558 390597.799048712 5819356.83331666 38.9445728704558 390607.49081629 5819358.00227673 38.9445728704558 390606.778671514 5819363.90657678 38.9445728704558 390597.086903901 5819362.73761685 38.9445728704558 390597.086797286 5819362.73745898 33.9500007629395 390597.798942097 5819356.8331588 33.9500007629395 390597.799048712 5819356.83331666 38.9445728704558 390597.086903901 5819362.73761685 38.9445728704558 390597.086797286 5819362.73745898 33.9500007629395 390597.798942097 5819356.8331588 33.9500007629395 390607.490709674 5819358.00211886 33.9500007629395 390607.49081629 5819358.00227673 38.9445728704558 390597.799048712 5819356.83331666 38.9445728704558 390597.798942097 5819356.8331588 33.9500007629395 390606.778564898 5819363.90641892 33.9500007629395 390597.086797286 5819362.73745898 33.9500007629395 390597.086903901 5819362.73761685 38.9445728704558 390606.778671514 5819363.90657678 38.9445728704558 390606.778564898 5819363.90641892 33.9500007629395 390607.490709674 5819358.00211886 33.9500007629395 390606.778564898 5819363.90641892 33.9500007629395 390606.778671514 5819363.90657678 38.9445728704558 390607.49081629 5819358.00227673 38.9445728704558 390607.490709674 5819358.00211886 33.9500007629395 390606.778564898 5819363.90641892 33.9500007629395 390607.490709674 5819358.00211886 33.9500007629395 390597.798942097 5819356.8331588 33.9500007629395 390597.086797286 5819362.73745898 33.9500007629395 390606.778564898 5819363.90641892 33.9500007629395 BLDG_000300000016d363 1000 390592.865675883 5819356.23732643 34.4799995422363 390592.374793953 5819360.30150832 34.4799995422363 390597.308714034 5819360.89743493 34.4799995422363 390597.799595952 5819356.83325309 34.4799995422363 390592.865675883 5819356.23732643 34.4799995422363 390592.865675883 5819356.23732643 34.4799995422363 390597.799595952 5819356.83325309 34.4799995422363 390597.799667877 5819356.83335959 37.8494449191623 390592.865747807 5819356.23743293 37.8494449191623 390592.865675883 5819356.23732643 34.4799995422363 390592.374793953 5819360.30150832 34.4799995422363 390592.865675883 5819356.23732643 34.4799995422363 390592.865747807 5819356.23743293 37.8494449191623 390592.374865878 5819360.30161482 37.8494449191623 390592.374793953 5819360.30150832 34.4799995422363 390597.308714034 5819360.89743493 34.4799995422363 390592.374793953 5819360.30150832 34.4799995422363 390592.374865878 5819360.30161482 37.8494449191623 390597.308785959 5819360.89754143 37.8494449191623 390597.308714034 5819360.89743493 34.4799995422363 390597.799595952 5819356.83325309 34.4799995422363 390597.308714034 5819360.89743493 34.4799995422363 390597.308785959 5819360.89754143 37.8494449191623 390597.799667877 5819356.83335959 37.8494449191623 390597.799595952 5819356.83325309 34.4799995422363 390597.799667877 5819356.83335959 37.8494449191623 390597.308785959 5819360.89754143 37.8494449191623 390592.374865878 5819360.30161482 37.8494449191623 390592.865747807 5819356.23743293 37.8494449191623 390597.799667877 5819356.83335959 37.8494449191623 DEB_LOD2_UUID_9eaa711f-b51f-4d92-8155-5f95d7d77328 1000 390550.919 5819314.958 59.14 390558.302 5819315.564 59.14 390563.868 5819316.021 59.14 390563.749 5819317.435 59.14 390562.636 5819330.609 59.14 390562.304 5819330.583 59.14 390559.442 5819330.355 59.14 390549.68 5819329.58 59.14 390550.919 5819314.958 59.14 390549.68 5819329.58 33.2 390559.442 5819330.355 33.2 390562.304 5819330.583 33.2 390562.636 5819330.609 33.2 390563.749 5819317.435 33.2 390563.868 5819316.021 33.2 390558.302 5819315.564 33.2 390550.919 5819314.958 33.2 390549.68 5819329.58 33.2 390549.68 5819329.58 33.2 390549.68 5819329.58 59.14 390559.442 5819330.355 59.14 390559.442 5819330.355 33.2 390549.68 5819329.58 33.2 390559.442 5819330.355 33.2 390559.442 5819330.355 59.14 390562.304 5819330.583 59.14 390562.304 5819330.583 33.2 390559.442 5819330.355 33.2 390562.304 5819330.583 33.2 390562.304 5819330.583 59.14 390562.636 5819330.609 59.14 390562.636 5819330.609 33.2 390562.304 5819330.583 33.2 390562.636 5819330.609 33.2 390562.636 5819330.609 59.14 390563.749 5819317.435 59.14 390563.749 5819317.435 33.2 390562.636 5819330.609 33.2 390563.749 5819317.435 33.2 390563.749 5819317.435 59.14 390563.868 5819316.021 59.14 390563.868 5819316.021 33.2 390563.749 5819317.435 33.2 390550.919 5819314.958 33.2 390550.919 5819314.958 59.14 390549.68 5819329.58 59.14 390549.68 5819329.58 33.2 390550.919 5819314.958 33.2 390550.919 5819314.958 33.2 390558.302 5819315.564 33.2 390563.868 5819316.021 33.2 390563.868 5819316.021 59.14 390558.302 5819315.564 59.14 390550.919 5819314.958 59.14 390550.919 5819314.958 33.2 DEB_LOD2_UUID_223c804e-ed2e-4970-b42b-df3fcc4e8b30 1000 390526.046 5819312.914 58.024 390550.919 5819314.958 58.022 390550.8 5819316.364 60.92 390546.021 5819315.971 60.92 390541.686 5819315.615 60.921 390538.629 5819315.364 60.921 390531.881 5819314.809 60.922 390527.352 5819314.437 60.925 390525.929 5819314.32 60.925 390526.046 5819312.914 58.024 390530.995 5819325.275 60.919 390540.799 5819326.081 60.92 390540.695 5819327.299 55.454 390530.892 5819326.489 55.473 390530.995 5819325.275 60.919 390540.849 5819325.492 61.02 390545.184 5819325.848 61.02 390545.134 5819326.437 61.02 390540.799 5819326.081 61.02 390540.849 5819325.492 61.02 390541.127 5819322.202 62 390545.462 5819322.558 62 390545.184 5819325.848 62 390540.849 5819325.492 62 390541.127 5819322.202 62 390550.919 5819314.958 31.285 390550.919 5819314.958 58.022 390526.046 5819312.914 58.024 390526.046 5819312.914 31.285 390550.919 5819314.958 31.285 390526.474 5819326.943 31.285 390526.474 5819326.943 60.922 390526.474 5819327.091 60.922 390526.474 5819327.091 31.285 390526.474 5819326.943 31.285 390530.554 5819327.447 31.285 390530.554 5819327.447 60.919 390530.636 5819326.468 60.919 390530.636 5819326.468 31.285 390530.554 5819327.447 31.285 390530.892 5819326.489 55.473 390530.892 5819326.489 60.919 390530.995 5819325.275 60.919 390530.892 5819326.489 55.473 390526.958 5819320.824 31.285 390526.958 5819320.824 60.923 390526.474 5819326.943 60.922 390526.474 5819326.943 31.285 390526.958 5819320.824 31.285 390541.082 5819327.331 31.285 390541.082 5819327.331 60.92 390540.943 5819328.86 60.92 390540.943 5819328.86 31.285 390541.082 5819327.331 31.285 390540.799 5819326.081 60.92 390540.695 5819327.299 60.92 390540.695 5819327.299 55.454 390540.799 5819326.081 60.92 390540.799 5819326.081 60.92 390540.799 5819326.081 60.973 390540.799 5819326.081 61.02 390545.134 5819326.437 61.02 390545.134 5819326.437 60.92 390540.799 5819326.081 60.92 390540.849 5819325.492 61.02 390540.799 5819326.081 61.02 390540.799 5819326.081 60.973 390540.849 5819325.492 61.02 390540.849 5819325.492 61.02 390540.849 5819325.492 62 390545.184 5819325.848 62 390545.184 5819325.848 61.02 390540.849 5819325.492 61.02 390545.462 5819322.558 60.92 390545.462 5819322.558 62 390541.127 5819322.202 62 390541.127 5819322.202 60.92 390545.462 5819322.558 60.92 390541.127 5819322.202 60.92 390541.127 5819322.202 62 390540.849 5819325.492 62 390540.849 5819325.492 61.02 390540.849 5819325.492 60.92 390541.127 5819322.202 60.92 390546.581 5819329.324 31.285 390546.581 5819329.324 60.92 390549.68 5819329.58 60.92 390549.68 5819329.58 31.285 390546.581 5819329.324 31.285 390525.929 5819314.32 60.925 390527.352 5819314.437 60.925 390531.881 5819314.809 60.922 390538.629 5819315.364 60.921 390541.686 5819315.615 60.921 390546.021 5819315.971 60.92 390550.8 5819316.364 60.92 390549.68 5819329.58 60.92 390546.581 5819329.324 60.92 390544.901 5819329.186 60.92 390544.539 5819329.156 60.92 390540.943 5819328.86 60.92 390541.082 5819327.331 60.92 390540.695 5819327.299 60.92 390540.799 5819326.081 60.92 390530.995 5819325.275 60.919 390530.892 5819326.489 60.919 390530.636 5819326.468 60.919 390530.554 5819327.447 60.919 390527.38 5819327.17 60.922 390526.474 5819327.091 60.922 390526.474 5819326.943 60.922 390526.958 5819320.824 60.923 390526.812 5819320.812 60.925 390525.397 5819320.699 60.925 390525.929 5819314.32 60.925 390545.134 5819326.437 60.92 390545.184 5819325.848 60.92 390545.462 5819322.558 60.92 390541.127 5819322.202 60.92 390540.849 5819325.492 60.92 390540.799 5819326.081 60.92 390545.134 5819326.437 60.92 390526.046 5819312.914 31.285 390525.929 5819314.32 31.285 390525.397 5819320.699 31.285 390526.812 5819320.812 31.285 390526.958 5819320.824 31.285 390526.474 5819326.943 31.285 390526.474 5819327.091 31.285 390527.38 5819327.17 31.285 390530.554 5819327.447 31.285 390530.636 5819326.468 31.285 390530.892 5819326.489 31.285 390540.695 5819327.299 31.285 390541.082 5819327.331 31.285 390540.943 5819328.86 31.285 390544.539 5819329.156 31.285 390544.901 5819329.186 31.285 390546.581 5819329.324 31.285 390549.68 5819329.58 31.285 390550.8 5819316.364 31.285 390550.919 5819314.958 31.285 390526.046 5819312.914 31.285 390530.636 5819326.468 60.919 390530.892 5819326.489 60.919 390530.892 5819326.489 55.473 390540.695 5819327.299 55.454 390540.695 5819327.299 60.92 390541.082 5819327.331 60.92 390541.082 5819327.331 31.285 390540.695 5819327.299 31.285 390530.892 5819326.489 31.285 390530.636 5819326.468 31.285 390530.636 5819326.468 60.919 390540.943 5819328.86 60.92 390544.539 5819329.156 60.92 390544.901 5819329.186 60.92 390546.581 5819329.324 60.92 390546.581 5819329.324 31.285 390544.901 5819329.186 31.285 390544.539 5819329.156 31.285 390540.943 5819328.86 31.285 390540.943 5819328.86 60.92 390545.462 5819322.558 62 390545.462 5819322.558 60.92 390545.184 5819325.848 60.92 390545.134 5819326.437 60.92 390545.134 5819326.437 61.02 390545.184 5819325.848 61.02 390545.184 5819325.848 62 390545.462 5819322.558 62 390526.474 5819327.091 60.922 390527.38 5819327.17 60.922 390530.554 5819327.447 60.919 390530.554 5819327.447 31.285 390527.38 5819327.17 31.285 390526.474 5819327.091 31.285 390526.474 5819327.091 60.922 390550.8 5819316.364 60.92 390550.919 5819314.958 58.022 390550.919 5819314.958 31.285 390550.8 5819316.364 31.285 390549.68 5819329.58 31.285 390549.68 5819329.58 60.92 390550.8 5819316.364 60.92 390525.929 5819314.32 31.285 390526.046 5819312.914 31.285 390526.046 5819312.914 58.024 390525.929 5819314.32 60.925 390525.397 5819320.699 60.925 390525.397 5819320.699 31.285 390525.929 5819314.32 31.285 390525.397 5819320.699 60.925 390526.812 5819320.812 60.925 390526.958 5819320.824 60.923 390526.958 5819320.824 31.285 390526.812 5819320.812 31.285 390525.397 5819320.699 31.285 390525.397 5819320.699 60.925 DEB_LOD2_UUID_bdba8cdc-80d7-457e-b484-b3c503bab56f 1000 390560.708 5819354.096 59.96 390561.121 5819348.883 59.96 390565.15 5819349.235 59.96 390567.434 5819349.435 59.96 390573.96 5819350.005 59.96 390573.569 5819355.024 59.96 390573.098 5819358.82 59.96 390569.421 5819358.54 59.96 390560.542 5819357.722 59.96 390560.708 5819354.096 59.96 390563.304 5819322.708 62.5 390567.203 5819323.026 62.5 390566.803 5819328.13 62.5 390562.873 5819327.809 62.5 390563.304 5819322.708 62.5 390563.749 5819317.435 59.53 390563.868 5819316.021 59.414 390576.487 5819317.051 59.414 390576.426 5819317.845 59.479 390576.377 5819318.479 59.531 390575.974 5819323.742 59.96 390567.203 5819323.026 59.96 390563.304 5819322.708 59.96 390563.749 5819317.435 59.53 390567.203 5819323.026 59.96 390575.974 5819323.742 59.96 390575.582 5819328.847 59.96 390569.147 5819328.321 59.96 390566.803 5819328.13 59.96 390567.203 5819323.026 59.96 390560.542 5819357.722 30.96 390560.542 5819357.722 59.96 390569.421 5819358.54 59.96 390569.421 5819358.54 30.96 390560.542 5819357.722 30.96 390569.421 5819358.54 30.96 390569.421 5819358.54 59.96 390573.098 5819358.82 59.96 390573.098 5819358.82 30.96 390569.421 5819358.54 30.96 390573.098 5819358.82 30.96 390573.098 5819358.82 59.96 390573.569 5819355.024 59.96 390573.569 5819355.024 30.96 390573.098 5819358.82 30.96 390560.708 5819354.096 30.96 390560.708 5819354.096 59.96 390560.542 5819357.722 59.96 390560.542 5819357.722 30.96 390560.708 5819354.096 30.96 390561.376 5819345.668 30.96 390561.376 5819345.668 58.094 390561.145 5819348.575 59.782 390561.145 5819348.575 30.96 390561.376 5819345.668 30.96 390562.492 5819332.309 30.96 390562.492 5819332.309 57.818 390565.73 5819332.587 57.812 390565.73 5819332.587 30.96 390562.492 5819332.309 30.96 390565.73 5819332.587 30.96 390565.73 5819332.587 57.812 390565.682 5819333.232 57.505 390565.682 5819333.232 30.96 390565.73 5819332.587 30.96 390562.636 5819330.609 30.96 390562.636 5819330.609 58.627 390562.492 5819332.309 57.818 390562.492 5819332.309 30.96 390562.636 5819330.609 30.96 390562.873 5819327.809 59.96 390562.873 5819327.809 62.5 390566.803 5819328.13 62.5 390566.803 5819328.13 59.96 390562.873 5819327.809 59.96 390566.803 5819328.13 59.96 390566.803 5819328.13 62.5 390567.203 5819323.026 62.5 390567.203 5819323.026 59.96 390566.803 5819328.13 59.96 390567.203 5819323.026 59.96 390567.203 5819323.026 62.5 390563.304 5819322.708 62.5 390563.304 5819322.708 59.96 390567.203 5819323.026 59.96 390576.377 5819318.479 30.96 390576.377 5819318.479 59.531 390576.426 5819317.845 59.479 390576.426 5819317.845 30.96 390576.377 5819318.479 30.96 390576.426 5819317.845 30.96 390576.426 5819317.845 59.479 390576.487 5819317.051 59.414 390576.487 5819317.051 30.96 390576.426 5819317.845 30.96 390576.487 5819317.051 30.96 390576.487 5819317.051 59.414 390563.868 5819316.021 59.414 390563.868 5819316.021 30.96 390576.487 5819317.051 30.96 390563.868 5819316.021 30.96 390563.868 5819316.021 59.414 390563.749 5819317.435 59.53 390563.749 5819317.435 30.96 390563.868 5819316.021 30.96 390568.302 5819339.227 30.96 390568.302 5819339.227 57.495 390569.125 5819339.277 57.804 390569.125 5819339.277 30.96 390568.302 5819339.227 30.96 390563.868 5819316.021 30.96 390563.749 5819317.435 30.96 390563.304 5819322.708 30.96 390562.873 5819327.809 30.96 390562.636 5819330.609 30.96 390562.492 5819332.309 30.96 390565.73 5819332.587 30.96 390565.682 5819333.232 30.96 390568.729 5819333.472 30.96 390568.814 5819333.479 30.96 390568.809 5819333.54 30.96 390568.302 5819339.227 30.96 390569.125 5819339.277 30.96 390568.618 5819345.237 30.96 390568.614 5819345.286 30.96 390568.12 5819345.426 30.96 390567.751 5819345.531 30.96 390565.92 5819346.051 30.96 390565.403 5819346.007 30.96 390561.376 5819345.668 30.96 390561.145 5819348.575 30.96 390561.121 5819348.883 30.96 390560.708 5819354.096 30.96 390560.542 5819357.722 30.96 390569.421 5819358.54 30.96 390573.098 5819358.82 30.96 390573.569 5819355.024 30.96 390573.96 5819350.005 30.96 390573.963 5819349.962 30.96 390574.019 5819349.246 30.96 390574.288 5819345.732 30.96 390575.183 5819334.06 30.96 390575.504 5819329.866 30.96 390575.573 5819328.973 30.96 390575.582 5819328.847 30.96 390575.974 5819323.742 30.96 390576.377 5819318.479 30.96 390576.426 5819317.845 30.96 390576.487 5819317.051 30.96 390563.868 5819316.021 30.96 390574.288 5819345.732 59.928 390575.183 5819334.06 59.909 390575.504 5819329.866 59.902 390575.573 5819328.973 59.9 390575.582 5819328.847 59.96 390575.974 5819323.742 59.96 390576.377 5819318.479 59.531 390576.377 5819318.479 30.96 390575.974 5819323.742 30.96 390575.582 5819328.847 30.96 390575.573 5819328.973 30.96 390575.504 5819329.866 30.96 390575.183 5819334.06 30.96 390574.288 5819345.732 30.96 390574.019 5819349.246 30.96 390574.019 5819349.246 59.934 390574.288 5819345.732 59.928 390561.145 5819348.575 59.782 390561.376 5819345.668 58.094 390565.403 5819346.007 58.087 390565.92 5819346.051 58.086 390567.751 5819345.531 57.694 390568.12 5819345.426 57.615 390573.963 5819349.962 59.935 390573.96 5819350.005 59.96 390567.434 5819349.435 59.96 390565.15 5819349.235 59.96 390561.121 5819348.883 59.96 390561.145 5819348.575 59.782 390568.614 5819345.286 57.795 390568.618 5819345.237 57.795 390569.125 5819339.277 57.804 390568.302 5819339.227 57.495 390568.809 5819333.54 57.512 390568.814 5819333.479 57.509 390575.573 5819328.973 59.9 390575.504 5819329.866 59.902 390575.183 5819334.06 59.909 390574.288 5819345.732 59.928 390574.019 5819349.246 59.934 390573.963 5819349.962 59.935 390568.12 5819345.426 57.615 390568.614 5819345.286 57.795 390573.96 5819350.005 59.96 390573.963 5819349.962 59.935 390574.019 5819349.246 59.934 390574.019 5819349.246 30.96 390573.963 5819349.962 30.96 390573.96 5819350.005 30.96 390573.569 5819355.024 30.96 390573.569 5819355.024 59.96 390573.96 5819350.005 59.96 390562.873 5819327.809 30.96 390563.304 5819322.708 30.96 390563.749 5819317.435 30.96 390563.749 5819317.435 59.53 390563.304 5819322.708 59.96 390563.304 5819322.708 62.5 390562.873 5819327.809 62.5 390562.873 5819327.809 59.96 390562.636 5819330.609 58.627 390562.636 5819330.609 30.96 390562.873 5819327.809 30.96 390567.751 5819345.531 30.96 390568.12 5819345.426 30.96 390568.614 5819345.286 30.96 390568.614 5819345.286 57.795 390568.12 5819345.426 57.615 390567.751 5819345.531 57.694 390565.92 5819346.051 58.086 390565.92 5819346.051 30.96 390567.751 5819345.531 30.96 390568.809 5819333.54 30.96 390568.814 5819333.479 30.96 390568.814 5819333.479 57.509 390568.809 5819333.54 57.512 390568.302 5819339.227 57.495 390568.302 5819339.227 30.96 390568.809 5819333.54 30.96 390568.618 5819345.237 30.96 390569.125 5819339.277 30.96 390569.125 5819339.277 57.804 390568.618 5819345.237 57.795 390568.614 5819345.286 57.795 390568.614 5819345.286 30.96 390568.618 5819345.237 30.96 390565.682 5819333.232 57.505 390568.729 5819333.472 57.509 390568.814 5819333.479 57.509 390568.814 5819333.479 30.96 390568.729 5819333.472 30.96 390565.682 5819333.232 30.96 390565.682 5819333.232 57.505 390561.376 5819345.668 30.96 390565.403 5819346.007 30.96 390565.92 5819346.051 30.96 390565.92 5819346.051 58.086 390565.403 5819346.007 58.087 390561.376 5819345.668 58.094 390561.376 5819345.668 30.96 390561.121 5819348.883 30.96 390561.145 5819348.575 30.96 390561.145 5819348.575 59.782 390561.121 5819348.883 59.96 390560.708 5819354.096 59.96 390560.708 5819354.096 30.96 390561.121 5819348.883 30.96 390562.636 5819330.609 58.627 390562.873 5819327.809 59.96 390566.803 5819328.13 59.96 390569.147 5819328.321 59.96 390575.582 5819328.847 59.96 390575.573 5819328.973 59.9 390568.814 5819333.479 57.509 390568.729 5819333.472 57.509 390565.682 5819333.232 57.505 390565.73 5819332.587 57.812 390562.492 5819332.309 57.818 390562.636 5819330.609 58.627 BLDG_000300000016d825 1000 390633.202997389 5819344.85725506 33.9300003051758 390633.981600776 5819335.31380685 33.9300003051758 390633.981667378 5819335.31390546 37.05 390633.203063991 5819344.85735367 37.05 390633.202997389 5819344.85725506 33.9300003051758 390639.905245361 5819335.79708437 33.9300003051758 390639.126641997 5819345.34053245 33.9300003051758 390639.126708599 5819345.34063106 37.05 390639.905311964 5819335.79718299 37.05 390639.905245361 5819335.79708437 33.9300003051758 390639.126641997 5819345.34053245 33.9300003051758 390633.202997389 5819344.85725506 33.9300003051758 390633.203063991 5819344.85735367 37.05 390639.126708599 5819345.34063106 37.05 390639.126641997 5819345.34053245 33.9300003051758 390633.981600776 5819335.31380685 33.9300003051758 390639.905245361 5819335.79708437 33.9300003051758 390639.905311964 5819335.79718299 37.05 390633.981667378 5819335.31390546 37.05 390633.981600776 5819335.31380685 33.9300003051758 390633.981667378 5819335.31390546 37.05 390639.905311964 5819335.79718299 37.05 390639.126708599 5819345.34063106 37.05 390633.203063991 5819344.85735367 37.05 390633.981667378 5819335.31390546 37.05 390633.202997389 5819344.85725506 33.9300003051758 390639.126641997 5819345.34053245 33.9300003051758 390639.905245361 5819335.79708437 33.9300003051758 390633.981600776 5819335.31380685 33.9300003051758 390633.202997389 5819344.85725506 33.9300003051758 BLDG_000300000016d63b 1000 390613.324041199 5819357.96476328 33.9000015258789 390625.029688594 5819358.85803629 33.9000015258789 390625.029779924 5819358.85817152 38.1784292399454 390613.324132528 5819357.96489851 38.1784292399454 390613.324041199 5819357.96476328 33.9000015258789 390611.941509634 5819376.08162288 33.9000015258789 390613.324041199 5819357.96476328 33.9000015258789 390613.324132528 5819357.96489851 38.1784292399454 390611.941600963 5819376.08175811 38.1784292399454 390611.941509634 5819376.08162288 33.9000015258789 390623.647157111 5819376.97489542 33.9000015258789 390611.941509634 5819376.08162288 33.9000015258789 390611.941600963 5819376.08175811 38.1784292399454 390623.647248441 5819376.97503064 38.1784292399454 390623.647157111 5819376.97489542 33.9000015258789 390625.029688594 5819358.85803629 33.9000015258789 390623.647157111 5819376.97489542 33.9000015258789 390623.647248441 5819376.97503064 38.1784292399454 390625.029779924 5819358.85817152 38.1784292399454 390625.029688594 5819358.85803629 33.9000015258789 390623.647157111 5819376.97489542 33.9000015258789 390625.029688594 5819358.85803629 33.9000015258789 390613.324041199 5819357.96476328 33.9000015258789 390611.941509634 5819376.08162288 33.9000015258789 390623.647157111 5819376.97489542 33.9000015258789 390611.941600963 5819376.08175811 38.1784292399454 390613.324132528 5819357.96489851 38.1784292399454 390625.029779924 5819358.85817152 38.1784292399454 390623.647248441 5819376.97503064 38.1784292399454 390611.941600963 5819376.08175811 38.1784292399454 DEB_LOD2_UUID_19c7e3d0-7c76-4a27-ba39-5f8c2d20e17e 1000 390513.478 5819325.914 60.89 390514.555 5819311.97 60.89 390526.046 5819312.914 60.89 390525.397 5819320.699 60.89 390526.958 5819320.824 60.89 390526.474 5819326.943 60.89 390526.474 5819327.091 60.89 390526.757 5819327.116 60.89 390526.729 5819327.483 60.89 390513.441 5819326.391 60.89 390513.478 5819325.914 60.89 390519.011 5819348.355 61.86 390525.892 5819348.883 61.86 390525.162 5819358.318 61.86 390525.108 5819358.314 61.86 390525.104 5819358.364 61.86 390524.348 5819358.306 61.86 390518.279 5819357.837 61.86 390519.011 5819348.355 61.86 390525.892 5819348.883 58.98 390535.69 5819349.634 58.98 390535.517 5819351.797 58.98 390535.261 5819351.773 58.98 390534.782 5819358.548 58.98 390534.746 5819359.057 58.98 390525.162 5819358.318 58.98 390525.892 5819348.883 58.98 390544.539 5819329.156 55.01 390546.581 5819329.324 55.01 390545.209 5819347.189 55.01 390543.156 5819347.031 55.01 390544.539 5819329.156 55.01 390508.714 5819387.605 30.11 390508.714 5819387.605 58.55 390532.366 5819389.621 58.55 390532.366 5819389.621 30.11 390508.714 5819387.605 30.11 390532.366 5819389.621 30.11 390532.366 5819389.621 58.55 390533.654 5819374.378 58.55 390533.654 5819374.378 30.11 390532.366 5819389.621 30.11 390533.654 5819374.378 30.11 390533.654 5819374.378 58.55 390533.698 5819373.86 58.55 390533.698 5819373.86 30.11 390533.654 5819374.378 30.11 390533.698 5819373.86 30.11 390533.698 5819373.86 58.55 390523.968 5819373.103 58.55 390523.968 5819373.103 30.11 390533.698 5819373.86 30.11 390526.007 5819344.886 30.11 390526.007 5819344.886 43.14 390529.227 5819345.135 43.14 390529.227 5819345.135 30.11 390526.007 5819344.886 30.11 390529.227 5819345.135 30.11 390529.227 5819345.135 43.14 390530.521 5819328.379 43.14 390530.521 5819328.379 30.11 390529.227 5819345.135 30.11 390530.521 5819328.379 30.11 390530.521 5819328.379 43.14 390527.301 5819328.13 43.14 390527.301 5819328.13 30.11 390530.521 5819328.379 30.11 390513.441 5819326.391 43.14 390513.441 5819326.391 60.89 390526.729 5819327.483 60.89 390526.729 5819327.483 43.14 390513.441 5819326.391 43.14 390526.729 5819327.483 43.14 390526.729 5819327.483 60.89 390526.757 5819327.116 60.89 390526.757 5819327.116 43.14 390526.729 5819327.483 43.14 390526.474 5819327.091 30.11 390526.474 5819327.091 60.89 390526.474 5819326.943 60.89 390526.474 5819326.943 30.11 390526.474 5819327.091 30.11 390526.474 5819326.943 30.11 390526.474 5819326.943 60.89 390526.958 5819320.824 60.89 390526.958 5819320.824 30.11 390526.474 5819326.943 30.11 390526.958 5819320.824 30.11 390526.958 5819320.824 60.89 390525.397 5819320.699 60.89 390525.397 5819320.699 30.11 390526.958 5819320.824 30.11 390525.397 5819320.699 30.11 390525.397 5819320.699 60.89 390526.046 5819312.914 60.89 390526.046 5819312.914 30.11 390525.397 5819320.699 30.11 390526.046 5819312.914 30.11 390526.046 5819312.914 60.89 390514.555 5819311.97 60.89 390514.555 5819311.97 30.11 390526.046 5819312.914 30.11 390525.162 5819358.318 58.98 390525.162 5819358.318 61.86 390525.892 5819348.883 61.86 390525.892 5819348.883 58.98 390525.162 5819358.318 58.98 390519.011 5819348.355 58.55 390519.011 5819348.355 61.86 390518.279 5819357.837 61.86 390518.279 5819357.837 58.55 390519.011 5819348.355 58.55 390561.145 5819348.575 30.11 390561.145 5819348.575 58.55 390545.196 5819347.351 58.55 390545.196 5819347.351 30.11 390561.145 5819348.575 30.11 390545.209 5819347.189 55.01 390545.209 5819347.189 58.55 390543.156 5819347.031 58.55 390543.156 5819347.031 55.01 390545.209 5819347.189 55.01 390543.143 5819347.193 30.11 390543.143 5819347.193 58.55 390525.928 5819345.873 58.55 390525.928 5819345.873 30.11 390543.143 5819347.193 30.11 390535.517 5819351.797 58.55 390535.517 5819351.797 58.98 390535.69 5819349.634 58.98 390535.69 5819349.634 58.55 390535.517 5819351.797 58.55 390546.581 5819329.324 30.11 390546.581 5819329.324 55.01 390544.539 5819329.156 55.01 390544.539 5819329.156 30.11 390546.581 5819329.324 30.11 390560.542 5819357.722 30.11 390560.542 5819357.722 59.75 390560.708 5819354.096 59.75 390560.708 5819354.096 30.11 390560.542 5819357.722 30.11 390560.908 5819351.569 58.55 390560.908 5819351.569 59.75 390554.592 5819351.084 59.75 390554.592 5819351.084 58.55 390560.908 5819351.569 58.55 390554.592 5819351.084 58.55 390554.592 5819351.084 59.75 390554.366 5819353.558 59.75 390554.366 5819353.558 58.55 390554.592 5819351.084 58.55 390554.456 5819353.566 30.11 390554.456 5819353.566 59.75 390553.859 5819360.106 59.75 390553.859 5819360.106 30.11 390554.456 5819353.566 30.11 390569.209 5819361.291 30.11 390569.209 5819361.291 59.75 390569.421 5819358.54 59.75 390569.421 5819358.54 30.11 390569.209 5819361.291 30.11 390535.261 5819351.773 58.98 390535.517 5819351.797 58.98 390535.517 5819351.797 58.55 390545.921 5819352.769 58.55 390554.366 5819353.558 58.55 390554.366 5819353.558 59.75 390554.456 5819353.566 59.75 390554.456 5819353.566 30.11 390554.366 5819353.558 30.11 390545.921 5819352.769 30.11 390535.517 5819351.797 30.11 390535.261 5819351.773 30.11 390535.261 5819351.773 58.98 390509.917 5819372.035 30.11 390509.939 5819371.745 30.11 390511.056 5819357.28 30.11 390511.06 5819357.228 30.11 390512.019 5819344.807 30.11 390512.032 5819344.644 30.11 390513.441 5819326.391 30.11 390513.478 5819325.914 30.11 390514.555 5819311.97 30.11 390514.555 5819311.97 60.89 390513.478 5819325.914 60.89 390513.441 5819326.391 60.89 390513.441 5819326.391 43.14 390512.032 5819344.644 43.14 390512.032 5819344.644 58.55 390512.019 5819344.807 58.55 390511.06 5819357.228 58.55 390511.056 5819357.28 58.55 390509.939 5819371.745 58.55 390509.917 5819372.035 58.55 390508.714 5819387.605 58.55 390508.714 5819387.605 30.11 390509.917 5819372.035 30.11 390560.592 5819357.727 30.11 390560.542 5819357.722 30.11 390560.708 5819354.096 30.11 390560.908 5819351.569 30.11 390561.145 5819348.575 30.11 390545.196 5819347.351 30.11 390545.209 5819347.189 30.11 390546.581 5819329.324 30.11 390544.539 5819329.156 30.11 390543.156 5819347.031 30.11 390543.143 5819347.193 30.11 390525.928 5819345.873 30.11 390525.941 5819345.711 30.11 390526.007 5819344.886 30.11 390529.227 5819345.135 30.11 390530.521 5819328.379 30.11 390527.301 5819328.13 30.11 390527.35 5819327.534 30.11 390527.38 5819327.17 30.11 390526.757 5819327.116 30.11 390526.474 5819327.091 30.11 390526.474 5819326.943 30.11 390526.958 5819320.824 30.11 390525.397 5819320.699 30.11 390526.046 5819312.914 30.11 390514.555 5819311.97 30.11 390513.478 5819325.914 30.11 390513.441 5819326.391 30.11 390512.032 5819344.644 30.11 390512.019 5819344.807 30.11 390511.06 5819357.228 30.11 390511.056 5819357.28 30.11 390509.939 5819371.745 30.11 390509.917 5819372.035 30.11 390508.714 5819387.605 30.11 390532.366 5819389.621 30.11 390533.654 5819374.378 30.11 390533.698 5819373.86 30.11 390523.968 5819373.103 30.11 390523.98 5819372.942 30.11 390525.104 5819358.364 30.11 390525.108 5819358.314 30.11 390525.162 5819358.318 30.11 390534.746 5819359.057 30.11 390534.782 5819358.548 30.11 390535.261 5819351.773 30.11 390535.517 5819351.797 30.11 390545.921 5819352.769 30.11 390554.366 5819353.558 30.11 390554.456 5819353.566 30.11 390553.859 5819360.106 30.11 390560.402 5819360.611 30.11 390569.209 5819361.291 30.11 390569.421 5819358.54 30.11 390560.592 5819357.727 30.11 390509.917 5819372.035 58.55 390509.939 5819371.745 58.55 390511.056 5819357.28 58.55 390511.06 5819357.228 58.55 390512.019 5819344.807 58.55 390512.032 5819344.644 58.55 390519.255 5819345.198 58.55 390525.941 5819345.711 58.55 390525.928 5819345.873 58.55 390543.143 5819347.193 58.55 390543.156 5819347.031 58.55 390545.209 5819347.189 58.55 390545.196 5819347.351 58.55 390561.145 5819348.575 58.55 390560.908 5819351.569 58.55 390554.592 5819351.084 58.55 390554.366 5819353.558 58.55 390545.921 5819352.769 58.55 390535.517 5819351.797 58.55 390535.69 5819349.634 58.55 390525.892 5819348.883 58.55 390519.011 5819348.355 58.55 390518.279 5819357.837 58.55 390524.348 5819358.306 58.55 390525.104 5819358.364 58.55 390523.98 5819372.942 58.55 390523.968 5819373.103 58.55 390533.698 5819373.86 58.55 390533.654 5819374.378 58.55 390532.366 5819389.621 58.55 390508.714 5819387.605 58.55 390509.917 5819372.035 58.55 390525.108 5819358.314 61.86 390525.108 5819358.314 30.11 390525.104 5819358.364 30.11 390523.98 5819372.942 30.11 390523.968 5819373.103 30.11 390523.968 5819373.103 58.55 390523.98 5819372.942 58.55 390525.104 5819358.364 58.55 390525.104 5819358.364 61.86 390525.108 5819358.314 61.86 390560.542 5819357.722 30.11 390560.592 5819357.727 30.11 390569.421 5819358.54 30.11 390569.421 5819358.54 59.75 390560.592 5819357.727 59.75 390560.542 5819357.722 59.75 390560.542 5819357.722 30.11 390553.859 5819360.106 59.75 390560.402 5819360.611 59.75 390569.209 5819361.291 59.75 390569.209 5819361.291 30.11 390560.402 5819360.611 30.11 390553.859 5819360.106 30.11 390553.859 5819360.106 59.75 390534.782 5819358.548 58.98 390535.261 5819351.773 58.98 390535.261 5819351.773 30.11 390534.782 5819358.548 30.11 390534.746 5819359.057 30.11 390534.746 5819359.057 58.98 390534.782 5819358.548 58.98 390543.156 5819347.031 30.11 390544.539 5819329.156 30.11 390544.539 5819329.156 55.01 390543.156 5819347.031 55.01 390543.156 5819347.031 58.55 390543.143 5819347.193 58.55 390543.143 5819347.193 30.11 390543.156 5819347.031 30.11 390545.209 5819347.189 58.55 390545.209 5819347.189 55.01 390546.581 5819329.324 55.01 390546.581 5819329.324 30.11 390545.209 5819347.189 30.11 390545.196 5819347.351 30.11 390545.196 5819347.351 58.55 390545.209 5819347.189 58.55 390560.908 5819351.569 59.75 390560.908 5819351.569 58.55 390561.145 5819348.575 58.55 390561.145 5819348.575 30.11 390560.908 5819351.569 30.11 390560.708 5819354.096 30.11 390560.708 5819354.096 59.75 390560.908 5819351.569 59.75 390519.011 5819348.355 58.55 390525.892 5819348.883 58.55 390535.69 5819349.634 58.55 390535.69 5819349.634 58.98 390525.892 5819348.883 58.98 390525.892 5819348.883 61.86 390519.011 5819348.355 61.86 390519.011 5819348.355 58.55 390525.108 5819358.314 61.86 390525.162 5819358.318 61.86 390525.162 5819358.318 58.98 390534.746 5819359.057 58.98 390534.746 5819359.057 30.11 390525.162 5819358.318 30.11 390525.108 5819358.314 30.11 390525.108 5819358.314 61.86 390518.279 5819357.837 61.86 390524.348 5819358.306 61.86 390525.104 5819358.364 61.86 390525.104 5819358.364 58.55 390524.348 5819358.306 58.55 390518.279 5819357.837 58.55 390518.279 5819357.837 61.86 390526.474 5819327.091 30.11 390526.757 5819327.116 30.11 390527.38 5819327.17 30.11 390527.38 5819327.17 43.14 390526.757 5819327.116 43.14 390526.757 5819327.116 60.89 390526.474 5819327.091 60.89 390526.474 5819327.091 30.11 390527.35 5819327.534 43.14 390527.38 5819327.17 43.14 390527.38 5819327.17 30.11 390527.35 5819327.534 30.11 390527.301 5819328.13 30.11 390527.301 5819328.13 43.14 390527.35 5819327.534 43.14 390525.941 5819345.711 58.55 390525.941 5819345.711 43.14 390526.007 5819344.886 43.14 390526.007 5819344.886 30.11 390525.941 5819345.711 30.11 390525.928 5819345.873 30.11 390525.928 5819345.873 58.55 390525.941 5819345.711 58.55 390512.032 5819344.644 43.14 390519.255 5819345.198 43.14 390525.941 5819345.711 43.14 390525.941 5819345.711 58.55 390519.255 5819345.198 58.55 390512.032 5819344.644 58.55 390512.032 5819344.644 43.14 390554.456 5819353.566 59.75 390554.366 5819353.558 59.75 390554.592 5819351.084 59.75 390560.908 5819351.569 59.75 390560.708 5819354.096 59.75 390560.542 5819357.722 59.75 390560.592 5819357.727 59.75 390569.421 5819358.54 59.75 390569.209 5819361.291 59.75 390560.402 5819360.611 59.75 390553.859 5819360.106 59.75 390554.456 5819353.566 59.75 390513.441 5819326.391 43.14 390526.729 5819327.483 43.14 390526.757 5819327.116 43.14 390527.38 5819327.17 43.14 390527.35 5819327.534 43.14 390527.301 5819328.13 43.14 390530.521 5819328.379 43.14 390529.227 5819345.135 43.14 390526.007 5819344.886 43.14 390525.941 5819345.711 43.14 390519.255 5819345.198 43.14 390512.032 5819344.644 43.14 390513.441 5819326.391 43.14 DEB_LOD2_UUID_0177f020-88d7-4c48-8f97-9c7cdd6e92ab 2100 390551.661 5819386.85 59.73 390564.527 5819387.993 59.73 390569.81 5819388.463 59.73 390573.07 5819388.753 59.73 390575.689 5819388.986 59.73 390576.798 5819389.084 59.73 390589.257 5819390.192 59.73 390589.025 5819392.424 57.077 390588.871 5819393.889 55.336 390588.801 5819394.568 54.529 390555.477 5819391.606 54.528 390552.087 5819391.304 54.529 390551.3 5819391.234 54.529 390551.661 5819386.85 59.73 390566.943 5819362.966 54.119 390569.064 5819363.158 54.548 390569.209 5819361.291 54.541 390569.214 5819361.228 54.541 390572.289 5819361.469 55.162 390572.755 5819361.506 55.256 390571.028 5819379.114 55.245 390570.672 5819379.083 55.173 390565.438 5819378.618 54.116 390566.943 5819362.966 54.119 390569.421 5819358.54 54.1 390572.537 5819358.777 54.1 390572.289 5819361.469 54.1 390569.214 5819361.228 54.1 390569.421 5819358.54 54.1 390588.801 5819394.568 32.13 390588.801 5819394.568 54.529 390588.871 5819393.889 55.336 390588.871 5819393.889 32.13 390588.801 5819394.568 32.13 390588.871 5819393.889 32.13 390588.871 5819393.889 55.336 390589.025 5819392.424 57.077 390589.025 5819392.424 32.13 390588.871 5819393.889 32.13 390553.213 5819377.567 32.13 390553.213 5819377.567 56.313 390552.429 5819377.499 56.314 390552.429 5819377.499 32.13 390553.213 5819377.567 32.13 390572.289 5819361.469 54.1 390572.289 5819361.469 55.162 390569.214 5819361.228 54.541 390569.214 5819361.228 54.1 390572.289 5819361.469 54.1 390569.209 5819361.291 32.13 390569.209 5819361.291 54.541 390569.064 5819363.158 54.548 390569.064 5819363.158 32.13 390569.209 5819361.291 32.13 390569.064 5819363.158 32.13 390569.064 5819363.158 54.548 390566.943 5819362.966 54.119 390566.943 5819362.966 32.13 390569.064 5819363.158 32.13 390572.289 5819361.469 55.162 390572.289 5819361.469 55.347 390572.755 5819361.506 55.256 390572.289 5819361.469 55.162 390572.537 5819358.777 54.1 390572.537 5819358.777 55.349 390572.289 5819361.469 55.347 390572.289 5819361.469 55.162 390572.289 5819361.469 54.1 390572.537 5819358.777 54.1 390574.047 5819379.383 56.3 390574.047 5819379.383 60.062 390573.317 5819386.379 60.062 390573.317 5819386.379 58.861 390574.047 5819379.383 56.3 390577.046 5819386.711 58.86 390577.046 5819386.711 60.062 390577.77 5819379.77 60.062 390577.77 5819379.77 56.32 390577.046 5819386.711 58.86 390589.516 5819387.707 32.13 390589.516 5819387.707 58.82 390589.805 5819384.937 57.806 390589.805 5819384.937 32.13 390589.516 5819387.707 32.13 390589.805 5819384.937 32.13 390589.805 5819384.937 57.806 390589.968 5819383.371 57.233 390589.968 5819383.371 32.13 390589.805 5819384.937 32.13 390589.968 5819383.371 32.13 390589.968 5819383.371 57.233 390590.228 5819380.886 56.324 390590.228 5819380.886 32.13 390589.968 5819383.371 32.13 390551.856 5819384.471 58.861 390552.429 5819377.499 56.314 390553.213 5819377.567 56.313 390556.484 5819377.86 56.314 390565.384 5819378.659 56.317 390565.434 5819378.663 56.317 390565.438 5819378.618 56.3 390570.672 5819379.083 56.3 390571.028 5819379.114 56.3 390574.047 5819379.383 56.3 390573.317 5819386.379 58.861 390575.937 5819386.612 58.86 390577.046 5819386.711 58.86 390577.77 5819379.77 56.32 390590.228 5819380.886 56.324 390589.968 5819383.371 57.233 390589.805 5819384.937 57.806 390589.516 5819387.707 58.82 390589.257 5819390.192 59.73 390576.798 5819389.084 59.73 390575.689 5819388.986 59.73 390573.07 5819388.753 59.73 390569.81 5819388.463 59.73 390564.527 5819387.993 59.73 390551.661 5819386.85 59.73 390551.856 5819384.471 58.861 390565.438 5819378.618 54.116 390570.672 5819379.083 55.173 390571.028 5819379.114 55.245 390574.047 5819379.383 54.635 390576.631 5819379.613 54.113 390576.631 5819379.613 60.062 390574.047 5819379.383 60.062 390574.047 5819379.383 56.3 390571.028 5819379.114 56.3 390570.672 5819379.083 56.3 390565.438 5819378.618 56.3 390565.438 5819378.618 54.116 390579.19 5819355.438 32.13 390573.569 5819355.024 32.13 390573.489 5819355.672 32.13 390573.098 5819358.82 32.13 390572.537 5819358.777 32.13 390569.421 5819358.54 32.13 390569.214 5819361.228 32.13 390569.209 5819361.291 32.13 390569.064 5819363.158 32.13 390566.943 5819362.966 32.13 390565.438 5819378.618 32.13 390565.434 5819378.663 32.13 390565.384 5819378.659 32.13 390556.484 5819377.86 32.13 390553.213 5819377.567 32.13 390552.429 5819377.499 32.13 390551.856 5819384.471 32.13 390551.661 5819386.85 32.13 390551.3 5819391.234 32.13 390552.087 5819391.304 32.13 390555.477 5819391.606 32.13 390588.801 5819394.568 32.13 390588.871 5819393.889 32.13 390589.025 5819392.424 32.13 390589.257 5819390.192 32.13 390589.516 5819387.707 32.13 390589.805 5819384.937 32.13 390589.968 5819383.371 32.13 390590.228 5819380.886 32.13 390577.77 5819379.77 32.13 390576.661 5819379.67 32.13 390576.625 5819379.667 32.13 390576.631 5819379.613 32.13 390578.424 5819361.951 32.13 390578.433 5819361.861 32.13 390578.444 5819361.752 32.13 390578.53 5819361.76 32.13 390592.094 5819362.989 32.13 390592.362 5819360.425 32.13 390592.778 5819356.44 32.13 390579.19 5819355.438 32.13 390551.3 5819391.234 54.529 390552.087 5819391.304 54.529 390555.477 5819391.606 54.528 390588.801 5819394.568 54.529 390588.801 5819394.568 32.13 390555.477 5819391.606 32.13 390552.087 5819391.304 32.13 390551.3 5819391.234 32.13 390551.3 5819391.234 54.529 390551.661 5819386.85 32.13 390551.856 5819384.471 32.13 390552.429 5819377.499 32.13 390552.429 5819377.499 56.314 390551.856 5819384.471 58.861 390551.661 5819386.85 59.73 390551.3 5819391.234 54.529 390551.3 5819391.234 32.13 390551.661 5819386.85 32.13 390553.213 5819377.567 32.13 390556.484 5819377.86 32.13 390565.384 5819378.659 32.13 390565.434 5819378.663 32.13 390565.434 5819378.663 56.317 390565.384 5819378.659 56.317 390556.484 5819377.86 56.314 390553.213 5819377.567 56.313 390553.213 5819377.567 32.13 390576.631 5819379.613 60.062 390576.631 5819379.613 54.113 390578.424 5819361.951 54.112 390578.433 5819361.861 54.114 390578.444 5819361.752 54.138 390578.444 5819361.752 32.13 390578.433 5819361.861 32.13 390578.424 5819361.951 32.13 390576.631 5819379.613 32.13 390576.625 5819379.667 32.13 390576.625 5819379.667 60.062 390576.631 5819379.613 60.062 390576.625 5819379.667 32.13 390576.661 5819379.67 32.13 390577.77 5819379.77 32.13 390590.228 5819380.886 32.13 390590.228 5819380.886 56.324 390577.77 5819379.77 56.32 390577.77 5819379.77 60.062 390576.661 5819379.67 60.062 390576.625 5819379.667 60.062 390576.625 5819379.667 32.13 390592.778 5819356.44 32.13 390592.362 5819360.425 32.13 390592.094 5819362.989 32.13 390592.094 5819362.989 54.103 390592.362 5819360.425 54.589 390592.778 5819356.44 55.344 390592.778 5819356.44 32.13 390573.569 5819355.024 32.13 390579.19 5819355.438 32.13 390592.778 5819356.44 32.13 390592.778 5819356.44 55.344 390579.19 5819355.438 55.341 390573.569 5819355.024 55.341 390573.569 5819355.024 32.13 390578.444 5819361.752 54.138 390578.53 5819361.76 54.138 390592.094 5819362.989 54.103 390592.094 5819362.989 32.13 390578.53 5819361.76 32.13 390578.444 5819361.752 32.13 390578.444 5819361.752 54.138 390573.317 5819386.379 60.062 390575.937 5819386.612 60.062 390577.046 5819386.711 60.062 390577.046 5819386.711 58.86 390575.937 5819386.612 58.86 390573.317 5819386.379 58.861 390573.317 5819386.379 60.062 390569.421 5819358.54 32.13 390572.537 5819358.777 32.13 390573.098 5819358.82 32.13 390573.098 5819358.82 55.237 390572.537 5819358.777 55.349 390572.537 5819358.777 54.1 390569.421 5819358.54 54.1 390569.421 5819358.54 32.13 390573.489 5819355.672 32.13 390573.569 5819355.024 32.13 390573.569 5819355.024 55.341 390573.489 5819355.672 55.22 390573.098 5819358.82 55.237 390573.098 5819358.82 32.13 390573.489 5819355.672 32.13 390569.214 5819361.228 32.13 390569.421 5819358.54 32.13 390569.421 5819358.54 54.1 390569.214 5819361.228 54.1 390569.214 5819361.228 54.541 390569.209 5819361.291 54.541 390569.209 5819361.291 32.13 390569.214 5819361.228 32.13 390565.438 5819378.618 32.13 390566.943 5819362.966 32.13 390566.943 5819362.966 54.119 390565.438 5819378.618 54.116 390565.438 5819378.618 56.3 390565.434 5819378.663 56.317 390565.434 5819378.663 32.13 390565.438 5819378.618 32.13 390589.516 5819387.707 58.82 390589.516 5819387.707 32.13 390589.257 5819390.192 32.13 390589.025 5819392.424 32.13 390589.025 5819392.424 57.077 390589.257 5819390.192 59.73 390589.516 5819387.707 58.82 390573.569 5819355.024 55.341 390579.19 5819355.438 55.341 390592.778 5819356.44 55.344 390592.362 5819360.425 54.589 390592.094 5819362.989 54.103 390578.53 5819361.76 54.138 390578.444 5819361.752 54.138 390578.433 5819361.861 54.114 390573.489 5819355.672 55.22 390573.569 5819355.024 55.341 390574.047 5819379.383 60.062 390576.631 5819379.613 60.062 390576.625 5819379.667 60.062 390576.661 5819379.67 60.062 390577.77 5819379.77 60.062 390577.046 5819386.711 60.062 390575.937 5819386.612 60.062 390573.317 5819386.379 60.062 390574.047 5819379.383 60.062 390572.755 5819361.506 55.256 390572.289 5819361.469 55.347 390572.537 5819358.777 55.349 390573.098 5819358.82 55.237 390573.489 5819355.672 55.22 390578.433 5819361.861 54.114 390578.424 5819361.951 54.112 390576.631 5819379.613 54.113 390574.047 5819379.383 54.635 390571.028 5819379.114 55.245 390572.755 5819361.506 55.256 BLDG_0003000e002837d7 1130 390493.983357642 5819348.19993014 33.4900016784668 390494.523014082 5819341.05479498 33.4900016784668 390483.656689953 5819340.23404114 33.4900016784668 390483.316013643 5819344.74436944 33.4900016784668 390478.193904148 5819344.35751166 33.4900016784668 390477.994899531 5819346.99236931 33.4900016784668 390483.116996391 5819347.3792261 33.4900016784668 390493.983357642 5819348.19993014 33.4900016784668 390483.117289549 5819347.37958952 47 390477.995187885 5819346.99279632 47 390478.194192502 5819344.35793868 47 390483.316301999 5819344.74479645 47 390483.117289549 5819347.37958952 47 390494.523419185 5819341.05539487 52.4696928071602 390493.983730456 5819348.20051607 52.4696928071602 390488.550675374 5819347.79029763 57.4809500003743 390489.090364118 5819340.64517635 57.4809500003743 390494.523419185 5819341.05539487 52.4696928071602 390483.117406294 5819347.3797624 52.4696928071602 390483.657095052 5819340.23464103 52.4696928071602 390489.090364118 5819340.64517635 57.4809500003743 390488.550675374 5819347.79029763 57.4809500003743 390483.117406294 5819347.3797624 52.4696928071602 390494.523014082 5819341.05479498 33.4900016784668 390493.983357642 5819348.19993014 33.4900016784668 390493.983613711 5819348.20034318 47 390493.983730456 5819348.20051607 52.4696928071602 390494.523419185 5819341.05539487 52.4696928071602 390494.52330244 5819341.055222 47 390494.523014082 5819341.05479498 33.4900016784668 390483.656689953 5819340.23404114 33.4900016784668 390494.523014082 5819341.05479498 33.4900016784668 390494.52330244 5819341.055222 47 390494.523419185 5819341.05539487 52.4696928071602 390489.090364118 5819340.64517635 57.4809500003743 390483.657095052 5819340.23464103 52.4696928071602 390483.656978308 5819340.23446815 47 390483.656689953 5819340.23404114 33.4900016784668 390483.117406294 5819347.3797624 52.4696928071602 390488.550675374 5819347.79029763 57.4809500003743 390493.983730456 5819348.20051607 52.4696928071602 390493.983613711 5819348.20034318 47 390493.983357642 5819348.19993014 33.4900016784668 390483.116996391 5819347.3792261 33.4900016784668 390477.994899531 5819346.99236931 33.4900016784668 390477.995187885 5819346.99279632 47 390483.117289549 5819347.37958952 47 390483.117406294 5819347.3797624 52.4696928071602 390477.994899531 5819346.99236931 33.4900016784668 390478.193904148 5819344.35751166 33.4900016784668 390478.194192502 5819344.35793868 47 390477.995187885 5819346.99279632 47 390477.994899531 5819346.99236931 33.4900016784668 390483.316013643 5819344.74436944 33.4900016784668 390483.656689953 5819340.23404114 33.4900016784668 390483.656978308 5819340.23446815 47 390483.657095052 5819340.23464103 52.4696928071602 390483.117406294 5819347.3797624 52.4696928071602 390483.117289549 5819347.37958952 47 390483.316301999 5819344.74479645 47 390483.316013643 5819344.74436944 33.4900016784668 390478.193904148 5819344.35751166 33.4900016784668 390483.316013643 5819344.74436944 33.4900016784668 390483.316301999 5819344.74479645 47 390478.194192502 5819344.35793868 47 390478.193904148 5819344.35751166 33.4900016784668 BLDG_0003000e00531822 1130 390494.553496086 5819341.24981781 33.7299995422363 390483.65672975 5819340.23405586 33.7299995422363 390483.657098358 5819340.23460172 51 390489.105531612 5819340.7425568 53.344685057376 390494.553864698 5819341.25036366 51 390494.553496086 5819341.24981781 33.7299995422363 390484.184789293 5819334.56924828 33.7299995422363 390478.569256795 5819334.04579222 33.7299995422363 390478.569625401 5819334.04633807 51 390484.185157901 5819334.56979413 51 390484.184789293 5819334.56924828 33.7299995422363 390483.65672975 5819340.23405586 33.7299995422363 390484.184789293 5819334.56924828 33.7299995422363 390484.185157901 5819334.56979413 51 390483.657098358 5819340.23460172 51 390483.65672975 5819340.23405586 33.7299995422363 390495.607588114 5819329.94644869 51 390495.607151605 5819329.94593381 33.7299995422363 390494.553496086 5819341.24981781 33.7299995422363 390494.553864698 5819341.25036366 51 390495.08192531 5819335.58554443 51 390495.607588114 5819329.94644869 51 390478.569256795 5819334.04579222 33.7299995422363 390479.094910098 5819328.40673268 33.7299995422363 390479.095278705 5819328.40727853 51 390478.569625401 5819334.04633807 51 390478.569256795 5819334.04579222 33.7299995422363 390479.095278705 5819328.40727853 51 390479.094910098 5819328.40673268 33.7299995422363 390484.710448679 5819328.93018938 33.7299995422363 390495.607151605 5819329.94593381 33.7299995422363 390495.607588114 5819329.94644869 51 390490.159255058 5819329.43864169 53.344685057376 390484.710821833 5819328.93068647 51 390479.095278705 5819328.40727853 51 390484.185157901 5819334.56979413 51 390478.569625401 5819334.04633807 51 390479.095278705 5819328.40727853 51 390484.710821833 5819328.93068647 51 390484.185157901 5819334.56979413 51 390483.657098358 5819340.23460172 51 390484.185157901 5819334.56979413 51 390484.710821833 5819328.93068647 51 390490.159255058 5819329.43864169 53.344685057376 390489.105531612 5819340.7425568 53.344685057376 390483.657098358 5819340.23460172 51 390495.607588114 5819329.94644869 51 390495.08192531 5819335.58554443 51 390494.553864698 5819341.25036366 51 390489.105531612 5819340.7425568 53.344685057376 390490.159255058 5819329.43864169 53.344685057376 390495.607588114 5819329.94644869 51 390483.65672975 5819340.23405586 33.7299995422363 390494.553496086 5819341.24981781 33.7299995422363 390495.607151605 5819329.94593381 33.7299995422363 390484.710448679 5819328.93018938 33.7299995422363 390479.094910098 5819328.40673268 33.7299995422363 390478.569256795 5819334.04579222 33.7299995422363 390484.184789293 5819334.56924828 33.7299995422363 390483.65672975 5819340.23405586 33.7299995422363 BLDG_0003000e00a4fcbf 1130 390676.427223572 5819240.03417249 56.0012921181325 390669.149536598 5819239.49453811 56 390669.65204424 5819232.73518856 63.2 390676.930087008 5819233.27606924 63.2 390676.427223572 5819240.03417249 56.0012921181325 390703.083850149 5819228.42493496 64.2225904352854 390697.315191171 5819305.97704439 64.2225904352854 390689.839326749 5819305.42096258 64.2225904352854 390682.237610615 5819304.85551945 64.2225904352854 390687.00077885 5819240.82091325 64.2225904352854 390676.427399022 5819240.03443224 64.22 390676.858878777 5819234.23370352 64.22 390677.432878698 5819226.51696339 64.22 390688.006267146 5819227.30344529 64.22 390695.607935865 5819227.86884809 64.2225904352854 390703.083850149 5819228.42493496 64.2225904352854 390670.154244582 5819225.97538392 56 390677.43270323 5819226.51670362 56.0004321839286 390676.930087008 5819233.27606924 63.2 390669.65204424 5819232.73518856 63.2 390670.154244582 5819225.97538392 56 390654.690830032 5819286.51142088 59.8 390683.442935325 5819288.65007429 59.8 390682.298542002 5819304.03496631 59.8 390653.546454253 5819301.89631522 59.8 390654.690830032 5819286.51142088 59.8 390703.083180188 5819228.42394311 32.8400001525879 390695.607265908 5819227.86785625 32.8400001525879 390688.005597249 5819227.30245353 32.8400001525879 390670.153750172 5819225.97465195 32.8400001525879 390669.149042189 5819239.49380614 32.8400001525879 390676.426729132 5819240.03344048 32.8400001525879 390687.000108898 5819240.8199214 32.8400001525879 390683.442359788 5819288.6492222 32.8400001525879 390654.690254511 5819286.51056879 32.8400001525879 390653.545878731 5819301.89546312 32.8400001525879 390682.297966465 5819304.0341142 32.8400001525879 390682.236940666 5819304.85452756 32.8400001525879 390697.314521213 5819305.97605251 32.8400001525879 390697.375548299 5819305.15562182 32.8400001525879 390698.519941534 5819289.77073034 32.8400001525879 390703.083180188 5819228.42394311 32.8400001525879 390676.427399022 5819240.03443224 64.22 390687.00077885 5819240.82091325 64.2225904352854 390687.000684437 5819240.82077347 59.8 390687.000603327 5819240.82065339 56.0005489088561 390687.000108898 5819240.8199214 32.8400001525879 390676.426729132 5819240.03344048 32.8400001525879 390669.149042189 5819239.49380614 32.8400001525879 390669.149536598 5819239.49453811 56 390676.427223572 5819240.03417249 56.0012921181325 390676.427399022 5819240.03443224 64.22 390683.442935325 5819288.65007429 59.8 390683.442359788 5819288.6492222 32.8400001525879 390687.000108898 5819240.8199214 32.8400001525879 390687.000603327 5819240.82065339 56.0005489088561 390687.000684437 5819240.82077347 59.8 390687.00077885 5819240.82091325 64.2225904352854 390682.237610615 5819304.85551945 64.2225904352854 390682.237516203 5819304.85537967 59.8 390682.236940666 5819304.85452756 32.8400001525879 390682.297966465 5819304.0341142 32.8400001525879 390682.298542002 5819304.03496631 59.8 390683.442935325 5819288.65007429 59.8 390676.427399022 5819240.03443224 64.22 390676.427223572 5819240.03417249 56.0012921181325 390676.930087008 5819233.27606924 63.2 390677.43270323 5819226.51670362 56.0004321839286 390677.432878698 5819226.51696339 64.22 390676.858878777 5819234.23370352 64.22 390676.427399022 5819240.03443224 64.22 390654.690254511 5819286.51056879 32.8400001525879 390683.442359788 5819288.6492222 32.8400001525879 390683.442935325 5819288.65007429 59.8 390654.690830032 5819286.51142088 59.8 390654.690254511 5819286.51056879 32.8400001525879 390703.083180188 5819228.42394311 32.8400001525879 390698.519941534 5819289.77073034 32.8400001525879 390697.375548299 5819305.15562182 32.8400001525879 390697.314521213 5819305.97605251 32.8400001525879 390697.315096758 5819305.97690461 59.8 390697.315191171 5819305.97704439 64.2225904352854 390703.083850149 5819228.42493496 64.2225904352854 390703.083755735 5819228.42479518 59.8 390703.083180188 5819228.42394311 32.8400001525879 390682.297966465 5819304.0341142 32.8400001525879 390653.545878731 5819301.89546312 32.8400001525879 390653.546454253 5819301.89631522 59.8 390682.298542002 5819304.03496631 59.8 390682.297966465 5819304.0341142 32.8400001525879 390669.149042189 5819239.49380614 32.8400001525879 390670.153750172 5819225.97465195 32.8400001525879 390670.154244582 5819225.97538392 56 390669.65204424 5819232.73518856 63.2 390669.149536598 5819239.49453811 56 390669.149042189 5819239.49380614 32.8400001525879 390653.545878731 5819301.89546312 32.8400001525879 390654.690254511 5819286.51056879 32.8400001525879 390654.690830032 5819286.51142088 59.8 390653.546454253 5819301.89631522 59.8 390653.545878731 5819301.89546312 32.8400001525879 390682.236940666 5819304.85452756 32.8400001525879 390682.237516203 5819304.85537967 59.8 390682.237610615 5819304.85551945 64.2225904352854 390689.839326749 5819305.42096258 64.2225904352854 390697.315191171 5819305.97704439 64.2225904352854 390697.315096758 5819305.97690461 59.8 390697.314521213 5819305.97605251 32.8400001525879 390682.236940666 5819304.85452756 32.8400001525879 390703.083180188 5819228.42394311 32.8400001525879 390703.083755735 5819228.42479518 59.8 390703.083850149 5819228.42493496 64.2225904352854 390695.607935865 5819227.86884809 64.2225904352854 390688.006267146 5819227.30344529 64.22 390677.432878698 5819226.51696339 64.22 390677.43270323 5819226.51670362 56.0004321839286 390670.154244582 5819225.97538392 56 390670.153750172 5819225.97465195 32.8400001525879 390688.005597249 5819227.30245353 32.8400001525879 390695.607265908 5819227.86785625 32.8400001525879 390703.083180188 5819228.42394311 32.8400001525879 BLDG_00030002001b001f 1000 390571.593812243 5819447.21695694 31.6499996185303 390571.255639209 5819453.59164373 31.6499996185303 390587.608633388 5819454.45915183 31.6499996185303 390587.946806393 5819448.08446527 31.6499996185303 390571.593812243 5819447.21695694 31.6499996185303 390571.255639209 5819453.59164373 31.6499996185303 390571.593812243 5819447.21695694 31.6499996185303 390571.594377314 5819447.21779371 58.1224933450407 390571.25620428 5819453.5924805 58.1224933450407 390571.255639209 5819453.59164373 31.6499996185303 390571.593812243 5819447.21695694 31.6499996185303 390587.946806393 5819448.08446527 31.6499996185303 390587.947371473 5819448.08530204 58.1224933450407 390571.594377314 5819447.21779371 58.1224933450407 390571.593812243 5819447.21695694 31.6499996185303 390587.608633388 5819454.45915183 31.6499996185303 390571.255639209 5819453.59164373 31.6499996185303 390571.25620428 5819453.5924805 58.1224933450407 390587.609198468 5819454.4599886 58.1224933450407 390587.608633388 5819454.45915183 31.6499996185303 390587.946806393 5819448.08446527 31.6499996185303 390587.608633388 5819454.45915183 31.6499996185303 390587.609198468 5819454.4599886 58.1224933450407 390587.947371473 5819448.08530204 58.1224933450407 390587.946806393 5819448.08446527 31.6499996185303 390587.947371473 5819448.08530204 58.1224933450407 390587.609198468 5819454.4599886 58.1224933450407 390571.25620428 5819453.5924805 58.1224933450407 390571.594377314 5819447.21779371 58.1224933450407 390587.947371473 5819448.08530204 58.1224933450407 BLDG_0003000000c8d671 1000 390535.707762588 5819460.65539239 27.5200004577637 390534.397707402 5819478.98875462 27.5200004577637 390555.876695775 5819480.52357516 27.5200004577637 390557.18675082 5819462.19021383 27.5200004577637 390551.638427797 5819461.79374799 27.5200004577637 390551.839903716 5819458.97415849 27.5200004577637 390541.33407601 5819458.22346265 27.5200004577637 390541.132601352 5819461.04303444 27.5200004577637 390535.707762588 5819460.65539239 27.5200004577637 390541.132825647 5819461.04336659 38.0280698809707 390541.334300306 5819458.2237948 38.0280698809707 390551.840128013 5819458.97449064 38.0280698809707 390551.638652095 5819461.79408015 38.0280698809707 390541.132825647 5819461.04336659 38.0280698809707 390557.187016843 5819462.19060777 39.9828038055062 390555.876961798 5819480.52396911 39.9828038055062 390534.39797342 5819478.98914857 39.9828038055062 390535.708028607 5819460.65578633 39.9828038055062 390557.187016843 5819462.19060777 39.9828038055062 390541.33407601 5819458.22346265 27.5200004577637 390551.839903716 5819458.97415849 27.5200004577637 390551.840128013 5819458.97449064 38.0280698809707 390541.334300306 5819458.2237948 38.0280698809707 390541.33407601 5819458.22346265 27.5200004577637 390557.18675082 5819462.19021383 27.5200004577637 390555.876695775 5819480.52357516 27.5200004577637 390555.876920074 5819480.52390732 38.0280698809707 390555.876961798 5819480.52396911 39.9828038055062 390557.187016843 5819462.19060777 39.9828038055062 390557.186975119 5819462.19054598 38.0280698809707 390557.18675082 5819462.19021383 27.5200004577637 390534.397707402 5819478.98875462 27.5200004577637 390535.707762588 5819460.65539239 27.5200004577637 390535.707986883 5819460.65572455 38.0280698809707 390535.708028607 5819460.65578633 39.9828038055062 390534.39797342 5819478.98914857 39.9828038055062 390534.397931696 5819478.98908678 38.0280698809707 390534.397707402 5819478.98875462 27.5200004577637 390541.132601352 5819461.04303444 27.5200004577637 390541.33407601 5819458.22346265 27.5200004577637 390541.334300306 5819458.2237948 38.0280698809707 390541.132825647 5819461.04336659 38.0280698809707 390541.132601352 5819461.04303444 27.5200004577637 390551.638652095 5819461.79408015 38.0280698809707 390551.638427797 5819461.79374799 27.5200004577637 390557.18675082 5819462.19021383 27.5200004577637 390557.186975119 5819462.19054598 38.0280698809707 390557.187016843 5819462.19060777 39.9828038055062 390535.708028607 5819460.65578633 39.9828038055062 390535.707986883 5819460.65572455 38.0280698809707 390535.707762588 5819460.65539239 27.5200004577637 390541.132601352 5819461.04303444 27.5200004577637 390541.132825647 5819461.04336659 38.0280698809707 390551.638652095 5819461.79408015 38.0280698809707 390555.876695775 5819480.52357516 27.5200004577637 390534.397707402 5819478.98875462 27.5200004577637 390534.397931696 5819478.98908678 38.0280698809707 390534.39797342 5819478.98914857 39.9828038055062 390555.876961798 5819480.52396911 39.9828038055062 390555.876920074 5819480.52390732 38.0280698809707 390555.876695775 5819480.52357516 27.5200004577637 390551.839903716 5819458.97415849 27.5200004577637 390551.638427797 5819461.79374799 27.5200004577637 390551.638652095 5819461.79408015 38.0280698809707 390551.840128013 5819458.97449064 38.0280698809707 390551.839903716 5819458.97415849 27.5200004577637 BLDG_0003000f001c07a1 1000 390515.011301337 5819481.01946802 57.8 390515.341154928 5819476.46263649 57.8 390521.317144139 5819476.89521458 57.8 390520.595356639 5819486.86650021 57.8 390514.619367407 5819486.43392225 57.8 390508.018354833 5819485.95610135 57.8 390504.022410254 5819485.66659525 57.8 390503.032570737 5819485.59494472 57.8 390504.718666838 5819462.30202061 57.8 390505.708506347 5819462.37367119 57.8 390509.704469302 5819462.66292319 57.8 390508.740142378 5819475.98481544 57.8 390508.410288776 5819480.54164703 57.8 390515.011301337 5819481.01946802 57.8 390503.537190873 5819455.36849738 54.8 390505.21171949 5819455.48966638 54.8 390510.197531276 5819455.85044006 54.8 390516.797265492 5819456.32799727 54.8 390516.407467096 5819461.71488068 54.8 390509.807605874 5819461.23714274 54.8 390509.704405269 5819462.66282836 54.8 390504.718602806 5819462.30192578 54.8 390503.032488295 5819485.59510421 54.8 390504.022346222 5819485.66650042 54.8 390514.618809929 5819486.43353605 54.8 390514.524446652 5819487.73760613 54.8 390501.264371881 5819486.7781072 54.8 390501.358741583 5819485.47394838 54.8 390503.537190873 5819455.36849738 54.8 390508.410327196 5819480.54170393 59.6 390509.807708327 5819461.23729446 59.6 390516.408720842 5819461.71511574 59.6 390515.011339757 5819481.01952492 59.6 390508.410327196 5819480.54170393 59.6 390520.594951092 5819486.86589963 38.8 390520.508489211 5819488.166162 38.8 390514.524105141 5819487.73710038 38.8 390514.618468418 5819486.4330303 38.8 390520.594951092 5819486.86589963 38.8 390521.316738592 5819476.894614 38.8 390515.339979592 5819476.46198019 38.8 390516.407125584 5819461.71437493 38.8 390522.390928907 5819462.1511503 38.8 390521.316738592 5819476.894614 38.8 390503.032488295 5819485.59510421 54.8 390504.718602806 5819462.30192578 54.8 390504.718666838 5819462.30202061 57.8 390503.032570737 5819485.59494472 57.8 390503.032488295 5819485.59510421 54.8 390501.263855351 5819486.77734224 30.6000003814697 390501.358225053 5819485.47318342 30.6000003814697 390503.536674342 5819455.36773244 30.6000003814697 390503.537190873 5819455.36849738 54.8 390501.358741583 5819485.47394838 54.8 390501.264371881 5819486.7781072 54.8 390501.263855351 5819486.77734224 30.6000003814697 390507.923383302 5819487.25922565 30.6000003814697 390501.263855351 5819486.77734224 30.6000003814697 390501.264371881 5819486.7781072 54.8 390514.524446652 5819487.73760613 54.8 390514.524105141 5819487.73710038 38.8 390520.508489211 5819488.166162 38.8 390520.508314184 5819488.16590279 30.6000003814697 390514.523930116 5819487.73684118 30.6000003814697 390507.923383302 5819487.25922565 30.6000003814697 390509.704405269 5819462.66282836 54.8 390509.704469302 5819462.66292319 57.8 390505.708506347 5819462.37367119 57.8 390504.718666838 5819462.30202061 57.8 390504.718602806 5819462.30192578 54.8 390509.704405269 5819462.66282836 54.8 390516.406950559 5819461.71411573 30.6000003814697 390522.390753881 5819462.1508911 30.6000003814697 390522.390928907 5819462.1511503 38.8 390516.407125584 5819461.71437493 38.8 390516.406950559 5819461.71411573 30.6000003814697 390515.339979592 5819476.46198019 38.8 390521.316738592 5819476.894614 38.8 390521.317144139 5819476.89521458 57.8 390515.341154928 5819476.46263649 57.8 390515.339979592 5819476.46198019 38.8 390516.796748955 5819456.32723232 30.6000003814697 390516.797265492 5819456.32799727 54.8 390510.197531276 5819455.85044006 54.8 390505.21171949 5819455.48966638 54.8 390503.537190873 5819455.36849738 54.8 390503.536674342 5819455.36773244 30.6000003814697 390505.211202959 5819455.48890144 30.6000003814697 390510.197014742 5819455.84967512 30.6000003814697 390516.796748955 5819456.32723232 30.6000003814697 390515.011301337 5819481.01946802 57.8 390508.410288776 5819480.54164703 57.8 390508.410327196 5819480.54170393 59.6 390515.011339757 5819481.01952492 59.6 390515.011301337 5819481.01946802 57.8 390514.618468418 5819486.4330303 38.8 390514.524105141 5819487.73710038 38.8 390514.524446652 5819487.73760613 54.8 390514.618809929 5819486.43353605 54.8 390514.618468418 5819486.4330303 38.8 390509.704405269 5819462.66282836 54.8 390509.807605874 5819461.23714274 54.8 390509.807669907 5819461.23723757 57.8 390509.807708327 5819461.23729446 59.6 390508.410327196 5819480.54170393 59.6 390508.410288776 5819480.54164703 57.8 390508.740142378 5819475.98481544 57.8 390509.704469302 5819462.66292319 57.8 390509.704405269 5819462.66282836 54.8 390509.807605874 5819461.23714274 54.8 390516.407467096 5819461.71488068 54.8 390516.408682422 5819461.71505884 57.8 390516.408720842 5819461.71511574 59.6 390509.807708327 5819461.23729446 59.6 390509.807669907 5819461.23723757 57.8 390509.807605874 5819461.23714274 54.8 390504.022346222 5819485.66650042 54.8 390503.032488295 5819485.59510421 54.8 390503.032570737 5819485.59494472 57.8 390504.022410254 5819485.66659525 57.8 390508.018354833 5819485.95610135 57.8 390514.619367407 5819486.43392225 57.8 390520.595356639 5819486.86650021 57.8 390520.594951092 5819486.86589963 38.8 390514.618468418 5819486.4330303 38.8 390514.618809929 5819486.43353605 54.8 390504.022346222 5819485.66650042 54.8 390515.339979592 5819476.46198019 38.8 390515.341154928 5819476.46263649 57.8 390515.011301337 5819481.01946802 57.8 390515.011339757 5819481.01952492 59.6 390516.408720842 5819461.71511574 59.6 390516.408682422 5819461.71505884 57.8 390516.407467096 5819461.71488068 54.8 390516.797265492 5819456.32799727 54.8 390516.796748955 5819456.32723232 30.6000003814697 390516.406950559 5819461.71411573 30.6000003814697 390516.407125584 5819461.71437493 38.8 390515.339979592 5819476.46198019 38.8 390522.390928907 5819462.1511503 38.8 390522.390753881 5819462.1508911 30.6000003814697 390521.323882036 5819476.89488456 30.6000003814697 390520.602361076 5819486.86618948 30.6000003814697 390520.508314184 5819488.16590279 30.6000003814697 390520.508489211 5819488.166162 38.8 390520.594951092 5819486.86589963 38.8 390520.595356639 5819486.86650021 57.8 390521.317144139 5819476.89521458 57.8 390521.316738592 5819476.894614 38.8 390522.390928907 5819462.1511503 38.8 390503.536674342 5819455.36773244 30.6000003814697 390501.358225053 5819485.47318342 30.6000003814697 390501.263855351 5819486.77734224 30.6000003814697 390507.923383302 5819487.25922565 30.6000003814697 390514.523930116 5819487.73684118 30.6000003814697 390520.508314184 5819488.16590279 30.6000003814697 390520.602361076 5819486.86618948 30.6000003814697 390521.323882036 5819476.89488456 30.6000003814697 390522.390753881 5819462.1508911 30.6000003814697 390516.406950559 5819461.71411573 30.6000003814697 390516.796748955 5819456.32723232 30.6000003814697 390510.197014742 5819455.84967512 30.6000003814697 390505.211202959 5819455.48890144 30.6000003814697 390503.536674342 5819455.36773244 30.6000003814697 BLDG_0003000e00742389 1130 390559.584583194 5819452.07025445 27.5200004577637 390533.821300617 5819450.27765831 27.5200004577637 390523.34665429 5819449.5488377 27.5200004577637 390522.766431857 5819457.92656498 27.5200004577637 390533.238390891 5819458.6551984 27.5200004577637 390559.001673543 5819460.44779405 27.5200004577637 390557.607374206 5819480.48658286 27.5200004577637 390556.913383674 5819490.46057928 27.5200004577637 390566.243434366 5819491.10975863 27.5200004577637 390567.385341804 5819491.18921187 27.5200004577637 390568.0793323 5819481.21521569 27.5200004577637 390569.519495639 5819460.51727174 27.5200004577637 390570.057009587 5819452.7921561 27.5200004577637 390568.915102163 5819452.71270276 27.5200004577637 390559.584583194 5819452.07025445 27.5200004577637 390533.238390891 5819458.6551984 27.5200004577637 390522.766431857 5819457.92656498 27.5200004577637 390521.372132265 5819477.96535544 27.5200004577637 390520.678177841 5819487.93883192 27.5200004577637 390531.150136985 5819488.66746462 27.5200004577637 390556.913383674 5819490.46057928 27.5200004577637 390557.607374206 5819480.48658286 27.5200004577637 390531.844091373 5819478.69398839 27.5200004577637 390533.238390891 5819458.6551984 27.5200004577637 390520.678177841 5819487.93883192 27.5200004577637 390520.678484682 5819487.93928633 41.8955513001981 390520.678753719 5819487.93968475 54.5 390531.150712868 5819488.66831746 54.5 390556.913959571 5819490.46143211 54.5 390566.244010268 5819491.11061146 54.5 390567.244227134 5819491.18020595 54.5 390567.385917707 5819491.1900647 54.5 390567.385341804 5819491.18921187 27.5200004577637 390566.243434366 5819491.10975863 27.5200004577637 390556.913383674 5819490.46057928 27.5200004577637 390531.150136985 5819488.66746462 27.5200004577637 390520.678177841 5819487.93883192 27.5200004577637 390523.34665429 5819449.5488377 27.5200004577637 390523.347230169 5819449.54969052 54.5 390522.767007735 5819457.9274178 54.5 390520.678753719 5819487.93968475 54.5 390520.678484682 5819487.93928633 41.8955513001981 390520.678177841 5819487.93883192 27.5200004577637 390521.372132265 5819477.96535544 27.5200004577637 390522.766431857 5819457.92656498 27.5200004577637 390523.34665429 5819449.5488377 27.5200004577637 390568.0793323 5819481.21521569 27.5200004577637 390567.385341804 5819491.18921187 27.5200004577637 390567.385917707 5819491.1900647 54.5 390568.07987977 5819481.21647715 54.5 390570.057585491 5819452.79300891 54.5 390570.057009587 5819452.7921561 27.5200004577637 390569.519495639 5819460.51727174 27.5200004577637 390568.0793323 5819481.21521569 27.5200004577637 390570.057009587 5819452.7921561 27.5200004577637 390570.057585491 5819452.79300891 54.5 390568.915678067 5819452.71355558 54.5 390559.585159092 5819452.07110726 54.5 390523.347230169 5819449.54969052 54.5 390523.34665429 5819449.5488377 27.5200004577637 390533.821300617 5819450.27765831 27.5200004577637 390559.584583194 5819452.07025445 27.5200004577637 390568.915102163 5819452.71270276 27.5200004577637 390570.057009587 5819452.7921561 27.5200004577637 390531.844091373 5819478.69398839 27.5200004577637 390557.607374206 5819480.48658286 27.5200004577637 390557.607921671 5819480.48784432 54.5 390531.844667256 5819478.69484122 54.5 390531.844091373 5819478.69398839 27.5200004577637 390557.607374206 5819480.48658286 27.5200004577637 390559.001673543 5819460.44779405 27.5200004577637 390559.001691883 5819460.44782121 28.3792001538216 390559.002249441 5819460.44864687 54.5 390557.607921671 5819480.48784432 54.5 390557.607374206 5819480.48658286 27.5200004577637 390533.238390891 5819458.6551984 27.5200004577637 390531.844091373 5819478.69398839 27.5200004577637 390531.844667256 5819478.69484122 54.5 390533.238966775 5819458.65605122 54.5 390533.23840923 5819458.65522556 28.3792001538197 390533.238390891 5819458.6551984 27.5200004577637 390559.001673543 5819460.44779405 27.5200004577637 390533.238390891 5819458.6551984 27.5200004577637 390533.23840923 5819458.65522556 28.3792001538197 390533.238966775 5819458.65605122 54.5 390559.002249441 5819460.44864687 54.5 390559.001691883 5819460.44782121 28.3792001538216 390559.001673543 5819460.44779405 27.5200004577637 390556.913959571 5819490.46143211 54.5 390531.150712868 5819488.66831746 54.5 390536.898820672 5819484.05788569 61 390551.858761566 5819485.09878965 61 390556.913959571 5819490.46143211 54.5 390531.844667256 5819478.69484122 54.5 390557.607921671 5819480.48784432 54.5 390551.858761566 5819485.09878965 61 390536.898820672 5819484.05788569 61 390531.844667256 5819478.69484122 54.5 390557.607921671 5819480.48784432 54.5 390556.913959571 5819490.46143211 54.5 390551.858761566 5819485.09878965 61 390557.607921671 5819480.48784432 54.5 390570.057585491 5819452.79300891 54.5 390568.07987977 5819481.21647715 54.5 390567.385917707 5819491.1900647 54.5 390567.244227134 5819491.18020595 54.5 390566.244010268 5819491.11061146 54.5 390556.913959571 5819490.46143211 54.5 390557.607921671 5819480.48784432 54.5 390559.002249441 5819460.44864687 54.5 390533.238966775 5819458.65605122 54.5 390531.844667256 5819478.69484122 54.5 390531.150712868 5819488.66831746 54.5 390520.678753719 5819487.93968475 54.5 390522.767007735 5819457.9274178 54.5 390523.347230169 5819449.54969052 54.5 390559.585159092 5819452.07110726 54.5 390568.915678067 5819452.71355558 54.5 390570.057585491 5819452.79300891 54.5 390531.150712868 5819488.66831746 54.5 390531.844667256 5819478.69484122 54.5 390536.898820672 5819484.05788569 61 390531.150712868 5819488.66831746 54.5 DEB_LOD2_UUID_2e63cf9a-99cb-4974-93e1-f3a12a7af4d9 1000 390607.49 5819487.098 60.1 390622.836 5819488.307 60.1 390622.831 5819488.362 60.084 390622.821 5819488.476 60.051 390622.345 5819494.006 58.464 390606.975 5819492.795 58.464 390607.49 5819487.098 60.1 390607.866 5819482.942 59.52 390623.194 5819484.15 59.52 390623.184 5819484.269 59.537 390622.836 5819488.307 60.1 390607.49 5819487.098 60.1 390607.866 5819482.942 59.52 390608.031 5819481.117 58.53 390608.494 5819481.152 58.529 390608.506 5819481.006 58.45 390618.503 5819481.794 58.45 390623.364 5819482.177 58.45 390623.194 5819484.15 59.52 390607.866 5819482.942 59.52 390608.031 5819481.117 58.53 390609.814 5819465.244 37.416 390619.242 5819465.892 37.416 390622.195 5819468.351 37.416 390621.658 5819475.088 37.416 390609.08 5819474.097 37.416 390609.814 5819465.244 37.416 390622.821 5819488.476 60.1 390650.423 5819490.651 60.1 390650.091 5819496.193 58.465 390649.504 5819496.147 58.465 390622.345 5819494.006 58.464 390622.821 5819488.476 60.1 390622.831 5819488.362 60.084 390622.836 5819488.307 60.077 390623.184 5819484.269 59.52 390650.676 5819486.436 59.52 390650.589 5819487.887 59.72 390650.445 5819490.291 60.05 390650.423 5819490.651 60.1 390622.821 5819488.476 60.1 390622.831 5819488.362 60.084 390623.194 5819484.15 59.459 390623.364 5819482.177 58.45 390624.853 5819482.294 58.45 390624.846 5819482.372 58.49 390632.417 5819482.938 58.474 390632.42 5819482.891 58.45 390650.802 5819484.339 58.45 390650.676 5819486.436 59.52 390623.184 5819484.269 59.52 390623.194 5819484.15 59.459 390650.423 5819490.651 60.451 390650.445 5819490.291 60.58 390655.49 5819490.688 60.58 390655.136 5819496.59 58.468 390654.647 5819496.552 58.468 390650.091 5819496.193 58.465 390650.423 5819490.651 60.451 390650.589 5819487.887 59.72 390650.676 5819486.436 59.2 390650.802 5819484.339 58.45 390655.847 5819484.737 58.45 390655.49 5819490.688 60.58 390650.445 5819490.291 60.58 390650.589 5819487.887 59.72 390650.804 5819484.31 37.416 390655.321 5819484.647 37.416 390655.85 5819484.687 37.416 390655.847 5819484.737 37.416 390650.802 5819484.339 37.416 390650.804 5819484.31 37.416 390608.494 5819481.152 33.63 390608.494 5819481.152 58.529 390608.031 5819481.117 58.53 390608.031 5819481.117 33.63 390608.494 5819481.152 33.63 390623.87 5819475.3 33.63 390623.87 5819475.3 40.97 390621.654 5819475.135 40.97 390621.654 5819475.135 33.63 390623.87 5819475.3 33.63 390621.658 5819475.088 37.416 390621.658 5819475.088 40.97 390609.08 5819474.097 40.97 390609.08 5819474.097 37.416 390621.658 5819475.088 37.416 390622.195 5819468.351 33.63 390622.195 5819468.351 37.416 390619.242 5819465.892 37.416 390619.242 5819465.892 33.63 390622.195 5819468.351 33.63 390619.242 5819465.892 33.63 390619.242 5819465.892 37.416 390609.814 5819465.244 37.416 390609.814 5819465.244 33.63 390619.242 5819465.892 33.63 390632.417 5819482.938 33.63 390632.417 5819482.938 58.474 390624.846 5819482.372 58.49 390624.846 5819482.372 33.63 390632.417 5819482.938 33.63 390650.802 5819484.339 37.416 390650.802 5819484.339 40.919 390650.804 5819484.31 40.919 390650.804 5819484.31 37.416 390650.802 5819484.339 37.416 390648.604 5819484.146 33.63 390648.604 5819484.146 40.919 390648.885 5819480.233 40.919 390648.885 5819480.233 33.63 390648.604 5819484.146 33.63 390648.885 5819480.233 33.63 390648.885 5819480.233 40.919 390650.189 5819480.249 40.919 390650.189 5819480.249 33.63 390648.885 5819480.233 33.63 390650.189 5819480.249 33.63 390650.189 5819480.249 40.919 390651.05 5819479.168 40.919 390651.05 5819479.168 33.63 390650.189 5819480.249 33.63 390650.51 5819474.925 33.63 390650.51 5819474.925 37.45 390649.82 5819474.853 37.45 390649.82 5819474.853 33.63 390650.51 5819474.925 33.63 390649.82 5819474.853 33.63 390649.82 5819474.853 37.45 390650.089 5819473.112 37.45 390650.089 5819473.112 33.63 390649.82 5819474.853 33.63 390650.089 5819473.112 33.63 390650.089 5819473.112 37.45 390648.364 5819471.001 37.45 390648.364 5819471.001 33.63 390650.089 5819473.112 33.63 390648.364 5819471.001 33.63 390648.364 5819471.001 37.45 390646.09 5819470.89 37.45 390646.09 5819470.89 33.63 390648.364 5819471.001 33.63 390646.09 5819470.89 33.63 390646.09 5819470.89 37.45 390643.386 5819467.482 37.45 390643.386 5819467.482 33.63 390646.09 5819470.89 33.63 390643.386 5819467.482 33.63 390643.386 5819467.482 37.45 390636.59 5819467.097 37.45 390636.59 5819467.097 33.63 390643.386 5819467.482 33.63 390636.59 5819467.097 33.63 390636.59 5819467.097 37.45 390633.365 5819469.729 37.45 390633.365 5819469.729 33.63 390636.59 5819467.097 33.63 390654.647 5819496.552 33.63 390654.647 5819496.552 58.468 390655.136 5819496.59 58.468 390655.136 5819496.59 33.63 390654.647 5819496.552 33.63 390655.85 5819484.687 33.63 390655.85 5819484.687 37.416 390655.321 5819484.647 37.416 390655.321 5819484.647 33.63 390655.85 5819484.687 33.63 390623.184 5819484.269 59.537 390623.194 5819484.15 59.52 390623.364 5819482.177 58.45 390623.194 5819484.15 59.459 390623.184 5819484.269 59.52 390622.836 5819488.307 60.077 390622.831 5819488.362 60.084 390622.836 5819488.307 60.1 390623.184 5819484.269 59.537 390606.975 5819492.795 58.464 390622.345 5819494.006 58.464 390649.504 5819496.147 58.465 390650.091 5819496.193 58.465 390654.647 5819496.552 58.468 390654.647 5819496.552 33.63 390650.091 5819496.193 33.63 390649.504 5819496.147 33.63 390622.345 5819494.006 33.63 390606.975 5819492.795 33.63 390606.975 5819492.795 58.464 390655.321 5819484.647 33.63 390650.804 5819484.31 33.63 390650.162 5819484.262 33.63 390648.604 5819484.146 33.63 390648.885 5819480.233 33.63 390650.189 5819480.249 33.63 390651.05 5819479.168 33.63 390651.188 5819477.907 33.63 390651.241 5819477.419 33.63 390651.338 5819476.531 33.63 390651.277 5819476.413 33.63 390650.51 5819474.925 33.63 390649.82 5819474.853 33.63 390650.089 5819473.112 33.63 390648.364 5819471.001 33.63 390646.09 5819470.89 33.63 390643.386 5819467.482 33.63 390636.59 5819467.097 33.63 390633.365 5819469.729 33.63 390632.917 5819475.975 33.63 390632.42 5819482.891 33.63 390632.417 5819482.938 33.63 390624.846 5819482.372 33.63 390624.853 5819482.294 33.63 390625.276 5819477.257 33.63 390624.827 5819476.632 33.63 390623.947 5819475.407 33.63 390623.87 5819475.3 33.63 390621.654 5819475.135 33.63 390621.658 5819475.088 33.63 390622.195 5819468.351 33.63 390619.242 5819465.892 33.63 390609.814 5819465.244 33.63 390609.08 5819474.097 33.63 390609.072 5819474.196 33.63 390608.506 5819481.006 33.63 390608.494 5819481.152 33.63 390608.031 5819481.117 33.63 390607.866 5819482.942 33.63 390607.49 5819487.098 33.63 390606.975 5819492.795 33.63 390622.345 5819494.006 33.63 390649.504 5819496.147 33.63 390650.091 5819496.193 33.63 390654.647 5819496.552 33.63 390655.136 5819496.59 33.63 390655.49 5819490.688 33.63 390655.847 5819484.737 33.63 390655.85 5819484.687 33.63 390655.321 5819484.647 33.63 390609.072 5819474.196 40.97 390609.08 5819474.097 40.97 390621.658 5819475.088 40.97 390621.654 5819475.135 40.97 390623.87 5819475.3 40.97 390623.947 5819475.407 40.97 390624.827 5819476.632 40.97 390625.276 5819477.257 40.97 390624.853 5819482.294 40.97 390623.364 5819482.177 40.97 390618.503 5819481.794 40.97 390608.506 5819481.006 40.97 390609.072 5819474.196 40.97 390607.49 5819487.098 33.63 390607.866 5819482.942 33.63 390608.031 5819481.117 33.63 390608.031 5819481.117 58.53 390607.866 5819482.942 59.52 390607.49 5819487.098 60.1 390606.975 5819492.795 58.464 390606.975 5819492.795 33.63 390607.49 5819487.098 33.63 390608.506 5819481.006 40.97 390618.503 5819481.794 40.97 390623.364 5819482.177 40.97 390624.853 5819482.294 40.97 390624.853 5819482.294 58.45 390623.364 5819482.177 58.45 390618.503 5819481.794 58.45 390608.506 5819481.006 58.45 390608.506 5819481.006 40.97 390623.87 5819475.3 33.63 390623.947 5819475.407 33.63 390624.827 5819476.632 33.63 390625.276 5819477.257 33.63 390625.276 5819477.257 40.97 390624.827 5819476.632 40.97 390623.947 5819475.407 40.97 390623.87 5819475.3 40.97 390623.87 5819475.3 33.63 390632.42 5819482.891 33.63 390632.917 5819475.975 33.63 390633.365 5819469.729 33.63 390633.365 5819469.729 37.45 390632.917 5819475.975 37.45 390632.917 5819475.975 40.919 390632.42 5819482.891 40.919 390632.42 5819482.891 58.45 390632.417 5819482.938 58.474 390632.417 5819482.938 33.63 390632.42 5819482.891 33.63 390648.604 5819484.146 33.63 390650.162 5819484.262 33.63 390650.804 5819484.31 33.63 390655.321 5819484.647 33.63 390655.321 5819484.647 37.416 390650.804 5819484.31 37.416 390650.804 5819484.31 40.919 390650.162 5819484.262 40.919 390648.604 5819484.146 40.919 390648.604 5819484.146 33.63 390651.188 5819477.907 40.919 390651.241 5819477.419 40.919 390651.241 5819477.419 37.45 390651.338 5819476.531 37.45 390651.338 5819476.531 33.63 390651.241 5819477.419 33.63 390651.188 5819477.907 33.63 390651.05 5819479.168 33.63 390651.05 5819479.168 40.919 390651.188 5819477.907 40.919 390655.847 5819484.737 58.45 390655.847 5819484.737 37.416 390655.85 5819484.687 37.416 390655.85 5819484.687 33.63 390655.847 5819484.737 33.63 390655.49 5819490.688 33.63 390655.136 5819496.59 33.63 390655.136 5819496.59 58.468 390655.49 5819490.688 60.58 390655.847 5819484.737 58.45 390650.423 5819490.651 60.1 390650.445 5819490.291 60.05 390650.589 5819487.887 59.72 390650.445 5819490.291 60.58 390650.423 5819490.651 60.451 390650.091 5819496.193 58.465 390650.423 5819490.651 60.1 390650.51 5819474.925 33.63 390651.277 5819476.413 33.63 390651.338 5819476.531 33.63 390651.338 5819476.531 37.45 390651.277 5819476.413 37.45 390650.51 5819474.925 37.45 390650.51 5819474.925 33.63 390632.917 5819475.975 37.45 390651.217 5819477.417 37.45 390651.241 5819477.419 37.45 390651.241 5819477.419 40.919 390651.217 5819477.417 40.919 390632.917 5819475.975 40.919 390632.917 5819475.975 37.45 390632.42 5819482.891 40.919 390650.802 5819484.339 40.919 390650.802 5819484.339 37.416 390655.847 5819484.737 37.416 390655.847 5819484.737 58.45 390650.802 5819484.339 58.45 390632.42 5819482.891 58.45 390632.42 5819482.891 40.919 390650.676 5819486.436 59.52 390650.802 5819484.339 58.45 390650.676 5819486.436 59.2 390650.589 5819487.887 59.72 390650.676 5819486.436 59.52 390622.821 5819488.476 60.051 390622.831 5819488.362 60.084 390622.821 5819488.476 60.1 390622.345 5819494.006 58.464 390622.821 5819488.476 60.051 390624.853 5819482.294 58.45 390624.853 5819482.294 40.97 390625.276 5819477.257 40.97 390625.276 5819477.257 33.63 390624.853 5819482.294 33.63 390624.846 5819482.372 33.63 390624.846 5819482.372 58.49 390624.853 5819482.294 58.45 390609.08 5819474.097 33.63 390609.814 5819465.244 33.63 390609.814 5819465.244 37.416 390609.08 5819474.097 37.416 390609.08 5819474.097 40.97 390609.072 5819474.196 40.97 390609.072 5819474.196 33.63 390609.08 5819474.097 33.63 390621.658 5819475.088 40.97 390621.658 5819475.088 37.416 390622.195 5819468.351 37.416 390622.195 5819468.351 33.63 390621.658 5819475.088 33.63 390621.654 5819475.135 33.63 390621.654 5819475.135 40.97 390621.658 5819475.088 40.97 390608.506 5819481.006 33.63 390609.072 5819474.196 33.63 390609.072 5819474.196 40.97 390608.506 5819481.006 40.97 390608.506 5819481.006 58.45 390608.494 5819481.152 58.529 390608.494 5819481.152 33.63 390608.506 5819481.006 33.63 390633.365 5819469.729 37.45 390636.59 5819467.097 37.45 390643.386 5819467.482 37.45 390646.09 5819470.89 37.45 390648.364 5819471.001 37.45 390650.089 5819473.112 37.45 390649.82 5819474.853 37.45 390650.51 5819474.925 37.45 390651.277 5819476.413 37.45 390651.338 5819476.531 37.45 390651.241 5819477.419 37.45 390651.217 5819477.417 37.45 390632.917 5819475.975 37.45 390633.365 5819469.729 37.45 390632.917 5819475.975 40.919 390651.217 5819477.417 40.919 390651.241 5819477.419 40.919 390651.188 5819477.907 40.919 390651.05 5819479.168 40.919 390650.189 5819480.249 40.919 390648.885 5819480.233 40.919 390648.604 5819484.146 40.919 390650.162 5819484.262 40.919 390650.804 5819484.31 40.919 390650.802 5819484.339 40.919 390632.42 5819482.891 40.919 390632.917 5819475.975 40.919 BLDG_000300020068278e 1000 390657.575218434 5819472.93218088 33.5800018310547 390657.180603998 5819479.74699106 33.5800018310547 390669.63649883 5819480.46824865 33.5800018310547 390670.031113242 5819473.65343867 33.5800018310547 390657.575218434 5819472.93218088 33.5800018310547 390657.180603998 5819479.74699106 33.5800018310547 390657.575218434 5819472.93218088 33.5800018310547 390657.57534908 5819472.93237433 39.7 390657.180734644 5819479.74718451 39.7 390657.180603998 5819479.74699106 33.5800018310547 390669.63649883 5819480.46824865 33.5800018310547 390657.180603998 5819479.74699106 33.5800018310547 390657.180734644 5819479.74718451 39.7 390669.636629478 5819480.4684421 39.7 390669.63649883 5819480.46824865 33.5800018310547 390657.575218434 5819472.93218088 33.5800018310547 390670.031113242 5819473.65343867 33.5800018310547 390670.031243889 5819473.65363212 39.7 390657.57534908 5819472.93237433 39.7 390657.575218434 5819472.93218088 33.5800018310547 390670.031113242 5819473.65343867 33.5800018310547 390669.63649883 5819480.46824865 33.5800018310547 390669.636629478 5819480.4684421 39.7 390670.031243889 5819473.65363212 39.7 390670.031113242 5819473.65343867 33.5800018310547 390670.031243889 5819473.65363212 39.7 390669.636629478 5819480.4684421 39.7 390657.180734644 5819479.74718451 39.7 390657.57534908 5819472.93237433 39.7 390670.031243889 5819473.65363212 39.7 BLDG_00030009003f01b5 1130 390574.467172119 5819478.56704969 29.2700004577637 390574.467781735 5819478.56795243 57.8292446269856 390573.240953148 5819474.35884806 57.8292446269856 390573.240343533 5819474.35794532 29.2700004577637 390574.467172119 5819478.56704969 29.2700004577637 390587.099617892 5819456.67446379 29.2700004577637 390587.100227516 5819456.67536652 57.8292446269856 390587.30294681 5819454.43475518 57.8292446269856 390587.302337186 5819454.43385245 29.2700004577637 390587.099617892 5819456.67446379 29.2700004577637 390584.282484141 5819463.6058478 29.2700004577637 390584.283093762 5819463.60675054 57.8292446269856 390585.011498562 5819463.55902308 57.8292446269856 390585.01088894 5819463.55812035 29.2700004577637 390584.282484141 5819463.6058478 29.2700004577637 390568.21402129 5819478.05851228 32.9799995422363 390568.21455099 5819478.05929668 57.7955236898914 390568.098607363 5819485.03681935 58.6116171757748 390567.982629007 5819492.01429043 57.7955236898914 390567.982099307 5819492.01350601 32.9799995422363 390568.21402129 5819478.05851228 32.9799995422363 390582.170329415 5819464.15684891 29.2700004577637 390582.170939036 5819464.15775165 57.8292446269856 390582.856428646 5819463.9073052 57.8292446269856 390582.855819025 5819463.90640246 29.2700004577637 390582.170329415 5819464.15684891 29.2700004577637 390588.933596103 5819473.32258701 32.7000007629395 390588.934072882 5819473.32329303 55.0358026292589 390588.456167883 5819479.64168309 55.0358026292589 390588.455691104 5819479.64097707 32.7000007629395 390588.933596103 5819473.32258701 32.7000007629395 390577.474024965 5819470.66869521 29.2700004577637 390577.474634583 5819470.66959795 57.8292446269856 390577.57339978 5819469.89416241 57.8292446269856 390577.572790162 5819469.89325967 29.2700004577637 390577.474024965 5819470.66869521 29.2700004577637 390567.982099307 5819492.01350601 32.9799995422363 390567.982629007 5819492.01429043 57.7955236898914 390581.169077337 5819493.0663881 57.7955236898914 390581.16854763 5819493.06560368 32.9799995422363 390567.982099307 5819492.01350601 32.9799995422363 390579.716455499 5819465.80129858 29.2700004577637 390579.717065118 5819465.80220132 57.8292446269856 390580.297893891 5819465.27941423 57.8292446269856 390580.297284272 5819465.27851149 29.2700004577637 390579.716455499 5819465.80129858 29.2700004577637 390573.240343533 5819474.35794532 29.2700004577637 390573.240953148 5819474.35884806 57.8292446269856 390576.715126292 5819473.54178322 57.8292446269856 390576.714516675 5819473.54088048 29.2700004577637 390573.240343533 5819474.35794532 29.2700004577637 390593.986407468 5819479.00694097 32.7000007629395 390593.98688425 5819479.007647 55.0358026292589 390594.229776046 5819474.45139684 55.0358026292589 390594.229299265 5819474.45069081 32.7000007629395 390593.986407468 5819479.00694097 32.7000007629395 390579.191014717 5819466.38040035 29.2700004577637 390579.191624335 5819466.38130309 57.8292446269856 390579.717065118 5819465.80220132 57.8292446269856 390579.716455499 5819465.80129858 29.2700004577637 390579.191014717 5819466.38040035 29.2700004577637 390582.855819025 5819463.90640246 29.2700004577637 390582.856428646 5819463.9073052 57.8292446269856 390583.562711418 5819463.72328975 57.8292446269856 390583.562101797 5819463.72238701 29.2700004577637 390582.855819025 5819463.90640246 29.2700004577637 390594.270838555 5819473.68275137 32.7000007629395 390594.271315336 5819473.6834574 55.0358026292589 390588.934072882 5819473.32329303 55.0358026292589 390588.933596103 5819473.32258701 32.7000007629395 390594.270838555 5819473.68275137 32.7000007629395 390570.931402863 5819453.11057808 29.2700004577637 390570.932012477 5819453.11148082 57.8292446269856 390568.05672306 5819452.87902998 57.8292446269856 390568.056113448 5819452.87812725 29.2700004577637 390570.931402863 5819453.11057808 29.2700004577637 390581.16854763 5819493.06560368 32.9799995422363 390581.169077337 5819493.0663881 57.7955236898914 390581.285055672 5819486.08891724 58.6116171757748 390581.400999278 5819479.11139478 57.7955236898914 390581.400469571 5819479.11061037 32.9799995422363 390581.16854763 5819493.06560368 32.9799995422363 390587.302337186 5819454.43385245 29.2700004577637 390587.30294681 5819454.43475518 57.8292446269856 390570.932012477 5819453.11148082 57.8292446269856 390570.931402863 5819453.11057808 29.2700004577637 390587.302337186 5819454.43385245 29.2700004577637 390576.459149276 5819470.67182822 29.2700004577637 390576.459758893 5819470.67273096 57.8292446269856 390577.474634583 5819470.66959795 57.8292446269856 390577.474024965 5819470.66869521 29.2700004577637 390576.459149276 5819470.67182822 29.2700004577637 390593.930166395 5819480.06078172 32.7000007629395 390593.930643176 5819480.06148775 55.0358026292589 390593.98688425 5819479.007647 55.0358026292589 390593.986407468 5819479.00694097 32.7000007629395 390593.930166395 5819480.06078172 32.7000007629395 390568.089006527 5819478.03842362 29.2700004577637 390568.08961614 5819478.03932637 57.8292446269856 390574.467781735 5819478.56795243 57.8292446269856 390574.467172119 5819478.56704969 29.2700004577637 390568.089006527 5819478.03842362 29.2700004577637 390580.297284272 5819465.27851149 29.2700004577637 390580.297893891 5819465.27941423 57.8292446269856 390580.885931842 5819464.84681461 57.8292446269856 390580.885322222 5819464.84591188 29.2700004577637 390580.297284272 5819465.27851149 29.2700004577637 390581.511072373 5819464.47087911 29.2700004577637 390581.511681993 5819464.47178185 57.8292446269856 390582.170939036 5819464.15775165 57.8292446269856 390582.170329415 5819464.15684891 29.2700004577637 390581.511072373 5819464.47087911 29.2700004577637 390585.01088894 5819463.55812035 29.2700004577637 390585.011498562 5819463.55902308 57.8292446269856 390585.741220555 5819463.58053891 57.8292446269856 390585.740610933 5819463.57963617 29.2700004577637 390585.01088894 5819463.55812035 29.2700004577637 390578.727562706 5819467.00989272 29.2700004577637 390578.728172325 5819467.01079546 57.8292446269856 390579.191624335 5819466.38130309 57.8292446269856 390579.191014717 5819466.38040035 29.2700004577637 390578.727562706 5819467.00989272 29.2700004577637 390577.749948685 5819469.13219958 29.2700004577637 390577.750558303 5819469.13310233 57.8292446269856 390578.003801726 5819468.39348203 57.8292446269856 390578.003192107 5819468.39257928 29.2700004577637 390577.749948685 5819469.13219958 29.2700004577637 390594.229299265 5819474.45069081 32.7000007629395 390594.229776046 5819474.45139684 55.0358026292589 390594.271315336 5819473.6834574 55.0358026292589 390594.270838555 5819473.68275137 32.7000007629395 390594.229299265 5819474.45069081 32.7000007629395 390576.714516675 5819473.54088048 29.2700004577637 390576.715126292 5819473.54178322 57.8292446269856 390576.459758893 5819470.67273096 57.8292446269856 390576.459149276 5819470.67182822 29.2700004577637 390576.714516675 5819473.54088048 29.2700004577637 390585.740610933 5819463.57963617 29.2700004577637 390585.741220555 5819463.58053891 57.8292446269856 390586.465543916 5819463.67112179 57.8292446269856 390586.464934293 5819463.67021905 29.2700004577637 390585.740610933 5819463.57963617 29.2700004577637 390568.056113448 5819452.87812725 29.2700004577637 390568.05672306 5819452.87902998 57.8292446269856 390568.08961614 5819478.03932637 57.8292446269856 390568.089006527 5819478.03842362 29.2700004577637 390568.056113448 5819452.87812725 29.2700004577637 390586.825046222 5819459.6936614 29.2700004577637 390586.825655845 5819459.69456413 57.8292446269856 390586.996286749 5819457.82043927 57.8292446269856 390586.995677126 5819457.81953654 29.2700004577637 390586.825046222 5819459.6936614 29.2700004577637 390577.572790162 5819469.89325967 29.2700004577637 390577.57339978 5819469.89416241 57.8292446269856 390577.750558303 5819469.13310233 57.8292446269856 390577.749948685 5819469.13219958 29.2700004577637 390577.572790162 5819469.89325967 29.2700004577637 390581.400469571 5819479.11061037 32.9799995422363 390581.400999278 5819479.11139478 57.7955236898914 390568.21455099 5819478.05929668 57.7955236898914 390568.21402129 5819478.05851228 32.9799995422363 390581.400469571 5819479.11061037 32.9799995422363 390578.003192107 5819468.39257928 29.2700004577637 390578.003801726 5819468.39348203 57.8292446269856 390578.330846763 5819467.68358228 57.8292446269856 390578.330237145 5819467.68267954 29.2700004577637 390578.003192107 5819468.39257928 29.2700004577637 390588.455691104 5819479.64097707 32.7000007629395 390588.456167883 5819479.64168309 55.0358026292589 390593.930643176 5819480.06148775 55.0358026292589 390593.930166395 5819480.06078172 32.7000007629395 390588.455691104 5819479.64097707 32.7000007629395 390580.885322222 5819464.84591188 29.2700004577637 390580.885931842 5819464.84681461 57.8292446269856 390581.511681993 5819464.47178185 57.8292446269856 390581.511072373 5819464.47087911 29.2700004577637 390580.885322222 5819464.84591188 29.2700004577637 390578.330237145 5819467.68267954 29.2700004577637 390578.330846763 5819467.68358228 57.8292446269856 390578.728172325 5819467.01079546 57.8292446269856 390578.727562706 5819467.00989272 29.2700004577637 390578.330237145 5819467.68267954 29.2700004577637 390583.562101797 5819463.72238701 29.2700004577637 390583.562711418 5819463.72328975 57.8292446269856 390584.283093762 5819463.60675054 57.8292446269856 390584.282484141 5819463.6058478 29.2700004577637 390583.562101797 5819463.72238701 29.2700004577637 390586.464934293 5819463.67021905 29.2700004577637 390586.465543916 5819463.67112179 57.8292446269856 390586.825655845 5819459.69456413 57.8292446269856 390586.825046222 5819459.6936614 29.2700004577637 390586.464934293 5819463.67021905 29.2700004577637 390593.930114501 5819480.06094155 33.0999984741211 390593.930742929 5819480.06187214 62.5400053478034 390587.794160905 5819479.59100228 64.1470352780672 390581.657510174 5819479.12003082 62.5400053478034 390581.656881754 5819479.11910024 33.0999984741211 390593.930114501 5819480.06094155 33.0999984741211 390580.910732429 5819493.08238644 33.0999984741211 390580.911360849 5819493.08331703 62.5400053478034 390587.048011607 5819493.5542883 64.1470352780672 390593.184593659 5819494.02515796 62.5400053478034 390593.183965232 5819494.02422737 33.0999984741211 390580.910732429 5819493.08238644 33.0999984741211 390586.995677126 5819457.81953654 29.2700004577637 390586.996286749 5819457.82043927 57.8292446269856 390587.100227516 5819456.67536652 57.8292446269856 390587.099617892 5819456.67446379 29.2700004577637 390586.995677126 5819457.81953654 29.2700004577637 390581.656881754 5819479.11910024 33.0999984741211 390581.657510174 5819479.12003082 62.5400053478034 390580.911360849 5819493.08331703 62.5400053478034 390580.910732429 5819493.08238644 33.0999984741211 390581.656881754 5819479.11910024 33.0999984741211 390593.183965232 5819494.02422737 33.0999984741211 390593.184593659 5819494.02515796 62.5400053478034 390593.930742929 5819480.06187214 62.5400053478034 390593.930114501 5819480.06094155 33.0999984741211 390593.183965232 5819494.02422737 33.0999984741211 390587.048011607 5819493.5542883 64.1470352780672 390580.911360849 5819493.08331703 62.5400053478034 390581.657510174 5819479.12003082 62.5400053478034 390587.794160905 5819479.59100228 64.1470352780672 390587.048011607 5819493.5542883 64.1470352780672 390568.08961614 5819478.03932637 57.8292446269856 390568.05672306 5819452.87902998 57.8292446269856 390570.932012477 5819453.11148082 57.8292446269856 390587.30294681 5819454.43475518 57.8292446269856 390587.100227516 5819456.67536652 57.8292446269856 390586.996286749 5819457.82043927 57.8292446269856 390586.825655845 5819459.69456413 57.8292446269856 390586.465543916 5819463.67112179 57.8292446269856 390585.741220555 5819463.58053891 57.8292446269856 390585.011498562 5819463.55902308 57.8292446269856 390584.283093762 5819463.60675054 57.8292446269856 390583.562711418 5819463.72328975 57.8292446269856 390582.856428646 5819463.9073052 57.8292446269856 390582.170939036 5819464.15775165 57.8292446269856 390581.511681993 5819464.47178185 57.8292446269856 390580.885931842 5819464.84681461 57.8292446269856 390580.297893891 5819465.27941423 57.8292446269856 390579.717065118 5819465.80220132 57.8292446269856 390579.191624335 5819466.38130309 57.8292446269856 390578.728172325 5819467.01079546 57.8292446269856 390578.330846763 5819467.68358228 57.8292446269856 390578.003801726 5819468.39348203 57.8292446269856 390577.750558303 5819469.13310233 57.8292446269856 390577.57339978 5819469.89416241 57.8292446269856 390577.474634583 5819470.66959795 57.8292446269856 390576.459758893 5819470.67273096 57.8292446269856 390576.715126292 5819473.54178322 57.8292446269856 390573.240953148 5819474.35884806 57.8292446269856 390574.467781735 5819478.56795243 57.8292446269856 390568.08961614 5819478.03932637 57.8292446269856 390581.285055672 5819486.08891724 58.6116171757748 390581.169077337 5819493.0663881 57.7955236898914 390567.982629007 5819492.01429043 57.7955236898914 390568.098607363 5819485.03681935 58.6116171757748 390581.285055672 5819486.08891724 58.6116171757748 390581.400999278 5819479.11139478 57.7955236898914 390581.285055672 5819486.08891724 58.6116171757748 390568.098607363 5819485.03681935 58.6116171757748 390568.21455099 5819478.05929668 57.7955236898914 390581.400999278 5819479.11139478 57.7955236898914 390593.184593659 5819494.02515796 62.5400053478034 390587.048011607 5819493.5542883 64.1470352780672 390587.794160905 5819479.59100228 64.1470352780672 390593.930742929 5819480.06187214 62.5400053478034 390593.184593659 5819494.02515796 62.5400053478034 390588.456167883 5819479.64168309 55.0358026292589 390588.934072882 5819473.32329303 55.0358026292589 390594.271315336 5819473.6834574 55.0358026292589 390594.229776046 5819474.45139684 55.0358026292589 390593.98688425 5819479.007647 55.0358026292589 390593.930643176 5819480.06148775 55.0358026292589 390588.456167883 5819479.64168309 55.0358026292589 390588.933596103 5819473.32258701 32.7000007629395 390588.455691104 5819479.64097707 32.7000007629395 390593.930166395 5819480.06078172 32.7000007629395 390593.986407468 5819479.00694097 32.7000007629395 390594.229299265 5819474.45069081 32.7000007629395 390594.270838555 5819473.68275137 32.7000007629395 390588.933596103 5819473.32258701 32.7000007629395 390568.056113448 5819452.87812725 29.2700004577637 390568.089006527 5819478.03842362 29.2700004577637 390574.467172119 5819478.56704969 29.2700004577637 390573.240343533 5819474.35794532 29.2700004577637 390576.714516675 5819473.54088048 29.2700004577637 390576.459149276 5819470.67182822 29.2700004577637 390577.474024965 5819470.66869521 29.2700004577637 390577.572790162 5819469.89325967 29.2700004577637 390577.749948685 5819469.13219958 29.2700004577637 390578.003192107 5819468.39257928 29.2700004577637 390578.330237145 5819467.68267954 29.2700004577637 390578.727562706 5819467.00989272 29.2700004577637 390579.191014717 5819466.38040035 29.2700004577637 390579.716455499 5819465.80129858 29.2700004577637 390580.297284272 5819465.27851149 29.2700004577637 390580.885322222 5819464.84591188 29.2700004577637 390581.511072373 5819464.47087911 29.2700004577637 390582.170329415 5819464.15684891 29.2700004577637 390582.855819025 5819463.90640246 29.2700004577637 390583.562101797 5819463.72238701 29.2700004577637 390584.282484141 5819463.6058478 29.2700004577637 390585.01088894 5819463.55812035 29.2700004577637 390585.740610933 5819463.57963617 29.2700004577637 390586.464934293 5819463.67021905 29.2700004577637 390586.825046222 5819459.6936614 29.2700004577637 390586.995677126 5819457.81953654 29.2700004577637 390587.099617892 5819456.67446379 29.2700004577637 390587.302337186 5819454.43385245 29.2700004577637 390570.931402863 5819453.11057808 29.2700004577637 390568.056113448 5819452.87812725 29.2700004577637 390567.982099307 5819492.01350601 32.9799995422363 390581.16854763 5819493.06560368 32.9799995422363 390581.400469571 5819479.11061037 32.9799995422363 390568.21402129 5819478.05851228 32.9799995422363 390567.982099307 5819492.01350601 32.9799995422363 390581.656881754 5819479.11910024 33.0999984741211 390580.910732429 5819493.08238644 33.0999984741211 390593.183965232 5819494.02422737 33.0999984741211 390593.930114501 5819480.06094155 33.0999984741211 390581.656881754 5819479.11910024 33.0999984741211 BLDG_000300000016db0b 1000 390661.704669523 5819446.89014851 33.7700004577637 390661.271898789 5819454.61869554 33.7700004577637 390665.231922552 5819454.84044065 33.7700004577637 390665.664693277 5819447.11189369 33.7700004577637 390661.704669523 5819446.89014851 33.7700004577637 390661.271898789 5819454.61869554 33.7700004577637 390661.704669523 5819446.89014851 33.7700004577637 390661.704746628 5819446.89026268 37.3818866441835 390661.271975894 5819454.61880971 37.3818866441835 390661.271898789 5819454.61869554 33.7700004577637 390661.704669523 5819446.89014851 33.7700004577637 390665.664693277 5819447.11189369 33.7700004577637 390665.664770382 5819447.11200786 37.3818866441835 390661.704746628 5819446.89026268 37.3818866441835 390661.704669523 5819446.89014851 33.7700004577637 390665.664693277 5819447.11189369 33.7700004577637 390665.231922552 5819454.84044065 33.7700004577637 390665.231999657 5819454.84055482 37.3818866441835 390665.664770382 5819447.11200786 37.3818866441835 390665.664693277 5819447.11189369 33.7700004577637 390665.231922552 5819454.84044065 33.7700004577637 390661.271898789 5819454.61869554 33.7700004577637 390661.271975894 5819454.61880971 37.3818866441835 390665.231999657 5819454.84055482 37.3818866441835 390665.231922552 5819454.84044065 33.7700004577637 390665.664770382 5819447.11200786 37.3818866441835 390665.231999657 5819454.84055482 37.3818866441835 390661.271975894 5819454.61880971 37.3818866441835 390661.704746628 5819446.89026268 37.3818866441835 390665.664770382 5819447.11200786 37.3818866441835 BLDG_000300020030807d 1000 390607.212973126 5819469.75608145 32.8699989318848 390607.213498886 5819469.75685999 57.5 390601.12006487 5819469.32948795 57.5 390594.734150783 5819468.88160238 57.5 390594.733625029 5819468.88082384 32.8699989318848 390601.119539114 5819469.32870941 32.8699989318848 390607.212973126 5819469.75608145 32.8699989318848 390605.449305888 5819494.91190528 57.5 390605.448780129 5819494.91112673 32.8699989318848 390592.969453806 5819494.03595851 32.8699989318848 390592.969979558 5819494.03673706 57.5 390599.355901034 5819494.48459015 57.5 390605.449305888 5819494.91190528 57.5 390593.867555512 5819481.23006514 32.8699989318848 390600.253471006 5819481.677918 32.8699989318848 390600.253996762 5819481.67869654 57.5 390593.868081265 5819481.23084368 57.5 390593.867555512 5819481.23006514 32.8699989318848 390594.357232863 5819474.24734771 32.8699989318848 390594.733625029 5819468.88082384 32.8699989318848 390594.734150783 5819468.88160238 57.5 390594.357758616 5819474.24812625 57.5 390594.357232863 5819474.24734771 32.8699989318848 390600.743176741 5819474.69523528 32.8699989318848 390594.357232863 5819474.24734771 32.8699989318848 390594.357758616 5819474.24812625 57.5 390600.743702498 5819474.69601383 57.5 390600.743176741 5819474.69523528 32.8699989318848 390605.448780129 5819494.91112673 32.8699989318848 390605.449305888 5819494.91190528 57.5 390606.347399957 5819482.10603511 57.5 390606.837103505 5819475.12338348 57.5 390607.213498886 5819469.75685999 57.5 390607.212973126 5819469.75608145 32.8699989318848 390606.346874198 5819482.10525657 32.8699989318848 390605.448780129 5819494.91112673 32.8699989318848 390600.253471006 5819481.677918 32.8699989318848 390600.743176741 5819474.69523528 32.8699989318848 390600.743702498 5819474.69601383 57.5 390600.253996762 5819481.67869654 57.5 390600.253471006 5819481.677918 32.8699989318848 390592.969453806 5819494.03595851 32.8699989318848 390593.867555512 5819481.23006514 32.8699989318848 390593.868081265 5819481.23084368 57.5 390592.969979558 5819494.03673706 57.5 390592.969453806 5819494.03595851 32.8699989318848 390607.212973126 5819469.75608145 32.8699989318848 390601.119539114 5819469.32870941 32.8699989318848 390594.733625029 5819468.88082384 32.8699989318848 390594.357232863 5819474.24734771 32.8699989318848 390600.743176741 5819474.69523528 32.8699989318848 390600.253471006 5819481.677918 32.8699989318848 390593.867555512 5819481.23006514 32.8699989318848 390592.969453806 5819494.03595851 32.8699989318848 390605.448780129 5819494.91112673 32.8699989318848 390606.346874198 5819482.10525657 32.8699989318848 390607.212973126 5819469.75608145 32.8699989318848 390606.347399957 5819482.10603511 57.5 390605.449305888 5819494.91190528 57.5 390599.355901034 5819494.48459015 57.5 390592.969979558 5819494.03673706 57.5 390593.868081265 5819481.23084368 57.5 390600.253996762 5819481.67869654 57.5 390600.743702498 5819474.69601383 57.5 390594.357758616 5819474.24812625 57.5 390594.734150783 5819468.88160238 57.5 390601.12006487 5819469.32948795 57.5 390607.213498886 5819469.75685999 57.5 390606.837103505 5819475.12338348 57.5 390606.347399957 5819482.10603511 57.5 DEB_LOD2_UUID_45dfcefd-7d64-442f-b4a6-a96deb99bfd0 1000 390498.962 5819506.375 56.02 390513.416 5819507.808 56.02 390531.791 5819509.629 56.02 390540.812 5819510.523 56.02 390539.346 5819525.315 56.02 390530.363 5819524.424 56.02 390530.37 5819524.346 56.02 390530.332 5819524.343 56.02 390512.199 5819522.588 56.02 390512.195 5819522.624 56.02 390512.162 5819522.621 56.02 390497.708 5819521.188 56.02 390498.962 5819506.375 56.02 390496.431 5819536.271 55.62 390497.708 5819521.188 55.62 390512.162 5819522.621 55.62 390512.195 5819522.624 55.62 390511.93 5819525.364 55.62 390510.776 5819537.285 55.62 390510.919 5819537.299 55.62 390515.738 5819537.78 55.62 390528.871 5819539.09 55.62 390528.943 5819539.097 55.62 390528.97 5819538.814 55.62 390530.363 5819524.424 55.62 390539.346 5819525.315 55.62 390537.939 5819539.515 55.62 390536.637 5819552.649 55.62 390527.597 5819551.943 55.62 390509.797 5819550.551 55.62 390495.317 5819549.42 55.62 390496.431 5819536.271 55.62 390530.363 5819524.424 55.62 390530.363 5819524.424 56.02 390539.346 5819525.315 56.02 390539.346 5819525.315 55.62 390530.363 5819524.424 55.62 390510.776 5819537.285 33.64 390510.919 5819537.299 33.64 390515.738 5819537.78 33.64 390528.871 5819539.09 33.64 390528.943 5819539.097 33.64 390528.943 5819539.097 55.62 390528.871 5819539.09 55.62 390515.738 5819537.78 55.62 390510.919 5819537.299 55.62 390510.776 5819537.285 55.62 390510.776 5819537.285 33.64 390512.199 5819522.588 56.02 390530.332 5819524.343 56.02 390530.37 5819524.346 56.02 390530.37 5819524.346 33.64 390530.332 5819524.343 33.64 390512.199 5819522.588 33.64 390512.199 5819522.588 56.02 390497.708 5819521.188 56.02 390512.162 5819522.621 56.02 390512.195 5819522.624 56.02 390512.195 5819522.624 55.62 390512.162 5819522.621 55.62 390497.708 5819521.188 55.62 390497.708 5819521.188 56.02 390537.939 5819539.515 55.62 390539.346 5819525.315 55.62 390539.346 5819525.315 56.02 390540.812 5819510.523 56.02 390540.812 5819510.523 33.64 390539.346 5819525.315 33.64 390537.939 5819539.515 33.64 390536.637 5819552.649 33.64 390536.637 5819552.649 55.62 390537.939 5819539.515 55.62 390531.791 5819509.629 33.64 390513.416 5819507.808 33.64 390498.962 5819506.375 33.64 390497.708 5819521.188 33.64 390496.431 5819536.271 33.64 390495.317 5819549.42 33.64 390509.797 5819550.551 33.64 390527.597 5819551.943 33.64 390536.637 5819552.649 33.64 390537.939 5819539.515 33.64 390539.346 5819525.315 33.64 390540.812 5819510.523 33.64 390531.791 5819509.629 33.64 390530.363 5819524.424 33.64 390528.97 5819538.814 33.64 390528.943 5819539.097 33.64 390528.871 5819539.09 33.64 390515.738 5819537.78 33.64 390510.919 5819537.299 33.64 390510.776 5819537.285 33.64 390511.93 5819525.364 33.64 390512.195 5819522.624 33.64 390512.199 5819522.588 33.64 390530.332 5819524.343 33.64 390530.37 5819524.346 33.64 390530.363 5819524.424 33.64 390528.97 5819538.814 33.64 390530.363 5819524.424 33.64 390530.37 5819524.346 33.64 390530.37 5819524.346 56.02 390530.363 5819524.424 56.02 390530.363 5819524.424 55.62 390528.97 5819538.814 55.62 390528.943 5819539.097 55.62 390528.943 5819539.097 33.64 390528.97 5819538.814 33.64 390511.93 5819525.364 55.62 390512.195 5819522.624 55.62 390512.195 5819522.624 56.02 390512.199 5819522.588 56.02 390512.199 5819522.588 33.64 390512.195 5819522.624 33.64 390511.93 5819525.364 33.64 390510.776 5819537.285 33.64 390510.776 5819537.285 55.62 390511.93 5819525.364 55.62 390498.962 5819506.375 33.64 390513.416 5819507.808 33.64 390531.791 5819509.629 33.64 390540.812 5819510.523 33.64 390540.812 5819510.523 56.02 390531.791 5819509.629 56.02 390513.416 5819507.808 56.02 390498.962 5819506.375 56.02 390498.962 5819506.375 33.64 390495.317 5819549.42 55.62 390509.797 5819550.551 55.62 390527.597 5819551.943 55.62 390536.637 5819552.649 55.62 390536.637 5819552.649 33.64 390527.597 5819551.943 33.64 390509.797 5819550.551 33.64 390495.317 5819549.42 33.64 390495.317 5819549.42 55.62 390496.431 5819536.271 33.64 390497.708 5819521.188 33.64 390498.962 5819506.375 33.64 390498.962 5819506.375 56.02 390497.708 5819521.188 56.02 390497.708 5819521.188 55.62 390496.431 5819536.271 55.62 390495.317 5819549.42 55.62 390495.317 5819549.42 33.64 390496.431 5819536.271 33.64 libcitygml-2.0.8/debian_scripts/000077500000000000000000000000001321622335500166535ustar00rootroot00000000000000libcitygml-2.0.8/debian_scripts/postinst000077500000000000000000000000121321622335500204550ustar00rootroot00000000000000ldconfig libcitygml-2.0.8/libcitygml_classdiagram.graphml000066400000000000000000001412551321622335500221170ustar00rootroot00000000000000 Appearance AppearanceTarget AppearanceTargetDefinition CityGMLModel CityObject Envelope Geometry GeoreferencedTexture ImplicitGeometry LinearRing Material MaterialTargetDefinition TextureTargetDefinition Polygon Texture TextureCoordinates TransformMatrix 1..* 1 1..* 1 1 0..* 1 0..* 1 0..* 1..* 1 1 1 1 1..* 1 0..* 1 0..* 1 0..* 1 libcitygml-2.0.8/osgplugin/000077500000000000000000000000001321622335500156715ustar00rootroot00000000000000libcitygml-2.0.8/osgplugin/CMakeLists.txt000066400000000000000000000026471321622335500204420ustar00rootroot00000000000000set(target osgdb_citygml) set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ON) find_package( OpenSceneGraph REQUIRED osgDB osgViewer osgGA osgUtil osgText) include_directories( ${OPENSCENEGRAPH_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/sources/include ) set( sources ReaderWriterCityGML.cpp ) add_library(${target} SHARED ${sources}) set_target_properties(${target} PROPERTIES PREFIX "") if(APPLE) SET(CMAKE_SHARED_LIBRARY_SUFFIX ".so") endif(APPLE) target_link_libraries(${target} ${OPENSCENEGRAPH_LIBRARIES} citygml) set(OSG_PLUGINS "osgPlugins-${OPENSCENEGRAPH_VERSION}") set(LIBCITYGML_OSG_PLUGIN_INSTALL_DIR "" CACHE PATH "The directory in which the plugin will be installed. (osgPlugins- is appended to this path)") set(PLUGIN_INSTALL_PATH lib/${OSG_PLUGINS}) if (LIBCITYGML_OSG_PLUGIN_INSTALL_DIR) set(PLUGIN_INSTALL_PATH ${LIBCITYGML_OSG_PLUGIN_INSTALL_DIR}/${OSG_PLUGINS}) endif() add_definitions(-DPLUGIN_BIN_DIR=\"${CMAKE_BINARY_DIR}/lib\") add_executable(citygmlOsgViewer CitygmlOsgViewer.cpp) target_link_libraries(citygmlOsgViewer ${OPENSCENEGRAPH_LIBRARIES} citygml) INSTALL( TARGETS ${target} RUNTIME DESTINATION ${PLUGIN_INSTALL_PATH} LIBRARY DESTINATION ${PLUGIN_INSTALL_PATH} ARCHIVE DESTINATION ${PLUGIN_INSTALL_PATH} ) INSTALL( TARGETS citygmlOsgViewer RUNTIME DESTINATION bin LIBRARY DESTINATION ${PLUGIN_INSTALL_PATH} ARCHIVE DESTINATION ${PLUGIN_INSTALL_PATH} ) libcitygml-2.0.8/osgplugin/CitygmlOsgViewer.cpp000066400000000000000000000102421321622335500216370ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include class PickingHandler : public osgGA::GUIEventHandler { public: PickingHandler() { m_xMouseCoordAtLastPress = -1; m_yMouseCoordAtLastPress = -1; } // EventHandler interface virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa, osg::Object*, osg::NodeVisitor*) { if (ea.getEventType() == osgGA::GUIEventAdapter::RELEASE && ea.getButton() == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON) { if (m_xMouseCoordAtLastPress != ea.getX() || m_yMouseCoordAtLastPress != ea.getY()) { return false; } return printDescriptionOfIntersectedDrawable(ea, aa); } else if (ea.getEventType() == osgGA::GUIEventAdapter::PUSH && ea.getButton() == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON) { m_xMouseCoordAtLastPress = ea.getX(); m_yMouseCoordAtLastPress = ea.getY(); } return false; } private: bool printDescriptionOfIntersectedDrawable(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) { osgUtil::LineSegmentIntersector::Intersections intersections; #if OSG_VERSION_GREATER_OR_EQUAL(3,3,2) if (!aa.computeIntersections(ea, intersections)) { return false; } #else return false; #endif osgUtil::LineSegmentIntersector::Intersection firstIntersection = *intersections.begin(); if (firstIntersection.drawable == nullptr) { return false; } #if OSG_VERSION_GREATER_OR_EQUAL(3,3,2) if (firstIntersection.drawable->getNumDescriptions() == 0) { std::cout << "Intersected drawable has no description:" << std::endl; return true; } std::cout << "Description of intersected drawable:" << std::endl; for (const std::string& desc : firstIntersection.drawable->getDescriptions()) { std::cout << " " << desc << std::endl; } #else std::cout << firstIntersection.drawable->getName()<< std::endl; #endif std::cout << std::endl; return true; } int m_xMouseCoordAtLastPress; int m_yMouseCoordAtLastPress; }; int main(int argc, char *argv[]) { osg::setNotifyLevel(osg::WARN); std::cout << "Using plugin directory: " << PLUGIN_BIN_DIR << std::endl; osgDB::Registry::instance()->getLibraryFilePathList().push_front(PLUGIN_BIN_DIR); osgDB::Registry::instance()->addFileExtensionAlias("gml", "citygml"); if (argc < 2) { std::cerr << "No citygml file specified..." << std::endl; return 1; } osg::ref_ptr options = new osgDB::Options("usemaxlodonly storegeomids"); std::cout << "Loading file: " << argv[1] << std::endl; osg::ref_ptr node = osgDB::readNodeFile(argv[1], options); if (node == nullptr) { std::cerr << "Failed to load file " << argv[1] << std::endl; return 1; } std::cout << "Optimizing node..." << std::endl; osgUtil::Optimizer optimizer; optimizer.optimize(node, osgUtil::Optimizer::ALL_OPTIMIZATIONS); std::cout << "Setup viewer..." << std::endl; osg::ref_ptr manip = new osgGA::SphericalManipulator(); manip->setAutoComputeHomePosition(true); manip->setNode(node); osgViewer::Viewer viewer; viewer.setUpViewInWindow(0, 0, 800, 600); viewer.setSceneData(node); viewer.setCameraManipulator(manip); viewer.addEventHandler(new osgGA::StateSetManipulator(node->getOrCreateStateSet())); viewer.addEventHandler(new osgViewer::StatsHandler()); viewer.addEventHandler(new osgViewer::WindowSizeHandler()); viewer.addEventHandler(new PickingHandler()); viewer.addEventHandler(new osgViewer::HelpHandler()); viewer.run(); return 0; } libcitygml-2.0.8/osgplugin/ReaderWriterCityGML.cpp000066400000000000000000000452141321622335500221730ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////////// // OSG plugin for reading OGC CityGML v0.3 - v1.0 format using libcitygml // http://code.google.com/p/libcitygml // Copyright(c) 2010 Joachim Pouderoux, BRGM ////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include class CityGMLOSGPluginLogger : public citygml::CityGMLLogger { public: virtual void log(LOGLEVEL level, const std::string& message, const char* file, int line) const { std::ostream& stream = getLogStreamFor(level); if (file) { stream << " [" << file; if (line > -1) { stream << ":" << line; } stream << "]"; } stream << " " << message << std::endl; } private: std::ostream& getLogStreamFor(LOGLEVEL level) const { switch(level) { case LOGLEVEL::LL_DEBUG: return osg::notify(osg::DEBUG_INFO); case LOGLEVEL::LL_WARNING: return osg::notify(osg::WARN); case LOGLEVEL::LL_TRACE: return osg::notify(osg::DEBUG_FP); case LOGLEVEL::LL_ERROR: return osg::notify(osg::FATAL); case LOGLEVEL::LL_INFO: return osg::notify(osg::INFO); default: return osg::notify(osg::INFO); } } }; class CityGMLSettings { public: CityGMLSettings( void ) : _printNames(false) , _useMaxLODOnly(false) , _storeGeomIDs(false) , _theme("") {} void parseOptions( const osgDB::ReaderWriter::Options* options) { if ( !options ) return; std::istringstream iss( options->getOptionString() ); std::string currentOption; while ( iss >> currentOption ) { std::transform( currentOption.begin(), currentOption.end(), currentOption.begin(), ::tolower ); if ( currentOption == "names" ) _printNames = true; else if ( currentOption == "mask" ) iss >> _params.objectsMask; else if ( currentOption == "minlod" ) iss >> _params.minLOD; else if ( currentOption == "maxlod" ) iss >> _params.maxLOD; else if ( currentOption == "optimize" ) _params.optimize = true; else if ( currentOption == "pruneemptyobjects" ) _params.pruneEmptyObjects = true; else if ( currentOption == "usemaxlodonly" ) _useMaxLODOnly = true; else if ( currentOption == "usetheme" ) iss >> _theme; else if ( currentOption == "storegeomids" ) _storeGeomIDs = true; } } public: citygml::ParserParams _params; bool _printNames; bool _useMaxLODOnly; bool _storeGeomIDs; std::map< std::string, osg::Texture2D* > _textureMap; std::string _theme; }; class ReaderWriterCityGML : public osgDB::ReaderWriter { public: ReaderWriterCityGML( void ) { supportsExtension( "citygml", "CityGML format" ); supportsExtension( "gml", "CityGML format" ); supportsOption( "names", "Add the name of the city objects on top of them" ); supportsOption( "mask", "Set the objects mask" ); supportsOption( "minLOD", "Minimum LOD level to fetch" ); supportsOption( "maxLOD", "Maximum LOD level to fetch" ); supportsOption( "optimize", "Optimize the geometries & polygons of the CityGML model to reduce the number of instanced objects" ); supportsOption( "pruneEmptyObjects", "Prune empty objects (ie. without -supported- geometry)" ); supportsOption( "destSRS", "Transform geometry to given reference system" ); supportsOption( "useMaxLODonly", "Use the highest available LOD for geometry of one object" ); supportsOption( "appearanceTheme", "Name of the appearance theme to use" ); supportsOption( "storegeomids", "Store the citygml id of geometry objects in the corresponding osg::Geometry object as a description string." ); m_logger = std::make_shared(); } virtual const char* className( void ) const override { return "CityGML Reader"; } virtual ReadResult readNode( const std::string&, const osgDB::ReaderWriter::Options* ) const override; virtual ReadResult readNode( std::istream&, const osgDB::ReaderWriter::Options* ) const override; private: std::shared_ptr m_logger; static unsigned int getHighestLodForObject(const citygml::CityObject& object); ReadResult readCity(std::shared_ptr, CityGMLSettings& ) const; bool createCityObject(const citygml::CityObject&, CityGMLSettings&, osg::Group*, const osg::Vec3d& offset = osg::Vec3d(0.0, 0.0, 0.0), unsigned int minimumLODToConsider = 0) const; }; // Register with Registry to instantiate the above reader/writer. REGISTER_OSGPLUGIN( citygml, ReaderWriterCityGML ) // Read CityGML file using libcitygml and generate the OSG scenegraph osgDB::ReaderWriter::ReadResult ReaderWriterCityGML::readNode( const std::string& file, const osgDB::ReaderWriter::Options* options ) const { std::string ext = osgDB::getLowerCaseFileExtension( file ); if ( !acceptsExtension( ext ) ) return ReadResult::FILE_NOT_HANDLED; // try to open the file as is std::string fileName = osgDB::findDataFile( file, options ); if ( fileName.empty() ) { // not found, so remove the .citygml extension file std::string fname = osgDB::getNameLessExtension( file ); fileName = osgDB::findDataFile( fname, options ); if ( fileName.empty() ) return ReadResult::FILE_NOT_FOUND; } CityGMLSettings settings; settings.parseOptions( options ); osgDB::getDataFilePathList().push_front( osgDB::getFilePath( fileName ) ); // Redirect both std::cout & std::cerr (used by libcitygml) to osg::notify stream std::streambuf* coutsb = std::cout.rdbuf( osg::notify(osg::NOTICE).rdbuf() ); std::streambuf* cerrsb = std::cerr.rdbuf( osg::notify(osg::NOTICE).rdbuf() ); osg::notify(osg::NOTICE) << "Parsing CityGML file " << fileName << "..." << std::endl; std::shared_ptr city = citygml::load( fileName, settings._params, m_logger ); ReadResult rr = readCity( city, settings ); if ( rr.status() == ReadResult::FILE_LOADED && rr.getNode() ) { rr.getNode()->setName( fileName ); // Let osg calculate the normals osgUtil::SmoothingVisitor sv; rr.getNode()->accept(sv); } osgDB::getDataFilePathList().pop_front(); // Restore cout/cerr streams std::cout.rdbuf( coutsb ); std::cerr.rdbuf( cerrsb ); return rr; } osgDB::ReaderWriter::ReadResult ReaderWriterCityGML::readNode( std::istream& fin, const osgDB::ReaderWriter::Options* options ) const { CityGMLSettings settings; settings.parseOptions( options ); // Redirect both std::cout & std::cerr (used by CityGML parser) to osg::notify stream std::streambuf* coutsb = std::cout.rdbuf( osg::notify(osg::NOTICE).rdbuf() ); std::streambuf* cerrsb = std::cerr.rdbuf( osg::notify(osg::NOTICE).rdbuf() ); osg::notify(osg::NOTICE) << "Parsing CityGML stream..." << std::endl; std::shared_ptr city = citygml::load( fin, settings._params ); ReadResult rr = readCity( city, settings ); // Restore cout/cerr streams std::cout.rdbuf( coutsb ); std::cerr.rdbuf( cerrsb ); return rr; } osgDB::ReaderWriter::ReadResult ReaderWriterCityGML::readCity(std::shared_ptr city, CityGMLSettings& settings ) const { if ( !city ) return nullptr; osg::notify(osg::NOTICE) << city->getNumRootCityObjects() << " city objects read." << std::endl; osg::notify(osg::NOTICE) << "Creation of the OSG city objects' geometry..." << std::endl; osg::MatrixTransform* root = new osg::MatrixTransform(); root->setName( city->getId() ); if (settings._theme.empty() && !city->themes().empty()) { settings._theme = city->themes().front(); } const citygml::ConstCityObjects& roots = city->getRootCityObjects(); if(roots.size() == 0) return nullptr; osg::Vec3d offset(0, 0, 0); if (city->getEnvelope().validBounds()) { TVec3d lb = city->getEnvelope().getLowerBound(); offset = osg::Vec3d(lb.x, lb.y, lb.z); } for ( unsigned int i = 0; i < roots.size(); ++i ) createCityObject( *roots[i], settings, root, offset ); osg::notify(osg::NOTICE) << "Done." << std::endl; root->setMatrix( osg::Matrixd::translate(offset)); return root; } void setTexture(osg::ref_ptr stateset, osg::Geometry* geom, const citygml::Polygon& polygon, CityGMLSettings& settings) { const auto citygmlTex = polygon.getTextureFor(settings._theme); if ( !citygmlTex ) { return; } const std::vector& texCoords = polygon.getTexCoordsForTheme(settings._theme, true); if (texCoords.empty()) { osg::notify(osg::WARN) << "Texture coordinates not found for poly " << polygon.getId() << std::endl; } osg::Texture2D* texture = nullptr; if ( settings._textureMap.find( citygmlTex->getUrl() ) == settings._textureMap.end() ) { std::string fullPath = osgDB::findDataFile(citygmlTex->getUrl()); if (fullPath.empty()) { osg::notify(osg::NOTICE) << " Texture file " << citygmlTex->getUrl() << " not found..." << std::endl; return; } // Load a new texture osg::notify(osg::NOTICE) << " Loading texture " << fullPath << "..." << std::endl; osg::Image* image = osgDB::readImageFile( citygmlTex->getUrl() ); if (!image) { osg::notify(osg::NOTICE) << " Warning: Failed to read Texture " << fullPath << std::endl; return; } texture = new osg::Texture2D; texture->setImage( image ); texture->setFilter( osg::Texture::MIN_FILTER, osg::Texture::LINEAR_MIPMAP_LINEAR ); texture->setFilter( osg::Texture::MAG_FILTER, osg::Texture::NEAREST ); texture->setWrap( osg::Texture::WRAP_S, osg::Texture::REPEAT ); texture->setWrap( osg::Texture::WRAP_T, osg::Texture::REPEAT ); texture->setWrap( osg::Texture::WRAP_R, osg::Texture::REPEAT ); settings._textureMap[ citygmlTex->getUrl() ] = texture; } else { texture = settings._textureMap[ citygmlTex->getUrl() ]; } if ( !texture ) { return; } osg::ref_ptr tex = new osg::Vec2Array; tex->reserve( texCoords.size() ); for ( unsigned int k = 0; k < texCoords.size(); k++ ) tex->push_back( osg::Vec2( texCoords[k].x, texCoords[k].y ) ); geom->setTexCoordArray( 0, tex ); stateset->setTextureAttributeAndModes( 0, texture, osg::StateAttribute::ON ); } void setMaterial(osg::ref_ptr stateset, const citygml::Polygon& polygon, CityGMLSettings& settings) { const auto citygmlMaterial = polygon.getMaterialFor(settings._theme); if (!citygmlMaterial) { return; } TVec4f diffuse( citygmlMaterial->getDiffuse(), 0.f ); TVec4f emissive( citygmlMaterial->getEmissive(), 0.f ); TVec4f specular( citygmlMaterial->getSpecular(), 0.f ); float ambient = citygmlMaterial->getAmbientIntensity(); osg::Material* material = new osg::Material; material->setColorMode( osg::Material::OFF ); material->setDiffuse( osg::Material::FRONT_AND_BACK, osg::Vec4(diffuse.r, diffuse.g, diffuse.b, diffuse.a ) ); material->setSpecular( osg::Material::FRONT_AND_BACK, osg::Vec4(specular.r, specular.g, specular.b, specular.a ) ); material->setEmission( osg::Material::FRONT_AND_BACK, osg::Vec4(emissive.r, emissive.g, emissive.b, emissive.a ) ); material->setShininess( osg::Material::FRONT_AND_BACK, 128.f * citygmlMaterial->getShininess() ); material->setAmbient( osg::Material::FRONT_AND_BACK, osg::Vec4( ambient, ambient, ambient, 1.0 ) ); material->setTransparency( osg::Material::FRONT_AND_BACK, citygmlMaterial->getTransparency() ); stateset->setAttributeAndModes( material, osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON ); stateset->setMode( GL_LIGHTING, osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON ); } void createOsgGeometryFromCityGMLGeometry(const citygml::Geometry& geometry, CityGMLSettings& settings, osg::Geode* geometryContainer, const osg::Vec3d& offset ) { for ( unsigned int j = 0; j < geometry.getPolygonsCount(); j++ ) { const citygml::Polygon& p = *geometry.getPolygon(j); if ( p.getIndices().size() == 0 ) continue; // Geometry management osg::Geometry* geom = new osg::Geometry; geom->setName( p.getId() ); geom->setUserValue("cot_type", geometry.getTypeAsString()); // Vertices osg::Vec3Array* vertices = new osg::Vec3Array; const std::vector& vert = p.getVertices(); vertices->reserve( vert.size() ); for ( unsigned int k = 0; k < vert.size(); k++ ) { TVec3d v = vert[k]; osg::Vec3d pt = osg::Vec3d( v.x, v.y, v.z ) - offset; vertices->push_back( pt ); } geom->setVertexArray( vertices ); // Indices osg::DrawElementsUInt* indices = new osg::DrawElementsUInt( osg::PrimitiveSet::TRIANGLES, p.getIndices().begin(), p.getIndices().end()); geom->addPrimitiveSet( indices ); // Appearance osg::ref_ptr stateset = geom->getOrCreateStateSet(); setMaterial(stateset, p, settings); setTexture(stateset, geom, p, settings); #if OSG_VERSION_GREATER_OR_EQUAL(3,3,2) if (settings._storeGeomIDs) { geom->addDescription(p.getId()); } #endif geometryContainer->addDrawable( geom ); } // Parse child geoemtries for (unsigned int i = 0; i < geometry.getGeometriesCount(); i++) { createOsgGeometryFromCityGMLGeometry(geometry.getGeometry(i), settings, geometryContainer, offset); } } bool ReaderWriterCityGML::createCityObject(const citygml::CityObject& object, CityGMLSettings& settings, osg::Group* parent, const osg::Vec3d& offset , unsigned int minimumLODToConsider) const { // Skip objects without geometry if ( !parent ) return false; osg::ref_ptr geode = new osg::Geode; geode->setName( object.getId() ); osg::Group* grp = new osg::Group; grp->setName( object.getId() ); grp->setUserValue("cot_type", object.getTypeAsString()); grp->addChild( geode ); parent->addChild( grp ); osg::ref_ptr roof_color = new osg::Vec4Array; roof_color->push_back( osg::Vec4( 0.9f, 0.1f, 0.1f, 1.0f ) ); unsigned int highestLOD = ReaderWriterCityGML::getHighestLodForObject(object); for ( unsigned int i = 0; i < object.getGeometriesCount(); i++ ) { const citygml::Geometry& geometry = object.getGeometry( i ); const unsigned int currentLOD = geometry.getLOD(); if (settings._useMaxLODOnly && (currentLOD < highestLOD || currentLOD < minimumLODToConsider )){ continue; } createOsgGeometryFromCityGMLGeometry(geometry, settings, geode, offset); } if ( settings._printNames ) { // Print the city object name on top of it geode->getBoundingBox().center(); osg::ref_ptr text = new osgText::Text; text->setFont( "arial.ttf" ); text->setCharacterSize( 2 ); text->setBackdropType( osgText::Text::OUTLINE ); text->setFontResolution( 64, 64 ); text->setText( object.getId(), osgText::String::ENCODING_UTF8 ); text->setCharacterSizeMode( osgText::TextBase::OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT ); text->setAxisAlignment( osgText::TextBase::SCREEN ); text->setAlignment( osgText::TextBase::CENTER_BOTTOM ); text->setPosition( geode->getBoundingBox().center() + osg::Vec3( 0, 0, geode->getBoundingBox().radius() ) ); text->getOrCreateStateSet()->setMode( GL_LIGHTING, osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF ); geode->addDrawable( text.get() ); } // Manage transparency for windows if ( object.getType() == citygml::CityObject::CityObjectsType::COT_Window ) { osg::StateSet *geodeSS( geode->getOrCreateStateSet() ); osg::ref_ptr blendFunc = new osg::BlendFunc(osg::BlendFunc::ONE_MINUS_CONSTANT_ALPHA,osg::BlendFunc::CONSTANT_ALPHA); geodeSS->setAttributeAndModes( blendFunc.get(), osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON ); osg::ref_ptr blendColor = new osg::BlendColor(osg::Vec4( 1., 1., 1., 0.4 )); geodeSS->setAttributeAndModes( blendColor.get(), osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON ); osg::ref_ptr depth = new osg::Depth; depth->setWriteMask( false ); geodeSS->setAttributeAndModes( depth.get(), osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON ); geodeSS->setRenderingHint(osg::StateSet::TRANSPARENT_BIN); } for ( unsigned int i = 0; i < object.getChildCityObjectsCount(); ++i ) createCityObject( object.getChildCityObject(i), settings, grp, offset, highestLOD); return true; } unsigned int ReaderWriterCityGML::getHighestLodForObject( const citygml::CityObject& object){ unsigned int highestLOD = 0; // first find out highest LOD for this object for (unsigned int i = 0; i < object.getGeometriesCount(); i++) { const citygml::Geometry &geometry = object.getGeometry(i); if (geometry.getLOD() > highestLOD){ highestLOD = geometry.getLOD(); } } //check for the highest LODs of Children for (unsigned int i = 0; i < object.getChildCityObjectsCount(); ++i){ unsigned int tempHighestLOD = ReaderWriterCityGML::getHighestLodForObject(object.getChildCityObject(i)); if (tempHighestLOD > highestLOD){ tempHighestLOD = highestLOD; } } return highestLOD; } libcitygml-2.0.8/sources/000077500000000000000000000000001321622335500153455ustar00rootroot00000000000000libcitygml-2.0.8/sources/.gitignore000066400000000000000000000000771321622335500173410ustar00rootroot00000000000000include/citygml/citygml_api.h include/citygml/citygml_export.h libcitygml-2.0.8/sources/CMakeLists.txt000066400000000000000000000163401321622335500201110ustar00rootroot00000000000000include(GenerateExportHeader) IF (NOT DEFINED CMAKE_MODULE_PATH) GET_FILENAME_COMPONENT(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/../CMakeModules" ABSOLUTE) ENDIF (NOT DEFINED CMAKE_MODULE_PATH) SET( target citygml ) FIND_PACKAGE( OpenGL REQUIRED ) FIND_PACKAGE( Xerces REQUIRED ) # gdal library OPTION(LIBCITYGML_USE_GDAL "Set to ON to build libcitygml with GDAL library so that it supports coordinates transformations." ON) IF( LIBCITYGML_USE_GDAL ) FIND_PACKAGE( GDAL REQUIRED ) ADD_DEFINITIONS( -DUSE_GDAL ) ELSE( LIBCITYGML_USE_GDAL ) SET( GDAL_INCLUDE_DIR "" ) SET( GDAL_LIBRARY "" ) ENDIF( LIBCITYGML_USE_GDAL ) OPTION(LIBCITYGML_DEBUG_POSTFIX "Set to on to add \"d\" postfix to targets" ON) IF( LIBCITYGML_DEBUG_POSTFIX ) SET(CMAKE_DEBUG_POSTFIX "d") ELSE( LIBCITYGML_DEBUG_POSTFIX ) UNSET(CMAKE_DEBUG_POSTFIX) ENDIF( LIBCITYGML_DEBUG_POSTFIX ) # Dynamic vs Static Linking OPTION(LIBCITYGML_DYNAMIC "Set to ON to build libcitygml for dynamic linking. Use OFF for static." ON) IF (LIBCITYGML_DYNAMIC) SET(LIBCITYGML_USER_DEFINED_DYNAMIC_OR_STATIC "SHARED") ADD_DEFINITIONS( -DLIBCITYGML_DYNAMIC ) ELSE (LIBCITYGML_DYNAMIC) SET(LIBCITYGML_USER_DEFINED_DYNAMIC_OR_STATIC "STATIC") ADD_DEFINITIONS( -DLIBCITYGML_STATIC ) ENDIF(LIBCITYGML_DYNAMIC) ADD_DEFINITIONS( -DCITYGML_LIBRARY ) ADD_DEFINITIONS( -DLIBCITYGML_BUILD ) configure_file("${CMAKE_MODULE_PATH}/citygml_api.h.in" ${CMAKE_CURRENT_SOURCE_DIR}/include/citygml/citygml_api.h) SET(EXPORT_HEADER_FILE_NAME ${CMAKE_CURRENT_SOURCE_DIR}/include/citygml/citygml_export.h) INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}/include ${XERCESC_INCLUDE} ${GLU_INCLUDE_PATH} ${GDAL_INCLUDE_DIR}) SET(SOURCES src/citygml/attributesmap.cpp src/citygml/citymodel.cpp src/citygml/tesselator.cpp src/citygml/object.cpp src/citygml/featureobject.cpp src/citygml/appearance.cpp src/citygml/texture.cpp src/citygml/material.cpp src/citygml/georeferencedtexture.cpp src/citygml/envelope.cpp src/citygml/appearancemanager.cpp src/citygml/cityobject.cpp src/citygml/geometry.cpp src/citygml/implictgeometry.cpp src/citygml/linearring.cpp src/citygml/polygon.cpp src/citygml/transformmatrix.cpp src/citygml/texturetargetdefinition.cpp src/citygml/materialtargetdefinition.cpp src/citygml/texturecoordinates.cpp src/citygml/appearancetarget.cpp src/citygml/citygmlfactory.cpp src/citygml/polygonmanager.cpp src/citygml/geometrymanager.cpp src/citygml/linestring.cpp src/citygml/address.cpp src/parser/nodetypes.cpp src/parser/attributes.cpp src/parser/geocoordinatetransformer.cpp src/parser/citygmldocumentparser.cpp src/parser/parserxercesc.cpp src/parser/citygmlelementparser.cpp src/parser/elementparser.cpp src/parser/delayedchoiceelementparser.cpp src/parser/skipelementparser.cpp src/parser/sequenceparser.cpp src/parser/gmlobjectparser.cpp src/parser/gmlfeaturecollectionparser.cpp src/parser/citymodelelementparser.cpp src/parser/cityobjectelementparser.cpp src/parser/appearanceelementparser.cpp src/parser/materialelementparser.cpp src/parser/textureelementparser.cpp src/parser/georeferencedtextureelementparser.cpp src/parser/geometryelementparser.cpp src/parser/polygonelementparser.cpp src/parser/linestringelementparser.cpp src/parser/linearringelementparser.cpp src/parser/implicitgeometryelementparser.cpp src/parser/addressparser.cpp ) if(UNIX) if (APPLE) set_source_files_properties(src/citygml/tesselator.cpp PROPERTIES COMPILE_FLAGS "-Wno-deprecated-declarations") # for warnings: 'glu*' is deprecated... endif (APPLE) endif(UNIX) SET(PUBLIC_HEADER include/citygml/citygml_api.h include/citygml/citygml_export.h include/citygml/attributesmap.h include/citygml/enum_type_bitmask.h include/citygml/citygmllogger.h include/citygml/polygon.h include/citygml/material.h include/citygml/geometry.h include/citygml/object.h include/citygml/featureobject.h include/citygml/georeferencedtexture.h include/citygml/cityobject.h include/citygml/envelope.h include/citygml/appearance.h include/citygml/vecs.hpp include/citygml/citymodel.h include/citygml/linearring.h include/citygml/citygml.h include/citygml/transformmatrix.h include/citygml/implictgeometry.h include/citygml/tesselator.h include/citygml/texture.h include/citygml/appearancetargetdefinition.h include/citygml/texturetargetdefinition.h include/citygml/materialtargetdefinition.h include/citygml/texturecoordinates.h include/citygml/appearancetarget.h include/citygml/citygmlfactory.h include/citygml/linestring.h include/citygml/address.h ) SET(HEADERS ${PUBLIC_HEADER} ${CMAKE_MODULE_PATH}/citygml_api.h.in include/citygml/tesselator.h include/citygml/utils.h include/citygml/appearancemanager.h include/citygml/polygonmanager.h include/citygml/geometrymanager.h include/parser/nodetypes.h include/parser/attributes.h include/parser/documentlocation.h include/parser/parserutils.hpp include/parser/geocoordinatetransformer.h include/parser/citygmldocumentparser.h include/parser/citygmlelementparser.h include/parser/elementparser.h include/parser/delayedchoiceelementparser.h include/parser/skipelementparser.h include/parser/sequenceparser.h include/parser/gmlobjectparser.h include/parser/gmlfeaturecollectionparser.h include/parser/citymodelelementparser.h include/parser/cityobjectelementparser.h include/parser/appearanceelementparser.h include/parser/materialelementparser.h include/parser/textureelementparser.h include/parser/georeferencedtextureelementparser.h include/parser/geometryelementparser.h include/parser/polygonelementparser.h include/parser/linestringelementparser.h include/parser/linearringelementparser.h include/parser/implicitgeometryelementparser.h include/parser/addressparser.h ) ADD_LIBRARY( ${target} ${LIBCITYGML_USER_DEFINED_DYNAMIC_OR_STATIC} ${SOURCES} ${HEADERS} ) generate_export_header(citygml EXPORT_MACRO_NAME LIBCITYGML_EXPORT EXPORT_FILE_NAME ${EXPORT_HEADER_FILE_NAME}) TARGET_LINK_LIBRARIES( ${target} ${XERCESC_LIBRARIES} ${OPENGL_LIBRARIES} ${GDAL_LIBRARY} ) set_target_properties( ${target} PROPERTIES VERSION ${META_VERSION} SOVERSION ${META_VERSION_MAJOR} ) if(NOT DEFINED BIN_INSTALL_DIR) set(BIN_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/bin") endif(NOT DEFINED BIN_INSTALL_DIR) if(NOT DEFINED LIB_INSTALL_DIR) set(LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib") endif(NOT DEFINED LIB_INSTALL_DIR) if(NOT DEFINED INCLUDE_INSTALL_DIR) set(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include/citygml") endif(NOT DEFINED INCLUDE_INSTALL_DIR) INSTALL( TARGETS ${target} RUNTIME DESTINATION ${BIN_INSTALL_DIR} LIBRARY DESTINATION ${LIB_INSTALL_DIR} ARCHIVE DESTINATION ${LIB_INSTALL_DIR} ) # FIXME: Do not run for OS X framework INSTALL( FILES ${PUBLIC_HEADER} DESTINATION ${INCLUDE_INSTALL_DIR} ) INSTALL( FILES ${EXPORT_HEADER_FILE_NAME} DESTINATION ${INCLUDE_INSTALL_DIR} ) configure_file(citygml.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/citygml.pc) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/citygml.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) libcitygml-2.0.8/sources/citygml.pc.cmake000066400000000000000000000004531321622335500204220ustar00rootroot00000000000000prefix=${CMAKE_INSTALL_PREFIX} exec_prefix=${BIN_INSTALL_DIR} libdir=${LIB_INSTALL_DIR} includedir=${INCLUDE_INSTALL_DIR} Name: citygml Description: Read and Write CityGML files Requires: libxml-2.0 glu Version: ${META_VERSION} Libs: -L${LIB_INSTALL_DIR} -lcitygml Cflags: -I${INCLUDE_INSTALL_DIR} libcitygml-2.0.8/sources/include/000077500000000000000000000000001321622335500167705ustar00rootroot00000000000000libcitygml-2.0.8/sources/include/citygml/000077500000000000000000000000001321622335500204405ustar00rootroot00000000000000libcitygml-2.0.8/sources/include/citygml/address.h000066400000000000000000000017451321622335500222450ustar00rootroot00000000000000#pragma once #include #include namespace citygml { class LIBCITYGML_EXPORT Address: public Object { public: Address(const std::string& id); const std::string& country() const; void setCountry(const std::string& country); const std::string& locality() const; void setLocality(const std::string& locality); const std::string& postalCode() const; void setPostalCode(const std::string& postalCode); const std::string& thoroughfareName() const; void setThoroughfareName(const std::string& thoroughfareName); const std::string& thoroughfareNumber() const; void setThoroughfareNumber(const std::string& thoroughfareNumber); protected: std::string m_country; std::string m_locality; std::string m_thoroughfareName; std::string m_thoroughfareNumber; std::string m_postalCode; }; } /* namespace citygml */ libcitygml-2.0.8/sources/include/citygml/appearance.h000066400000000000000000000025211321622335500227100ustar00rootroot00000000000000#pragma once #include #include #include #include #include #include namespace citygml { class Material; class Texture; class GeoreferencedTexture; class LIBCITYGML_EXPORT Appearance : public Object, public std::enable_shared_from_this { public: std::string getType() const; bool getIsFront() const; void setIsFront(bool front); virtual std::string toString() const; virtual std::shared_ptr asMaterial(); virtual std::shared_ptr asMaterial() const; virtual std::shared_ptr asTexture(); virtual std::shared_ptr asTexture() const; virtual std::shared_ptr asGeoreferencedTexture(); virtual std::shared_ptr asGeoreferencedTexture() const; bool inTheme(const std::string& themeName) const; void addToTheme(std::string themeName); const std::vector& getThemes() const; virtual ~Appearance() {} protected: Appearance( const std::string& id, const std::string& typeString ); std::string m_typeString; std::vector m_themes; bool m_isFront; }; } libcitygml-2.0.8/sources/include/citygml/appearancemanager.h000066400000000000000000000042061321622335500242450ustar00rootroot00000000000000#pragma once #include #include #include #include #include #include class Tesselator; namespace citygml { class CityGMLLogger; class Appearance; class AppearanceTarget; class Material; class Texture; class MaterialTargetDefinition; class TextureTargetDefinition; class LIBCITYGML_EXPORT AppearanceManager { public: AppearanceManager(std::shared_ptr logger ); ~AppearanceManager(); /** * @brief returns the appearance with the given id * @return the Appearance object or nullptr if not found */ std::shared_ptr getAppearanceByID( const std::string& id ) const; /** * @brief all themes found in the parsed citygml file * @return a list of theme identifiers * @note should be called after assignAppearancesToTargets (otherwise the list will be empty) */ std::vector getAllThemes(); void addAppearanceTarget(AppearanceTarget* target); void addAppearance(std::shared_ptr appearance); void addTextureTargetDefinition(std::shared_ptr targetDef); void addMaterialTargetDefinition(std::shared_ptr targetDef); /** * @brief assigns each appearance to all targets for which a coresponding AppearanceTargetDefinition exits. * @note should be called once after parsing has finished */ void assignAppearancesToTargets(); protected: std::unordered_map > m_appearancesMap; std::vector > m_materialTargetDefinitions; std::vector > m_texTargetDefinitions; std::unordered_set m_themes; std::unordered_map m_appearanceTargetsMap; std::shared_ptr m_logger; void addThemesFrom(std::shared_ptr surfaceData); }; } libcitygml-2.0.8/sources/include/citygml/appearancetarget.h000066400000000000000000000040451321622335500241220ustar00rootroot00000000000000#pragma once #include #include #include #include #include namespace citygml { class MaterialTargetDefinition; class TextureTargetDefinition; class Appearance; /** * @brief The AppearanceTarget class is the base class for all citygml objects that can be targets of appearances * * Ensures that there is only one texture and material per theme */ class LIBCITYGML_EXPORT AppearanceTarget : public citygml::Object { public: void addTargetDefinition(std::shared_ptr > targetDef); void addTargetDefinition(std::shared_ptr targetDef); void addTargetDefinition(std::shared_ptr targetDef); void addTargetDefinitionsOf(const AppearanceTarget& other); std::shared_ptr getMaterialTargetDefinitionForTheme(const std::string& theme, bool front); std::shared_ptr getMaterialTargetDefinitionForTheme(const std::string& theme, bool front) const; std::shared_ptr getTextureTargetDefinitionForTheme(const std::string& theme, bool front); std::shared_ptr getTextureTargetDefinitionForTheme(const std::string& theme, bool front) const; std::vector getTextureTargetDefinitions(); std::vector getAllTextureThemes(bool front) const; protected: AppearanceTarget(const std::string& id); private: std::unordered_map > m_themeMatMapFront; std::unordered_map > m_themeMatMapBack; std::unordered_map > m_themeTexMapFront; std::unordered_map > m_themeTexMapBack; }; } libcitygml-2.0.8/sources/include/citygml/appearancetargetdefinition.h000066400000000000000000000037531321622335500262000ustar00rootroot00000000000000#pragma once #include #include #include namespace citygml { /* * TODO: * - store the target id here * - store the appearance object here as a shared pointer * - create a subclass for material appearance type and texture appearance type (TextureTargetDefinition, MaterialTargetDefinition) * - modify AppearanceTarget so that is contains distinct lists for TextureTargetDefinition and MaterialTargetDefinition definitions... store the AppearanceTargetDefinitions as shared_ptr * - remove all knowledge of thier targets from the appearance objects (Texture, Material) * - let the appearance manager store the AppearanceTargetDefinition objects and the Appearance objects until they are assigned... then remove them from the appearance manager * - when finishing the AppearanceTarget objcts pass down the AppearanceTargetDefinition * - when finishing the polygon object remove all AppearanceTargetDefinition that are unused */ /** * @brief defines the association between an Appearance object and an AppearanceTarget object */ template class LIBCITYGML_EXPORT AppearanceTargetDefinition : public Object { public: AppearanceTargetDefinition(const std::string& targetID, std::shared_ptr appearance, const std::string& id) : Object(id), m_targetID(targetID), m_appearance(appearance) {} /** * @brief the id of the target surface * @note The targetID must not be the id of the object on which the texture is applied at the end (may be passed down to the children of the target object) */ std::string getTargetID() const { return m_targetID; } std::shared_ptr getAppearance() const { return m_appearance; } std::shared_ptr getAppearance() { return m_appearance; } virtual ~AppearanceTargetDefinition() {} protected: std::string m_targetID; std::shared_ptr m_appearance; }; } libcitygml-2.0.8/sources/include/citygml/attributesmap.h000066400000000000000000000023071321622335500234770ustar00rootroot00000000000000#pragma once #include #include #include namespace citygml { /** * @brief The AttributeType enum represents the data type of an object attribute */ enum class AttributeType { String, Double, Integer, Date, Uri }; /** * @brief The AttributeValue class stores an attribute value and its data type */ class LIBCITYGML_EXPORT AttributeValue { public: AttributeValue(); AttributeValue(const char* value); AttributeValue(const std::string& value, AttributeType type=AttributeType::String); AttributeValue(double value); AttributeValue(int value); void setType(AttributeType type); AttributeType getType() const; void setValue(const std::string& value, AttributeType type=AttributeType::String); void setValue(double value); void setValue(int value); std::string asString() const; double asDouble(double defaultValue=0.0) const; int asInteger(int defaultValue=0) const; private: AttributeType m_type; std::string m_value; }; LIBCITYGML_EXPORT std::ostream& operator<<(std::ostream& os, const AttributeValue& o); typedef std::map AttributesMap; } // namespace citygml libcitygml-2.0.8/sources/include/citygml/citygml.h000066400000000000000000000057721321622335500222740ustar00rootroot00000000000000/* -*-c++-*- libcitygml - Copyright (c) 2010 Joachim Pouderoux, BRGM * * This file is part of libcitygml library * http://code.google.com/p/libcitygml * * libcitygml is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. * * libcitygml is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include class Tesselator; namespace citygml { class CityModel; class CityGMLLogger; class Appearance; class Texture; class Material; class AppearanceManager; typedef EnumClassBitmask CityObjectsTypeMask; /////////////////////////////////////////////////////////////////////////////// // Parsing routines // Parameters: // objectsMask: a bit mask that defines which CityObjectsTypes are parsed // examples: CityObject::CityObjectsType::COT_Building | CityObject::CityObjectsType::COT_Room <- parses only Building and Room objects" // minLOD: the minimal LOD that will be parsed // maxLOD: the maximal LOD that will be parsed // optimize: merge geometries & polygons that share the same appearance in the same object in order to reduce the global hierarchy // pruneEmptyObjects: remove the objects which do not contains any geometrical entity // tesselate: convert the interior & exteriors polygons to triangles // destSRS: the SRS (WKT, EPSG, OGC URN, etc.) where the coordinates must be transformed, default ("") is no transformation class LIBCITYGML_EXPORT ParserParams { public: ParserParams() : objectsMask(CityObject::CityObjectsType::COT_All) , minLOD( 0 ) , maxLOD( 4 ) , optimize( false ) , pruneEmptyObjects( false ) , destSRS( "" ) , keepVertices ( false ) { } public: CityObjectsTypeMask objectsMask; unsigned int minLOD; unsigned int maxLOD; bool optimize; bool pruneEmptyObjects; bool tesselate; bool keepVertices; std::string destSRS; }; LIBCITYGML_EXPORT std::shared_ptr load( std::istream& stream, const ParserParams& params, std::shared_ptr logger = nullptr); LIBCITYGML_EXPORT std::shared_ptr load( const std::string& fileName, const ParserParams& params, std::shared_ptr logger = nullptr); } libcitygml-2.0.8/sources/include/citygml/citygmlfactory.h000066400000000000000000000053541321622335500236600ustar00rootroot00000000000000#pragma once #include #include #include namespace citygml { class AppearanceManager; class PolygonManager; class GeometryManager; class CityGMLLogger; class CityModel; class AppearanceTarget; class CityObject; class Geometry; class ImplicitGeometry; class Polygon; class LineString; class Appearance; class Texture; class GeoreferencedTexture; class Material; class MaterialTargetDefinition; class TextureTargetDefinition; class LIBCITYGML_EXPORT CityGMLFactory { public: CityGMLFactory(std::shared_ptr logger); CityModel* createCityModel(const std::string& id); CityObject* createCityObject(const std::string& id, CityObject::CityObjectsType type); Geometry* createGeometry(const std::string& id, const CityObject::CityObjectsType& cityObjType = CityObject::CityObjectsType::COT_All, unsigned int lod = 0); std::shared_ptr createPolygon(const std::string& id); std::shared_ptr createLineString(const std::string& id); /** * @brief requests a polygon for a Geometry object that will be added later * @param geom the Geometry object to which the polygon will be added * @param polygonId the id of the polygon */ void requestSharedPolygonForGeometry(Geometry* geom, const std::string& polygonId); ImplicitGeometry* createImplictGeometry(const std::string& id); std::shared_ptr shareGeometry(Geometry* geom); void requestSharedGeometryWithID(ImplicitGeometry* implicitGeom, const std::string& id); std::shared_ptr createTexture(const std::string& id); std::shared_ptr createMaterial(const std::string& id); std::shared_ptr createGeoReferencedTexture(const std::string& id); std::shared_ptr createMaterialTargetDefinition(const std::string& targetID, std::shared_ptr appearance, const std::string& id); std::shared_ptr createTextureTargetDefinition(const std::string& targetID, std::shared_ptr appearance, const std::string& id); std::shared_ptr getAppearanceWithID(const std::string& id); std::vector getAllThemes(); void closeFactory(); ~CityGMLFactory(); protected: void appearanceTargetCreated(AppearanceTarget* obj); std::shared_ptr m_logger; std::unique_ptr m_appearanceManager; std::unique_ptr m_polygonManager; std::unique_ptr m_geometryManager; }; } libcitygml-2.0.8/sources/include/citygml/citygmllogger.h000066400000000000000000000045011321622335500234610ustar00rootroot00000000000000#pragma once #include #include namespace citygml { class LIBCITYGML_EXPORT CityGMLLogger { public: enum class LOGLEVEL { LL_ERROR = 4, LL_WARNING = 3, LL_INFO = 2, LL_DEBUG = 1, LL_TRACE = 0 }; CityGMLLogger(LOGLEVEL level = LOGLEVEL::LL_ERROR):m_logLevel(level){} /** * @brief logs a message. Might be called from different threads. */ virtual void log(LOGLEVEL level, const std::string& message, const char* file=nullptr, int line=-1) const = 0; virtual bool isEnabledFor(LOGLEVEL level) const { return level >= getLogLevel(); }; virtual LOGLEVEL getLogLevel() const{ return m_logLevel; }; virtual LOGLEVEL setLogLevel(LOGLEVEL level) { return m_logLevel = level; }; private: LOGLEVEL m_logLevel; }; /** * @brief logs a message for a certain log level * @param logger a pointer to a CityGMLLogger * @param level the CityGMLLogger::LOGLEVEL * @param message a string or a stream expression */ #define CITYGML_LOG(logger, level, message) \ do { \ if (logger->isEnabledFor(level)) { \ std::stringstream ss; \ ss << message; \ logger->log(level, ss.str(), __FILE__, __LINE__); \ } \ } while (0); #define CITYGML_LOG_ERROR(logger, message) CITYGML_LOG(logger, citygml::CityGMLLogger::LOGLEVEL::LL_ERROR, message) #define CITYGML_LOG_WARN(logger, message) CITYGML_LOG(logger, citygml::CityGMLLogger::LOGLEVEL::LL_WARNING, message) #define CITYGML_LOG_INFO(logger, message) CITYGML_LOG(logger, citygml::CityGMLLogger::LOGLEVEL::LL_INFO, message) #define CITYGML_LOG_DEBUG(logger, message) CITYGML_LOG(logger, citygml::CityGMLLogger::LOGLEVEL::LL_DEBUG, message) #define CITYGML_LOG_TRACE(logger, message) CITYGML_LOG(logger, citygml::CityGMLLogger::LOGLEVEL::LL_TRACE, message) } libcitygml-2.0.8/sources/include/citygml/citymodel.h000066400000000000000000000033631321622335500226070ustar00rootroot00000000000000#pragma once #include #include #include #include #include #include namespace citygml { class AppearanceManager; class AppearanceTarget; class CityGMLLogger; class CityObject; class CityGMLFactory; typedef std::vector > CityObjects; typedef std::vector ConstCityObjects; typedef std::map< CityObject::CityObjectsType, std::vector > CityObjectsMap; class LIBCITYGML_EXPORT CityModel : public FeatureObject { friend class CityGMLFactory; public: /** * @brief Return the roots elements of the model. */ const ConstCityObjects getRootCityObjects() const; void addRootObject(CityObject* obj); unsigned int getNumRootCityObjects() const; CityObject& getRootCityObject(int i); const CityObject& getRootCityObject(int i) const; const ConstCityObjects getAllCityObjectsOfType( CityObject::CityObjectsType type ) const; const std::string& getSRSName() const; void finish(Tesselator& tesselator, bool optimize, std::shared_ptr logger); std::vector themes() const; void setThemes(std::vector themes); ~CityModel(); protected: CityModel( const std::string& id = "CityModel"); void addToCityObjectsMapRecursive(const CityObject* cityObj); CityObjects m_roots; CityObjectsMap m_cityObjectsMap; std::string m_srsName; std::vector m_themes; }; LIBCITYGML_EXPORT std::ostream& operator<<( std::ostream&, const citygml::CityModel & ); } libcitygml-2.0.8/sources/include/citygml/cityobject.h000066400000000000000000000113161321622335500227520ustar00rootroot00000000000000#pragma once #include #include #include #include #include class Tesselator; namespace citygml { class ParserParams; class Geometry; class ImplicitGeometry; class Composite; class CityGMLLogger; class AppearanceManager; class Address; class LIBCITYGML_EXPORT CityObject : public FeatureObject { public: enum class CityObjectsType : uint64_t { COT_GenericCityObject = 1ll, COT_Building = 1ll<< 1, COT_Room = 1ll<< 2, COT_BuildingInstallation = 1ll<< 3, COT_BuildingFurniture = 1ll<< 4, COT_Door = 1ll<< 5, COT_Window = 1ll<< 6, COT_CityFurniture = 1ll<< 7, COT_Track = 1ll<< 8, COT_Road = 1ll<< 9, COT_Railway = 1ll<< 10, COT_Square = 1ll<< 11, COT_PlantCover = 1ll<< 12, COT_SolitaryVegetationObject = 1ll<< 13, COT_WaterBody = 1ll<< 14, COT_ReliefFeature = 1ll<< 15, COT_LandUse = 1ll<< 16, COT_Tunnel = 1ll<< 17, COT_Bridge = 1ll<< 18, COT_BridgeConstructionElement = 1ll<< 19, COT_BridgeInstallation = 1ll<< 20, COT_BridgePart = 1ll<< 21, COT_BuildingPart = 1ll<< 22, COT_WallSurface = 1ll<< 23, COT_RoofSurface = 1ll<< 24, COT_GroundSurface = 1ll<< 25, COT_ClosureSurface = 1ll<< 26, COT_FloorSurface = 1ll<< 27, COT_InteriorWallSurface = 1ll<< 28, COT_CeilingSurface = 1ll<< 29, COT_CityObjectGroup = 1ll<< 30, COT_OuterCeilingSurface = 1ll<< 31, COT_OuterFloorSurface = 1ll<< 32, // covers all supertypes of tran::_TransportationObject that are not Track, Road, Railway or Square... // there are to many for to few bits to explicitly enumerate them. However Track, Road, Railway or Square should be used most of the time COT_TransportationObject = 1ll<< 33, COT_All = 0xFFFFFFFFFFFFFFFFll }; CityObject( const std::string& id, CityObjectsType type ); // Get the object type CityObjectsType getType() const; std::string getTypeAsString() const; // Get the number of geometries contains in the object unsigned int getGeometriesCount() const; // Access the geometries const Geometry& getGeometry( unsigned int i ) const; Geometry& getGeometry( unsigned int i ); void addGeometry(Geometry* geom); // Get the number of implicit geometries contains in the object unsigned int getImplicitGeometryCount() const; // Access the implicit geometries const ImplicitGeometry& getImplicitGeometry( unsigned int i ) const; ImplicitGeometry& getImplicitGeometry( unsigned int i ); void addImplictGeometry(ImplicitGeometry* implictGeom); // Access the children unsigned int getChildCityObjectsCount() const; const CityObject& getChildCityObject( unsigned int i ) const; CityObject& getChildCityObject( unsigned int i ); void addChildCityObject(CityObject* cityObj); // Access address const Address* address() const; void setAddress(std::unique_ptr
&& address); void finish(Tesselator& tesselator, bool optimize, std::shared_ptr logger); virtual ~CityObject(); protected: CityObjectsType m_type; std::vector > m_geometries; std::vector > m_implicitGeometries; std::vector > m_children; std::unique_ptr
m_address; }; LIBCITYGML_EXPORT std::ostream& operator<<( std::ostream& os, const CityObject& o ); LIBCITYGML_EXPORT std::string cityObjectsTypeToString(const CityObject::CityObjectsType& t); LIBCITYGML_EXPORT CityObject::CityObjectsType cityObjectsTypeFromString(const std::string& s, bool& valid); } ENUM_CLASS_BITWISE_OPERATORS_DEFS(citygml::CityObject::CityObjectsType); libcitygml-2.0.8/sources/include/citygml/enum_type_bitmask.h000066400000000000000000000054271321622335500243400ustar00rootroot00000000000000#pragma once #include #include #include #include template class LIBCITYGML_EXPORT EnumClassBitmask { private: T t; public: typedef typename std::underlying_type::type underlying_type; /*constexpr*/ EnumClassBitmask() : t(T(0)) {} /*constexpr*/ EnumClassBitmask(T t) : t(t) {} /*constexpr*/ explicit EnumClassBitmask(underlying_type t) : t(T(t)) {} /*constexpr*/ /*explicit*/ operator bool() const { return bool(t); } /*constexpr*/ operator T() { return t; } /*constexpr*/ EnumClassBitmask operator|(T r) const { return EnumClassBitmask(t | r); } /*constexpr*/ EnumClassBitmask operator&(T r) const { return EnumClassBitmask(t & r); } /*constexpr*/ EnumClassBitmask operator^(T r) const { return EnumClassBitmask(t ^ r); } /*constexpr*/ EnumClassBitmask operator~() const { return EnumClassBitmask(~t); } const EnumClassBitmask& operator|=(T r) { t = t | r; return *this; } const EnumClassBitmask& operator&=(T r) { t = t & r; return *this; } const EnumClassBitmask& operator^=(T r) { t = t ^ r; return *this; } bool operator==(const EnumClassBitmask& r) { return underlying_type(t) == underlying_type(r.t); } bool operator==(const T& r) { return underlying_type(t) == underlying_type(r); } const EnumClassBitmask& setFromUnderlyingType(underlying_type value) { t = T(value); return *this; } friend std::istream& operator>> (std::istream &is, EnumClassBitmask& r) { underlying_type tmp; is >> tmp; r.t = static_cast(tmp); return is; } friend std::ostream& operator<< (std::ostream &os, const EnumClassBitmask& r) { os << static_cast(r.t); return os; } }; #define ENUM_CLASS_BITWISE_OPERATORS(type_name) \ /*constexpr*/ LIBCITYGML_EXPORT type_name operator|(type_name l, type_name r) { return type_name(std::underlying_type::type(l) | std::underlying_type::type(r)); } \ /*constexpr*/ LIBCITYGML_EXPORT type_name operator&(type_name l, type_name r) { return type_name(std::underlying_type::type(l) & std::underlying_type::type(r)); } \ /*constexpr*/ LIBCITYGML_EXPORT type_name operator^(type_name l, type_name r) { return type_name(std::underlying_type::type(l) ^ std::underlying_type::type(r)); } \ /*constexpr*/ LIBCITYGML_EXPORT type_name operator~(type_name l) { return type_name(~std::underlying_type::type(l)); } #define ENUM_CLASS_BITWISE_OPERATORS_DEFS(type_name) \ /*constexpr*/ LIBCITYGML_EXPORT type_name operator|(type_name l, type_name r); \ /*constexpr*/ LIBCITYGML_EXPORT type_name operator&(type_name l, type_name r); \ /*constexpr*/ LIBCITYGML_EXPORT type_name operator^(type_name l, type_name r);\ /*constexpr*/ LIBCITYGML_EXPORT type_name operator~(type_name l); libcitygml-2.0.8/sources/include/citygml/envelope.h000066400000000000000000000021661321622335500224330ustar00rootroot00000000000000#pragma once #include #include #include namespace citygml { /** * @brief The Envelope class defines a bounding box in an spatial reference system (gml:Envelope) */ class LIBCITYGML_EXPORT Envelope { public: Envelope(); Envelope(const std::string& srsName); /** * @brief lower left front corner of the bounding box in srs coordinates */ const TVec3d& getLowerBound() const; void setLowerBound(const TVec3d& coordinate); /** * @brief upper right back corner of the bounding box in srs coordinates */ const TVec3d& getUpperBound() const; void setUpperBound(const TVec3d& coordinate); /** * @brief the name of the spatial reference system */ const std::string& srsName() const; const bool validBounds() const; protected: TVec3d m_lowerBound; TVec3d m_upperBound; std::string m_srsName; }; LIBCITYGML_EXPORT std::ostream& operator<<( std::ostream&, const citygml::Envelope& ); } libcitygml-2.0.8/sources/include/citygml/featureobject.h000066400000000000000000000006771321622335500234450ustar00rootroot00000000000000#pragma once #include #include #include namespace citygml { class Envelope; class LIBCITYGML_EXPORT FeatureObject : public Object { public: FeatureObject(const std::string& gmlID); const Envelope& getEnvelope() const; void setEnvelope(Envelope* e); virtual ~FeatureObject(); protected: std::unique_ptr m_envelope; }; } libcitygml-2.0.8/sources/include/citygml/geometry.h000066400000000000000000000054511321622335500224510ustar00rootroot00000000000000#pragma once #include #include #include #include #include class Tesselator; namespace citygml { class LineString; class Polygon; class AppearanceManager; class Appearance; class ParserParams; class CityGMLFactory; class CityGMLLogger; class LIBCITYGML_EXPORT Geometry : public AppearanceTarget { friend class CityGMLFactory; public: enum class GeometryType { GT_Unknown = 1 << 0, GT_Roof = 1 << 1, GT_Wall = 1 << 2, GT_Ground = 1 << 3, GT_Closure = 1 << 4, GT_Floor = 1 << 5, GT_InteriorWall = 1 << 6, GT_Ceiling = 1 << 7, GT_OuterCeiling = 1 << 8, GT_OuterFloor = 1 << 9 }; unsigned int getLOD() const; unsigned int getPolygonsCount() const; std::shared_ptr getPolygon( unsigned int i ); std::shared_ptr getPolygon( unsigned int i ) const; unsigned int getLineStringCount() const; std::shared_ptr getLineString( unsigned int i ); std::shared_ptr getLineString( unsigned int i ) const; unsigned int getGeometriesCount() const; const Geometry& getGeometry( unsigned int i ) const; Geometry& getGeometry( unsigned int i ); void addGeometry(Geometry* geom); GeometryType getType() const; std::string getTypeAsString() const; unsigned int lod() const; void setLod(unsigned int lod); void addPolygon(std::shared_ptr ); void addLineString(std::shared_ptr); /** * @brief finishes the geometry by finishing its child polygons after broadcasting its appearances to all child polygons * @param tesselate determines wether the polygons are tesselated * @param tesselator the tesselator to be used for tesselation * @param mergePolygons determines wether all polygons are merged into one */ void finish(Tesselator& tesselator, bool optimize, std::shared_ptr logger); ~Geometry(); protected: Geometry( const std::string& id, GeometryType type = GeometryType::GT_Unknown, unsigned int lod = 0 ); bool m_finished; GeometryType m_type; unsigned int m_lod; std::vector > m_childGeometries; std::vector > m_polygons; std::vector > m_lineStrings; }; LIBCITYGML_EXPORT std::ostream& operator<<( std::ostream& os, const citygml::Geometry& s ); } libcitygml-2.0.8/sources/include/citygml/geometrymanager.h000066400000000000000000000024221321622335500237770ustar00rootroot00000000000000#pragma once #include #include #include #include #include namespace citygml { class ImplicitGeometry; class Geometry; class CityGMLLogger; class LIBCITYGML_EXPORT GeometryManager { public: GeometryManager(std::shared_ptr logger); void addSharedGeometry(std::shared_ptr geom); /** * @brief the Geometry with id geometryID will be added to geom when finished is called * @param geom the ImplicitGeometry object to which the Geometry object will be added * @param geometryID the id of the Geometry */ void requestSharedGeometryForImplicitGeometry(ImplicitGeometry* geom, const std::string& geometryID); void finish(); ~GeometryManager(); private: struct GeometryRequest { GeometryRequest(ImplicitGeometry* target, std::string geometryID) : target(target), geometryID(geometryID) {} ImplicitGeometry* target; std::string geometryID; }; std::shared_ptr m_logger; std::vector m_geometryRequests; std::unordered_map > m_sharedGeometries; }; } libcitygml-2.0.8/sources/include/citygml/georeferencedtexture.h000066400000000000000000000014341321622335500250310ustar00rootroot00000000000000#pragma once #include #include namespace citygml { class CityGMLFactory; class LIBCITYGML_EXPORT GeoreferencedTexture : public Texture { friend class CityGMLFactory; public: bool getPreferWorldFile() const; void setPreferWorldFile(bool value); virtual std::shared_ptr asTexture(); virtual std::shared_ptr asTexture() const; virtual std::shared_ptr asGeoreferencedTexture(); virtual std::shared_ptr asGeoreferencedTexture() const; // TODO support referencePoint and orientation protected: GeoreferencedTexture( const std::string& id ); bool m_preferWorldFile; }; } libcitygml-2.0.8/sources/include/citygml/implictgeometry.h000066400000000000000000000023411321622335500240260ustar00rootroot00000000000000#pragma once #include #include #include #include #include namespace citygml { class Geometry; class CityGMLFactory; class LIBCITYGML_EXPORT ImplicitGeometry : public Object { friend class CityGMLFactory; public: void setTransformMatrix(const TransformationMatrix matrix); const TransformationMatrix& getTransformMatrix() const; void setReferencePoint(const TVec3d& referencePoint); TVec3d getReferencePoint() const; void addGeometry(std::shared_ptr geom); // Get the number of geometries contains in the object unsigned int getGeometriesCount() const; // Access the geometries Geometry& getGeometry( unsigned int i ) const; // Access the srs of the implicit geometry std::string getSRSName() const; void setSRSName(const std::string& srsName); protected: ImplicitGeometry(const std::string& id); TransformationMatrix m_matrix; TVec3d m_referencePoint; std::vector > m_geometries; std::string m_srsName; }; } libcitygml-2.0.8/sources/include/citygml/linearring.h000066400000000000000000000016351321622335500227500ustar00rootroot00000000000000#pragma once #include #include #include #include #include namespace citygml { class TextureTargetDefinition; class CityGMLLogger; class LIBCITYGML_EXPORT LinearRing : public Object { public: LinearRing( const std::string& id, bool isExterior ); bool isExterior() const; unsigned int size() const; const std::vector& getVertices() const; std::vector& getVertices(); void setVertices(std::vector vertices); void addVertex( const TVec3d& v ); TVec3d computeNormal() const; void removeDuplicateVertices(const std::vector& targets , std::shared_ptr logger); void forgetVertices(); protected: bool m_exterior; std::vector m_vertices; }; } libcitygml-2.0.8/sources/include/citygml/linestring.h000066400000000000000000000020111321622335500227610ustar00rootroot00000000000000#pragma once #include #include #include #include #include namespace citygml { class CityGMLFactory; /** * @brief The LineString class implements the gml:LineString object may also be used as a container of a single gml::Point */ class LIBCITYGML_EXPORT LineString : public Object { friend class CityGMLFactory; public: int getDimensions() const; const std::vector& getVertices2D() const; const std::vector& getVertices3D() const; std::vector& getVertices2D(); std::vector& getVertices3D(); void setVertices2D(const std::vector& vertices); void setVertices3D(const std::vector& vertices); void setDimensions(int dim); protected: LineString(const std::string& id); std::vector m_vertices_2d; std::vector m_vertices_3d; int m_dimensions; }; } libcitygml-2.0.8/sources/include/citygml/material.h000066400000000000000000000030061321622335500224060ustar00rootroot00000000000000#pragma once #include #include #include #include namespace citygml { class CityGMLFactory; class LIBCITYGML_EXPORT Material : public Appearance { friend class CityGMLFactory; public: TVec3f getDiffuse() const; void setDiffuse(TVec3f diffuse); TVec3f getEmissive() const; void setEmissive(TVec3f emissive); TVec3f getSpecular() const; void setSpecular(TVec3f specular); float getAmbientIntensity() const; void setAmbientIntensity(float intensity); /** * @brief the shininess of the material * @return a value between 0 and 1, where 1 is the brightest intensity * @note openGL defines the shininess as a value beteen 0 and 128 with 128 beeing the brightest intensity */ float getShininess() const; void setShininess(float shininess); float getTransparency() const; void setTransparency(float transparancy); bool isSmooth() const; void setIsSmooth(bool isSmooth); virtual std::shared_ptr asMaterial() override; virtual std::shared_ptr asMaterial() const override; protected: Material( const std::string& id ); TVec3f m_diffuse; TVec3f m_emissive; TVec3f m_specular; float m_ambientIntensity; float m_shininess; float m_transparency; bool m_isSmooth; }; } libcitygml-2.0.8/sources/include/citygml/materialtargetdefinition.h000066400000000000000000000010651321622335500256710ustar00rootroot00000000000000#pragma once #include #include #include namespace citygml { class CityGMLFactory; /** * @brief The MaterialTargetDefinition associates a material with a target surface. */ class LIBCITYGML_EXPORT MaterialTargetDefinition : public AppearanceTargetDefinition { friend class CityGMLFactory; protected: MaterialTargetDefinition(const std::string& targetID, std::shared_ptr appearance, const std::string& id); }; } libcitygml-2.0.8/sources/include/citygml/object.h000066400000000000000000000015771321622335500220710ustar00rootroot00000000000000#pragma once #include #include #include namespace citygml { /** * @brief The base object associated with an unique id and a set of attributes (key-value pairs) */ class LIBCITYGML_EXPORT Object { public: Object( const std::string& id ); const std::string& getId() const; std::string getAttribute( const std::string& name ) const; const AttributesMap& getAttributes() const; AttributesMap& getAttributes(); virtual ~Object() {} void setAttribute(const std::string& name, const std::string& value, AttributeType type = AttributeType::String, bool overwrite = true ); protected: std::string m_id; AttributesMap m_attributes; }; LIBCITYGML_EXPORT std::ostream& operator<<( std::ostream&, const citygml::Object& ); } libcitygml-2.0.8/sources/include/citygml/polygon.h000066400000000000000000000126171321622335500223070ustar00rootroot00000000000000#pragma once #include #include #include #include #include #include #include #include #include class Tesselator; namespace citygml { class TextureCoordinates; class CityGMLFactory; class Texture; class Material; /** * @brief The Polygon class implements the functionality of gml::Polygon and gml::SurfacePatch (gml::Rectangle, gml::Triangle) objects */ class LIBCITYGML_EXPORT Polygon : public AppearanceTarget { friend class CityGMLFactory; public: enum class AppearanceSide { FRONT, BACK }; // Get the vertices const std::vector& getVertices() const; std::vector& getVertices(); // Get the indices const std::vector& getIndices() const; /** * @brief returns the material of this polygon for the given theme and side * @param theme a name of an appearance theme * @param front determines for which side the material should be returned (true = front side, false = backside) * @return a Material object or nullptr if there is no material for the theme and side */ std::shared_ptr getMaterialFor(const std::string& theme, bool front) const; /** * @brief returns the material of this polygon for the given theme. Prefers front side materials over back side materials * @param theme a name of an appearance theme * @return a Material object or nullptr if there is no material for the theme */ std::shared_ptr getMaterialFor(const std::string& theme) const; /** * @brief returns the texture of this polygon for the given theme and side * @param theme a name of an appearance theme * @param front determines for which side the texture should be returned (true = front side, false = backside) * @return a Texture object or nullptr if there is no texture for the theme and side */ std::shared_ptr getTextureFor(const std::string& theme, bool front) const; /** * @brief returns the texture of this polygon for the given theme. Prefers front side textures over back side textures * @param theme a name of an appearance theme * @return a Texture object or nullptr if there is no texture for the theme */ std::shared_ptr getTextureFor(const std::string& theme) const; /** * @brief returns the texture coordinates for the given theme and side * @param theme a name of an appearance theme * @param front determines for which side the texture coordinates should be returned (true = front side, false = backside) * @return the texture coordinates or an empty list if there are no texture coordinates for this theme and side */ const std::vector getTexCoordsForTheme(const std::string& theme, bool front) const; bool negNormal() const; void setNegNormal(bool negNormal); void addRing( LinearRing* ); void finish(Tesselator& tesselator , bool optimize, std::shared_ptr logger); std::shared_ptr exteriorRing(){ return m_exteriorRing; } const std::shared_ptr exteriorRing() const{ return m_exteriorRing; } std::vector >& interiorRings() { return m_interiorRings; } const std::vector >& interiorRings() const{ return m_interiorRings; } virtual ~Polygon(); protected: Polygon( const std::string& id, std::shared_ptr logger ); std::shared_ptr getTextureForTheme(const std::string& theme, bool front) const; /** * @brief fill the vertex array and creates a corresponding index array * @param tesselate if true the tesselator will be used to tesselate the linear rings * @param tesselator the Tesselator object */ void computeIndices(Tesselator& tesselator, std::shared_ptr logger); void createSimpleIndices(std::shared_ptr logger); void createIndicesWithTesselation(Tesselator& tesselator, std::shared_ptr logger); void removeDuplicateVerticesInRings(std::shared_ptr logger); std::vector getTexCoordsForRingAndTheme(const LinearRing& ring, const std::string& theme, bool front); std::vector > getTexCoordListsForRing(const LinearRing& ring, const std::vector& themesFront, const std::vector& themesBack); TVec3d computeNormal(); std::vector m_vertices; std::unordered_map > m_themeToFrontTexCoordsMap; std::unordered_map > m_themeToBackTexCoordsMap; std::vector m_indices; std::shared_ptr m_exteriorRing; std::vector > m_interiorRings; bool m_negNormal; bool m_finished; std::shared_ptr m_logger; }; } libcitygml-2.0.8/sources/include/citygml/polygonmanager.h000066400000000000000000000022751321622335500236410ustar00rootroot00000000000000#pragma once #include #include #include #include #include namespace citygml { class Polygon; class Geometry; class CityGMLLogger; class LIBCITYGML_EXPORT PolygonManager { public: PolygonManager(std::shared_ptr logger); void addPolygon(std::shared_ptr poly); /** * @brief the polygon with id polygonID will be added to geom when finished is called * @param geom the geometry object to which the polygon will be added * @param polygonID the id of the polygon */ void requestSharedPolygonForGeometry(Geometry* geom, const std::string& polygonID); void finish(); ~PolygonManager(); private: struct PolygonRequest { PolygonRequest(Geometry* target, std::string polygonID) : target(target), polygonID(polygonID) {} Geometry* target; std::string polygonID; }; std::shared_ptr m_logger; std::vector m_polygonRequests; std::unordered_map > m_sharedPolygons; }; } libcitygml-2.0.8/sources/include/citygml/tesselator.h000066400000000000000000000052721321622335500230040ustar00rootroot00000000000000/* -*-c++-*- libcitygml - Copyright (c) 2010 Joachim Pouderoux, BRGM * * This file is part of libcitygml library * http://code.google.com/p/libcitygml * * libcitygml is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. * * libcitygml is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. */ #ifndef __TESSELATOR_H__ #define __TESSELATOR_H__ #ifdef WIN32 # include #else # define CALLBACK # define APIENTRY #endif #ifdef __APPLE__ #include #else #include #endif #include #include #include #include #include namespace citygml { class CityGMLLogger; } // GLU based polygon tesselator class LIBCITYGML_EXPORT Tesselator { public: Tesselator( std::shared_ptr logger ); ~Tesselator(); void init(const TVec3d& normal, GLenum winding_rule = GLU_TESS_WINDING_ODD ); /** * @brief Add a new contour - add the exterior ring first, then interiors * @param textureCoordinatesLists a list of texture coordinates lists for the countour. Each list contains one texture coordinate for each vertex. */ void addContour(const std::vector&, std::vector > textureCoordinatesLists); // Let's tesselate! void compute(); // Tesselation result access const std::vector getVertices() const; const std::vector >& getTexCoords() const { return _texCoordsLists; } const std::vector& getIndices() const; void setKeepVertices(bool val); bool keepVertices() const; private: typedef void (APIENTRY *GLU_TESS_CALLBACK)(); static void CALLBACK beginCallback( GLenum, void* ); static void CALLBACK vertexDataCallback( GLvoid*, void* ); static void CALLBACK combineCallback( GLdouble[3], void* [4], GLfloat [4], void** , void* ); static void CALLBACK endCallback( void* ); static void CALLBACK errorCallback(GLenum, void*); private: GLUtesselator *_tobj; GLenum _curMode; std::list _vertices; std::vector > _texCoordsLists; std::list _indices; std::vector _outIndices; std::vector _curIndices; std::shared_ptr _logger; bool _keepVertices; }; #endif // __TESSELATOR_H__ libcitygml-2.0.8/sources/include/citygml/texture.h000066400000000000000000000033261321622335500223150ustar00rootroot00000000000000#pragma once #include #include #include #include namespace citygml { class CityGMLFactory; class LIBCITYGML_EXPORT Texture : public Appearance { friend class CityGMLFactory; public: enum class WrapMode { WM_NONE, // the resulting color is fully transparent WM_WRAP, // the texture is repeated WM_MIRROR, // the texture is repeated and mirrored WM_CLAMP, // the texture is clamped to its edges WM_BORDER // the resulting color is specified by the borderColor element (RGBA) }; std::string getUrl() const; void setUrl(const std::string& url); bool getRepeat() const; WrapMode getWrapMode() const; void setWrapMode(WrapMode mode); /** * @brief tries to interpret the string as a WrapMode. Does nothing on failure. * @param wrapMode the string e.g. ("WM_NONE") * @return true if the string could be interpreted as a WrapMode, false otherwise */ bool setWrapModeFromString(std::string wrapMode); TVec4f getBorderColor() const; void setBorderColor(TVec4f color); std::string toString() const override; virtual std::shared_ptr asTexture() override; virtual std::shared_ptr asTexture() const override; virtual ~Texture(); protected: Texture( const std::string& id ); Texture( const std::string& id, const std::string& type ); std::string m_url; bool m_repeat; WrapMode m_wrapMode; TVec4f m_borderColor; }; } libcitygml-2.0.8/sources/include/citygml/texturecoordinates.h000066400000000000000000000015101321622335500245410ustar00rootroot00000000000000#pragma once #include #include #include #include #include #include namespace citygml { class LinearRing; /** * @brief The TextureCoordinates class describes a mapping of texture coordinates to the vertices of a linear ring */ class LIBCITYGML_EXPORT TextureCoordinates : public Object { public: TextureCoordinates(std::string id, std::string targetID); bool targets(const LinearRing& ring) const; std::string getTargetLinearRingID() const; const std::vector& getCoords() const; void setCoords(std::vector texCoords); bool eraseCoordinate(unsigned int i); protected: std::string m_targetID; std::vector m_coordlist; }; } libcitygml-2.0.8/sources/include/citygml/texturetargetdefinition.h000066400000000000000000000041521321622335500255730ustar00rootroot00000000000000#pragma once #include #include #include #include #include namespace citygml { class TextureCoordinates; class CityGMLFactory; /** * @brief The TextureTargetDefinition associates a texture with a target surface and defines the mapping of the texture. * @note may be shared between different texture objects using the 'xlink:href' attribute. * TextureTargets are applicable only to polygonal surfaces, whose boundaries are described by gml:LinearRing * (e.g. gml:Triangle, gml:Polygon, or a gml:MultiSurface consisting of gml:Polygons). */ class LIBCITYGML_EXPORT TextureTargetDefinition : public AppearanceTargetDefinition { friend class CityGMLFactory; public: /** * @brief the number of TextureCoordinates objects for this texture target */ unsigned int getTextureCoordinatesCount() const; /** * @brief the i-th texture coordinates in texture coordinates list (gml::TexCoordList) */ std::shared_ptr getTextureCoordinates(unsigned int i); std::shared_ptr getTextureCoordinates(unsigned int i) const; /** * @brief the texture coordinates for linear ring with the given id * @return the TextureCoordinates object or nullptr if no such object exists for ringID */ std::shared_ptr getTextureCoordinatesForID(const std::string& ringID); std::shared_ptr getTextureCoordinatesForID(const std::string& ringID) const; void addTexCoordinates(std::shared_ptr texCoords); ~TextureTargetDefinition(); protected: TextureTargetDefinition(const std::string& targetID, std::shared_ptr appearance, const std::string& id); std::vector > m_coordinatesList; std::unordered_map > m_idTexCoordMap; }; } libcitygml-2.0.8/sources/include/citygml/transformmatrix.h000066400000000000000000000007221321622335500240520ustar00rootroot00000000000000#pragma once #include #include namespace citygml { class LIBCITYGML_EXPORT TransformationMatrix : public Object { public: TransformationMatrix(); TransformationMatrix(double* matrix); const double* getMatrix() const; const double* getTransposedMatrix() const; ~TransformationMatrix(); protected: double m_matrix[16]; double m_transposedMatrix[16]; }; } libcitygml-2.0.8/sources/include/citygml/utils.h000066400000000000000000000044751321622335500217630ustar00rootroot00000000000000/* -*-c++-*- libcitygml - Copyright (c) 2010 Joachim Pouderoux, BRGM * * This file is part of libcitygml library * http://code.google.com/p/libcitygml * * libcitygml is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. * * libcitygml is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. */ #pragma once #include #include #include // Helpers // std::string tokenizer inline std::vector tokenize( const std::string& str, const std::string& delimiters = ",|& " ) { std::vector tokens; std::string::size_type lastPos = str.find_first_not_of( delimiters, 0 ); std::string::size_type pos = str.find_first_of( delimiters, lastPos ); while ( pos != std::string::npos || lastPos != std::string::npos ) { tokens.push_back( str.substr( lastPos, pos - lastPos ) ); lastPos = str.find_first_not_of( delimiters, pos ); pos = str.find_first_of( delimiters, lastPos ); } return tokens; } inline bool ci_string_compare( const std::string& str1, const std::string& str2 ) { std::string s1( str1 ); std::transform( s1.begin(), s1.end(), s1.begin(), ::tolower ); std::string s2( str2 ); std::transform( s2.begin(), s2.end(), s2.begin(), ::tolower ); return s1 == s2; } inline std::string toLower(const std::string& s) { std::string lower = s; std::transform( lower.begin(), lower.end(), lower.begin(), ::tolower ); return lower; } inline std::string trim_left( const std::string& s, const std::string& t = " \t\r\n" ) { std::string d( s ); return d.erase( 0, s.find_first_not_of( t ) ); } inline std::string trim_right( const std::string& s, const std::string& t = " \t\r\n" ) { std::string d( s ); size_t endpos = d.find_last_not_of( t ); return ( endpos != std::string::npos ) ? d.erase( endpos + 1 ) : d; } inline std::string trim( const std::string& s, const std::string& t = " \t\r\n" ) { return trim_left( trim_right( s, t ), t ); } libcitygml-2.0.8/sources/include/citygml/vecs.hpp000066400000000000000000000200201321622335500221030ustar00rootroot00000000000000#pragma once #include #include #include #include // 2D vector class. template< class T > class TVec2 { public: T x; T y; public: TVec2( const TVec2& o) { this->x = o.x; this->y = o.y; } TVec2( const T x = (T)0, const T y = (T)0 ); TVec2( const T vec[] ); TVec2 operator+( const TVec2& v ) const; TVec2 operator-( const TVec2& v ) const; TVec2 operator-() const; TVec2 operator*( const T& v ) const; TVec2 operator*( const TVec2& v ) const; TVec2 operator/( const T& v ) const; TVec2 operator/( const TVec2& v ) const; bool operator==( const TVec2& v ) const; bool operator!=( const TVec2& v ) const; }; template< class T > inline TVec2::TVec2( const T x, const T y ) { this->x = x; this->y = y; } template< class T > inline TVec2::TVec2( const T vec[] ) { x = vec[0]; y = vec[1]; } template< class T > inline TVec2 TVec2::operator+( const TVec2& v ) const { return TVec2( x + v.x, y + v.y ); } template< class T > inline TVec2 TVec2::operator-( const TVec2& v ) const { return TVec2( x - v.x, y - v.y ); } template< class T > inline TVec2 TVec2::operator-() const { return TVec2( -x, -y ); } template< class T > inline TVec2 TVec2::operator*( const T& v ) const { return TVec2( x * v, y * v ); } template< class T > inline TVec2 TVec2::operator*( const TVec2& v ) const { return TVec2( x * v.x, y * v.y ); } template< class T > inline TVec2 TVec2::operator/( const T& v ) const { return TVec2( x / v, y / v ); } template< class T > inline TVec2 TVec2::operator/( const TVec2& v ) const { return TVec2( x / v.x, y / v.y ); } template< class T > inline bool TVec2::operator==( const TVec2& v ) const { return x == v.x && y == v.y; } template< class T > inline bool TVec2::operator!=( const TVec2& v ) const { return x != v.x || y != v.y; } template< class T > inline TVec2 operator*( const T& val, const TVec2& vec ) { return TVec2( vec.x * val, vec.y * val ); } template inline std::ostream& operator<<(std::ostream & os, TVec2 const & v) { return os << std::fixed << v.x << " " << std::fixed << v.y; } template inline std::istream& operator>>(std::istream & is, TVec2 & v) { return is >> v.x >> v.y; } typedef TVec2< float > TVec2f; typedef TVec2< double > TVec2d; // 3D vector class. template< class T > class TVec3 { public: union { T xyz[3]; T rgb[3]; struct { T x, y, z; }; struct { T r, g, b; }; }; public: TVec3( const T x = (T)0, const T y = (T)0, const T z = (T)0 ); TVec3( const T vec[] ); inline T length() const; inline T sqrLength() const; T dot( const TVec3& vec ) const; TVec3 cross( const TVec3& vec ) const; TVec3 normal() const; TVec3& normalEq(); TVec3& normalEq( const T length ); TVec3 operator+( const TVec3& rhs ) const; TVec3 operator+( const T& _v ) const; TVec3 operator-( const TVec3& rhs ) const; TVec3 operator-( const T& _v ) const; TVec3 operator-() const; TVec3 operator*( const T& rhs ) const; TVec3 operator*( const TVec3& rhs ) const; TVec3 operator/( const T& rhs ) const; TVec3 operator/( const TVec3& rhs ) const; inline bool operator==( const TVec3& rhs ) const; inline bool operator!=( const TVec3& rhs ) const; inline operator T*() { return xyz; } inline operator const T*() const { return xyz; } }; template< class T > inline TVec3::TVec3( const T x, const T y, const T z ) { this->x = x; this->y = y; this->z = z; } template< class T > inline TVec3::TVec3( const T vec[] ) { memcpy( xyz, vec, 3 * sizeof(T) ); } template< class T > inline T TVec3::length() const { return (T)sqrt( x*x + y*y + z*z ); } template< class T > inline T TVec3::sqrLength() const { return x*x + y*y + z*z; } template< class T > inline T TVec3::dot( const TVec3& vec ) const { return x*vec.x + y*vec.y + z*vec.z; } template< class T > inline TVec3 TVec3::cross( const TVec3& vec ) const { return TVec3( y*vec.z - z*vec.y, z*vec.x - x*vec.z, x*vec.y - y*vec.x ); } template< class T > inline TVec3 TVec3::normal() const { const T len = length(); const T tmp = ( len != (T)0 ) ? ( (T)1 / len ) : (T)0; return TVec3( x * tmp, y * tmp, z * tmp ); } template< class T > inline TVec3& TVec3::normalEq() { const T len = length(); const T tmp = ( len != (T)0 ) ? ( (T)1 / len ) : (T)0; x *= tmp; y *= tmp; z *= tmp; return *this; } template< class T > inline TVec3& TVec3::normalEq( const T length ) { const T len = TVec3::length(); const T tmp = ( len != (T)0 ) ? length / len : (T)0; x *= tmp; y *= tmp; z *= tmp; return *this; } template< class T > inline TVec3 TVec3::operator+( const TVec3& rhs ) const { return TVec3( x + rhs.x, y + rhs.y, z + rhs.z ); } template< class T > inline TVec3 TVec3::operator+( const T& _v ) const { return TVec3( x + _v, y + _v, z + _v ); } template< class T > inline TVec3 TVec3::operator-( const TVec3& rhs ) const { return TVec3( x - rhs.x, y - rhs.y, z - rhs.z ); } template< class T > inline TVec3 TVec3::operator-( const T& _v ) const { return TVec3( x - _v, y - _v, z - _v ); } template< class T > inline TVec3 TVec3::operator-() const { return TVec3( -x, -y, -z ); } template< class T > inline TVec3 TVec3::operator*( const T& rhs ) const { return TVec3( x * rhs, y * rhs, z * rhs ); } template< class T > inline TVec3 TVec3::operator*( const TVec3& rhs ) const { return TVec3( x * rhs.x, y * rhs.y, z * rhs.z ); } template< class T > inline TVec3 TVec3::operator/( const T& rhs ) const { return TVec3( x / rhs, y / rhs, z / rhs ); } template< class T > inline TVec3 TVec3::operator/( const TVec3& rhs ) const { return TVec3( x / rhs.x, y / rhs.y, z / rhs.z ); } template< class T > inline bool TVec3::operator==( const TVec3& rhs ) const { return x == rhs.x && y == rhs.y && z == rhs.z; } template< class T > inline bool TVec3::operator!=( const TVec3& rhs ) const { return x != rhs.x || y != rhs.y || z != rhs.z; } template< class T > inline TVec3 operator*( const T& val, const TVec3& vec ) { return TVec3( vec.x * val, vec.y * val, vec.z * val ); } template inline std::ostream& operator<<(std::ostream & os, const TVec3 & v) { return os << std::fixed << v.x << " " << std::fixed << v.y << " " << std::fixed << v.z; } template inline std::istream& operator>>(std::istream & is, TVec3 & v) { return is >> v.x >> v.y >> v.z; } typedef TVec3< float > TVec3f; typedef TVec3< double > TVec3d; //std::istream& operator>>(std::istream & is, TVec3d & v) //{ // return is >> v.x >> v.y >> v.z; //} //std::istream& operator>>(std::istream & is, TVec3f & v) //{ // return is >> v.x >> v.y >> v.z; //} // 4D vector class. template< class T > class TVec4 { public: union { T xyzw[4]; T rgba[4]; struct { T x, y, z, w; }; struct { T r, g, b, a; }; }; public: TVec4( const T x = (T)0, const T y = (T)0, const T z = (T)0, const T w = (T)0 ) { this->x = x; this->y = y; this->z = z; this->w = w; } TVec4( const T vec[], const T w ) { memcpy( xyzw, vec, 4 * sizeof(T) ); this->w = w; } TVec4( const T vec[] ) { memcpy( xyzw, vec, 4 * sizeof(T) ); } }; template inline std::ostream& operator<<( std::ostream & os, TVec4 const & v ) { return os << std::fixed << v.x << " " << std::fixed << v.y << " " << std::fixed << v.z << " " << std::fixed << v.w; } template inline std::istream& operator>>( std::istream & is, TVec4 & v ) { return is >> v.x >> v.y >> v.z >> v.w; } typedef TVec4< float > TVec4f; typedef TVec4< double > TVec4d; libcitygml-2.0.8/sources/include/parser/000077500000000000000000000000001321622335500202645ustar00rootroot00000000000000libcitygml-2.0.8/sources/include/parser/addressparser.h000066400000000000000000000022171321622335500233010ustar00rootroot00000000000000#pragma once #include #include namespace citygml { class Address; class AddressParser: public CityGMLElementParser { public: using Callback = std::function&&)>; public: AddressParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, const Callback& callback); virtual std::string elementParserName() const override; virtual bool handlesElement(const NodeType::XMLNode& node) const override; protected: virtual bool parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes ) override; virtual bool parseElementEndTag(const NodeType::XMLNode& node, const std::string& characters ) override; virtual bool parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes ) override; virtual bool parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters ) override; protected: std::unique_ptr
m_address; Callback m_callback; }; } /* namespace citygml */ libcitygml-2.0.8/sources/include/parser/appearanceelementparser.h000066400000000000000000000024731321622335500253310ustar00rootroot00000000000000#pragma once #include #include #include #include namespace citygml { class CityObject; class Appearance; class AppearanceElementParser : public GMLObjectElementParser { public: AppearanceElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger); // ElementParser interface virtual std::string elementParserName() const override; virtual bool handlesElement(const NodeType::XMLNode &node) const override; protected: // CityGMLElementParser interface virtual bool parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; virtual bool parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; // GMLObjectElementParser interface virtual Object* getObject() override; private: std::vector > m_surfaceDataList; std::shared_ptr m_appearanceObj; std::string m_theme; }; } libcitygml-2.0.8/sources/include/parser/attributes.h000066400000000000000000000023611321622335500226250ustar00rootroot00000000000000#pragma once #include #include namespace citygml { class CityGMLLogger; class DocumentLocation; /** * @brief The Attributes class provides methods to access the attributes of an xml element */ class Attributes { public: /** * @brief get the value of an attribute * @param attname the name of the attribute * @param defvalue the default value * @return the value of the attribute or defvalue if no such attribute exists */ virtual std::string getAttribute( const std::string& attname, const std::string& defvalue = "" ) const = 0; virtual const DocumentLocation& getDocumentLocation() const = 0; /** * @brief gets the citygml id attribute value or if not present generates a value based on the document location * @return the value of the gml::id attribute or "genID___" if there is no id attribute */ std::string getCityGMLIDAttribute() const; bool hasXLinkAttribute() const; std::string getXLinkValue(); protected: Attributes(std::shared_ptr logger); std::shared_ptr m_logger; }; } libcitygml-2.0.8/sources/include/parser/citygmldocumentparser.h000066400000000000000000000052621321622335500250660ustar00rootroot00000000000000#pragma once #include #include #include namespace citygml { class Attributes; class CityGMLLogger; class DocumentLocation; class CityGMLFactory; class ElementParser; class CityGMLDocumentParser { public: CityGMLDocumentParser(const ParserParams& params, std::shared_ptr logger); std::shared_ptr getModel(); // Methods used by CityGMLElementParser void setCurrentElementParser(ElementParser* parser); void removeCurrentElementParser(const ElementParser* caller); /** * @brief the current location in the document */ virtual const DocumentLocation& getDocumentLocation() const = 0; virtual ~CityGMLDocumentParser(); protected: /** * @brief must be called for each xml element start tag * @param name the name of the xml element * @param attributes the attribut data of the xml element */ void startElement( const std::string& name, Attributes& attributes); /** * @brief must be called for each xml element end tag * @param name the name of the xml element * @param characters the character data of the element or empty string if it contains no charcter data */ void endElement( const std::string& name, const std::string& characters ); /** * @brief must be called at the start of the document */ void startDocument(); /** * @brief must be called at the end of the document */ void endDocument(); std::shared_ptr m_logger; private: void skipUnknownOrUnexpectedElement(const std::string& name); bool checkCurrentElementUnownOrUnexpected_start(const std::string& name); bool checkCurrentElementUnownOrUnexpected_end(const std::string& name); std::stack > m_parserStack; /** * @brief The currently active parser (the one on which startElement or endElement was called last) * * The active parser can remove itself from the stack at any time. Hence we need another shared_ptr reference * to it so that it does not delete itself when removed from the stack. */ std::shared_ptr m_activeParser; std::unique_ptr m_factory; std::shared_ptr m_rootModel; ParserParams m_parserParams; bool m_currentElementUnknownOrUnexpected; int m_unknownElementOrUnexpectedElementDepth; std::string m_unknownElementOrUnexpectedElementName; }; } libcitygml-2.0.8/sources/include/parser/citygmlelementparser.h000066400000000000000000000076131321622335500247030ustar00rootroot00000000000000#pragma once #include #include #include "parser/elementparser.h" #include "parser/nodetypes.h" namespace citygml { class Attributes; class CityGMLDocumentParser; class CityGMLLogger; class CityGMLFactory; class DocumentLocation; /** * @brief The CityGMLElementParser class is a xml sax parser that is responsible for parsing a specific subset of elements * * The CityGMLDocumentParser uses CityGMLElementParser objects to parse the elements that are found in the document. * Only the CityGMLElementParser objects for the root elements of a citygml document are known by the CityGMLDocumentParser. * Whenever it encounters such an element it delegates the startElement and endElement class to the corresponding CityGMLElementParser object. * A CityGMLElementParser object can itself invoke other CityGMLElementParser objects to parse its child elements. * * After a CityGMLElementParser object has been set as the active element parser by the CityGMLDocumentParser or another CityGMLElementParser (the caller) * it will be bound to the xml element whose start tag is found next by the sax parser. * As soon as the end tag of the bound element is detected the control flow is returned to the caller. * How the result values are shared between caller and callee is up to the concrete implementation. * Usally a callback mechanism is used. */ class CityGMLElementParser : public ElementParser { public: CityGMLElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger); /** * @brief must be called for xml tag that starts a child of the elements handeld by this parser or starts one of the elements itself * @return true if the node was expected otherwise false * @note the CityGMLDocumentParser calls this method */ virtual bool startElement(const NodeType::XMLNode& node, Attributes& attributes) override; /** * @brief must be called for each xml tag that ends a child of the elements handeld by this parser or ends one of the elements itself * @return true if the node was expected otherwise false * @note the CityGMLDocumentParser calls this method */ virtual bool endElement(const NodeType::XMLNode& node, const std::string& characters ) override; virtual ~CityGMLElementParser(); protected: // Template methods to be implemented by subclasses /** * @brief called for the start tag of the element to which the parser is bound * @return true if the node was expected otherwise false */ virtual bool parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes ) = 0; /** * @brief called for the end tag of the element to which the parser is bound * @return true if the node was expected otherwise false */ virtual bool parseElementEndTag(const NodeType::XMLNode& node, const std::string& characters ) = 0; /** * @brief called for the start tag of each child inside the element to which the parser is bound * @return true if the node was expected otherwise false */ virtual bool parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes ) = 0; /** * @brief called for the end tag of each child inside the element to which the parser is bound * @return true if the node was expected otherwise false * @note if a callback mechanism is used to share the result of this parser this method would be the right place to invoke the callback */ virtual bool parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters ) = 0; CityGMLFactory& m_factory; private: NodeType::XMLNode m_boundElement; }; } libcitygml-2.0.8/sources/include/parser/citymodelelementparser.h000066400000000000000000000024311321622335500252150ustar00rootroot00000000000000#pragma once #include #include namespace citygml { class CityModel; class CityModelElementParser : public GMLFeatureCollectionElementParser { public: CityModelElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback); // ElementParser interface virtual std::string elementParserName() const override; virtual bool handlesElement(const NodeType::XMLNode &node) const override; protected: // CityGMLElementParser interface virtual bool parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; virtual bool parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; // GMLFeatureCollectionElementParser interface virtual FeatureObject* getFeatureObject() override; private: std::function m_callback; CityModel* m_model; }; } libcitygml-2.0.8/sources/include/parser/cityobjectelementparser.h000066400000000000000000000043641321622335500253720ustar00rootroot00000000000000#pragma once #include #include #include #include #include #include namespace citygml { class CityObjectElementParser : public GMLFeatureCollectionElementParser { public: CityObjectElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback); // ElementParser interface virtual std::string elementParserName() const override; virtual bool handlesElement(const NodeType::XMLNode &node) const override; protected: // CityGMLElementParser interface virtual bool parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; virtual bool parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; // GMLFeatureCollectionElementParser interface virtual FeatureObject* getFeatureObject() override; private: static void initializeTypeIDTypeMap(); static void initializeAttributesSet(); static AttributeType getAttributeType(const NodeType::XMLNode& node); CityObject* m_model; std::function m_callback; std::string m_lastAttributeName; AttributeType m_lastAttributeType; // The nodes that are valid CityObjects static std::mutex initializedTypeIDMutex; static std::unordered_map typeIDTypeMap; static bool typeIDTypeMapInitialized; static std::mutex initializedAttributeSetMutex; static std::unordered_set attributesSet; static std::unordered_map attributeTypeMap; static bool attributesSetInitialized; void parseGeometryForLODLevel(int lod); void parseImplicitGeometryForLODLevel(int lod); void parseGeometryPropertyElementForLODLevel(int lod, const std::string& id); }; } libcitygml-2.0.8/sources/include/parser/delayedchoiceelementparser.h000066400000000000000000000025131321622335500260070ustar00rootroot00000000000000#pragma once #include #include #include "parser/elementparser.h" namespace citygml { /** * @brief The DelayedChoiceElementParser allows to parse xml elements of which the concrete type is not known in advance * * The DelayedChoiceElementParser is initialized with a list of possible parses. When the start element of the next node is parsed it chooses the * first parser that can handle the element. */ class DelayedChoiceElementParser : public ElementParser { public: /** * @brief creates a DelayedChoiceElementParser * @param documentParser * @param logger * @param choices the parsers to choose from. The DelayedChoiceElementParser takes ownership of the parsers. */ DelayedChoiceElementParser(CityGMLDocumentParser& documentParser, std::shared_ptr logger, std::vector choices); // ElementParser interface virtual bool startElement(const NodeType::XMLNode& node, Attributes& attributes); virtual bool endElement(const NodeType::XMLNode& node, const std::string& characters); virtual bool handlesElement(const NodeType::XMLNode& node) const; virtual std::string elementParserName() const; private: std::vector m_choices; }; } libcitygml-2.0.8/sources/include/parser/documentlocation.h000066400000000000000000000014671321622335500240140ustar00rootroot00000000000000#pragma once #include #include #include namespace citygml { class DocumentLocation { public: virtual const std::string& getDocumentFileName() const = 0; virtual uint64_t getCurrentLine() const = 0; virtual uint64_t getCurrentColumn() const = 0; }; inline std::ostream& operator<<( std::ostream& os, const DocumentLocation& o ) { if (o.getCurrentLine() == 0) { os << " unknown location"; } else { os << " line " << o.getCurrentLine(); if (o.getCurrentColumn() > 0) { os << ", column " << o.getCurrentColumn(); } } if (!o.getDocumentFileName().empty()) { os << " in file " << o.getDocumentFileName(); } return os; } } libcitygml-2.0.8/sources/include/parser/elementparser.h000066400000000000000000000047331321622335500233120ustar00rootroot00000000000000#pragma once #include #include #include "parser/nodetypes.h" namespace citygml { class Attributes; class CityGMLDocumentParser; class CityGMLLogger; class CityGMLFactory; class DocumentLocation; /** * @brief The ElementParser is the base class for parsers that only handle a specific subset of elements * * For a basic explanation of the parsing process @see CityGMLElementParser */ class ElementParser { public: ElementParser(CityGMLDocumentParser& documentParser, std::shared_ptr logger) : m_logger(logger), m_documentParser(documentParser) {} /** * @brief must be called for xml tag that starts a child of the elements handeld by this parser or starts one of the elements itself * @return true if the node was expected otherwise false * @note the CityGMLDocumentParser calls this method */ virtual bool startElement(const NodeType::XMLNode& node, Attributes& attributes) = 0; /** * @brief must be called for each xml tag that ends a child of the elements handeld by this parser or ends one of the elements itself * @return true if the node was expected otherwise false * @note the CityGMLDocumentParser calls this method */ virtual bool endElement(const NodeType::XMLNode& node, const std::string& characters ) = 0; /** * @brief returns wether the parser handels elements of type node * @note this is required for the delayed choice mechanism @see DelayedChoiceElementParser * @return true if node is a valid !!root!! element for this parser * (e.g. is valid root element for the appearance parser but is not since its a child element of an appearance) */ virtual bool handlesElement(const NodeType::XMLNode& node) const = 0; /** * @brief the name of the parser (for logging purposes) */ virtual std::string elementParserName() const = 0; virtual ~ElementParser(); protected: /** * @brief sets a parser that will be called for the next element. * @note The parser will be deleted after parsing the elment. */ void setParserForNextElement(ElementParser* parser); virtual const DocumentLocation& getDocumentLocation() const; std::shared_ptr m_logger; CityGMLDocumentParser& m_documentParser; }; } libcitygml-2.0.8/sources/include/parser/geocoordinatetransformer.h000066400000000000000000000022461321622335500255460ustar00rootroot00000000000000#pragma once #include #include #include class GeoTransform; namespace citygml { class CityGMLLogger; class CityModel; class CityObject; class ImplicitGeometry; class Geometry; class Polygon; class LineString; class GeoCoordinateTransformer { public: GeoCoordinateTransformer(const std::string& destSRS, std::shared_ptr logger); void transformToDestinationSRS(CityModel* model); private: std::string m_destinationSRS; std::shared_ptr m_logger; std::unordered_map m_transformedPolygonsSourceURNMap; std::unordered_map m_transformedLineStringsSourceURNMap; void transformRecursive(CityObject& obj, GeoTransform& transformation); void transformRecursive_helper(CityObject& obj, GeoTransform& transformation); void transformRecursive(ImplicitGeometry& obj, GeoTransform& transformation); void transformRecursive_helper(ImplicitGeometry& obj, GeoTransform& transformation); void transform(Geometry& obj, GeoTransform& transformation); }; } libcitygml-2.0.8/sources/include/parser/geometryelementparser.h000066400000000000000000000027251321622335500250650ustar00rootroot00000000000000#pragma once #include #include #include #include namespace citygml { class Geometry; class GeometryElementParser : public GMLObjectElementParser { public: GeometryElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, int lodLevel, CityObject::CityObjectsType parentType, std::function callback); // ElementParser interface virtual std::string elementParserName() const override; virtual bool handlesElement(const NodeType::XMLNode &node) const override; protected: // CityGMLElementParser interface virtual bool parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; virtual bool parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; // GMLObjectElementParser interface virtual Object* getObject() override; private: Geometry* m_model; std::function m_callback; int m_lodLevel; CityObject::CityObjectsType m_parentType; std::string m_orientation; }; } libcitygml-2.0.8/sources/include/parser/georeferencedtextureelementparser.h000066400000000000000000000023361321622335500274460ustar00rootroot00000000000000#pragma once #include #include #include namespace citygml { class GeoreferencedTexture; class GeoReferencedTextureElementParser : public CityGMLElementParser { public: GeoReferencedTextureElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function)> callback); // ElementParser interface virtual std::string elementParserName() const override; virtual bool handlesElement(const NodeType::XMLNode &node) const override; protected: // CityGMLElementParser interface virtual bool parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; virtual bool parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; private: std::function)> m_callback; }; } libcitygml-2.0.8/sources/include/parser/gmlfeaturecollectionparser.h000066400000000000000000000017541321622335500260700ustar00rootroot00000000000000#pragma once #include namespace citygml { class Envelope; class FeatureObject; /** * @brief abstract base class for all CityGMLElementParser's that parse citygml elements which inherit from gml:AbstractFeatureCollectionType */ class GMLFeatureCollectionElementParser : public GMLObjectElementParser { public: GMLFeatureCollectionElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger); protected: // CityGMLElementParser interface virtual bool parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; virtual FeatureObject* getFeatureObject() = 0; // GMLObjectElementParser interface virtual Object* getObject() override; private: Envelope* m_bounds; }; } libcitygml-2.0.8/sources/include/parser/gmlobjectparser.h000066400000000000000000000016101321622335500236160ustar00rootroot00000000000000#pragma once #include namespace citygml { class Object; /** * @brief abstract base class for all CityGMLElementParser's that parse citygml elements which inherit from gml:AbstractGMLType */ class GMLObjectElementParser : public CityGMLElementParser { public: GMLObjectElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger); protected: // CityGMLElementParser interface virtual bool parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; /** * @brief returns the object in which the parsed information will be stored */ virtual Object* getObject() = 0; }; } libcitygml-2.0.8/sources/include/parser/implicitgeometryelementparser.h000066400000000000000000000030051321622335500266100ustar00rootroot00000000000000#pragma once #include #include #include #include namespace citygml { class ImplicitGeometry; class ImplicitGeometryElementParser : public GMLObjectElementParser { public: ImplicitGeometryElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, int lodLevel, CityObject::CityObjectsType parentType, std::function callback); // ElementParser interface virtual std::string elementParserName() const override; virtual bool handlesElement(const NodeType::XMLNode &node) const override; protected: // CityGMLElementParser interface virtual bool parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; virtual bool parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; // GMLObjectElementParser interface virtual Object* getObject() override; private: ImplicitGeometry* m_model; std::function m_callback; int m_lodLevel; CityObject::CityObjectsType m_parentType; std::string m_orientation; }; } libcitygml-2.0.8/sources/include/parser/linearringelementparser.h000066400000000000000000000024261321622335500253620ustar00rootroot00000000000000#pragma once #include #include namespace citygml { class LinearRing; class LinearRingElementParser : public GMLObjectElementParser { public: LinearRingElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, bool interior, std::function callback); // ElementParser interface virtual std::string elementParserName() const override; virtual bool handlesElement(const NodeType::XMLNode &node) const override; protected: // CityGMLElementParser interface virtual bool parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; virtual bool parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; // GMLObjectElementParser interface virtual Object* getObject() override; private: LinearRing* m_model; std::function m_callback; bool m_interior; }; } libcitygml-2.0.8/sources/include/parser/linestringelementparser.h000066400000000000000000000025461321622335500254110ustar00rootroot00000000000000#pragma once #include #include #include namespace citygml { class LineString; class LineStringElementParser : public GMLObjectElementParser { public: LineStringElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function)> callback); // ElementParser interface virtual std::string elementParserName() const override; virtual bool handlesElement(const NodeType::XMLNode &node) const override; protected: // CityGMLElementParser interface virtual bool parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; virtual bool parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; // GMLObjectElementParser interface virtual Object* getObject() override; private: std::shared_ptr m_model; std::function)> m_callback; void parseDimension(Attributes& attributes); }; } libcitygml-2.0.8/sources/include/parser/materialelementparser.h000066400000000000000000000025341321622335500250260ustar00rootroot00000000000000#pragma once #include #include #include #include namespace citygml { class Material; class MaterialElementParser : public GMLObjectElementParser { public: MaterialElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function)> callback); // ElementParser interface virtual std::string elementParserName() const override; bool handlesElement(const NodeType::XMLNode &node) const override; protected: // CityGMLElementParser interface virtual bool parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; virtual bool parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; // GMLObjectElementParser interface virtual Object* getObject() override; private: std::shared_ptr m_model; std::function)> m_callback; std::string m_lastTargetDefinitionID; }; } libcitygml-2.0.8/sources/include/parser/nodetypes.h000066400000000000000000000321671321622335500224600ustar00rootroot00000000000000#pragma once #include #include #include #include namespace citygml { class NodeType { public: class XMLNode { public: XMLNode(); XMLNode(std::string prefix, std::string name); const std::string name() const; const std::string& prefix() const; const std::string& baseName() const; int typeID() const; bool operator==(const XMLNode& other) const; bool operator!=(const XMLNode& other) const; bool valid() const; private: std::string m_name; std::string m_prefix; int m_typeID; }; static const XMLNode& getXMLNodeFor(const std::string& name); static const XMLNode InvalidNode; #define NODETYPE( prefix, elementName ) static XMLNode prefix ## _ ## elementName ## Node; // CORE NODETYPE( CORE, CityModel ) NODETYPE( CORE, CityObjectMember ) NODETYPE( CORE, CreationDate ) NODETYPE( CORE, TerminationDate ) NODETYPE( CORE, GeneralizesTo) NODETYPE( CORE, ExternalReference) NODETYPE( CORE, InformationSystem) NODETYPE( CORE, ExternalObject) NODETYPE( CORE, Uri) NODETYPE( CORE, Name) NODETYPE( CORE, Address ) NODETYPE( CORE, XalAddress ) NODETYPE( CORE, ImplicitGeometry ) NODETYPE( CORE, RelativeGMLGeometry ) NODETYPE( CORE, TransformationMatrix ) NODETYPE( CORE, ReferencePoint) NODETYPE( CORE, MimeType) NODETYPE( CORE, LibraryObject) // GRP NODETYPE( GRP, CityObjectGroup ) NODETYPE( GRP, GroupMember ) NODETYPE( GRP, Class ) NODETYPE( GRP, Function ) NODETYPE( GRP, Usage ) NODETYPE( GRP, Parent ) NODETYPE( GRP, Geometry ) // GEN NODETYPE( GEN, Class ) NODETYPE( GEN, Function ) NODETYPE( GEN, Usage ) NODETYPE( GEN, GenericCityObject ) NODETYPE( GEN, StringAttribute ) NODETYPE( GEN, DoubleAttribute ) NODETYPE( GEN, IntAttribute ) NODETYPE( GEN, DateAttribute ) NODETYPE( GEN, UriAttribute ) NODETYPE( GEN, Value ) NODETYPE( GEN, Lod0Geometry ) NODETYPE( GEN, Lod1Geometry ) NODETYPE( GEN, Lod2Geometry ) NODETYPE( GEN, Lod3Geometry ) NODETYPE( GEN, Lod4Geometry ) NODETYPE( GEN, Lod0TerrainIntersection ) NODETYPE( GEN, Lod1TerrainIntersection ) NODETYPE( GEN, Lod2TerrainIntersection ) NODETYPE( GEN, Lod3TerrainIntersection ) NODETYPE( GEN, Lod4TerrainIntersection ) NODETYPE( GEN, Lod0ImplicitRepresentation ) NODETYPE( GEN, Lod1ImplicitRepresentation ) NODETYPE( GEN, Lod2ImplicitRepresentation ) NODETYPE( GEN, Lod3ImplicitRepresentation ) NODETYPE( GEN, Lod4ImplicitRepresentation ) // TEX // NODETYPE( GML, TexturedSurface ) // Deprecated // GML NODETYPE( GML, Description ) NODETYPE( GML, Identifier ) NODETYPE( GML, Name ) NODETYPE( GML, DescriptionReference ) NODETYPE( GML, MetaDataProperty ) NODETYPE( GML, Coordinates ) NODETYPE( GML, Pos ) NODETYPE( GML, BoundedBy ) NODETYPE( GML, Envelope ) NODETYPE( GML, LowerCorner ) NODETYPE( GML, UpperCorner ) NODETYPE( GML, Solid ) NODETYPE( GML, SurfaceMember ) NODETYPE( GML, BaseSurface ) NODETYPE( GML, Patches ) NODETYPE( GML, TrianglePatches ) NODETYPE( GML, SolidMember ) NODETYPE( GML, TriangulatedSurface ) NODETYPE( GML, Triangle ) NODETYPE( GML, Polygon ) NODETYPE( GML, Rectangle ) NODETYPE( GML, PosList ) NODETYPE( GML, OrientableSurface ) NODETYPE( GML, LinearRing ) NODETYPE( GML, MultiPoint ) NODETYPE( GML, MultiCurve ) NODETYPE( GML, MultiSurface ) NODETYPE( GML, MultiSolid ) NODETYPE( GML, CompositeCurve ) NODETYPE( GML, CompositeSurface ) NODETYPE( GML, CompositeSolid ) NODETYPE( GML, ReferencePoint ) NODETYPE( GML, Point ) NODETYPE( GML, Interior ) NODETYPE( GML, Exterior ) NODETYPE( GML, Shell ) NODETYPE( GML, PolyhedralSurface ) NODETYPE( GML, Surface ) NODETYPE( GML, PolygonPatch) NODETYPE( GML, LineString ) // BLDG NODETYPE( BLDG, Building ) NODETYPE( BLDG, BuildingPart ) NODETYPE( BLDG, Room ) NODETYPE( BLDG, Door ) NODETYPE( BLDG, Window ) NODETYPE( BLDG, BuildingInstallation ) NODETYPE( BLDG, MeasuredHeight ) NODETYPE( BLDG, Class ) NODETYPE( BLDG, Type ) NODETYPE( BLDG, Function ) NODETYPE( BLDG, Usage ) NODETYPE( BLDG, YearOfConstruction ) NODETYPE( BLDG, YearOfDemolition ) NODETYPE( BLDG, StoreysAboveGround ) NODETYPE( BLDG, StoreysBelowGround ) NODETYPE( BLDG, StoreyHeightsAboveGround ) NODETYPE( BLDG, StoreyHeightsBelowGround ) NODETYPE( BLDG, BoundedBy ) NODETYPE( BLDG, OuterBuildingInstallation) NODETYPE( BLDG, InteriorBuildingInstallation) NODETYPE( BLDG, InteriorRoom) NODETYPE( BLDG, InteriorFurniture) NODETYPE( BLDG, RoomInstallation) NODETYPE( BLDG, Opening) NODETYPE( BLDG, RoofType) NODETYPE( BLDG, Lod1Solid ) NODETYPE( BLDG, Lod2Solid ) NODETYPE( BLDG, Lod3Solid ) NODETYPE( BLDG, Lod4Solid ) NODETYPE( BLDG, Lod2Geometry ) NODETYPE( BLDG, Lod3Geometry ) NODETYPE( BLDG, Lod4Geometry ) NODETYPE( BLDG, Lod1MultiCurve ) NODETYPE( BLDG, Lod2MultiCurve ) NODETYPE( BLDG, Lod3MultiCurve ) NODETYPE( BLDG, Lod4MultiCurve ) NODETYPE( BLDG, Lod1MultiSurface ) NODETYPE( BLDG, Lod2MultiSurface ) NODETYPE( BLDG, Lod3MultiSurface ) NODETYPE( BLDG, Lod4MultiSurface ) NODETYPE( BLDG, Lod1TerrainIntersection ) NODETYPE( BLDG, Lod2TerrainIntersection ) NODETYPE( BLDG, Lod3TerrainIntersection ) NODETYPE( BLDG, Lod4TerrainIntersection ) NODETYPE( BLDG, ConsistsOfBuildingPart ) // BoundarySurfaceType NODETYPE( BLDG, WallSurface ) NODETYPE( BLDG, RoofSurface ) NODETYPE( BLDG, GroundSurface ) NODETYPE( BLDG, ClosureSurface ) NODETYPE( BLDG, FloorSurface ) NODETYPE( BLDG, InteriorWallSurface ) NODETYPE( BLDG, CeilingSurface ) NODETYPE( BLDG, OuterCeilingSurface ) NODETYPE( BLDG, OuterFloorSurface ) NODETYPE( BLDG, BuildingFurniture ) NODETYPE( BLDG, CityFurniture ) NODETYPE( BLDG, Address) // CityFurniture NODETYPE( FRN, Class ) NODETYPE( FRN, Function ) NODETYPE( FRN, CityFurniture ) NODETYPE( FRN, Lod1Geometry ) NODETYPE( FRN, Lod2Geometry ) NODETYPE( FRN, Lod3Geometry ) NODETYPE( FRN, Lod4Geometry ) NODETYPE( FRN, Lod1TerrainIntersection ) NODETYPE( FRN, Lod2TerrainIntersection ) NODETYPE( FRN, Lod3TerrainIntersection ) NODETYPE( FRN, Lod4TerrainIntersection ) NODETYPE( FRN, Lod1ImplicitRepresentation ) NODETYPE( FRN, Lod2ImplicitRepresentation ) NODETYPE( FRN, Lod3ImplicitRepresentation ) NODETYPE( FRN, Lod4ImplicitRepresentation ) // ADDRESS NODETYPE( XAL, AddressDetails ) NODETYPE( XAL, Country ) NODETYPE( XAL, CountryName ) NODETYPE( XAL, CountryNameCode ) NODETYPE( XAL, AdministrativeArea ) NODETYPE( XAL, AdministrativeAreaName ) NODETYPE( XAL, Locality ) NODETYPE( XAL, LocalityName ) NODETYPE( XAL, PostalCode ) NODETYPE( XAL, PostalCodeNumber ) NODETYPE( XAL, Thoroughfare ) NODETYPE( XAL, ThoroughfareName ) NODETYPE( XAL, ThoroughfareNumber ) // WTR NODETYPE( WTR, WaterBody ) NODETYPE( WTR, WaterSurface ) NODETYPE( WTR, WaterGroundSurface ) NODETYPE( WTR, WaterClosureSurface ) NODETYPE( WTR, Class ) NODETYPE( WTR, Function ) NODETYPE( WTR, Usage ) NODETYPE( WTR, WaterLevel ) NODETYPE( WTR, Lod0MultiCurve ) NODETYPE( WTR, Lod0MultiSurface ) NODETYPE( WTR, Lod1MultiCurve ) NODETYPE( WTR, Lod1MultiSurface ) NODETYPE( WTR, Lod1Solid ) NODETYPE( WTR, Lod2Solid ) NODETYPE( WTR, Lod3Solid ) NODETYPE( WTR, Lod4Solid ) NODETYPE( WTR, Lod2Surface ) NODETYPE( WTR, Lod3Surface ) NODETYPE( WTR, Lod4Surface ) NODETYPE( WTR, BoundedBy ) // VEG NODETYPE( VEG, PlantCover ) NODETYPE( VEG, SolitaryVegetationObject ) NODETYPE( VEG, Lod1ImplicitRepresentation ) NODETYPE( VEG, Lod2ImplicitRepresentation ) NODETYPE( VEG, Lod3ImplicitRepresentation ) NODETYPE( VEG, Lod4ImplicitRepresentation ) NODETYPE( VEG, Class ) NODETYPE( VEG, Function ) NODETYPE( VEG, AverageHeight ) NODETYPE( VEG, Species ) NODETYPE( VEG, Height ) NODETYPE( VEG, TrunkDiameter ) NODETYPE( VEG, CrownDiameter ) NODETYPE( VEG, Lod0Geometry ) NODETYPE( VEG, Lod1Geometry ) NODETYPE( VEG, Lod2Geometry ) NODETYPE( VEG, Lod3Geometry ) NODETYPE( VEG, Lod4Geometry ) // TRANS NODETYPE( TRANS, TransportationComplex ) NODETYPE( TRANS, TrafficArea ) NODETYPE( TRANS, AuxiliaryTrafficArea ) NODETYPE( TRANS, Track ) NODETYPE( TRANS, Road ) NODETYPE( TRANS, Railway ) NODETYPE( TRANS, Square ) NODETYPE( TRANS, Usage ) NODETYPE( TRANS, Function ) NODETYPE( TRANS, SurfaceMaterial ) NODETYPE( TRANS, Lod0Network ) NODETYPE( TRANS, Lod1MultiSurface ) NODETYPE( TRANS, Lod2MultiSurface ) NODETYPE( TRANS, Lod3MultiSurface ) NODETYPE( TRANS, Lod4MultiSurface ) // LUSE NODETYPE( LUSE, LandUse ) NODETYPE( LUSE, Class ) NODETYPE( LUSE, Usage ) NODETYPE( LUSE, Function ) NODETYPE( LUSE, Lod1MultiSurface ) NODETYPE( LUSE, Lod2MultiSurface ) NODETYPE( LUSE, Lod3MultiSurface ) NODETYPE( LUSE, Lod4MultiSurface ) // DEM (Relief) NODETYPE( DEM, ReliefFeature ) NODETYPE( DEM, TINRelief ) NODETYPE( DEM, RasterRelief ) NODETYPE( DEM, MassPointRelief ) NODETYPE( DEM, BreaklineRelief ) NODETYPE( DEM, Lod ) NODETYPE( DEM, Extent ) NODETYPE( DEM, ReliefComponent ) NODETYPE( DEM, Tin ) NODETYPE( DEM, Grid ) NODETYPE( DEM, ReliefPoints ) NODETYPE( DEM, RidgeOrValleyLines ) NODETYPE( DEM, Breaklines ) NODETYPE( DEM, Elevation ) // SUB NODETYPE( SUB, Tunnel ) NODETYPE( SUB, RelativeToTerrain ) // BRID NODETYPE( BRID, Bridge ) NODETYPE( BRID, BridgeConstructionElement ) NODETYPE( BRID, BridgeInstallation ) NODETYPE( BRID, BridgePart ) // APP NODETYPE( APP, Appearance ) NODETYPE( APP, AppearanceMember ) NODETYPE( APP, SimpleTexture ) NODETYPE( APP, ParameterizedTexture ) NODETYPE( APP, GeoreferencedTexture ) NODETYPE( APP, ImageURI ) NODETYPE( APP, TextureMap ) NODETYPE( APP, Target ) NODETYPE( APP, TexCoordList ) NODETYPE( APP, TexCoordGen ) NODETYPE( APP, TextureCoordinates ) NODETYPE( APP, WorldToTexture ) NODETYPE( APP, TextureType ) NODETYPE( APP, Repeat ) NODETYPE( APP, WrapMode ) NODETYPE( APP, BorderColor ) NODETYPE( APP, PreferWorldFile ) NODETYPE( APP, ReferencePoint) NODETYPE( APP, Orientation) NODETYPE( APP, isSmooth) NODETYPE( APP, X3DMaterial ) NODETYPE( APP, Material ) NODETYPE( APP, SurfaceDataMember ) NODETYPE( APP, Shininess ) NODETYPE( APP, Transparency ) NODETYPE( APP, SpecularColor ) NODETYPE( APP, DiffuseColor ) NODETYPE( APP, EmissiveColor ) NODETYPE( APP, AmbientIntensity ) NODETYPE( APP, IsFront ) NODETYPE( APP, Theme ) NODETYPE( APP, MimeType ) private: static void initializeNodeTypes(); static std::mutex initializedMutex; static bool nodesInitialized; static int typeCount; static std::unordered_map nodeNameTypeMap; static std::unordered_map nodeNameWithPrefixTypeMap; }; std::ostream& operator<<( std::ostream& os, const NodeType::XMLNode& o ); } namespace std { template <> struct hash { size_t operator()(const citygml::NodeType::XMLNode& node) const { return node.typeID(); } }; template <> struct hash { size_t operator()(const citygml::NodeType::XMLNode& node) const { return node.typeID(); } }; } // namespace std libcitygml-2.0.8/sources/include/parser/parserutils.hpp000066400000000000000000000053331321622335500233560ustar00rootroot00000000000000#pragma once #include #include #include #include #include #include #include #include namespace citygml { template inline T parseValue( const std::string &s, std::shared_ptr&, const DocumentLocation&) { std::stringstream ss; ss << s; T v; ss >> v; return v; } inline TransformationMatrix parseMatrix( const std::string &s, std::shared_ptr& logger, const DocumentLocation& location) { std::stringstream ss; ss << s; double matrix[16] = { 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 }; for (size_t i = 0; i < 16; ++i) { if(ss.eof()) { CITYGML_LOG_WARN(logger, "Matrix with 16 elements expected, got '" << i + 1 << "' at " << location << ". Matrix may be invalid."); break; } ss >> matrix[i]; } return TransformationMatrix(matrix); } template<> inline bool parseValue( const std::string &s, std::shared_ptr& logger, const DocumentLocation& location ) { // parsing a bool is special because "true" and "1" are true while "false" and "0" are false if (s == "1" || s == "true") { return true; } else if (s == "0" || s == "false") { return false; } else { CITYGML_LOG_WARN(logger, "Boolean expected, got '" << s << "' at " << location << " set value to false."); } return false; } template inline std::vector parseVecList( const std::string &s, std::shared_ptr& logger, const DocumentLocation& location ) { std::stringstream ss; ss << s; T v; std::vector vec; while ( ss >> v ) vec.push_back( v ); if ( !ss.eof() ) { CITYGML_LOG_WARN(logger, "Mismatch type, list of " << typeid(T).name() << " expected at " << location << " Ring/Polygon may be incomplete!"); } return vec; } inline std::string parseReference(const std::string& reference, std::shared_ptr& logger, const DocumentLocation& location) { if (reference.empty()) { CITYGML_LOG_WARN(logger, "Invalid reference value at " << location); } if (reference[0] == '#') { return reference.substr(1); } else { return reference; } } } libcitygml-2.0.8/sources/include/parser/polygonelementparser.h000066400000000000000000000025151321622335500247160ustar00rootroot00000000000000#pragma once #include #include #include namespace citygml { class Polygon; class PolygonElementParser : public GMLObjectElementParser { public: PolygonElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function)> callback); // ElementParser interface virtual std::string elementParserName() const override; virtual bool handlesElement(const NodeType::XMLNode &node) const override; protected: // CityGMLElementParser interface virtual bool parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; virtual bool parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; // GMLObjectElementParser interface virtual Object* getObject() override; private: std::shared_ptr m_model; std::function)> m_callback; void parseRingElement(bool interior); }; } libcitygml-2.0.8/sources/include/parser/sequenceparser.h000066400000000000000000000034171321622335500234670ustar00rootroot00000000000000#pragma once #include #include #include #include "parser/citygmlelementparser.h" namespace citygml { /** * @brief The SequenceParser parses a sequence of elements * * The sequence parser can be used if an xml element can contain more than one child elements. If a * parser finds the start tag of such an element (e.g. ) it can invoke the sequence parser, which * in turn calls a predefined parser for each child until the end tag of the element is found. */ class SequenceParser : public ElementParser { public: /** * @brief initializes the parser for an element that can contain multiple children * @param documentParser the CityGMLDocumentParser instance * @param logger a CityGMLLogger logger instance * @param childParserFactory a factory for the parser for the child elements * @param parentElement the element that contains the child objects */ SequenceParser(CityGMLDocumentParser& documentParser, std::shared_ptr logger, std::function childParserFactory, const NodeType::XMLNode& parentElement); // ElementParser interface virtual bool startElement(const NodeType::XMLNode& node, Attributes& attributes); virtual bool endElement(const NodeType::XMLNode& node, const std::string& characters); virtual bool handlesElement(const NodeType::XMLNode& node) const; virtual std::string elementParserName() const; private: std::function m_childParserFactory; mutable std::unique_ptr m_childParserInstance; NodeType::XMLNode m_containerType; ElementParser& getChildParserDummyInstance() const; }; } libcitygml-2.0.8/sources/include/parser/skipelementparser.h000066400000000000000000000031421321622335500241720ustar00rootroot00000000000000#pragma once #include namespace citygml { /** * @brief A parser that just skips over the element (and all its child elements) for which it was called * @note The SkipElementParser can be called for the content of an element that might be empty. In * that case the SkipElementParser will return control to the calling parser after the end element of that element was parsed. * Hence the the calling parser should not expect to parse the end element. */ class SkipElementParser : public ElementParser { public: /** * @brief initializes the SkipElementParser * @param skipNode if a valid node is passed the skip parser is bound to that node and skips all its children. * In that case the start tag of the node must already been parsed. * If the node is not valid (Default) the skip parser will be bound to the first element it encounters. */ SkipElementParser(CityGMLDocumentParser& documentParser, std::shared_ptr logger, const NodeType::XMLNode& skipNode = NodeType::XMLNode()); // ElementParser interface virtual std::string elementParserName() const override; virtual bool handlesElement(const NodeType::XMLNode &node) const override; virtual bool startElement(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool endElement(const NodeType::XMLNode& node, const std::string& characters) override; private: NodeType::XMLNode m_skipNode; int m_depth; }; } libcitygml-2.0.8/sources/include/parser/textureelementparser.h000066400000000000000000000027721321622335500247340ustar00rootroot00000000000000#pragma once #include #include #include #include namespace citygml { class Texture; class TextureTargetDefinition; class TextureCoordinates; class TextureElementParser : public GMLObjectElementParser { public: TextureElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function)> callback); // ElementParser interface virtual std::string elementParserName() const override; virtual bool handlesElement(const NodeType::XMLNode &node) const override; protected: // CityGMLElementParser interface virtual bool parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; virtual bool parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; virtual bool parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; // GMLObjectElementParser interface virtual Object* getObject() override; private: std::shared_ptr m_model; std::function)> m_callback; std::shared_ptr m_currentTexTargetDef; std::shared_ptr m_currentTexCoords; }; } libcitygml-2.0.8/sources/src/000077500000000000000000000000001321622335500161345ustar00rootroot00000000000000libcitygml-2.0.8/sources/src/citygml/000077500000000000000000000000001321622335500176045ustar00rootroot00000000000000libcitygml-2.0.8/sources/src/citygml/address.cpp000066400000000000000000000022411321622335500217340ustar00rootroot00000000000000#include namespace citygml { Address::Address(const std::string& id) : Object(id) { } const std::string& Address::country() const { return m_country; } void Address::setCountry(const std::string& country) { m_country = country; } const std::string& Address::locality() const { return m_locality; } void Address::setLocality(const std::string& locality) { m_locality = locality; } const std::string& Address::postalCode() const { return m_postalCode; } void Address::setPostalCode(const std::string& postalCode) { m_postalCode = postalCode; } const std::string& Address::thoroughfareName() const { return m_thoroughfareName; } void Address::setThoroughfareName(const std::string& thoroughfareName) { m_thoroughfareName = thoroughfareName; } const std::string& Address::thoroughfareNumber() const { return m_thoroughfareNumber; } void Address::setThoroughfareNumber(const std::string& thoroughfareNumber) { m_thoroughfareNumber = thoroughfareNumber; } } /* namespace citygml */ libcitygml-2.0.8/sources/src/citygml/appearance.cpp000066400000000000000000000030701321622335500224070ustar00rootroot00000000000000#include #include namespace citygml { Appearance::Appearance(const std::string& id, const std::string& typeString) : Object( id ), m_typeString( typeString ), m_isFront(true) { } std::string Appearance::getType() const { return m_typeString; } bool Appearance::getIsFront() const { return m_isFront; } void Appearance::setIsFront(bool front) { m_isFront = front; } std::string Appearance::toString() const { return m_typeString + " " + m_id; } std::shared_ptr Appearance::asMaterial() { return nullptr; } std::shared_ptr Appearance::asMaterial() const { return nullptr; } std::shared_ptr Appearance::asTexture() { return nullptr; } std::shared_ptr Appearance::asTexture() const { return nullptr; } std::shared_ptr Appearance::asGeoreferencedTexture() { return nullptr; } std::shared_ptr Appearance::asGeoreferencedTexture() const { return nullptr; } bool Appearance::inTheme(const std::string& themeName) const { return std::find(m_themes.begin(), m_themes.end(), themeName) != m_themes.end(); } void Appearance::addToTheme(std::string themeName) { m_themes.push_back(themeName); } const std::vector& Appearance::getThemes() const { return m_themes; } } libcitygml-2.0.8/sources/src/citygml/appearancemanager.cpp000066400000000000000000000071021321622335500237420ustar00rootroot00000000000000#include #include #include #include #include #include namespace citygml { AppearanceManager::AppearanceManager(std::shared_ptr logger) { m_logger = logger; } AppearanceManager::~AppearanceManager() { } std::shared_ptr AppearanceManager::getAppearanceByID(const std::string& id) const { auto it = m_appearancesMap.find(id); if (it == m_appearancesMap.end()) { return nullptr; } return it->second; } std::vector AppearanceManager::getAllThemes() { std::vector themes(m_themes.begin(), m_themes.end()); return themes; } void AppearanceManager::addAppearanceTarget(AppearanceTarget* target) { m_appearanceTargetsMap[target->getId()] = target; } void AppearanceManager::addAppearance(std::shared_ptr appearance) { m_appearancesMap[appearance->getId()] = appearance; } void AppearanceManager::addTextureTargetDefinition(std::shared_ptr targetDef) { m_texTargetDefinitions.push_back(targetDef); } void AppearanceManager::addMaterialTargetDefinition(std::shared_ptr targetDef) { m_materialTargetDefinitions.push_back(targetDef); } template void assignTargetDefinition(std::shared_ptr& targetDef, const std::unordered_map& targetMap, std::shared_ptr& logger) { std::string targetID = targetDef->getTargetID(); auto it = targetMap.find(targetID); if (it == targetMap.end()) { CITYGML_LOG_WARN(logger, "Appearance with id '" << targetDef->getAppearance()->getId() << "' targets object with id " << targetID << " but no such object exists."); } else { it->second->addTargetDefinition(targetDef); } } void AppearanceManager::assignAppearancesToTargets() { CITYGML_LOG_INFO(m_logger, "Start assignment of appearances to targets (" << m_materialTargetDefinitions.size() << " material target definition(s), " << m_texTargetDefinitions.size() << " texture target definition(s))."); for (std::shared_ptr& targetDef : m_materialTargetDefinitions ) { assignTargetDefinition(targetDef, m_appearanceTargetsMap, m_logger); addThemesFrom(targetDef->getAppearance()); } for (std::shared_ptr& targetDef : m_texTargetDefinitions ) { assignTargetDefinition(targetDef, m_appearanceTargetsMap, m_logger); addThemesFrom(targetDef->getAppearance()); } m_materialTargetDefinitions.clear(); m_texTargetDefinitions.clear(); m_appearanceTargetsMap.clear(); m_appearancesMap.clear(); CITYGML_LOG_INFO(m_logger, "Finished assignment of appearances to targets (" << m_materialTargetDefinitions.size() << " material target definition(s), " << m_texTargetDefinitions.size() << " texture target definition(s))."); } void AppearanceManager::addThemesFrom(std::shared_ptr surfaceData) { m_themes.insert(surfaceData->getThemes().begin(), surfaceData->getThemes().end()); } } libcitygml-2.0.8/sources/src/citygml/appearancetarget.cpp000066400000000000000000000112161321622335500236170ustar00rootroot00000000000000#include #include #include #include #include #include #include namespace citygml { AppearanceTarget::AppearanceTarget(const std::string& id) : Object(id) { } void AppearanceTarget::addTargetDefinition(std::shared_ptr > targetDef) { if (targetDef->getAppearance()->asMaterial() != nullptr) { addTargetDefinition(std::dynamic_pointer_cast(targetDef)); } else { addTargetDefinition(std::dynamic_pointer_cast(targetDef)); } } void AppearanceTarget::addTargetDefinition(std::shared_ptr targetDef) { for (const std::string& theme : targetDef->getAppearance()->getThemes()) { if (targetDef->getAppearance()->getIsFront() && m_themeTexMapFront.count(theme) == 0) { m_themeTexMapFront[theme] = targetDef; } else if (!targetDef->getAppearance()->getIsFront() && m_themeTexMapBack.count(theme) == 0) { m_themeTexMapBack[theme] = targetDef; } } } void AppearanceTarget::addTargetDefinition(std::shared_ptr targetDef) { for (const std::string& theme : targetDef->getAppearance()->getThemes()) { if (targetDef->getAppearance()->getIsFront() && m_themeMatMapFront.count(theme) == 0) { m_themeMatMapFront[theme] = targetDef; } else if (!targetDef->getAppearance()->getIsFront() && m_themeMatMapBack.count(theme) == 0) { m_themeMatMapBack[theme] = targetDef; } } } void AppearanceTarget::addTargetDefinitionsOf(const AppearanceTarget& other) { // Insert the TargetDefinitions of the other AppearanceTarget that belong to a themes for which this AppearanceTarget contains no TargetDefinitions m_themeMatMapFront.insert(other.m_themeMatMapFront.begin(), other.m_themeMatMapFront.end()); m_themeMatMapBack.insert(other.m_themeMatMapBack.begin(), other.m_themeMatMapBack.end()); m_themeTexMapFront.insert(other.m_themeTexMapFront.begin(), other.m_themeTexMapFront.end()); m_themeTexMapBack.insert(other.m_themeTexMapBack.begin(), other.m_themeTexMapBack.end()); } std::shared_ptr AppearanceTarget::getMaterialTargetDefinitionForTheme(const std::string& theme, bool front) { auto& map = front ? m_themeMatMapFront : m_themeMatMapBack; auto it = map.find(theme); if (it == map.end()) { return nullptr; } return it->second; } std::shared_ptr AppearanceTarget::getMaterialTargetDefinitionForTheme(const std::string& theme, bool front) const { auto& map = front ? m_themeMatMapFront : m_themeMatMapBack; const auto it = map.find(theme); if (it == map.end()) { return nullptr; } return it->second; } std::shared_ptr AppearanceTarget::getTextureTargetDefinitionForTheme(const std::string& theme, bool front) { auto& map = front ? m_themeTexMapFront : m_themeTexMapBack; auto it = map.find(theme); if (it == map.end()) { return nullptr; } return it->second; } std::shared_ptr AppearanceTarget::getTextureTargetDefinitionForTheme(const std::string& theme, bool front) const { auto& map = front ? m_themeTexMapFront : m_themeTexMapBack; const auto it = map.find(theme); if (it == map.end()) { return nullptr; } return it->second; } std::vector AppearanceTarget::getTextureTargetDefinitions() { std::unordered_set texTargetDefs; for (auto& pair : m_themeTexMapFront) { texTargetDefs.insert(pair.second.get()); } for (auto& pair : m_themeTexMapBack) { texTargetDefs.insert(pair.second.get()); } return std::vector(texTargetDefs.begin(), texTargetDefs.end()); } std::vector AppearanceTarget::getAllTextureThemes(bool front) const { auto& map = front ? m_themeTexMapFront : m_themeTexMapBack; std::vector themes; for (const auto& pair : map) { themes.push_back(pair.first); } return themes; } } libcitygml-2.0.8/sources/src/citygml/attributesmap.cpp000066400000000000000000000034601321622335500231770ustar00rootroot00000000000000#include #include namespace citygml { AttributeValue::AttributeValue() : m_type(AttributeType::String) { } AttributeValue::AttributeValue(const char* value) : m_type(AttributeType::String) , m_value(value) { } AttributeValue::AttributeValue(const std::string& value, AttributeType type) : m_type(type) , m_value(value) { } AttributeValue::AttributeValue(double value) { setValue(value); } AttributeValue::AttributeValue(int value) { setValue(value); } void AttributeValue::setType(AttributeType type) { m_type = type; } AttributeType AttributeValue::getType() const { return m_type; } void AttributeValue::setValue(const std::string& value, AttributeType type) { m_type = type; m_value = value; } void AttributeValue::setValue(double value) { m_type = AttributeType::Double; std::stringstream sstream; sstream << value; m_value = sstream.str(); } void AttributeValue::setValue(int value) { m_type = AttributeType::Integer; std::stringstream sstream; sstream << value; m_value = sstream.str(); } std::string AttributeValue::asString() const { return m_value; } double AttributeValue::asDouble(double defaultValue) const { double value = defaultValue; if (m_type == AttributeType::Double) { std::stringstream sstream; sstream << m_value; sstream >> value; } return value; } int AttributeValue::asInteger(int defaultValue) const { int value = defaultValue; if (m_type == AttributeType::Integer) { std::stringstream sstream; sstream << m_value; sstream >> value; } return value; } std::ostream& operator<<(std::ostream& os, const AttributeValue& o) { os << o.asString(); return os; } } // namespace citygml libcitygml-2.0.8/sources/src/citygml/citygmlfactory.cpp000066400000000000000000000147511321622335500233600ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace citygml { CityGMLFactory::CityGMLFactory(std::shared_ptr logger) { m_appearanceManager = std::unique_ptr(new AppearanceManager(logger)); m_polygonManager = std::unique_ptr(new PolygonManager(logger)); m_geometryManager = std::unique_ptr(new GeometryManager(logger)); m_logger = logger; } CityModel* CityGMLFactory::createCityModel(const std::string& id) { return new CityModel(id); } CityObject* CityGMLFactory::createCityObject(const std::string& id, CityObject::CityObjectsType type) { CityObject* cityObject = new CityObject(id, type); return cityObject; } Geometry::GeometryType mapCityObjectsTypeToGeometryType(const CityObject::CityObjectsType& cityObjType) { switch (cityObjType) { case CityObject::CityObjectsType::COT_RoofSurface: return Geometry::GeometryType::GT_Roof; case CityObject::CityObjectsType::COT_WallSurface: return Geometry::GeometryType::GT_Wall; case CityObject::CityObjectsType::COT_GroundSurface: return Geometry::GeometryType::GT_Ground; case CityObject::CityObjectsType::COT_ClosureSurface: return Geometry::GeometryType::GT_Closure; case CityObject::CityObjectsType::COT_FloorSurface: return Geometry::GeometryType::GT_Floor; case CityObject::CityObjectsType::COT_InteriorWallSurface: return Geometry::GeometryType::GT_InteriorWall; case CityObject::CityObjectsType::COT_CeilingSurface: return Geometry::GeometryType::GT_Ceiling; case CityObject::CityObjectsType::COT_OuterCeilingSurface: return Geometry::GeometryType::GT_OuterCeiling; case CityObject::CityObjectsType::COT_OuterFloorSurface: return Geometry::GeometryType::GT_OuterFloor; default: return Geometry::GeometryType::GT_Unknown; } } Geometry* CityGMLFactory::createGeometry(const std::string& id, const CityObject::CityObjectsType& cityObjType, unsigned int lod) { Geometry* geom = new Geometry(id, mapCityObjectsTypeToGeometryType(cityObjType), lod); appearanceTargetCreated(geom); return geom; } std::shared_ptr CityGMLFactory::createPolygon(const std::string& id) { Polygon* poly = new Polygon(id, m_logger); appearanceTargetCreated(poly); std::shared_ptr shared = std::shared_ptr(poly); m_polygonManager->addPolygon(shared); return shared; } std::shared_ptr CityGMLFactory::createLineString(const std::string& id) { LineString* lineString = new LineString(id); return std::shared_ptr(lineString); } void CityGMLFactory::requestSharedPolygonForGeometry(Geometry* geom, const std::string& polygonId) { m_polygonManager->requestSharedPolygonForGeometry(geom, polygonId); } ImplicitGeometry *CityGMLFactory::createImplictGeometry(const std::string& id) { return new ImplicitGeometry(id); } std::shared_ptr CityGMLFactory::shareGeometry(Geometry* geom) { std::shared_ptr shared = std::shared_ptr(geom); m_geometryManager->addSharedGeometry(shared); return shared; } void CityGMLFactory::requestSharedGeometryWithID(ImplicitGeometry* implicitGeom, const std::string& id) { m_geometryManager->requestSharedGeometryForImplicitGeometry(implicitGeom, id); } std::shared_ptr CityGMLFactory::createTexture(const std::string& id) { std::shared_ptr tex = std::shared_ptr(new Texture(id)); m_appearanceManager->addAppearance(tex); return tex; } std::shared_ptr CityGMLFactory::createMaterial(const std::string& id) { std::shared_ptr mat = std::shared_ptr(new Material(id)); m_appearanceManager->addAppearance(mat); return mat; } std::shared_ptr CityGMLFactory::createGeoReferencedTexture(const std::string& id) { std::shared_ptr tex = std::shared_ptr(new GeoreferencedTexture(id)); m_appearanceManager->addAppearance(tex); return tex; } std::shared_ptr CityGMLFactory::createMaterialTargetDefinition(const std::string& targetID, std::shared_ptr appearance, const std::string& id) { std::shared_ptr targetDef = std::shared_ptr(new MaterialTargetDefinition(targetID, appearance, id)); m_appearanceManager->addMaterialTargetDefinition(targetDef); return targetDef; } std::shared_ptr CityGMLFactory::createTextureTargetDefinition(const std::string& targetID, std::shared_ptr appearance, const std::string& id) { std::shared_ptr targetDef = std::shared_ptr(new TextureTargetDefinition(targetID, appearance, id)); m_appearanceManager->addTextureTargetDefinition(targetDef); return targetDef; } std::shared_ptr CityGMLFactory::getAppearanceWithID(const std::string& id) { return m_appearanceManager->getAppearanceByID(id); } std::vector CityGMLFactory::getAllThemes() { return m_appearanceManager->getAllThemes(); } void CityGMLFactory::closeFactory() { m_polygonManager->finish(); m_geometryManager->finish(); m_appearanceManager->assignAppearancesToTargets(); } CityGMLFactory::~CityGMLFactory() { } void CityGMLFactory::appearanceTargetCreated(AppearanceTarget* obj) { m_appearanceManager->addAppearanceTarget(obj); } } libcitygml-2.0.8/sources/src/citygml/citymodel.cpp000066400000000000000000000074051321622335500223070ustar00rootroot00000000000000/* -*-c++-*- libcitygml - Copyright (c) 2010 Joachim Pouderoux, BRGM * * Contributors: * - Manuel Garnier, BRGM - better normal computation * * This file is part of libcitygml library * http://code.google.com/p/libcitygml * * libcitygml is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. * * libcitygml is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. */ #include #include #include #include #include #include #include #include #include #ifndef min # define min( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) ) #endif /////////////////////////////////////////////////////////////////////////////// namespace citygml { CityModel::CityModel(const std::string& id) : FeatureObject( id ) { } void CityModel::addToCityObjectsMapRecursive(const CityObject* cityObj) { CityObjectsMap::iterator it = m_cityObjectsMap.find(cityObj->getType()); if (it == m_cityObjectsMap.end()) { std::vector tmp; tmp.push_back(cityObj); m_cityObjectsMap[cityObj->getType()] = std::vector(tmp); } else { it->second.push_back(cityObj); } for (int i = 0; i < cityObj->getChildCityObjectsCount(); i++) { addToCityObjectsMapRecursive(&cityObj->getChildCityObject(i)); } } std::vector CityModel::themes() const { return m_themes; } void CityModel::setThemes(std::vector themes) { m_themes = themes; } CityModel::~CityModel() { } const ConstCityObjects CityModel::getAllCityObjectsOfType( CityObject::CityObjectsType type ) const { CityObjectsMap::const_iterator it = m_cityObjectsMap.find( type ); return it->second; } const ConstCityObjects CityModel::getRootCityObjects() const { ConstCityObjects list; for (const std::unique_ptr& cityObj : m_roots) { list.push_back(cityObj.get()); } return list; } void CityModel::addRootObject(CityObject* obj) { m_roots.push_back(std::unique_ptr(obj)); } unsigned int CityModel::getNumRootCityObjects() const { return m_roots.size(); } CityObject& CityModel::getRootCityObject(int i) { return *m_roots.at(i); } const CityObject& CityModel::getRootCityObject(int i) const { return *m_roots.at(i); } const std::string& CityModel::getSRSName() const { return m_srsName; } void CityModel::finish(Tesselator& tesselator, bool optimize, std::shared_ptr logger) { // Finish all cityobjcts for (auto& cityObj : m_roots) { cityObj->finish(tesselator, optimize, logger); } // Build city objects map for (std::unique_ptr& obj : m_roots) { addToCityObjectsMapRecursive(obj.get()); } } std::ostream& operator<<( std::ostream& out, const CityModel& model ) { out << "Root CityObjects: " << std::endl; ConstCityObjects rootObjcts = model.getRootCityObjects(); for (const CityObject* cityObj : rootObjcts) { out << cityObj << std::endl; } return out; } } libcitygml-2.0.8/sources/src/citygml/cityobject.cpp000066400000000000000000000300211321622335500224430ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include ENUM_CLASS_BITWISE_OPERATORS(citygml::CityObject::CityObjectsType); namespace citygml { CityObject::CityObject(const std::string& id, CityObject::CityObjectsType type) : FeatureObject( id ), m_type( type ) { } CityObject::CityObjectsType CityObject::getType() const { return m_type; } std::string CityObject::getTypeAsString() const { return cityObjectsTypeToString(m_type); } unsigned int CityObject::getGeometriesCount() const { return m_geometries.size(); } const Geometry& CityObject::getGeometry(unsigned int i) const { return *m_geometries[i]; } Geometry& CityObject::getGeometry(unsigned int i) { return *m_geometries[i]; } void CityObject::addGeometry(Geometry* geom) { m_geometries.push_back(std::unique_ptr(geom)); } unsigned int CityObject::getImplicitGeometryCount() const { return m_implicitGeometries.size(); } const ImplicitGeometry& CityObject::getImplicitGeometry(unsigned int i) const { return *m_implicitGeometries[i]; } ImplicitGeometry& CityObject::getImplicitGeometry(unsigned int i) { return *m_implicitGeometries[i]; } void CityObject::addImplictGeometry(ImplicitGeometry* implictGeom) { m_implicitGeometries.push_back(std::unique_ptr(implictGeom)); } unsigned int CityObject::getChildCityObjectsCount() const { return m_children.size(); } const CityObject& CityObject::getChildCityObject(unsigned int i) const { return *m_children[i]; } CityObject& CityObject::getChildCityObject(unsigned int i) { return *m_children[i]; } void CityObject::addChildCityObject(CityObject* cityObj) { m_children.push_back(std::unique_ptr(cityObj)); } const Address* CityObject::address() const { return m_address.get(); } void CityObject::setAddress(std::unique_ptr
&& address) { m_address = std::move(address); } void CityObject::finish(Tesselator& tesselator, bool optimize, std::shared_ptr logger) { for (std::unique_ptr& geom : m_geometries) { geom->finish(tesselator, optimize, logger); } for (std::unique_ptr& implictGeom : m_implicitGeometries) { for (int i = 0; i < implictGeom->getGeometriesCount(); i++) { implictGeom->getGeometry(i).finish(tesselator, optimize, logger); } } for (std::unique_ptr& child : m_children) { child->finish(tesselator, optimize, logger); } } CityObject::~CityObject() { } std::ostream& operator<<( std::ostream& os, const CityObject& o ) { os << static_cast(o.getType()) << ": " << o.getId() << std::endl; os << " Envelope: " << o.getEnvelope() << std::endl; AttributesMap::const_iterator it = o.getAttributes().begin(); while ( it != o.getAttributes().end() ) { os << " + " << it->first << ": " << it->second << std::endl; ++it; } for (unsigned int i = 0; i < o.getGeometriesCount(); i++) { os << o.getGeometry(i); } os << " * " << o.getGeometriesCount() << " geometries." << std::endl; return os; } std::string cityObjectsTypeToString(const CityObject::CityObjectsType& t) { switch (t) { case CityObject::CityObjectsType::COT_GenericCityObject: return "GenericCityObject"; case CityObject::CityObjectsType::COT_Building: return "Building"; case CityObject::CityObjectsType::COT_Room: return "Room"; case CityObject::CityObjectsType::COT_BuildingInstallation: return "BuildingInstallation"; case CityObject::CityObjectsType::COT_BuildingFurniture: return "BuildingFurniture"; case CityObject::CityObjectsType::COT_Door: return "Door"; case CityObject::CityObjectsType::COT_Window: return "Window"; case CityObject::CityObjectsType::COT_CityFurniture: return "CityFurniture"; case CityObject::CityObjectsType::COT_Track: return "Track"; case CityObject::CityObjectsType::COT_Road: return "Road"; case CityObject::CityObjectsType::COT_Railway: return "Railway"; case CityObject::CityObjectsType::COT_Square: return "Square"; case CityObject::CityObjectsType::COT_PlantCover: return "PlantCover"; case CityObject::CityObjectsType::COT_SolitaryVegetationObject: return "SolitaryVegetationObject"; case CityObject::CityObjectsType::COT_WaterBody: return "WaterBody"; case CityObject::CityObjectsType::COT_ReliefFeature: return "ReliefFeature"; case CityObject::CityObjectsType::COT_LandUse: return "LandUse"; case CityObject::CityObjectsType::COT_Tunnel: return "Tunnel"; case CityObject::CityObjectsType::COT_Bridge: return "Bridge"; case CityObject::CityObjectsType::COT_BridgeConstructionElement: return "BridgeConstructionElement"; case CityObject::CityObjectsType::COT_BridgeInstallation: return "BridgeInstallation"; case CityObject::CityObjectsType::COT_BridgePart: return "BridgePart"; case CityObject::CityObjectsType::COT_BuildingPart: return "BuildingPart"; case CityObject::CityObjectsType::COT_WallSurface: return "WallSurface"; case CityObject::CityObjectsType::COT_RoofSurface: return "RoofSurface"; case CityObject::CityObjectsType::COT_GroundSurface: return "GroundSurface"; case CityObject::CityObjectsType::COT_ClosureSurface: return "ClosureSurface"; case CityObject::CityObjectsType::COT_FloorSurface: return "FloorSurface"; case CityObject::CityObjectsType::COT_InteriorWallSurface: return "InteriorWallSurface"; case CityObject::CityObjectsType::COT_CeilingSurface: return "CeilingSurface"; case CityObject::CityObjectsType::COT_OuterCeilingSurface: return "OuterCeilingSurface"; case CityObject::CityObjectsType::COT_OuterFloorSurface: return "OuterFloorSurface"; case CityObject::CityObjectsType::COT_TransportationObject: return "TransportationObject"; default: return "Unknown"; } } std::string cityObjectsTypeToLowerString(const CityObject::CityObjectsType& t) { std::string str = cityObjectsTypeToString(t); std::transform(str.begin(), str.end(), str.begin(), ::tolower); return str; } std::unordered_map stringTypeMap = { {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_GenericCityObject), CityObject::CityObjectsType::COT_GenericCityObject}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_Building), CityObject::CityObjectsType::COT_Building}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_Room), CityObject::CityObjectsType::COT_Room}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_BuildingInstallation), CityObject::CityObjectsType::COT_BuildingInstallation}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_BuildingFurniture), CityObject::CityObjectsType::COT_BuildingFurniture}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_Door), CityObject::CityObjectsType::COT_Door}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_Window), CityObject::CityObjectsType::COT_Window}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_CityFurniture), CityObject::CityObjectsType::COT_CityFurniture}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_Track), CityObject::CityObjectsType::COT_Track}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_Road), CityObject::CityObjectsType::COT_Road}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_Railway), CityObject::CityObjectsType::COT_Railway}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_Square), CityObject::CityObjectsType::COT_Square}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_PlantCover), CityObject::CityObjectsType::COT_PlantCover}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_SolitaryVegetationObject), CityObject::CityObjectsType::COT_SolitaryVegetationObject}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_WaterBody), CityObject::CityObjectsType::COT_WaterBody}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_ReliefFeature), CityObject::CityObjectsType::COT_ReliefFeature}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_LandUse), CityObject::CityObjectsType::COT_LandUse}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_Tunnel), CityObject::CityObjectsType::COT_Tunnel}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_Bridge), CityObject::CityObjectsType::COT_Bridge}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_BridgeConstructionElement), CityObject::CityObjectsType::COT_BridgeConstructionElement}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_BridgeInstallation), CityObject::CityObjectsType::COT_BridgeInstallation}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_BridgePart), CityObject::CityObjectsType::COT_BridgePart}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_BuildingPart), CityObject::CityObjectsType::COT_BuildingPart}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_WallSurface), CityObject::CityObjectsType::COT_WallSurface}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_RoofSurface), CityObject::CityObjectsType::COT_RoofSurface}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_GroundSurface), CityObject::CityObjectsType::COT_GroundSurface}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_ClosureSurface), CityObject::CityObjectsType::COT_ClosureSurface}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_FloorSurface), CityObject::CityObjectsType::COT_FloorSurface}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_InteriorWallSurface), CityObject::CityObjectsType::COT_InteriorWallSurface}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_CeilingSurface), CityObject::CityObjectsType::COT_CeilingSurface}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_OuterCeilingSurface), CityObject::CityObjectsType::COT_OuterCeilingSurface}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_OuterFloorSurface), CityObject::CityObjectsType::COT_OuterFloorSurface}, {cityObjectsTypeToLowerString(CityObject::CityObjectsType::COT_TransportationObject), CityObject::CityObjectsType::COT_TransportationObject} }; CityObject::CityObjectsType cityObjectsTypeFromString(const std::string& s, bool& valid) { std::string lower_s = s; std::transform(lower_s.begin(), lower_s.end(), lower_s.begin(), ::tolower); auto it = stringTypeMap.find(lower_s); valid = it != stringTypeMap.end(); if (valid) { return it->second; } return CityObject::CityObjectsType::COT_All; } } libcitygml-2.0.8/sources/src/citygml/envelope.cpp000066400000000000000000000025021321622335500221240ustar00rootroot00000000000000#include #include #include #ifndef NAN #define NAN std::numeric_limits::quiet_NaN() #endif #ifdef WIN32 #define ISNAN _isnan #else #define ISNAN std::isnan #endif namespace citygml { Envelope::Envelope() { m_lowerBound = TVec3d(NAN,NAN,NAN); m_upperBound = TVec3d(NAN,NAN,NAN); } Envelope::Envelope(const std::string& srsName) { m_srsName = srsName; } const TVec3d& Envelope::getLowerBound() const { return m_lowerBound; } void Envelope::setLowerBound(const TVec3d& coordinate) { m_lowerBound = coordinate; } const TVec3d& Envelope::getUpperBound() const { return m_upperBound; } void Envelope::setUpperBound(const TVec3d& coordinate) { m_upperBound = coordinate; } const std::string& Envelope::srsName() const { return m_srsName; } const bool Envelope::validBounds() const { return !(ISNAN(m_lowerBound[0]) || ISNAN(m_lowerBound[1]) || ISNAN(m_lowerBound[2]) || ISNAN(m_upperBound[0]) || ISNAN(m_upperBound[1]) || ISNAN(m_upperBound[2])); } std::ostream& operator<<( std::ostream& os, const Envelope& e ) { return os << e.getLowerBound() << " " << e.getUpperBound(); } } libcitygml-2.0.8/sources/src/citygml/featureobject.cpp000066400000000000000000000007321321622335500231340ustar00rootroot00000000000000#include #include namespace citygml { FeatureObject::FeatureObject(const std::string& gmlID) : Object(gmlID) { setEnvelope(new Envelope()); } const Envelope& FeatureObject::getEnvelope() const { return *m_envelope; } void FeatureObject::setEnvelope(Envelope* e) { m_envelope = std::unique_ptr(e); } FeatureObject::~FeatureObject() { } } libcitygml-2.0.8/sources/src/citygml/geometry.cpp000066400000000000000000000076351321622335500221560ustar00rootroot00000000000000#include #include #include #include #include namespace citygml { Geometry::Geometry(const std::string& id, Geometry::GeometryType type, unsigned int lod) : AppearanceTarget( id ), m_finished(false), m_type( type ), m_lod( lod ) { } unsigned int Geometry::getLOD() const { return m_lod; } unsigned int Geometry::getPolygonsCount() const { return m_polygons.size(); } std::shared_ptr Geometry::getPolygon(unsigned int i) { return m_polygons.at(i); } std::shared_ptr Geometry::getPolygon(unsigned int i) const { return m_polygons.at(i); } unsigned int Geometry::getLineStringCount() const { return m_lineStrings.size(); } std::shared_ptr Geometry::getLineString(unsigned int i) { return m_lineStrings.at(i); } std::shared_ptr Geometry::getLineString(unsigned int i) const { return m_lineStrings.at(i); } unsigned int Geometry::getGeometriesCount() const { return m_childGeometries.size(); } const Geometry& Geometry::getGeometry(unsigned int i) const { return *m_childGeometries.at(i); } Geometry& Geometry::getGeometry(unsigned int i) { return *m_childGeometries.at(i); } void Geometry::addGeometry(Geometry* geom) { m_childGeometries.push_back(std::unique_ptr(geom)); } Geometry::GeometryType Geometry::getType() const { return m_type; } std::string Geometry::getTypeAsString() const { switch (m_type) { case GeometryType::GT_Unknown: return "Unknown"; case GeometryType::GT_Roof: return "Roof"; case GeometryType::GT_Wall: return "Wall"; case GeometryType::GT_Ground: return "Ground"; case GeometryType::GT_Closure: return "Closure"; case GeometryType::GT_Floor: return "Floor"; case GeometryType::GT_InteriorWall: return "InteriorWall"; case GeometryType::GT_Ceiling: return "Ceiling"; case GeometryType::GT_OuterCeiling: return "OuterCeiling"; case GeometryType::GT_OuterFloor: return "OuterFloor"; default: return "Unknown"; } } Geometry::~Geometry() { } unsigned int Geometry::lod() const { return m_lod; } void Geometry::setLod(unsigned int lod) { m_lod = lod; } void Geometry::addPolygon( std::shared_ptr p ) { m_polygons.push_back(p); } void Geometry::addLineString(std::shared_ptr l) { m_lineStrings.push_back(l); } void Geometry::finish(Tesselator& tesselator, bool optimize, std::shared_ptr logger) { // only need to finish geometry once if (m_finished) { return; } m_finished = true; for (std::shared_ptr& child : m_childGeometries) { child->addTargetDefinitionsOf(*this); child->finish(tesselator, optimize, logger); } for (std::shared_ptr& polygon : m_polygons) { polygon->addTargetDefinitionsOf(*this); polygon->finish(tesselator, optimize, logger); } } std::ostream& operator<<( std::ostream& os, const citygml::Geometry& s ) { unsigned int count = 0; for ( unsigned int i = 0; i < s.getPolygonsCount(); i++ ) { os << s.getPolygon(i); count += s.getPolygon(i)->getVertices().size(); } os << " @ " << s.getPolygonsCount() << " polys [" << count << " vertices]" << std::endl; return os; } } libcitygml-2.0.8/sources/src/citygml/geometrymanager.cpp000066400000000000000000000033541321622335500235030ustar00rootroot00000000000000#include #include #include #include namespace citygml { GeometryManager::GeometryManager(std::shared_ptr logger) { m_logger = logger; } void GeometryManager::addSharedGeometry(std::shared_ptr geom) { if (m_sharedGeometries.count(geom->getId()) > 0) { CITYGML_LOG_WARN(m_logger, "Duplicate definition of shared geometry with id '" << geom->getId() << "'... overwriting existing object."); } m_sharedGeometries[geom->getId()] = geom; } void GeometryManager::requestSharedGeometryForImplicitGeometry(ImplicitGeometry* geom, const std::string& geometryID) { m_geometryRequests.push_back(GeometryRequest(geom, geometryID)); } void GeometryManager::finish() { CITYGML_LOG_INFO(m_logger, "Start processing shared geometry requests (" << m_geometryRequests.size() << ")."); for (const GeometryRequest& request : m_geometryRequests) { auto it = m_sharedGeometries.find(request.geometryID); if (it == m_sharedGeometries.end()) { CITYGML_LOG_WARN(m_logger, "ImplicitGeometry object with id '" << request.target->getId() << "' requests Geometry with id '" << request.geometryID << "' but no such" << "shared Geometry object exists."); continue; } request.target->addGeometry(it->second); } m_sharedGeometries.clear(); m_geometryRequests.clear(); CITYGML_LOG_INFO(m_logger, "Finished processing shared geometry requests."); } GeometryManager::~GeometryManager() { } } libcitygml-2.0.8/sources/src/citygml/georeferencedtexture.cpp000066400000000000000000000021501321622335500245240ustar00rootroot00000000000000#include namespace citygml { GeoreferencedTexture::GeoreferencedTexture(const std::string& id) : Texture( id, "GeoreferencedTexture" ), m_preferWorldFile(true) { } bool GeoreferencedTexture::getPreferWorldFile() const { return m_preferWorldFile; } void GeoreferencedTexture::setPreferWorldFile(bool value) { m_preferWorldFile = value; } std::shared_ptr GeoreferencedTexture::asTexture() { return std::static_pointer_cast(shared_from_this()); } std::shared_ptr GeoreferencedTexture::asTexture() const { return std::static_pointer_cast(shared_from_this()); } std::shared_ptr GeoreferencedTexture::asGeoreferencedTexture() { return std::static_pointer_cast(shared_from_this()); } std::shared_ptr GeoreferencedTexture::asGeoreferencedTexture() const { return std::static_pointer_cast(shared_from_this()); } } libcitygml-2.0.8/sources/src/citygml/implictgeometry.cpp000066400000000000000000000022511321622335500235250ustar00rootroot00000000000000#include #include namespace citygml { ImplicitGeometry::ImplicitGeometry(const std::string& id) : Object(id) { } void ImplicitGeometry::setTransformMatrix(const TransformationMatrix matrix) { m_matrix = matrix; } const TransformationMatrix& ImplicitGeometry::getTransformMatrix() const { return m_matrix; } void ImplicitGeometry::setReferencePoint(const TVec3d& referencePoint) { m_referencePoint = referencePoint; } TVec3d ImplicitGeometry::getReferencePoint() const { return m_referencePoint; } void ImplicitGeometry::addGeometry(std::shared_ptr geom) { m_geometries.push_back(geom); } unsigned int ImplicitGeometry::getGeometriesCount() const { return m_geometries.size(); } Geometry& ImplicitGeometry::getGeometry(unsigned int i) const { return *m_geometries[i]; } std::string ImplicitGeometry::getSRSName() const { return m_srsName; } void ImplicitGeometry::setSRSName(const std::string& srsName) { m_srsName = srsName; } } libcitygml-2.0.8/sources/src/citygml/linearring.cpp000066400000000000000000000106151321622335500224450ustar00rootroot00000000000000#include #include #include #include #include #include #include namespace citygml { LinearRing::LinearRing(const std::string& id, bool isExterior) : Object( id ), m_exterior( isExterior ) { } bool LinearRing::isExterior() const { return m_exterior; } unsigned int LinearRing::size() const { return m_vertices.size(); } void LinearRing::addVertex(const TVec3d& v) { m_vertices.push_back( v ); } TVec3d LinearRing::computeNormal() const { unsigned int len = size(); if ( len < 3 ) return TVec3d(); // Tampieri, F. 1992. Newell's method for computing the plane equation of a polygon. In Graphics Gems III, pp.231-232. TVec3d n( 0., 0., 0. ); for ( unsigned int i = 0; i < len; i++ ) { const TVec3d& current = m_vertices[i]; const TVec3d& next = m_vertices[ ( i + 1 ) % len]; n.x += ( current.y - next.y ) * ( current.z + next.z ); n.y += ( current.z - next.z ) * ( current.x + next.x ); n.z += ( current.x - next.x ) * ( current.y + next.y ); } return n.normal(); } std::vector& LinearRing::getVertices() { return m_vertices; } void LinearRing::setVertices(std::vector vertices) { m_vertices = vertices; } const std::vector& LinearRing::getVertices() const { return m_vertices; } void LinearRing::removeDuplicateVertices(const std::vector& targets, std::shared_ptr logger ) { // Currently TextureCoordinates sharing via xlink is not supported (every TextureTargetDefinition is the // sole owner of its TextureCoordinate objects... if this ever changes use an unordered_set for the texture coordinates std::vector > coordinatesList; bool textureCoordinatesVerticesMismatch = false; for (auto& texTarget : targets) { for (unsigned int i = 0; i < texTarget->getTextureCoordinatesCount(); i++) { auto texCoords = texTarget->getTextureCoordinates(i); if (texCoords->targets(*this)) { coordinatesList.push_back(texCoords); if (m_vertices.size() != texCoords->getCoords().size()) { CITYGML_LOG_WARN(logger, "Number of vertices in LinearRing with id '" << this->getId() << "' (" << m_vertices.size() << ") does not match with number of texture coordinates in coordinates list " << " with id '" << texCoords->getId() << "' (" << texCoords->getCoords().size() << ")"); textureCoordinatesVerticesMismatch = true; } } } } // Remove duplicated vertex unsigned int len = m_vertices.size(); if ( len < 2 ) return; unsigned int i = 0; while ( i < m_vertices.size() && m_vertices.size() > 2 ) { if ( ( m_vertices[i] - m_vertices[ ( i + 1 ) % m_vertices.size() ] ).sqrLength() <= DBL_EPSILON ) { m_vertices.erase( m_vertices.begin() + i ); for (auto coordinates : coordinatesList) { coordinates->eraseCoordinate(i); } } else { i++; } } #ifndef NDEBUG // Check integrity after duplicate removel... no need when the input was already corrupted if (textureCoordinatesVerticesMismatch) { return; } for (auto coordinates : coordinatesList) { if (coordinates->getCoords().size() != m_vertices.size()) { CITYGML_LOG_ERROR(logger, "Broken implementation. Duplicate vertex removal in LinearRing with id '" << this->getId() << "' caused a mismatch of texture coordinates in coordinates list with id '" << coordinates->getId() << "' (" << m_vertices.size() << " != " <getCoords().size() << ")"); } } #endif } void LinearRing::forgetVertices() { m_vertices.clear(); } } libcitygml-2.0.8/sources/src/citygml/linestring.cpp000066400000000000000000000025301321622335500224660ustar00rootroot00000000000000#include #include #include citygml::LineString::LineString(const std::string& id) : Object(id) { m_dimensions = -1; } int citygml::LineString::getDimensions() const { return m_dimensions; } const std::vector& citygml::LineString::getVertices2D() const { return m_vertices_2d; } const std::vector& citygml::LineString::getVertices3D() const { return m_vertices_3d; } std::vector& citygml::LineString::getVertices2D() { return m_vertices_2d; } std::vector& citygml::LineString::getVertices3D() { return m_vertices_3d; } void citygml::LineString::setVertices2D(const std::vector& vertices) { if (m_dimensions != 2) { setDimensions(2); } m_vertices_2d = vertices; } void citygml::LineString::setVertices3D(const std::vector& vertices) { if (m_dimensions != 3) { setDimensions(3); } m_vertices_3d = vertices; } void citygml::LineString::setDimensions(int dim) { m_dimensions = dim; if (dim != 2 && !m_vertices_2d.empty()) { throw std::runtime_error("LineString not set to dimension 2 but contains 2D vertices."); } else if (dim != 3 && !m_vertices_3d.empty()) { throw std::runtime_error("LineString not set to dimension 3 but contains 3D vertices."); } } libcitygml-2.0.8/sources/src/citygml/material.cpp000066400000000000000000000040311321622335500221040ustar00rootroot00000000000000#include namespace citygml { Material::Material(const std::string& id) : Appearance( id, "Material" ) { // Sets default values of the X3DMaterial definied in the citygml 1.0.0 spec see page 32 (section 9.3 Material) m_ambientIntensity = 0.2f; m_diffuse = TVec3f(0.8f, 0.8f, 0.8f); m_emissive = TVec3f(0.f, 0.f, 0.f); m_specular = TVec3f(1.f, 1.f, 1.f); m_shininess = 0.2f; m_transparency = 0.f; m_isSmooth = false; } bool Material::isSmooth() const { return m_isSmooth; } void Material::setIsSmooth(bool isSmooth) { m_isSmooth = isSmooth; } TVec3f Material::getDiffuse() const { return m_diffuse; } void Material::setDiffuse(TVec3f diffuse) { m_diffuse = diffuse; } TVec3f Material::getEmissive() const { return m_emissive; } void Material::setEmissive(TVec3f emissive) { m_emissive = emissive; } TVec3f Material::getSpecular() const { return m_specular; } void Material::setSpecular(TVec3f specular) { m_specular = specular; } float Material::getAmbientIntensity() const { return m_ambientIntensity; } void Material::setAmbientIntensity(float intensity) { m_ambientIntensity = intensity; } float Material::getShininess() const { return m_shininess; } void Material::setShininess(float shininess) { m_shininess = shininess; } float Material::getTransparency() const { return m_transparency; } void Material::setTransparency(float transparancy) { m_transparency = transparancy; } std::shared_ptr Material::asMaterial() { return std::static_pointer_cast(shared_from_this()); } std::shared_ptr Material::asMaterial() const { return std::static_pointer_cast(shared_from_this()); } } libcitygml-2.0.8/sources/src/citygml/materialtargetdefinition.cpp000066400000000000000000000004341321622335500253670ustar00rootroot00000000000000#include namespace citygml { MaterialTargetDefinition::MaterialTargetDefinition(const std::string& targetID, std::shared_ptr appearance, const std::string& id) : AppearanceTargetDefinition(targetID, appearance, id) { } } libcitygml-2.0.8/sources/src/citygml/object.cpp000066400000000000000000000022371321622335500215620ustar00rootroot00000000000000#include #include #include namespace citygml { Object::Object(const std::string& id) : m_id( id ) { if ( m_id == "" ) { std::stringstream ss; ss << "PtrId_" << this; m_id = ss.str(); } } const std::string&Object::getId() const { return m_id; } std::string Object::getAttribute(const std::string& name) const { AttributesMap::const_iterator elt = m_attributes.find( name ); return elt != m_attributes.end() ? elt->second.asString() : ""; } const AttributesMap& Object::getAttributes() const { return m_attributes; } AttributesMap& Object::getAttributes() { return m_attributes; } void Object::setAttribute(const std::string& name, const std::string& value, AttributeType type, bool overwrite) { if ( !overwrite ) { if ( m_attributes.count(name) > 1 ) return; } m_attributes[ name ] = AttributeValue(value, type); } std::ostream& operator<<( std::ostream& os, const Object& o ) { return os << o.getId(); } } libcitygml-2.0.8/sources/src/citygml/polygon.cpp000066400000000000000000000207311321622335500220020ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include namespace citygml { Polygon::Polygon(const std::string& id, std::shared_ptr logger) : AppearanceTarget( id ), m_negNormal( false ) { m_logger = logger; m_finished = false; } const std::vector& Polygon::getVertices() const { return m_vertices; } std::vector& Polygon::getVertices() { return m_vertices; } const std::vector& Polygon::getIndices() const { return m_indices; } std::shared_ptr Polygon::getMaterialFor(const std::string& theme, bool front) const { const auto targetDef = getMaterialTargetDefinitionForTheme(theme, front); if (targetDef == nullptr) { return nullptr; } return targetDef->getAppearance(); } std::shared_ptr Polygon::getMaterialFor(const std::string& theme) const { const auto result = getMaterialFor(theme, true); if (result != nullptr) { return result; } return getMaterialFor(theme, false); } std::shared_ptr Polygon::getTextureFor(const std::string& theme, bool front) const { const auto targetDef = getTextureTargetDefinitionForTheme(theme, front); if (targetDef == nullptr) { return nullptr; } return targetDef->getAppearance(); } std::shared_ptr Polygon::getTextureFor(const std::string& theme) const { const auto result = getTextureFor(theme, true); if (result != nullptr) { return result; } return getTextureFor(theme, false); } const std::vector Polygon::getTexCoordsForTheme(const std::string& theme, bool front) const { auto& map = front ? m_themeToFrontTexCoordsMap : m_themeToBackTexCoordsMap; auto it = map.find(theme); if (it == map.end()) { return std::vector(); } if (it->second.size() != m_vertices.size()) { CITYGML_LOG_ERROR(m_logger, "Number of texture coordinates (" << it->second.size() << ") for theme " << theme << " in polygon with id " << this->getId() << " does not match number of vertices (" << m_vertices.size() << ")."); } assert(it->second.size() == m_vertices.size()); return it->second; } std::shared_ptr Polygon::getTextureForTheme(const std::string& theme, bool front) const { const auto targetDef = getTextureTargetDefinitionForTheme(theme, front); if (targetDef == nullptr) { return nullptr; } return targetDef->getAppearance(); } TVec3d Polygon::computeNormal() { if ( m_exteriorRing == nullptr ) return TVec3d(); TVec3d normal = m_exteriorRing->computeNormal(); return m_negNormal ? -normal : normal; } bool Polygon::negNormal() const { return m_negNormal; } void Polygon::setNegNormal(bool negNormal) { m_negNormal = negNormal; } void Polygon::removeDuplicateVerticesInRings(std::shared_ptr logger) { std::vector texTargetDefinitions = this->getTextureTargetDefinitions(); // mergeRings should be done before merging polygons... hence m_exteriorRings should only contain one object if ( m_exteriorRing != nullptr ) { m_exteriorRing->removeDuplicateVertices( texTargetDefinitions, logger ); } for ( auto& ring : m_interiorRings ) { ring->removeDuplicateVertices( texTargetDefinitions, logger ); } } std::vector Polygon::getTexCoordsForRingAndTheme(const LinearRing& ring, const std::string& theme, bool front) { const auto targetDef = getTextureTargetDefinitionForTheme(theme, front); if (targetDef == nullptr) { return std::vector(); } const auto coords = targetDef->getTextureCoordinatesForID(ring.getId()); if (coords == nullptr || coords->getCoords().empty()) { return std::vector(); } return coords->getCoords(); } std::vector > Polygon::getTexCoordListsForRing(const LinearRing& ring, const std::vector& themesFront, const std::vector& themesBack) { std::vector > texCoordsLists; for (const std::string& theme : themesFront) { texCoordsLists.push_back(getTexCoordsForRingAndTheme(ring, theme, true)); } for (const std::string& theme : themesBack) { texCoordsLists.push_back(getTexCoordsForRingAndTheme(ring, theme, false)); } return texCoordsLists; } void Polygon::createIndicesWithTesselation(Tesselator& tesselator, std::shared_ptr logger) { TVec3d normal = computeNormal(); std::vector themesFront = getAllTextureThemes(true); std::vector themesBack = getAllTextureThemes(false); tesselator.init(normal); if (m_exteriorRing != nullptr) { tesselator.addContour( m_exteriorRing->getVertices(), getTexCoordListsForRing(*m_exteriorRing, themesFront, themesBack)); if (!tesselator.keepVertices()) { m_exteriorRing->forgetVertices(); } } for ( auto& ring : m_interiorRings ) { tesselator.addContour( ring->getVertices(), getTexCoordListsForRing(*ring, themesFront, themesBack) ); if (!tesselator.keepVertices()) { ring->forgetVertices(); } } tesselator.compute(); m_vertices = tesselator.getVertices(); m_indices = tesselator.getIndices(); if (m_vertices.empty()) { return; } const std::vector >& texCoordLists = tesselator.getTexCoords(); for (size_t i = 0; i < themesFront.size(); i++) { assert(texCoordLists.at(i).size() == m_vertices.size()); m_themeToFrontTexCoordsMap[themesFront.at(i)] = texCoordLists.at(i); } for (size_t i = 0; i < themesBack.size(); i++) { assert(texCoordLists.at(i + themesFront.size()).size() == m_vertices.size()); m_themeToBackTexCoordsMap[themesBack.at(i)] = texCoordLists.at(i + themesFront.size()); } } void Polygon::computeIndices(Tesselator& tesselator, std::shared_ptr logger ) { m_indices.clear(); m_vertices.clear(); createIndicesWithTesselation(tesselator, logger); if ( m_vertices.size() < 3 ) { CITYGML_LOG_WARN(logger, "Polygon with id " << this->getId() << " has less than 3 vertices."); } } void Polygon::finish(Tesselator& tesselator, bool optimize, std::shared_ptr logger) { if (m_finished) { // This may happen as Polygons can be shared between geometries return; } m_finished = true; if (optimize) { removeDuplicateVerticesInRings(logger); } computeIndices(tesselator, logger); } void Polygon::addRing( LinearRing* ring ) { if (m_finished) { throw std::runtime_error("Can't add LinearRing to finished Polygon."); } if (ring->isExterior() && m_exteriorRing != nullptr) { CITYGML_LOG_WARN(m_logger, "Duplicate definition of exterior LinearRing for Polygon with id '" << this->getId() << "'." << " Keeping exterior LinearRing with id '" << m_exteriorRing->getId() << "' and ignore LinearRing with id '" << ring->getId() << "'"); delete ring; return; } if ( ring->isExterior() ) { m_exteriorRing = std::shared_ptr(ring); } else { m_interiorRings.push_back( std::shared_ptr(ring) ); } } Polygon::~Polygon() { } } libcitygml-2.0.8/sources/src/citygml/polygonmanager.cpp000066400000000000000000000032061321622335500233330ustar00rootroot00000000000000#include #include #include #include namespace citygml { PolygonManager::PolygonManager(std::shared_ptr logger) { m_logger = logger; } void PolygonManager::addPolygon(std::shared_ptr poly) { if (m_sharedPolygons.count(poly->getId()) > 0) { CITYGML_LOG_WARN(m_logger, "Duplicate definition of Polygon with id '" << poly->getId() << "'... overwriting existing object."); } m_sharedPolygons[poly->getId()] = poly; } void PolygonManager::requestSharedPolygonForGeometry(Geometry* geom, const std::string& polygonID) { m_polygonRequests.push_back(PolygonRequest(geom, polygonID)); } void PolygonManager::finish() { CITYGML_LOG_INFO(m_logger, "Start processing polygon requests (" << m_polygonRequests.size() << ")."); for (const PolygonRequest& request : m_polygonRequests) { auto it = m_sharedPolygons.find(request.polygonID); if (it == m_sharedPolygons.end()) { CITYGML_LOG_WARN(m_logger, "Geometry object with id '" << request.target->getId() << "' requests Polygon with id '" << request.polygonID << "' but no such" << " Polygon object exists."); continue; } request.target->addPolygon(it->second); } m_sharedPolygons.clear(); m_polygonRequests.clear(); CITYGML_LOG_INFO(m_logger, "Finished processing polygon requests."); } PolygonManager::~PolygonManager() { } } libcitygml-2.0.8/sources/src/citygml/tesselator.cpp000066400000000000000000000166411321622335500225050ustar00rootroot00000000000000/* -*-c++-*- libcitygml - Copyright (c) 2010 Joachim Pouderoux, BRGM * * Contributors: * - Manuel Garnier, BRGM - better normal computation * * This file is part of libcitygml library * http://code.google.com/p/libcitygml * * libcitygml is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. * * libcitygml is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. */ #ifdef WIN32 #define WINDOWS_LEAN_AND_MEAN #define NOMINMAX #endif #include #ifndef WIN32 # include #endif #include #include #include #include #include Tesselator::Tesselator(std::shared_ptr logger ) { _logger = logger; _tobj = gluNewTess(); _keepVertices = false; gluTessCallback( _tobj, GLU_TESS_VERTEX_DATA, (GLU_TESS_CALLBACK)&vertexDataCallback ); gluTessCallback( _tobj, GLU_TESS_BEGIN_DATA, (GLU_TESS_CALLBACK)&beginCallback ); gluTessCallback( _tobj, GLU_TESS_END_DATA, (GLU_TESS_CALLBACK)&endCallback ); gluTessCallback( _tobj, GLU_TESS_COMBINE_DATA, (GLU_TESS_CALLBACK)&combineCallback ); gluTessCallback( _tobj, GLU_TESS_ERROR_DATA, (GLU_TESS_CALLBACK)&errorCallback ); } void Tesselator::init( const TVec3d& normal, GLenum winding_rule ) { gluTessBeginPolygon( _tobj, this ); gluTessProperty( _tobj, GLU_TESS_WINDING_RULE, winding_rule ); gluTessNormal( _tobj, normal.x, normal.y, normal.z ); _vertices.clear(); _indices.clear(); _curIndices.clear(); _texCoordsLists.clear(); _outIndices.clear(); } Tesselator::~Tesselator() { gluDeleteTess( _tobj ); } void Tesselator::compute() { gluTessEndPolygon( _tobj ); } const std::vector Tesselator::getVertices() const { return std::vector(_vertices.begin(), _vertices.end()); } const std::vector& Tesselator::getIndices() const { return _outIndices; } void Tesselator::setKeepVertices(bool value) { _keepVertices = value; } bool Tesselator::keepVertices() const { return _keepVertices; } void Tesselator::addContour(const std::vector& pts, std::vector > textureCoordinatesLists ) { unsigned int len = pts.size(); if ( len < 3 ) return; for (size_t i = 0; i < textureCoordinatesLists.size(); i++) { std::vector& texCoords = textureCoordinatesLists.at(i); if (texCoords.size() != pts.size()) { if (!texCoords.empty()) { CITYGML_LOG_ERROR(_logger, "Invalid call to 'addContour'. The number of texture coordinates in list " << i << " (" << texCoords.size() << ") " "does not match the number of vertices (" << pts.size() << "). The texture coordinates list will be resized which may cause invalid texture coordinates."); } texCoords.resize(pts.size(), TVec2f(0.f, 0.f)); } } for (size_t i = 0; i < std::max(_texCoordsLists.size(), textureCoordinatesLists.size()); i++) { if (i >= _texCoordsLists.size()) { std::vector texCoords(_vertices.size(), TVec2f(0.f, 0.f)); texCoords.insert(texCoords.end(), textureCoordinatesLists.at(i).begin(), textureCoordinatesLists.at(i).end()); _texCoordsLists.push_back(texCoords); } else if (i >= textureCoordinatesLists.size()) { _texCoordsLists.at(i).resize(_texCoordsLists.at(i).size() + pts.size(), TVec2f(0.f, 0.f)); } else { _texCoordsLists.at(i).insert(_texCoordsLists.at(i).end(), textureCoordinatesLists.at(i).begin(), textureCoordinatesLists.at(i).end()); } } unsigned int pos = _vertices.size(); gluTessBeginContour( _tobj ); for ( unsigned int i = 0; i < len; i++ ) { _vertices.push_back( pts[i] ); _indices.push_back(pos + i); gluTessVertex( _tobj, &(_vertices.back()[0]), &_indices.back() ); } gluTessEndContour( _tobj ); #ifndef NDEBUG for (size_t i = 0; i < _texCoordsLists.size(); i++) { assert(_texCoordsLists.at(i).size() == _vertices.size()); } #endif } void CALLBACK Tesselator::beginCallback( GLenum which, void* userData ) { Tesselator* tess = static_cast(userData); tess->_curMode = which; } void CALLBACK Tesselator::vertexDataCallback( GLvoid *data, void* userData ) { Tesselator *tess = static_cast(userData); unsigned int index = *reinterpret_cast(data); assert(index < tess->_vertices.size()); tess->_curIndices.push_back( index ); } void CALLBACK Tesselator::combineCallback( GLdouble coords[3], void* vertex_data[4], GLfloat weight[4], void** outData, void* userData ) { Tesselator *tess = static_cast(userData); tess->_indices.push_back(tess->_indices.size()); tess->_vertices.push_back( TVec3d( coords[0], coords[1], coords[2] ) ); if (!tess->_texCoordsLists.empty()) { for (std::vector& texcords : tess->_texCoordsLists) { if (texcords.empty()) { continue; } TVec2f newTexCoord(0,0); for (int i = 0; i < 4; i++) { if (vertex_data[i] != nullptr) { unsigned int vertexIndex = *reinterpret_cast(vertex_data[i]); newTexCoord = newTexCoord + weight[i] * texcords.at(vertexIndex); } } texcords.push_back(newTexCoord); assert(texcords.size() == tess->_vertices.size()); } } *outData = &tess->_indices.back(); } void CALLBACK Tesselator::endCallback( void* userData ) { Tesselator *tess = static_cast(userData); unsigned int len = tess->_curIndices.size(); switch ( tess->_curMode ) { case GL_TRIANGLES: for ( unsigned int i = 0; i < len; i++ ) tess->_outIndices.push_back( tess->_curIndices[i] ); break; case GL_TRIANGLE_FAN: case GL_TRIANGLE_STRIP: { unsigned int first = tess->_curIndices[0]; unsigned int prev = tess->_curIndices[1]; assert(first < tess->_vertices.size()); assert(prev < tess->_vertices.size()); for ( unsigned int i = 2; i < len; i++ ) { if ( tess->_curMode == GL_TRIANGLE_FAN || i%2 == 0 ) tess->_outIndices.push_back( first ); tess->_outIndices.push_back( prev ); if ( tess->_curMode == GL_TRIANGLE_STRIP ) { if ( i%2 == 1) tess->_outIndices.push_back( first ); first = prev; } prev = tess->_curIndices[i]; tess->_outIndices.push_back( prev ); } } break; default: CITYGML_LOG_WARN(tess->_logger, "Tesselator: non-supported GLU tesselator primitive " << tess->_curMode); } tess->_curIndices.clear(); } void CALLBACK Tesselator::errorCallback( GLenum errorCode, void* userData ) { Tesselator *tess = static_cast(userData); CITYGML_LOG_ERROR(tess->_logger, "Tesselator error: " << gluErrorString( errorCode )); } libcitygml-2.0.8/sources/src/citygml/texture.cpp000066400000000000000000000042461321622335500220160ustar00rootroot00000000000000#include #include namespace citygml { Texture::Texture(const std::string& id) : Appearance( id, "Texture" ), m_repeat( false ), m_wrapMode( WrapMode::WM_NONE ) { } Texture::Texture(const std::string& id, const std::string& type) : Appearance( id, type ), m_repeat( false ), m_wrapMode( WrapMode::WM_NONE ) { } std::string Texture::getUrl() const { return m_url; } void Texture::setUrl(const std::string& url) { m_url = url; } bool Texture::getRepeat() const { return m_repeat; } Texture::WrapMode Texture::getWrapMode() const { return m_wrapMode; } void Texture::setWrapMode(Texture::WrapMode mode) { m_wrapMode = mode; } bool Texture::setWrapModeFromString(std::string wrapMode) { if ( ci_string_compare( wrapMode, "wrap" ) ) { this->setWrapMode(Texture::WrapMode::WM_WRAP); } else if ( ci_string_compare( wrapMode, "mirror" ) ) { this->setWrapMode(Texture::WrapMode::WM_MIRROR); } else if ( ci_string_compare( wrapMode, "clamp" ) ) { this->setWrapMode(Texture::WrapMode::WM_CLAMP); } else if ( ci_string_compare( wrapMode, "border" ) ) { this->setWrapMode(Texture::WrapMode::WM_BORDER); } else if ( ci_string_compare( wrapMode, "none" ) ) { this->setWrapMode(Texture::WrapMode::WM_NONE); } else { return false; } return true; } TVec4f Texture::getBorderColor() const { return m_borderColor; } void Texture::setBorderColor(TVec4f color) { m_borderColor = color; } std::string Texture::toString() const { return Appearance::toString() + " (url: " + m_url + ")"; } std::shared_ptr Texture::asTexture() { return std::static_pointer_cast(shared_from_this()); } std::shared_ptr Texture::asTexture() const { return std::static_pointer_cast(shared_from_this()); } Texture::~Texture() { } } libcitygml-2.0.8/sources/src/citygml/texturecoordinates.cpp000066400000000000000000000016221321622335500242440ustar00rootroot00000000000000#include #include namespace citygml { TextureCoordinates::TextureCoordinates(std::string id, std::string targetID) : Object(id) { m_targetID = targetID; } bool TextureCoordinates::targets(const LinearRing& ring) const { return m_targetID == ring.getId(); } std::string TextureCoordinates::getTargetLinearRingID() const { return m_targetID; } bool TextureCoordinates::eraseCoordinate(unsigned int i) { if (i < m_coordlist.size()) { m_coordlist.erase(m_coordlist.begin() + i); return true; } return false; } const std::vector& TextureCoordinates::getCoords() const { return m_coordlist; } void TextureCoordinates::setCoords(std::vector texCoords) { m_coordlist = texCoords; } } libcitygml-2.0.8/sources/src/citygml/texturetargetdefinition.cpp000066400000000000000000000032071321622335500252720ustar00rootroot00000000000000#include #include namespace citygml { TextureTargetDefinition::TextureTargetDefinition(const std::string& targetID, std::shared_ptr appearance, const std::string& id) : AppearanceTargetDefinition(targetID, appearance, id) { } unsigned int TextureTargetDefinition::getTextureCoordinatesCount() const { return m_coordinatesList.size(); } std::shared_ptr TextureTargetDefinition::getTextureCoordinates(unsigned int i) { return m_coordinatesList.at(i); } std::shared_ptr TextureTargetDefinition::getTextureCoordinates(unsigned int i) const { return m_coordinatesList.at(i); } std::shared_ptr TextureTargetDefinition::getTextureCoordinatesForID(const std::string& ringID) { auto it = m_idTexCoordMap.find(ringID); if (it != m_idTexCoordMap.end()) { return it->second; } return nullptr; } std::shared_ptr TextureTargetDefinition::getTextureCoordinatesForID(const std::string& ringID) const { const auto it = m_idTexCoordMap.find(ringID); if (it != m_idTexCoordMap.end()) { return it->second; } return nullptr; } void TextureTargetDefinition::addTexCoordinates(std::shared_ptr texCoords) { m_coordinatesList.push_back(texCoords); m_idTexCoordMap[texCoords->getTargetLinearRingID()] = texCoords; } TextureTargetDefinition::~TextureTargetDefinition() { } } libcitygml-2.0.8/sources/src/citygml/transformmatrix.cpp000066400000000000000000000017021321622335500235500ustar00rootroot00000000000000#include namespace citygml { TransformationMatrix::TransformationMatrix() : Object("") { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { m_matrix[i + j * 4] = i == j; m_transposedMatrix[i + j * 4] = i == j; } } } TransformationMatrix::TransformationMatrix(double* matrix) : Object("") { for (size_t i = 0; i < 16; ++i) { m_matrix[i] = matrix[i]; } for (size_t i = 0; i < 4; ++i) { for (size_t j = 0; j < 4; ++j) { m_transposedMatrix[i+j*4] = m_matrix[j+i*4]; } } } const double* TransformationMatrix::getMatrix() const { return m_matrix; } const double* TransformationMatrix::getTransposedMatrix() const { return m_transposedMatrix; } TransformationMatrix::~TransformationMatrix() { } } libcitygml-2.0.8/sources/src/parser/000077500000000000000000000000001321622335500174305ustar00rootroot00000000000000libcitygml-2.0.8/sources/src/parser/addressparser.cpp000066400000000000000000000107451321622335500230050ustar00rootroot00000000000000#include #include #include #include #include #include #include #include namespace citygml { void setCountry(Address* address, std::string const &country) { address->setCountry(country); } void setLocality(Address* address, std::string const &locality) { address->setLocality(locality); } void setThoroughfareName(Address* address, std::string const &thoroughfareName) { address->setThoroughfareName(thoroughfareName); } void setThoroughfareNumber(Address *address, std::string const &thoroughfareNumber) { address->setThoroughfareNumber(thoroughfareNumber); } void setPostalCode(Address* address, std::string const &postalCode) { address->setPostalCode(postalCode); } namespace { template std::unique_ptr make_unique(Args&&... args) { return std::unique_ptr(new T(std::forward(args)...)); } auto k_rootElements = std::unordered_set(); auto k_subElements = std::unordered_set(); auto k_dataElements = std::unordered_map >(); std::mutex g_nodeSetMutex; bool g_nodeSetsInitialized = false; void initializeNodeSets() { if (!g_nodeSetsInitialized) { std::lock_guard lock(g_nodeSetMutex); if (!g_nodeSetsInitialized) { k_rootElements = { NodeType::CORE_AddressNode, NodeType::BLDG_AddressNode, NodeType::CORE_XalAddressNode }; k_subElements = { NodeType::XAL_AddressDetailsNode, NodeType::XAL_CountryNode, NodeType::XAL_LocalityNode, NodeType::XAL_PostalCodeNode, NodeType::XAL_ThoroughfareNode }; k_dataElements[NodeType::XAL_CountryNameNode] = &setCountry; k_dataElements[NodeType::XAL_LocalityNameNode] = &setLocality; k_dataElements[NodeType::XAL_ThoroughfareNameNode] = &setThoroughfareName; k_dataElements[NodeType::XAL_ThoroughfareNumberNode] = &setThoroughfareNumber; k_dataElements[NodeType::XAL_PostalCodeNumberNode] = &setPostalCode; g_nodeSetsInitialized = true; } } } } // anonymous namespace AddressParser::AddressParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, const Callback& callback) : CityGMLElementParser(documentParser, factory, logger) , m_callback(callback) { initializeNodeSets(); } std::string AddressParser::elementParserName() const { return "AddressParser"; } bool AddressParser::handlesElement(const NodeType::XMLNode& node) const { return k_rootElements.count(node) > 0; } bool AddressParser::parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { if (k_rootElements.count(node) == 0) { CITYGML_LOG_ERROR(m_logger, "Expected an address start tag but got <" << node << "> at " << getDocumentLocation()); throw std::runtime_error("Unexpected start tag found."); } m_address = citygml::make_unique
(attributes.getCityGMLIDAttribute()); return true; } bool AddressParser::parseElementEndTag(const NodeType::XMLNode& node, const std::string& characters) { m_callback(std::move(m_address)); m_address = nullptr; return k_rootElements.count(node) > 0; } bool AddressParser::parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { return k_subElements.count(node) > 0 || k_dataElements.count(node) > 0 || k_rootElements.count(node) > 0; } bool AddressParser::parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) { const auto itr = k_dataElements.find(node); if (itr != k_dataElements.end()) { itr->second(m_address.get(), characters); return true; } return k_subElements.count(node) > 0 || k_dataElements.count(node) > 0 || k_rootElements.count(node) > 0; } } /* namespace citygml */ libcitygml-2.0.8/sources/src/parser/appearanceelementparser.cpp000066400000000000000000000116711321622335500250300ustar00rootroot00000000000000#include "parser/appearanceelementparser.h" #include #include #include "parser/nodetypes.h" #include "parser/attributes.h" #include "parser/documentlocation.h" #include "parser/delayedchoiceelementparser.h" #include "parser/textureelementparser.h" #include "parser/materialelementparser.h" #include "parser/georeferencedtextureelementparser.h" #include "parser/skipelementparser.h" #include #include #include #include #include #include #include #include namespace citygml { AppearanceElementParser::AppearanceElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger) : GMLObjectElementParser(documentParser, factory, logger) { } std::string AppearanceElementParser::elementParserName() const { return "AppearanceElementParser"; } bool AppearanceElementParser::handlesElement(const NodeType::XMLNode& node) const { return node == NodeType::APP_AppearanceNode; } bool AppearanceElementParser::parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { if (node != NodeType::APP_AppearanceNode) { CITYGML_LOG_ERROR(m_logger, "Expected start tag <" << NodeType::APP_AppearanceNode.name() << "> got <" << node << "> at " << getDocumentLocation()); throw std::runtime_error("Unexpected start tag found."); } m_appearanceObj = std::make_shared(attributes.getCityGMLIDAttribute()); return true; } bool AppearanceElementParser::parseElementEndTag(const NodeType::XMLNode&, const std::string&) { if (m_theme.empty()) { CITYGML_LOG_INFO(m_logger, "Appearance node that ends at " << getDocumentLocation() << " has not theme defined. Using empty theme."); } if (m_surfaceDataList.empty()) { CITYGML_LOG_ERROR(m_logger, "Appearance node that ends at " << getDocumentLocation() << " has no surfaceData elements."); } // assign the theme to all members for (std::shared_ptr& surfaceData : m_surfaceDataList) { surfaceData->addToTheme(m_theme); } return true; } bool AppearanceElementParser::parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { if (node == NodeType::APP_ThemeNode) { return true; } else if (node == NodeType::APP_SurfaceDataMemberNode) { if (attributes.hasXLinkAttribute()) { // surfaceDataMemberNode links to an existing surfaceData member std::shared_ptr sharedAppearance = m_factory.getAppearanceWithID(attributes.getXLinkValue()); if (sharedAppearance != nullptr) { m_surfaceDataList.push_back(sharedAppearance); } else { CITYGML_LOG_WARN(m_logger, "SurfaceDataMember node with invalid xlink attribute. SurfaceData object with id " << attributes.getXLinkValue() << " does not exist."); } } else { // surfaceDataMemberNode contains a surfaceData object (material, texture or georeferencedtexture) std::function)> callback = [this] (std::shared_ptr surfacedata) { this->m_surfaceDataList.push_back(surfacedata); }; std::vector choices; choices.push_back(new MaterialElementParser(m_documentParser, m_factory, m_logger, callback)); choices.push_back(new TextureElementParser(m_documentParser, m_factory, m_logger, callback)); choices.push_back(new GeoReferencedTextureElementParser(m_documentParser, m_factory, m_logger, callback)); setParserForNextElement(new DelayedChoiceElementParser(m_documentParser, m_logger, choices)); } return true; } return GMLObjectElementParser::parseChildElementStartTag(node, attributes); } bool AppearanceElementParser::parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) { if (node == NodeType::APP_ThemeNode) { if (!m_theme.empty()) { CITYGML_LOG_WARN(m_logger, "Duplicate definition of theme in appearance node at " << getDocumentLocation() << ". Overwriting last theme '" << m_theme << "' with '" << characters << "'"); } m_theme = characters; return true; } else if (node == NodeType::APP_SurfaceDataMemberNode) { return true; } return GMLObjectElementParser::parseChildElementEndTag(node, characters); } Object* AppearanceElementParser::getObject() { return m_appearanceObj.get(); } } libcitygml-2.0.8/sources/src/parser/attributes.cpp000066400000000000000000000017451321622335500223310ustar00rootroot00000000000000#include "parser/attributes.h" #include "parser/parserutils.hpp" #include "parser/documentlocation.h" #include #include "sstream" namespace citygml { Attributes::Attributes(std::shared_ptr logger) { m_logger = logger; } std::string Attributes::getCityGMLIDAttribute() const { std::string id = getAttribute("gml:id", ""); if (id.empty()) { std::stringstream defaultID; defaultID << "genID_" << getDocumentLocation().getDocumentFileName() << "_" << getDocumentLocation().getCurrentLine() << "_" << + getDocumentLocation().getCurrentColumn(); id = defaultID.str(); } return id; } bool Attributes::hasXLinkAttribute() const { return !getAttribute("xlink:href", "").empty(); } std::string Attributes::getXLinkValue() { return parseReference(getAttribute("xlink:href", ""), m_logger, getDocumentLocation()); } } libcitygml-2.0.8/sources/src/parser/citygmldocumentparser.cpp000066400000000000000000000166241321622335500245710ustar00rootroot00000000000000#include "parser/citygmldocumentparser.h" #include "parser/documentlocation.h" #include "parser/nodetypes.h" #include "parser/elementparser.h" #include "parser/citymodelelementparser.h" #include "parser/geocoordinatetransformer.h" #include #include #include #include #include namespace citygml { CityGMLDocumentParser::CityGMLDocumentParser(const ParserParams& params, std::shared_ptr logger) { m_logger = logger; m_factory = std::unique_ptr(new CityGMLFactory(logger)); m_parserParams = params; m_activeParser = nullptr; m_currentElementUnknownOrUnexpected = false; m_unknownElementOrUnexpectedElementDepth = 0; m_unknownElementOrUnexpectedElementName = ""; } std::shared_ptr CityGMLDocumentParser::getModel() { return m_rootModel; } void CityGMLDocumentParser::setCurrentElementParser(ElementParser* parser) { m_parserStack.push(std::shared_ptr(parser)); } void CityGMLDocumentParser::removeCurrentElementParser(const ElementParser* caller) { if (m_parserStack.top().get() != caller) { throw std::runtime_error("A CityGMLElementParser object tries to remove another CityGMLElementParser object from the control flow which is not allowed."); } m_parserStack.pop(); } void CityGMLDocumentParser::startElement(const std::string& name, Attributes& attributes) { if (checkCurrentElementUnownOrUnexpected_start(name)) { CITYGML_LOG_DEBUG(m_logger, "Skipping element <" << name << "> at " << getDocumentLocation()); return; } const NodeType::XMLNode& node = NodeType::getXMLNodeFor(name); if (!node.valid()) { CITYGML_LOG_WARN(m_logger, "Found start tag of unknown node <" << name << "> at " << getDocumentLocation() << ". Skip to next element."); skipUnknownOrUnexpectedElement(name); return; } if (m_parserStack.empty()) { m_parserStack.push(std::unique_ptr(new CityModelElementParser(*this, *m_factory, m_logger, [this](CityModel* cityModel) { this->m_rootModel = std::unique_ptr(cityModel); }))); } m_activeParser = m_parserStack.top(); CITYGML_LOG_TRACE(m_logger, "Invoke " << m_activeParser->elementParserName() << "::startElement for <" << node << "> at " << getDocumentLocation()); if (!m_activeParser->startElement(node, attributes)) { CITYGML_LOG_WARN(m_logger, "Skipping element with unexpected start tag <" << node << "> at " << getDocumentLocation() << " (active parser " << m_activeParser->elementParserName() << ")"); skipUnknownOrUnexpectedElement(name); } } void CityGMLDocumentParser::endElement(const std::string& name, const std::string& characters) { if (checkCurrentElementUnownOrUnexpected_end(name)) { CITYGML_LOG_DEBUG(m_logger, "Skipped element <" << name << "> at " << getDocumentLocation()); return; } const NodeType::XMLNode& node = NodeType::getXMLNodeFor(name); if (!node.valid()) { CITYGML_LOG_WARN(m_logger, "Found end tag of unknown node <" << name << "> at " << getDocumentLocation()); return; } if (m_parserStack.empty()) { CITYGML_LOG_ERROR(m_logger, "Found element end tag at" << getDocumentLocation() << "but parser stack is empty (either a bug or corrupted xml document)"); throw std::runtime_error("Unexpected element end."); } m_activeParser = m_parserStack.top(); CITYGML_LOG_TRACE(m_logger, "Invoke " << m_activeParser->elementParserName() << "::endElement for <" << node << "> at " << getDocumentLocation()); if (!m_activeParser->endElement(node, characters)) { CITYGML_LOG_ERROR(m_logger, "Active parser " << m_activeParser->elementParserName() << " reports end tag <" << node << "> at " << getDocumentLocation() << " as " << "unknown, but it seems as if the corresponding start tag was not reported as unknown. Please check the parser implementation." << "Ignoring end tag and continue parsing."); } } void CityGMLDocumentParser::startDocument() { CITYGML_LOG_INFO(m_logger, "Start parsing citygml file (" << getDocumentLocation() << ")"); } void CityGMLDocumentParser::endDocument() { if (!m_parserStack.empty()) { CITYGML_LOG_WARN(m_logger, "Reached end of document but the parser stack is not empty (either a bug or corrupted xml document)"); } CITYGML_LOG_INFO(m_logger, "Finished parsing ciytgml file (" << getDocumentLocation() << ")"); m_factory->closeFactory(); if (m_rootModel != nullptr) { Tesselator tesselator(m_logger); tesselator.setKeepVertices(m_parserParams.keepVertices); CITYGML_LOG_INFO(m_logger, "Start postprocessing of the citymodel."); m_rootModel->finish(tesselator, m_parserParams.optimize, m_logger); CITYGML_LOG_INFO(m_logger, "Finished postprocessing of the citymodel."); m_rootModel->setThemes(m_factory->getAllThemes()); if (!m_parserParams.destSRS.empty()) { try { CITYGML_LOG_INFO(m_logger, "Start coordinates transformation ."); GeoCoordinateTransformer transformer(m_parserParams.destSRS, m_logger); transformer.transformToDestinationSRS(m_rootModel.get()); CITYGML_LOG_INFO(m_logger, "Finished coordinates transformation ."); } catch (const std::runtime_error& e) { CITYGML_LOG_ERROR(m_logger, "Coordinate transformation aborted: " << e.what()); throw e; } } } else { CITYGML_LOG_WARN(m_logger, "Reached end of document but no CityModel was parsed."); } } void CityGMLDocumentParser::skipUnknownOrUnexpectedElement(const std::string& name) { m_unknownElementOrUnexpectedElementName = name; m_unknownElementOrUnexpectedElementDepth = 0; m_currentElementUnknownOrUnexpected = true; } bool CityGMLDocumentParser::checkCurrentElementUnownOrUnexpected_start(const std::string& name) { if (!m_currentElementUnknownOrUnexpected) { return false; } if (m_unknownElementOrUnexpectedElementName == name) { m_unknownElementOrUnexpectedElementDepth++; } return true; } bool CityGMLDocumentParser::checkCurrentElementUnownOrUnexpected_end(const std::string& name) { if (!m_currentElementUnknownOrUnexpected) { return false; } if (m_unknownElementOrUnexpectedElementName == name) { if (m_unknownElementOrUnexpectedElementDepth == 0) { // End tag of initial unknown element reached... m_unknownElementOrUnexpectedElementName = ""; m_currentElementUnknownOrUnexpected = false; } m_unknownElementOrUnexpectedElementDepth--; } return true; } CityGMLDocumentParser::~CityGMLDocumentParser() { } } libcitygml-2.0.8/sources/src/parser/citygmlelementparser.cpp000066400000000000000000000042621321622335500243770ustar00rootroot00000000000000#include "parser/citygmlelementparser.h" #include #include #include "parser/citygmldocumentparser.h" #include "parser/documentlocation.h" #include "parser/nodetypes.h" #include namespace citygml { CityGMLElementParser::CityGMLElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger) : ElementParser(documentParser, logger), m_factory(factory), m_boundElement(NodeType::InvalidNode) { } bool CityGMLElementParser::startElement(const NodeType::XMLNode& node, Attributes& attributes) { if (!node.valid()) { CITYGML_LOG_ERROR(m_logger, "Invalid xml start tag (no name) found at " << getDocumentLocation()); throw std::runtime_error("Error parsing xml document. Invalid start tag."); } if (!m_boundElement.valid()) { m_boundElement = node; return parseElementStartTag(node, attributes); } else { return parseChildElementStartTag(node, attributes); } } bool CityGMLElementParser::endElement(const NodeType::XMLNode& node, const std::string& characters) { if (!m_boundElement.valid()) { // This might happen if an container element that usally contains a child element links to an exting object using XLink an thus // uses a combined start/end element: e.g.: // For such elements a child parser must only be created if there is no xlink attribute. CITYGML_LOG_ERROR(m_logger, "CityGMLElementParser::endElement called on unbound " << elementParserName() << " object for element <" << node << "> at " << getDocumentLocation()); throw std::runtime_error("CityGMLElementParser::endElement called on unbound CityGMLElementParser object."); } if (m_boundElement == node) { m_documentParser.removeCurrentElementParser(this); return parseElementEndTag(node, characters); } else { return parseChildElementEndTag(node, characters); } } CityGMLElementParser::~CityGMLElementParser() { } } libcitygml-2.0.8/sources/src/parser/citymodelelementparser.cpp000066400000000000000000000074261321622335500247250ustar00rootroot00000000000000#include "parser/citymodelelementparser.h" #include "parser/nodetypes.h" #include "parser/attributes.h" #include "parser/documentlocation.h" #include "parser/cityobjectelementparser.h" #include "parser/appearanceelementparser.h" #include #include #include #include #include namespace citygml { CityModelElementParser::CityModelElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback) : GMLFeatureCollectionElementParser(documentParser, factory, logger) { m_callback = callback; m_model = nullptr; } bool CityModelElementParser::handlesElement(const NodeType::XMLNode& node) const { return node == NodeType::CORE_CityModelNode; } std::string CityModelElementParser::elementParserName() const { return "CityModelElementParser"; } bool CityModelElementParser::parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { if (node != NodeType::CORE_CityModelNode) { CITYGML_LOG_ERROR(m_logger, "Expected start tag <" << NodeType::CORE_CityModelNode.name() << "> got <" << node.name() << "> at " << getDocumentLocation()); throw std::runtime_error("Unexpected start tag found."); } m_model = m_factory.createCityModel(attributes.getCityGMLIDAttribute()); return true; } bool CityModelElementParser::parseElementEndTag(const NodeType::XMLNode& node, const std::string&) { if (node != NodeType::CORE_CityModelNode) { CITYGML_LOG_WARN(m_logger, "Expected end tag <" << NodeType::CORE_CityModelNode.name() << "> got <" << node.name() << "> at " << getDocumentLocation()); } m_callback(m_model); return true; } bool CityModelElementParser::parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { if (m_model == nullptr) { throw std::runtime_error("CityModelElementParser::parseChildElementStartTag called before CityModelElementParser::parseElementStartTag"); } if (node == NodeType::CORE_CityObjectMemberNode) { setParserForNextElement(new CityObjectElementParser(m_documentParser, m_factory, m_logger, [this](CityObject* obj) { this->m_model->addRootObject(obj); })); return true; } else if (node == NodeType::APP_AppearanceNode // Compatibility with CityGML 1.0 (in CityGML 2 CityObjects can only contain appearanceMember elements) || node == NodeType::APP_AppearanceMemberNode) { setParserForNextElement(new AppearanceElementParser(m_documentParser, m_factory, m_logger)); return true; } else { return GMLFeatureCollectionElementParser::parseChildElementStartTag(node, attributes); } return false; } bool CityModelElementParser::parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) { if (m_model == nullptr) { throw std::runtime_error("CityModelElementParser::parseChildElementEndTag called before CityModelElementParser::parseElementStartTag"); } if (node == NodeType::CORE_CityObjectMemberNode || node == NodeType::APP_AppearanceNode || node == NodeType::APP_AppearanceMemberNode) { return true; } else { return GMLFeatureCollectionElementParser::parseChildElementEndTag(node, characters); } return false; } FeatureObject* CityModelElementParser::getFeatureObject() { return m_model; } } libcitygml-2.0.8/sources/src/parser/cityobjectelementparser.cpp000066400000000000000000001007011321622335500250610ustar00rootroot00000000000000#include "parser/cityobjectelementparser.h" #include "parser/nodetypes.h" #include "parser/attributes.h" #include "parser/documentlocation.h" #include "parser/appearanceelementparser.h" #include "parser/geometryelementparser.h" #include "parser/implicitgeometryelementparser.h" #include "parser/polygonelementparser.h" #include "parser/skipelementparser.h" #include "parser/delayedchoiceelementparser.h" #include "parser/linestringelementparser.h" #include "parser/addressparser.h" #include #include #include #include #include namespace citygml { bool CityObjectElementParser::typeIDTypeMapInitialized = false; bool CityObjectElementParser::attributesSetInitialized = false; std::unordered_map CityObjectElementParser::typeIDTypeMap = std::unordered_map(); std::unordered_set CityObjectElementParser::attributesSet = std::unordered_set(); std::unordered_map CityObjectElementParser::attributeTypeMap; std::mutex CityObjectElementParser::initializedTypeIDMutex; std::mutex CityObjectElementParser::initializedAttributeSetMutex; #define HANDLE_TYPE( prefix, elementName ) std::pair(NodeType::prefix ## _ ## elementName ## Node.typeID(), CityObject::CityObjectsType::COT_## elementName) #define HANDLE_GROUP_TYPE( prefix, elementName, enumtype ) std::pair(NodeType::prefix ## _ ## elementName ## Node.typeID(), enumtype) #define HANDLE_ATTR( prefix, elementName ) NodeType::prefix ## _ ## elementName ## Node.typeID() CityObjectElementParser::CityObjectElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback) : GMLFeatureCollectionElementParser(documentParser, factory, logger) , m_lastAttributeType(AttributeType::String) { m_callback = callback; } std::string CityObjectElementParser::elementParserName() const { return "CityObjectElementParser"; } void CityObjectElementParser::initializeTypeIDTypeMap() { // double-checked lock if (!typeIDTypeMapInitialized) { std::lock_guard lock(CityObjectElementParser::initializedTypeIDMutex); if (!typeIDTypeMapInitialized) { typeIDTypeMap.insert(HANDLE_TYPE(GEN, GenericCityObject)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, Building)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, BuildingPart)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, Room)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, BuildingInstallation)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, BuildingFurniture)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, Door)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, Window)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, CityFurniture)); typeIDTypeMap.insert(HANDLE_TYPE(FRN, CityFurniture)); typeIDTypeMap.insert(HANDLE_TYPE(TRANS, Track)); typeIDTypeMap.insert(HANDLE_TYPE(TRANS, Road)); typeIDTypeMap.insert(HANDLE_TYPE(TRANS, Railway)); typeIDTypeMap.insert(HANDLE_TYPE(TRANS, Square)); typeIDTypeMap.insert(HANDLE_GROUP_TYPE(TRANS, TransportationComplex, CityObject::CityObjectsType::COT_TransportationObject)); typeIDTypeMap.insert(HANDLE_GROUP_TYPE(TRANS, TrafficArea, CityObject::CityObjectsType::COT_TransportationObject)); typeIDTypeMap.insert(HANDLE_GROUP_TYPE(TRANS, AuxiliaryTrafficArea, CityObject::CityObjectsType::COT_TransportationObject)); typeIDTypeMap.insert(HANDLE_TYPE(VEG, PlantCover)); typeIDTypeMap.insert(HANDLE_TYPE(VEG, SolitaryVegetationObject)); typeIDTypeMap.insert(HANDLE_TYPE(WTR, WaterBody)); typeIDTypeMap.insert(HANDLE_GROUP_TYPE(WTR, WaterSurface, CityObject::CityObjectsType::COT_WaterBody)); typeIDTypeMap.insert(HANDLE_GROUP_TYPE(WTR, WaterGroundSurface, CityObject::CityObjectsType::COT_WaterBody)); typeIDTypeMap.insert(HANDLE_GROUP_TYPE(WTR, WaterClosureSurface, CityObject::CityObjectsType::COT_WaterBody)); typeIDTypeMap.insert(HANDLE_TYPE(LUSE, LandUse)); typeIDTypeMap.insert(HANDLE_TYPE(SUB, Tunnel)); typeIDTypeMap.insert(HANDLE_TYPE(BRID, Bridge)); typeIDTypeMap.insert(HANDLE_TYPE(BRID, BridgeConstructionElement)); typeIDTypeMap.insert(HANDLE_TYPE(BRID, BridgeInstallation)); typeIDTypeMap.insert(HANDLE_TYPE(BRID, BridgePart)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, WallSurface)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, RoofSurface)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, GroundSurface)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, ClosureSurface)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, FloorSurface)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, InteriorWallSurface)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, CeilingSurface)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, OuterCeilingSurface)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, OuterFloorSurface)); typeIDTypeMap.insert(HANDLE_TYPE(GRP, CityObjectGroup)); typeIDTypeMap.insert(HANDLE_TYPE(DEM, ReliefFeature)); typeIDTypeMapInitialized = true; } } } void CityObjectElementParser::initializeAttributesSet() { // double-checked lock if (!attributesSetInitialized) { std::lock_guard lock(CityObjectElementParser::initializedAttributeSetMutex); if (!attributesSetInitialized) { attributesSet.insert(HANDLE_ATTR(CORE, CreationDate)); attributesSet.insert(HANDLE_ATTR(CORE, TerminationDate)); attributesSet.insert(HANDLE_ATTR(BLDG, Type)); attributesSet.insert(HANDLE_ATTR(BLDG, Class)); attributesSet.insert(HANDLE_ATTR(BLDG, Function)); attributesSet.insert(HANDLE_ATTR(BLDG, Usage)); attributesSet.insert(HANDLE_ATTR(BLDG, YearOfConstruction)); attributesSet.insert(HANDLE_ATTR(BLDG, YearOfDemolition)); attributesSet.insert(HANDLE_ATTR(BLDG, StoreyHeightsAboveGround)); attributesSet.insert(HANDLE_ATTR(BLDG, StoreyHeightsBelowGround)); attributesSet.insert(HANDLE_ATTR(BLDG, StoreysBelowGround)); attributesSet.insert(HANDLE_ATTR(BLDG, StoreysAboveGround)); attributesSet.insert(HANDLE_ATTR(BLDG, MeasuredHeight)); attributesSet.insert(HANDLE_ATTR(BLDG, RoofType)); attributesSet.insert(HANDLE_ATTR(VEG, Class )); attributesSet.insert(HANDLE_ATTR(VEG, Function )); attributesSet.insert(HANDLE_ATTR(VEG, AverageHeight )); attributesSet.insert(HANDLE_ATTR(VEG, Species )); attributesSet.insert(HANDLE_ATTR(VEG, Height )); attributesSet.insert(HANDLE_ATTR(VEG, TrunkDiameter )); attributesSet.insert(HANDLE_ATTR(VEG, CrownDiameter )); attributesSet.insert(HANDLE_ATTR(FRN, Class)); attributesSet.insert(HANDLE_ATTR(FRN, Function)); attributesSet.insert(HANDLE_ATTR(GRP, Class)); attributesSet.insert(HANDLE_ATTR(GRP, Function)); attributesSet.insert(HANDLE_ATTR(GRP, Usage)); attributesSet.insert(HANDLE_ATTR(GEN, Class)); attributesSet.insert(HANDLE_ATTR(GEN, Function)); attributesSet.insert(HANDLE_ATTR(GEN, Usage)); attributesSet.insert(HANDLE_ATTR(LUSE, Class)); attributesSet.insert(HANDLE_ATTR(LUSE, Function)); attributesSet.insert(HANDLE_ATTR(LUSE, Usage)); attributesSet.insert(HANDLE_ATTR(DEM, Lod)); attributesSet.insert(HANDLE_ATTR(TRANS, Usage)); attributesSet.insert(HANDLE_ATTR(TRANS, Function)); attributesSet.insert(HANDLE_ATTR(TRANS, SurfaceMaterial)); attributesSet.insert(HANDLE_ATTR(WTR, Class)); attributesSet.insert(HANDLE_ATTR(WTR, Function)); attributesSet.insert(HANDLE_ATTR(WTR, Usage)); attributesSet.insert(HANDLE_ATTR(WTR, WaterLevel)); attributeTypeMap[HANDLE_ATTR(CORE, CreationDate)] = AttributeType::Date; attributeTypeMap[HANDLE_ATTR(CORE, TerminationDate)] = AttributeType::Date; attributeTypeMap[HANDLE_ATTR(BLDG, Type)] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(BLDG, Class)] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(BLDG, Function)] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(BLDG, Usage)] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(BLDG, YearOfConstruction)] = AttributeType::Date; attributeTypeMap[HANDLE_ATTR(BLDG, YearOfDemolition)] = AttributeType::Date; attributeTypeMap[HANDLE_ATTR(BLDG, StoreyHeightsAboveGround)] = AttributeType::Double; attributeTypeMap[HANDLE_ATTR(BLDG, StoreyHeightsBelowGround)] = AttributeType::Double; attributeTypeMap[HANDLE_ATTR(BLDG, StoreysBelowGround)] = AttributeType::Integer; attributeTypeMap[HANDLE_ATTR(BLDG, StoreysAboveGround)] = AttributeType::Integer; attributeTypeMap[HANDLE_ATTR(BLDG, MeasuredHeight)] = AttributeType::Double; attributeTypeMap[HANDLE_ATTR(BLDG, RoofType)] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(VEG, Class )] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(VEG, Function )] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(VEG, AverageHeight )] = AttributeType::Double; attributeTypeMap[HANDLE_ATTR(VEG, Species )] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(VEG, Height )] = AttributeType::Double; attributeTypeMap[HANDLE_ATTR(VEG, TrunkDiameter )] = AttributeType::Double; attributeTypeMap[HANDLE_ATTR(VEG, CrownDiameter )] = AttributeType::Double; attributeTypeMap[HANDLE_ATTR(FRN, Class)] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(FRN, Function)] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(GRP, Class)] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(GRP, Function)] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(GRP, Usage)] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(GEN, Class)] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(GEN, Function)] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(GEN, Usage)] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(LUSE, Class)] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(LUSE, Function)] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(LUSE, Usage)] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(DEM, Lod)] = AttributeType::Integer; attributeTypeMap[HANDLE_ATTR(TRANS, Usage)] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(TRANS, Function)] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(TRANS, SurfaceMaterial)] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(WTR, Class)] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(WTR, Function)] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(WTR, Usage)] = AttributeType::String; attributeTypeMap[HANDLE_ATTR(WTR, WaterLevel)] = AttributeType::Double; attributesSetInitialized = true; } } } AttributeType CityObjectElementParser::getAttributeType(const NodeType::XMLNode& node) { if (node == NodeType::GEN_StringAttributeNode) { return AttributeType::String; } else if (node == NodeType::GEN_DoubleAttributeNode) { return AttributeType::Double; } else if (node == NodeType::GEN_IntAttributeNode) { return AttributeType::Integer; } else if (node == NodeType::GEN_DateAttributeNode) { return AttributeType::Date; } else if (node == NodeType::GEN_UriAttributeNode) { return AttributeType::Uri; } else { // fallback to string for other types return AttributeType::String; } } bool CityObjectElementParser::handlesElement(const NodeType::XMLNode& node) const { initializeTypeIDTypeMap(); return typeIDTypeMap.count(node.typeID()) > 0; } bool CityObjectElementParser::parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { initializeTypeIDTypeMap(); auto it = typeIDTypeMap.find(node.typeID()); if (it == typeIDTypeMap.end()) { CITYGML_LOG_ERROR(m_logger, "Expected start tag of CityObject but got <" << node.name() << "> at " << getDocumentLocation()); throw std::runtime_error("Unexpected start tag found."); } m_model = m_factory.createCityObject(attributes.getCityGMLIDAttribute(), static_cast(it->second)); return true; } bool CityObjectElementParser::parseElementEndTag(const NodeType::XMLNode&, const std::string&) { m_callback(m_model); m_model = nullptr; return true; } bool CityObjectElementParser::parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { initializeAttributesSet(); if (m_model == nullptr) { throw std::runtime_error("CityObjectElementParser::parseChildElementStartTag called before CityObjectElementParser::parseElementStartTag"); } if ( node == NodeType::GEN_StringAttributeNode || node == NodeType::GEN_DoubleAttributeNode || node == NodeType::GEN_IntAttributeNode || node == NodeType::GEN_DateAttributeNode || node == NodeType::GEN_UriAttributeNode) { m_lastAttributeName = attributes.getAttribute("name"); m_lastAttributeType = getAttributeType(node); } else if (attributesSet.count(node.typeID()) > 0 || node == NodeType::GEN_ValueNode) { return true; } else if (node == NodeType::BLDG_BoundedByNode || node == NodeType::BLDG_OuterBuildingInstallationNode || node == NodeType::BLDG_InteriorBuildingInstallationNode || node == NodeType::BLDG_InteriorFurnitureNode || node == NodeType::BLDG_RoomInstallationNode || node == NodeType::BLDG_InteriorRoomNode || node == NodeType::BLDG_OpeningNode || node == NodeType::BLDG_ConsistsOfBuildingPartNode || node == NodeType::GRP_GroupMemberNode || node == NodeType::GRP_ParentNode || node == NodeType::TRANS_TrafficAreaNode || node == NodeType::TRANS_AuxiliaryTrafficAreaNode || node == NodeType::WTR_BoundedByNode) { setParserForNextElement(new CityObjectElementParser(m_documentParser, m_factory, m_logger, [this](CityObject* obj) { m_model->addChildCityObject(obj); })); } else if (node == NodeType::APP_AppearanceNode // Compatibility with CityGML 1.0 (in CityGML 2 CityObjects can only contain appearanceMember elements) || node == NodeType::APP_AppearanceMemberNode) { setParserForNextElement(new AppearanceElementParser(m_documentParser, m_factory, m_logger)); } else if (node == NodeType::BLDG_Lod1MultiCurveNode || node == NodeType::BLDG_Lod1MultiSurfaceNode || node == NodeType::BLDG_Lod1SolidNode || node == NodeType::BLDG_Lod1TerrainIntersectionNode || node == NodeType::GEN_Lod1TerrainIntersectionNode || node == NodeType::FRN_Lod1TerrainIntersectionNode || node == NodeType::LUSE_Lod1MultiSurfaceNode || node == NodeType::TRANS_Lod1MultiSurfaceNode || node == NodeType::WTR_Lod1MultiCurveNode || node == NodeType::WTR_Lod1MultiSurfaceNode || node == NodeType::WTR_Lod1SolidNode) { parseGeometryForLODLevel(1); } else if (node == NodeType::BLDG_Lod2MultiCurveNode || node == NodeType::BLDG_Lod2MultiSurfaceNode || node == NodeType::BLDG_Lod2SolidNode || node == NodeType::BLDG_Lod2TerrainIntersectionNode || node == NodeType::GEN_Lod2TerrainIntersectionNode || node == NodeType::FRN_Lod2TerrainIntersectionNode || node == NodeType::LUSE_Lod2MultiSurfaceNode || node == NodeType::TRANS_Lod2MultiSurfaceNode || node == NodeType::WTR_Lod2SolidNode || node == NodeType::WTR_Lod2SurfaceNode) { parseGeometryForLODLevel(2); } else if (node == NodeType::BLDG_Lod3MultiCurveNode || node == NodeType::BLDG_Lod3MultiSurfaceNode || node == NodeType::BLDG_Lod3SolidNode || node == NodeType::BLDG_Lod3TerrainIntersectionNode || node == NodeType::GEN_Lod3TerrainIntersectionNode || node == NodeType::FRN_Lod3TerrainIntersectionNode || node == NodeType::LUSE_Lod3MultiSurfaceNode || node == NodeType::TRANS_Lod3MultiSurfaceNode || node == NodeType::WTR_Lod3SolidNode || node == NodeType::WTR_Lod3SurfaceNode) { parseGeometryForLODLevel(3); } else if (node == NodeType::BLDG_Lod4MultiCurveNode || node == NodeType::BLDG_Lod4MultiSurfaceNode || node == NodeType::BLDG_Lod4SolidNode || node == NodeType::BLDG_Lod4TerrainIntersectionNode || node == NodeType::GEN_Lod4TerrainIntersectionNode || node == NodeType::FRN_Lod4TerrainIntersectionNode || node == NodeType::LUSE_Lod4MultiSurfaceNode || node == NodeType::TRANS_Lod4MultiSurfaceNode || node == NodeType::WTR_Lod4SolidNode || node == NodeType::WTR_Lod4SurfaceNode) { parseGeometryForLODLevel(4); } else if (node == NodeType::GEN_Lod1GeometryNode || node == NodeType::FRN_Lod1GeometryNode || node == NodeType::VEG_Lod1GeometryNode) { parseGeometryPropertyElementForLODLevel(1, attributes.getCityGMLIDAttribute()); } else if (node == NodeType::GEN_Lod2GeometryNode || node == NodeType::FRN_Lod2GeometryNode || node == NodeType::BLDG_Lod2GeometryNode || node == NodeType::VEG_Lod2GeometryNode) { parseGeometryPropertyElementForLODLevel(2, attributes.getCityGMLIDAttribute()); } else if (node == NodeType::GEN_Lod3GeometryNode || node == NodeType::FRN_Lod3GeometryNode || node == NodeType::BLDG_Lod3GeometryNode || node == NodeType::VEG_Lod3GeometryNode) { parseGeometryPropertyElementForLODLevel(3, attributes.getCityGMLIDAttribute()); } else if (node == NodeType::GEN_Lod4GeometryNode || node == NodeType::FRN_Lod4GeometryNode || node == NodeType::BLDG_Lod4GeometryNode || node == NodeType::VEG_Lod4GeometryNode) { parseGeometryPropertyElementForLODLevel(4, attributes.getCityGMLIDAttribute()); } else if (node == NodeType::VEG_Lod1ImplicitRepresentationNode || node == NodeType::FRN_Lod1ImplicitRepresentationNode || node == NodeType::GEN_Lod1ImplicitRepresentationNode) { parseImplicitGeometryForLODLevel(1); } else if (node == NodeType::VEG_Lod2ImplicitRepresentationNode || node == NodeType::FRN_Lod2ImplicitRepresentationNode || node == NodeType::GEN_Lod2ImplicitRepresentationNode) { parseImplicitGeometryForLODLevel(2); } else if (node == NodeType::VEG_Lod3ImplicitRepresentationNode || node == NodeType::FRN_Lod3ImplicitRepresentationNode || node == NodeType::GEN_Lod3ImplicitRepresentationNode) { parseImplicitGeometryForLODLevel(3); } else if (node == NodeType::VEG_Lod4ImplicitRepresentationNode || node == NodeType::FRN_Lod4ImplicitRepresentationNode || node == NodeType::GEN_Lod4ImplicitRepresentationNode) { parseImplicitGeometryForLODLevel(4); } else if (node == NodeType::CORE_GeneralizesToNode || node == NodeType::CORE_ExternalReferenceNode || node == NodeType::GML_MultiPointNode || node == NodeType::GRP_GeometryNode || node == NodeType::DEM_ReliefComponentNode || node == NodeType::GEN_Lod0GeometryNode || node == NodeType::GEN_Lod0ImplicitRepresentationNode || node == NodeType::GEN_Lod0TerrainIntersectionNode || node == NodeType::TRANS_Lod0NetworkNode || node == NodeType::WTR_Lod0MultiCurveNode || node == NodeType::WTR_Lod0MultiSurfaceNode) { CITYGML_LOG_INFO(m_logger, "Skipping CityObject child element <" << node << "> at " << getDocumentLocation() << " (Currently not supported!)"); setParserForNextElement(new SkipElementParser(m_documentParser, m_logger, node)); return true; } else if (node == NodeType::BLDG_AddressNode || node == NodeType::CORE_AddressNode || node == NodeType::CORE_XalAddressNode) { setParserForNextElement(new AddressParser(m_documentParser, m_factory, m_logger, [this](std::unique_ptr
&& address) { m_model->setAddress(std::move(address)); })); return true; } else { return GMLFeatureCollectionElementParser::parseChildElementStartTag(node, attributes); } return true; } bool CityObjectElementParser::parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) { if (m_model == nullptr) { throw std::runtime_error("CityObjectElementParser::parseChildElementEndTag called before CityObjectElementParser::parseElementStartTag"); } initializeAttributesSet(); if ( node == NodeType::GEN_StringAttributeNode || node == NodeType::GEN_DoubleAttributeNode || node == NodeType::GEN_IntAttributeNode || node == NodeType::GEN_DateAttributeNode || node == NodeType::GEN_UriAttributeNode) { m_lastAttributeName = ""; m_lastAttributeType = AttributeType::String; return true; } else if (node == NodeType::GEN_ValueNode) { if (!m_lastAttributeName.empty()) { m_model->setAttribute(m_lastAttributeName, characters, m_lastAttributeType); } else { CITYGML_LOG_WARN(m_logger, "Found value node (" << NodeType::GEN_ValueNode << ") outside attribute node... ignore."); } return true; } else if (attributesSet.count(node.typeID()) > 0) { if (!characters.empty()) { m_model->setAttribute(node.name(), characters, attributeTypeMap.at(node.typeID())); } return true; } else if (node == NodeType::BLDG_BoundedByNode || node == NodeType::BLDG_OuterBuildingInstallationNode || node == NodeType::BLDG_InteriorBuildingInstallationNode || node == NodeType::BLDG_InteriorFurnitureNode || node == NodeType::BLDG_RoomInstallationNode || node == NodeType::BLDG_InteriorRoomNode || node == NodeType::BLDG_OpeningNode || node == NodeType::APP_AppearanceNode || node == NodeType::APP_AppearanceMemberNode || node == NodeType::BLDG_Lod1MultiCurveNode || node == NodeType::BLDG_Lod1MultiSurfaceNode || node == NodeType::BLDG_Lod1SolidNode || node == NodeType::BLDG_Lod1TerrainIntersectionNode || node == NodeType::BLDG_Lod2GeometryNode || node == NodeType::BLDG_Lod2MultiCurveNode || node == NodeType::BLDG_Lod2MultiSurfaceNode || node == NodeType::BLDG_Lod2SolidNode || node == NodeType::BLDG_Lod2TerrainIntersectionNode || node == NodeType::BLDG_Lod3GeometryNode || node == NodeType::BLDG_Lod3MultiCurveNode || node == NodeType::BLDG_Lod3MultiSurfaceNode || node == NodeType::BLDG_Lod3SolidNode || node == NodeType::BLDG_Lod3TerrainIntersectionNode || node == NodeType::BLDG_Lod4GeometryNode || node == NodeType::BLDG_Lod4MultiCurveNode || node == NodeType::BLDG_Lod4MultiSurfaceNode || node == NodeType::BLDG_Lod4SolidNode || node == NodeType::BLDG_Lod4TerrainIntersectionNode || node == NodeType::GEN_Lod1GeometryNode || node == NodeType::GEN_Lod2GeometryNode || node == NodeType::GEN_Lod3GeometryNode || node == NodeType::GEN_Lod4GeometryNode || node == NodeType::GEN_Lod1TerrainIntersectionNode || node == NodeType::GEN_Lod2TerrainIntersectionNode || node == NodeType::GEN_Lod3TerrainIntersectionNode || node == NodeType::GEN_Lod4TerrainIntersectionNode || node == NodeType::GEN_Lod1ImplicitRepresentationNode || node == NodeType::GEN_Lod2ImplicitRepresentationNode || node == NodeType::GEN_Lod3ImplicitRepresentationNode || node == NodeType::GEN_Lod4ImplicitRepresentationNode || node == NodeType::VEG_Lod1ImplicitRepresentationNode || node == NodeType::VEG_Lod2ImplicitRepresentationNode || node == NodeType::VEG_Lod3ImplicitRepresentationNode || node == NodeType::VEG_Lod4ImplicitRepresentationNode || node == NodeType::CORE_ExternalReferenceNode || node == NodeType::BLDG_ConsistsOfBuildingPartNode || node == NodeType::FRN_Lod1GeometryNode || node == NodeType::FRN_Lod1TerrainIntersectionNode || node == NodeType::FRN_Lod1ImplicitRepresentationNode || node == NodeType::FRN_Lod2GeometryNode || node == NodeType::FRN_Lod2TerrainIntersectionNode || node == NodeType::FRN_Lod2ImplicitRepresentationNode || node == NodeType::FRN_Lod3GeometryNode || node == NodeType::FRN_Lod3TerrainIntersectionNode || node == NodeType::FRN_Lod3ImplicitRepresentationNode || node == NodeType::FRN_Lod4GeometryNode || node == NodeType::FRN_Lod4TerrainIntersectionNode || node == NodeType::FRN_Lod4ImplicitRepresentationNode || node == NodeType::CORE_GeneralizesToNode || node == NodeType::GML_MultiPointNode || node == NodeType::GRP_GroupMemberNode || node == NodeType::GRP_ParentNode || node == NodeType::LUSE_Lod1MultiSurfaceNode || node == NodeType::LUSE_Lod2MultiSurfaceNode || node == NodeType::LUSE_Lod3MultiSurfaceNode || node == NodeType::LUSE_Lod4MultiSurfaceNode || node == NodeType::DEM_ReliefComponentNode || node == NodeType::GEN_Lod0GeometryNode || node == NodeType::GEN_Lod0ImplicitRepresentationNode || node == NodeType::GEN_Lod0TerrainIntersectionNode || node == NodeType::TRANS_Lod0NetworkNode || node == NodeType::TRANS_TrafficAreaNode || node == NodeType::TRANS_AuxiliaryTrafficAreaNode || node == NodeType::TRANS_Lod1MultiSurfaceNode || node == NodeType::TRANS_Lod2MultiSurfaceNode || node == NodeType::TRANS_Lod3MultiSurfaceNode || node == NodeType::TRANS_Lod4MultiSurfaceNode || node == NodeType::WTR_Lod0MultiCurveNode || node == NodeType::WTR_Lod0MultiSurfaceNode || node == NodeType::WTR_Lod1MultiCurveNode || node == NodeType::WTR_Lod1MultiSurfaceNode || node == NodeType::WTR_Lod1SolidNode || node == NodeType::WTR_Lod2SolidNode || node == NodeType::WTR_Lod3SolidNode || node == NodeType::WTR_Lod4SolidNode || node == NodeType::WTR_Lod2SurfaceNode || node == NodeType::WTR_Lod3SurfaceNode || node == NodeType::WTR_Lod4SurfaceNode || node == NodeType::WTR_BoundedByNode || node == NodeType::BLDG_AddressNode || node == NodeType::CORE_AddressNode || node == NodeType::CORE_XalAddressNode) { return true; } return GMLFeatureCollectionElementParser::parseChildElementEndTag(node, characters); } FeatureObject* CityObjectElementParser::getFeatureObject() { return m_model; } void CityObjectElementParser::parseGeometryForLODLevel(int lod) { setParserForNextElement(new GeometryElementParser(m_documentParser, m_factory, m_logger, lod, m_model->getType(), [this](Geometry* geom) { m_model->addGeometry(geom); })); } void CityObjectElementParser::parseImplicitGeometryForLODLevel(int lod) { setParserForNextElement(new ImplicitGeometryElementParser(m_documentParser, m_factory, m_logger, lod, m_model->getType(), [this](ImplicitGeometry* imp) { m_model->addImplictGeometry(imp); })); } void CityObjectElementParser::parseGeometryPropertyElementForLODLevel(int lod, const std::string& id) { setParserForNextElement(new DelayedChoiceElementParser(m_documentParser, m_logger, { new PolygonElementParser(m_documentParser, m_factory, m_logger, [id, lod, this](std::shared_ptr p) { Geometry* geom = m_factory.createGeometry(id, m_model->getType(), lod); geom->addPolygon(p); m_model->addGeometry(geom); }), new LineStringElementParser(m_documentParser, m_factory, m_logger, [id, lod, this](std::shared_ptr l) { Geometry* geom = m_factory.createGeometry(id, m_model->getType(), lod); geom->addLineString(l); m_model->addGeometry(geom); }), new GeometryElementParser(m_documentParser, m_factory, m_logger, lod, m_model->getType(), [this](Geometry* geom) { m_model->addGeometry(geom); }) })); } } libcitygml-2.0.8/sources/src/parser/delayedchoiceelementparser.cpp000066400000000000000000000043401321622335500255060ustar00rootroot00000000000000#include "parser/delayedchoiceelementparser.h" #include "parser/documentlocation.h" #include "parser/citygmldocumentparser.h" #include #include #include namespace citygml { DelayedChoiceElementParser::DelayedChoiceElementParser(CityGMLDocumentParser& documentParser, std::shared_ptr logger, std::vector choices) : ElementParser(documentParser, logger) { m_choices = choices; } bool DelayedChoiceElementParser::startElement(const NodeType::XMLNode& node, Attributes& attributes) { ElementParser* choosenParser = nullptr; for (ElementParser* parser : m_choices) { if (choosenParser == nullptr && parser->handlesElement(node)) { choosenParser = parser; } else { delete parser; } } if (choosenParser != nullptr) { m_documentParser.removeCurrentElementParser(this); m_documentParser.setCurrentElementParser(choosenParser); return choosenParser->startElement(node, attributes); } else { CITYGML_LOG_ERROR(m_logger, "DelayedChoiceElementParser could not find a parser to handle <" << node << "> at " << getDocumentLocation()); throw std::runtime_error("No parser for XML element found."); } } bool DelayedChoiceElementParser::endElement(const NodeType::XMLNode&, const std::string&) { throw std::runtime_error("DelayedChoiceElementParser::endElement must never be called."); } bool DelayedChoiceElementParser::handlesElement(const NodeType::XMLNode& node) const { for (const ElementParser* parser : m_choices) { if (parser->handlesElement(node)) { return true; } } return false; } std::string DelayedChoiceElementParser::elementParserName() const { std::stringstream ss; ss << "DelayedChoiceElementParser ("; for (size_t i = 0; i < m_choices.size(); i++) { if (i > 0) { ss << " | "; } ss << m_choices[i]->elementParserName(); } ss << ")"; return ss.str(); } } libcitygml-2.0.8/sources/src/parser/elementparser.cpp000066400000000000000000000006571321622335500230120ustar00rootroot00000000000000#include "parser/elementparser.h" #include "parser/citygmldocumentparser.h" namespace citygml { void ElementParser::setParserForNextElement(ElementParser* parser) { m_documentParser.setCurrentElementParser(parser); } const DocumentLocation& ElementParser::getDocumentLocation() const { return m_documentParser.getDocumentLocation(); } ElementParser::~ElementParser() { } } libcitygml-2.0.8/sources/src/parser/geocoordinatetransformer.cpp000066400000000000000000000277651321622335500252620ustar00rootroot00000000000000#include "parser/geocoordinatetransformer.h" #include #include #include #include #include #include #include #include #include #ifdef USE_GDAL #include "ogrsf_frmts.h" #include class GeoTransform { public: GeoTransform( const std::string& destURN, std::shared_ptr logger ) : m_destSRSURN(destURN) , m_sourceURN("") , m_transformation(nullptr) , m_logger(logger) { OGRErr err = m_destSRS.SetFromUserInput(destURN.c_str()); if (err != OGRERR_NONE) { CITYGML_LOG_ERROR(m_logger, "Could not create OGRSpatialReference for destination SRS " << destURN << ". OGR error code: " << err << "."); throw std::runtime_error("Invalid destination spatial reference system."); } } GeoTransform(const GeoTransform& other) : m_destSRS(other.m_destSRS) , m_destSRSURN(other.m_destSRSURN) , m_sourceURN("") , m_transformation(nullptr) , m_logger(other.m_logger) { } ~GeoTransform() { if (m_transformation != nullptr) { OCTDestroyCoordinateTransformation(m_transformation); } } bool valid() const { return m_transformation != nullptr; } void transform( TVec3d &p ) const { if (m_transformation == nullptr) { return; } m_transformation->Transform( 1, &p.x, &p.y, &p.z ); } void transform( TVec2d &p ) const { if (m_transformation == nullptr) { return; } m_transformation->Transform( 1, &p.x, &p.y ); } bool hasSourceSRS(const std::string& sourceURN) { if (m_transformation == nullptr) { return false; } OGRSpatialReference refSys; OGRErr err = refSys.SetFromUserInput(sourceURN.c_str()); if (err != OGRERR_NONE) { return false; } return refSys.IsSame(m_transformation->GetSourceCS()); } void setSourceSRS(const std::string& sourceURN) { if (m_transformation != nullptr) { OCTDestroyCoordinateTransformation(m_transformation); m_transformation = nullptr; } OGRSpatialReference sourceSRS; OGRErr err = sourceSRS.SetFromUserInput(sourceURN.c_str()); if (err != OGRERR_NONE) { CITYGML_LOG_ERROR(m_logger, "Could not create OGRSpatialReference for source SRS " << sourceURN << ". OGR error code: " << err << "."); return; } m_transformation = OGRCreateCoordinateTransformation(&sourceSRS, &m_destSRS); if (m_transformation == nullptr) { CITYGML_LOG_ERROR(m_logger, "Could not create transformation from source SRS " << sourceURN << " to destination SRS " << m_destSRSURN << "."); return; } m_sourceURN = sourceURN; } std::string sourceURN() const { return m_sourceURN; } private: OGRSpatialReference m_destSRS; std::string m_destSRSURN; std::string m_sourceURN; OGRCoordinateTransformation* m_transformation; std::shared_ptr m_logger; }; namespace citygml { GeoCoordinateTransformer::GeoCoordinateTransformer(const std::string& destSRS, std::shared_ptr logger) { m_destinationSRS = destSRS; m_logger = logger; } void GeoCoordinateTransformer::transformToDestinationSRS(CityModel* model) { GeoTransform transformation(m_destinationSRS, m_logger); if (!model->getEnvelope().srsName().empty()) { transformation.setSourceSRS(model->getEnvelope().srsName()); if (model->getEnvelope().validBounds()) { if (transformation.valid()) { TVec3d lowerBound = model->getEnvelope().getLowerBound(); TVec3d upperBound = model->getEnvelope().getUpperBound(); transformation.transform(lowerBound); transformation.transform(upperBound); Envelope* newEnvelope = new Envelope(m_destinationSRS); newEnvelope->setLowerBound(lowerBound); newEnvelope->setUpperBound(upperBound); model->setEnvelope(newEnvelope); } else { CITYGML_LOG_WARN(m_logger, "No valid spatial reference system is given for CityModel with id '" << model->getId() << "'. Envelope (Bounding Box) is not transformed."); } } } for (unsigned int i = 0; i < model->getNumRootCityObjects(); i++) { transformRecursive(model->getRootCityObject(i), transformation); } } void GeoCoordinateTransformer::transformRecursive(CityObject& obj, GeoTransform& transformation) { if (!obj.getEnvelope().srsName().empty() && !transformation.hasSourceSRS(obj.getEnvelope().srsName())) { GeoTransform childTransformation = transformation; childTransformation.setSourceSRS(obj.getEnvelope().srsName()); transformRecursive_helper(obj, childTransformation); } else { transformRecursive_helper(obj, transformation); } } void GeoCoordinateTransformer::transformRecursive_helper(CityObject& obj, GeoTransform& transformation) { if (obj.getEnvelope().validBounds()) { if (transformation.valid()) { TVec3d lowerBound = obj.getEnvelope().getLowerBound(); TVec3d upperBound = obj.getEnvelope().getUpperBound(); transformation.transform(lowerBound); transformation.transform(upperBound); Envelope* newEnvelope = new Envelope(m_destinationSRS); newEnvelope->setLowerBound(lowerBound); newEnvelope->setUpperBound(upperBound); obj.setEnvelope(newEnvelope); } else { CITYGML_LOG_WARN(m_logger, "No valid spatial reference system is given for CityObject with id '" << obj.getId() << "'. Envelope (Bounding Box) is not transformed."); } } for (unsigned int i = 0; i < obj.getChildCityObjectsCount(); i++) { transformRecursive(obj.getChildCityObject(i), transformation); } for (unsigned int i = 0; i < obj.getImplicitGeometryCount(); i++) { transformRecursive(obj.getImplicitGeometry(i), transformation); } for (unsigned int i = 0; i < obj.getGeometriesCount(); i++) { transform(obj.getGeometry(i), transformation); } } void GeoCoordinateTransformer::transformRecursive(ImplicitGeometry& obj, GeoTransform& transformation) { if (!obj.getSRSName().empty() && !transformation.hasSourceSRS(obj.getSRSName())) { GeoTransform childTransformation = transformation; childTransformation.setSourceSRS(obj.getSRSName()); transformRecursive_helper(obj, childTransformation); } else { transformRecursive_helper(obj, transformation); } } void GeoCoordinateTransformer::transformRecursive_helper(ImplicitGeometry& obj, GeoTransform& transformation) { TVec3d referencePoint = obj.getReferencePoint(); if (transformation.valid()) { transformation.transform(referencePoint); obj.setReferencePoint(referencePoint); obj.setSRSName(m_destinationSRS); } else { CITYGML_LOG_WARN(m_logger, "No valid spatial reference system is given for ImplicitGeometry with id '" << obj.getId() << "'. Reference Point is not transformed."); } // Do not transform the geometry of an ImplicitGeometry object. Implicit Geometries share Geometry objects but each implicit geometry // defines its own transformation on the vertices of the shared geometry. Hence those vertices are in a local coordinate system. Read // the citygml documentation for more details. //for (unsigned int i = 0; i < obj.getGeometriesCount(); i++) { // transform(obj.getGeometry(i), transformation); //} } void GeoCoordinateTransformer::transform(Geometry& obj, GeoTransform& transformation) { if (!transformation.valid()) { CITYGML_LOG_WARN(m_logger, "No valid spatial reference system is given for Geometry with id '" << obj.getId() << "'. Child Polygons are not transformed" << "(unless they are shared with another geometry for which a spatial reference system is defined)"); return; } for (unsigned int i = 0; i < obj.getPolygonsCount(); i++) { const auto poly = obj.getPolygon(i); auto it = m_transformedPolygonsSourceURNMap.find(poly.get()); if (it == m_transformedPolygonsSourceURNMap.end()) { for (TVec3d& vertex : poly->getVertices()) { transformation.transform(vertex); } m_transformedPolygonsSourceURNMap[poly.get()] = transformation.sourceURN(); } else if (it->second != transformation.sourceURN()) { CITYGML_LOG_WARN(m_logger, "Polygon with id '" << poly->getId() << "' was already transformed from " << it->second << " to " << m_destinationSRS << ". But the spatial reference system of Geometry object with id '" << obj.getId() << "' that also contains the polygon is different " << "(" << transformation.sourceURN() << "). Ignoring new source SRS."); } } for (unsigned int i = 0; i < obj.getLineStringCount(); i++) { const auto lineString = obj.getLineString(i); auto it = m_transformedLineStringsSourceURNMap.find(lineString.get()); if (it == m_transformedLineStringsSourceURNMap.end()) { if (lineString->getDimensions() == 2) { for (TVec2d& vertex : lineString->getVertices2D()) { transformation.transform(vertex); } } else if (lineString->getDimensions() == 3) { for (TVec3d& vertex : lineString->getVertices3D()) { transformation.transform(vertex); } } m_transformedLineStringsSourceURNMap[lineString.get()] = transformation.sourceURN(); } else if (it->second != transformation.sourceURN()) { CITYGML_LOG_WARN(m_logger, "LineString with id '" << lineString->getId() << "' was already transformed from " << it->second << " to " << m_destinationSRS << ". But the spatial reference system of Geometry object with id '" << obj.getId() << "' that also contains the LineString is different " << "(" << transformation.sourceURN() << "). Ignoring new source SRS."); } } for (unsigned int i = 0; i < obj.getGeometriesCount(); i++) { transform(obj.getGeometry(i), transformation); } } } #else class GeoTransform { }; namespace citygml { GeoCoordinateTransformer::GeoCoordinateTransformer(const std::string& destSRS, std::shared_ptr logger) { m_destinationSRS = destSRS; m_logger = logger; } void GeoCoordinateTransformer::transformToDestinationSRS(CityModel* model) { CITYGML_LOG_WARN(m_logger, "Coordinate transformation to " << m_destinationSRS << " requested, but libcitygml was build without GDAL. The coordinates will not be transformed."); } void GeoCoordinateTransformer::transformRecursive(CityObject&, GeoTransform&) {} void GeoCoordinateTransformer::transformRecursive_helper(CityObject&, GeoTransform&) {} void GeoCoordinateTransformer::transformRecursive(ImplicitGeometry&, GeoTransform&) {} void GeoCoordinateTransformer::transformRecursive_helper(ImplicitGeometry&, GeoTransform&) {} void GeoCoordinateTransformer::transform(Geometry&, GeoTransform&) {} } #endif libcitygml-2.0.8/sources/src/parser/geometryelementparser.cpp000066400000000000000000000153641321622335500245670ustar00rootroot00000000000000#include "parser/geometryelementparser.h" #include #include "parser/nodetypes.h" #include "parser/attributes.h" #include "parser/documentlocation.h" #include "parser/polygonelementparser.h" #include "parser/delayedchoiceelementparser.h" #include "parser/sequenceparser.h" #include #include #include #include #include #include namespace citygml { // The nodes that are valid Geometry Objects std::unordered_set geometryTypeIDSet; bool geometryTypeIDSetInitialized = false; std::mutex geometryElement_initializedTypeIDMutex; GeometryElementParser::GeometryElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, int lodLevel, CityObject::CityObjectsType parentType, std::function callback) : GMLObjectElementParser(documentParser, factory, logger) { m_callback = callback; m_lodLevel = lodLevel; m_parentType = parentType; } std::string GeometryElementParser::elementParserName() const { return "GeometryElementParser"; } bool GeometryElementParser::handlesElement(const NodeType::XMLNode& node) const { if(!geometryTypeIDSetInitialized) { std::lock_guard lock(geometryElement_initializedTypeIDMutex); if (!geometryTypeIDSetInitialized) { geometryTypeIDSet.insert(NodeType::GML_CompositeSolidNode.typeID()); geometryTypeIDSet.insert(NodeType::GML_SolidNode.typeID()); geometryTypeIDSet.insert(NodeType::GML_MultiSurfaceNode.typeID()); geometryTypeIDSet.insert(NodeType::GML_CompositeSurfaceNode.typeID()); geometryTypeIDSet.insert(NodeType::GML_TriangulatedSurfaceNode.typeID()); geometryTypeIDSet.insert(NodeType::GML_OrientableSurfaceNode.typeID()); geometryTypeIDSet.insert(NodeType::GML_MultiSolidNode.typeID()); geometryTypeIDSet.insert(NodeType::GML_CompositeSolidNode.typeID()); geometryTypeIDSet.insert(NodeType::GML_ShellNode.typeID()); geometryTypeIDSet.insert(NodeType::GML_PolyhedralSurfaceNode.typeID()); geometryTypeIDSet.insert(NodeType::GML_SurfaceNode.typeID()); geometryTypeIDSet.insert(NodeType::GML_ShellNode.typeID()); geometryTypeIDSetInitialized = true; } } return geometryTypeIDSet.count(node.typeID()) > 0; } bool GeometryElementParser::parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { if (!handlesElement(node)) { CITYGML_LOG_ERROR(m_logger, "Expected start tag of GeometryObject but got <" << node.name() << "> at " << getDocumentLocation()); throw std::runtime_error("Unexpected start tag found."); } m_model = m_factory.createGeometry(attributes.getCityGMLIDAttribute(), m_parentType, m_lodLevel); m_orientation = attributes.getAttribute("orientation", "+"); // A gml:OrientableSurface may define a negative orientation return true; } bool GeometryElementParser::parseElementEndTag(const NodeType::XMLNode&, const std::string&) { if (m_orientation == "-") { for (int i = 0; i < m_model->getPolygonsCount(); i++) { m_model->getPolygon(i)->setNegNormal(true); } } m_callback(m_model); return true; } bool GeometryElementParser::parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { if (m_model == nullptr) { throw std::runtime_error("GeometryElementParser::parseChildElementStartTag called before GeometryElementParser::parseElementStartTag"); } if (node == NodeType::GML_InteriorNode || node == NodeType::GML_ExteriorNode || node == NodeType::GML_SolidMemberNode) { setParserForNextElement(new GeometryElementParser(m_documentParser, m_factory, m_logger, m_lodLevel, m_parentType, [this](Geometry* child) { m_model->addGeometry(child); })); return true; } else if (node == NodeType::GML_SurfaceMemberNode || node == NodeType::GML_BaseSurfaceNode) { if (attributes.hasXLinkAttribute()) { m_factory.requestSharedPolygonForGeometry(m_model, attributes.getXLinkValue()); } else { std::vector parsers; std::function)> callback1 = [this](std::shared_ptr poly) {m_model->addPolygon(poly);}; std::function callback2 = [this](Geometry* child) {m_model->addGeometry(child);}; parsers.push_back(new PolygonElementParser(m_documentParser, m_factory, m_logger, callback1)); parsers.push_back(new GeometryElementParser(m_documentParser, m_factory, m_logger, m_lodLevel, m_parentType, callback2)); setParserForNextElement(new DelayedChoiceElementParser(m_documentParser, m_logger, parsers)); } return true; } else if (node == NodeType::GML_PatchesNode || node == NodeType::GML_TrianglePatchesNode) { std::function patchParserFactory = [this]() { return new PolygonElementParser(m_documentParser, m_factory, m_logger, [this](std::shared_ptr poly) {m_model->addPolygon(poly);}); }; setParserForNextElement(new SequenceParser(m_documentParser, m_logger, patchParserFactory, node)); } return GMLObjectElementParser::parseChildElementStartTag(node, attributes); } bool GeometryElementParser::parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) { if (m_model == nullptr) { throw std::runtime_error("GeometryElementParser::parseChildElementEndTag called before GeometryElementParser::parseElementStartTag"); } if (node == NodeType::GML_InteriorNode || node == NodeType::GML_ExteriorNode || node == NodeType::GML_SolidMemberNode || node == NodeType::GML_SurfaceMemberNode || node == NodeType::GML_BaseSurfaceNode || node == NodeType::GML_PatchesNode || node == NodeType::GML_TrianglePatchesNode) { return true; } return GMLObjectElementParser::parseChildElementEndTag(node, characters); } Object* GeometryElementParser::getObject() { return m_model; } } libcitygml-2.0.8/sources/src/parser/georeferencedtextureelementparser.cpp000066400000000000000000000044771321622335500271550ustar00rootroot00000000000000#include "parser/georeferencedtextureelementparser.h" #include #include "parser/nodetypes.h" #include "parser/attributes.h" #include "parser/documentlocation.h" #include "parser/skipelementparser.h" #include #include #include #include namespace citygml { GeoReferencedTextureElementParser::GeoReferencedTextureElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function)> callback) : CityGMLElementParser(documentParser, factory, logger) { m_callback = callback; } std::string GeoReferencedTextureElementParser::elementParserName() const { return "GeoReferencedTextureElementParser"; } bool GeoReferencedTextureElementParser::handlesElement(const NodeType::XMLNode& node) const { return node == NodeType::APP_GeoreferencedTextureNode; } bool GeoReferencedTextureElementParser::parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { if (node != NodeType::APP_GeoreferencedTextureNode) { CITYGML_LOG_ERROR(m_logger, "Expected start tag <" << NodeType::APP_GeoreferencedTextureNode.name() << "> got " << node << " at " << getDocumentLocation()); throw std::runtime_error("Unexpected start tag found."); } CITYGML_LOG_WARN(m_logger, "Skipping contents of GeoReferencedTextureElement at " << getDocumentLocation() << ". (Currently not supported!)"); return true; } bool GeoReferencedTextureElementParser::parseElementEndTag(const NodeType::XMLNode&, const std::string&) { // Not Implemented return true; } bool GeoReferencedTextureElementParser::parseChildElementStartTag(const NodeType::XMLNode&, Attributes&) { setParserForNextElement(new SkipElementParser(m_documentParser, m_logger)); return true; } bool GeoReferencedTextureElementParser::parseChildElementEndTag(const NodeType::XMLNode&, const std::string&) { setParserForNextElement(new SkipElementParser(m_documentParser, m_logger)); return true; } } libcitygml-2.0.8/sources/src/parser/gmlfeaturecollectionparser.cpp000066400000000000000000000062201321622335500255600ustar00rootroot00000000000000#include "parser/gmlfeaturecollectionparser.h" #include "parser/attributes.h" #include "parser/parserutils.hpp" #include "parser/nodetypes.h" #include #include #include #include #include #include namespace citygml { GMLFeatureCollectionElementParser::GMLFeatureCollectionElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger) : GMLObjectElementParser(documentParser, factory, logger) { m_bounds = nullptr; } bool GMLFeatureCollectionElementParser::parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { if (getFeatureObject() == nullptr) { throw std::runtime_error("Invalid call to GMLFeatureCollectionElementParser::parseChildElementStartTag"); } if (node == NodeType::GML_LowerCornerNode || node == NodeType::GML_UpperCornerNode || node == NodeType::GML_BoundedByNode) { return true; } else if (node == NodeType::GML_EnvelopeNode) { if (m_bounds != nullptr) { CITYGML_LOG_WARN(m_logger, "Duplicate definition of " << NodeType::GML_EnvelopeNode << " at " << getDocumentLocation()); return true; } m_bounds = new Envelope(attributes.getAttribute("srsName")); return true; } return GMLObjectElementParser::parseChildElementStartTag(node, attributes); } bool GMLFeatureCollectionElementParser::parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) { if (getFeatureObject() == nullptr) { throw std::runtime_error("Invalid call to GMLFeatureCollectionElementParser::parseChildElementEndTag"); } if (node == NodeType::GML_LowerCornerNode) { if (m_bounds != nullptr) { m_bounds->setLowerBound(parseValue(characters, m_logger, getDocumentLocation())); } else { CITYGML_LOG_WARN(m_logger, "Definition of " << NodeType::GML_LowerCornerNode << " outside " << NodeType::GML_EnvelopeNode << " at " << getDocumentLocation()); } return true; } else if (node == NodeType::GML_UpperCornerNode) { if (m_bounds != nullptr) { m_bounds->setUpperBound(parseValue(characters, m_logger, getDocumentLocation())); } else { CITYGML_LOG_WARN(m_logger, "Definition of " << NodeType::GML_UpperCornerNode << " outside " << NodeType::GML_EnvelopeNode << " at " << getDocumentLocation()); } return true; } else if (node == NodeType::GML_EnvelopeNode) { getFeatureObject()->setEnvelope(m_bounds); return true; } else if (node == NodeType::GML_BoundedByNode) { return true; } return GMLObjectElementParser::parseChildElementEndTag(node, characters); } Object* GMLFeatureCollectionElementParser::getObject() { return getFeatureObject(); } } libcitygml-2.0.8/sources/src/parser/gmlobjectparser.cpp000066400000000000000000000031341321622335500233200ustar00rootroot00000000000000#include "parser/gmlobjectparser.h" #include namespace citygml { GMLObjectElementParser::GMLObjectElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger) : CityGMLElementParser(documentParser, factory, logger) { } bool GMLObjectElementParser::parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { if (getObject() == nullptr) { throw std::runtime_error("Invalid call to GMLObjectElementParser::parseChildElementStartTag"); } if ( node == NodeType::GML_DescriptionNode || node == NodeType::GML_IdentifierNode || node == NodeType::GML_NameNode || node == NodeType::GML_DescriptionReferenceNode || node == NodeType::GML_MetaDataPropertyNode) { return true; } return false; } bool GMLObjectElementParser::parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) { if (getObject() == nullptr) { throw std::runtime_error("Invalid call to GMLObjectElementParser::parseChildElementEndTag"); } if ( node == NodeType::GML_DescriptionNode || node == NodeType::GML_IdentifierNode || node == NodeType::GML_NameNode || node == NodeType::GML_DescriptionReferenceNode || node == NodeType::GML_MetaDataPropertyNode) { getObject()->setAttribute(node.name(), characters); return true; } return false; } } libcitygml-2.0.8/sources/src/parser/implicitgeometryelementparser.cpp000066400000000000000000000157771321622335500263320ustar00rootroot00000000000000#include "parser/implicitgeometryelementparser.h" #include #include "parser/nodetypes.h" #include "parser/attributes.h" #include "parser/documentlocation.h" #include "parser/geometryelementparser.h" #include "parser/parserutils.hpp" #include "parser/skipelementparser.h" #include "parser/linestringelementparser.h" #include "parser/polygonelementparser.h" #include "parser/delayedchoiceelementparser.h" #include #include #include #include namespace citygml { ImplicitGeometryElementParser::ImplicitGeometryElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, int lodLevel, CityObject::CityObjectsType parentType, std::function callback) : GMLObjectElementParser(documentParser, factory, logger) { m_callback = callback; m_lodLevel = lodLevel; m_parentType = parentType; } std::string ImplicitGeometryElementParser::elementParserName() const { return "ImplicitGeometryElementParser"; } bool ImplicitGeometryElementParser::handlesElement(const NodeType::XMLNode& node) const { return node == NodeType::CORE_ImplicitGeometryNode; } bool ImplicitGeometryElementParser::parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { if (!handlesElement(node)) { CITYGML_LOG_ERROR(m_logger, "Expected start tag of ImplicitGeometryObject but got <" << node.name() << "> at " << getDocumentLocation()); throw std::runtime_error("Unexpected start tag found."); } m_model = m_factory.createImplictGeometry(attributes.getCityGMLIDAttribute()); return true; } bool ImplicitGeometryElementParser::parseElementEndTag(const NodeType::XMLNode&, const std::string&) { m_callback(m_model); return true; } bool ImplicitGeometryElementParser::parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { if (m_model == nullptr) { throw std::runtime_error("ImplicitGeometryElementParser::parseChildElementStartTag called before ImplicitGeometryElementParser::parseElementStartTag"); } if ( node == NodeType::CORE_TransformationMatrixNode || node == NodeType::CORE_ReferencePointNode || node == NodeType::GML_ReferencePointNode || node == NodeType::CORE_MimeTypeNode) { return true; } else if (node == NodeType::GML_PointNode) { m_model->setSRSName(attributes.getAttribute("srsName")); return true; } else if (node == NodeType::GML_PosNode) { std::string srsDimension = attributes.getAttribute("srsDimension","3"); if (srsDimension != "3") { CITYGML_LOG_WARN(m_logger, NodeType::GML_PosNode << " element at " << getDocumentLocation() << " in ImplicitGeometry node has an unsupported 'srsDimension' attribute value of " << srsDimension << " (Only 3 is supported). Trying to parse it anyway."); } return true; } else if (node == NodeType::CORE_RelativeGMLGeometryNode) { if (attributes.hasXLinkAttribute()) { std::string sharedGeomID = attributes.getXLinkValue(); m_factory.requestSharedGeometryWithID(m_model, sharedGeomID); } else { std::string id = attributes.getCityGMLIDAttribute(); setParserForNextElement(new DelayedChoiceElementParser(m_documentParser, m_logger, { new PolygonElementParser(m_documentParser, m_factory, m_logger, [id, this](std::shared_ptr p) { Geometry* geom = m_factory.createGeometry(id, m_parentType, m_lodLevel); geom->addPolygon(p); m_model->addGeometry(m_factory.shareGeometry(geom)); }), new LineStringElementParser(m_documentParser, m_factory, m_logger, [id, this](std::shared_ptr l) { Geometry* geom = m_factory.createGeometry(id, m_parentType, m_lodLevel); geom->addLineString(l); m_model->addGeometry(m_factory.shareGeometry(geom)); }), new GeometryElementParser(m_documentParser, m_factory, m_logger, m_lodLevel, m_parentType, [this](Geometry* geom) { m_model->addGeometry(m_factory.shareGeometry(geom)); }) })); } return true; } else if (node == NodeType::CORE_LibraryObjectNode) { CITYGML_LOG_INFO(m_logger, "Skipping ImplicitGeometry child element <" << node << "> at " << getDocumentLocation() << " (Currently not supported!)"); setParserForNextElement(new SkipElementParser(m_documentParser, m_logger)); return true; } return GMLObjectElementParser::parseChildElementStartTag(node, attributes); } bool ImplicitGeometryElementParser::parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) { if (m_model == nullptr) { throw std::runtime_error("ImplicitGeometryElementParser::parseChildElementEndTag called before ImplicitGeometryElementParser::parseElementStartTag"); } if (node == NodeType::CORE_TransformationMatrixNode) { m_model->setTransformMatrix(parseMatrix(characters, m_logger, getDocumentLocation())); return true; } else if (node == NodeType::GML_PosNode) { m_model->setReferencePoint(parseValue(characters, m_logger, getDocumentLocation())); return true; } else if ( node == NodeType::CORE_RelativeGMLGeometryNode || node == NodeType::GML_PointNode || node == NodeType::CORE_ReferencePointNode || node == NodeType::GML_ReferencePointNode || node == NodeType::CORE_LibraryObjectNode) { return true; } else if (node == NodeType::CORE_MimeTypeNode) { m_model->setAttribute(node.name(), characters); } return GMLObjectElementParser::parseChildElementEndTag(node, characters); } Object* ImplicitGeometryElementParser::getObject() { return m_model; } } libcitygml-2.0.8/sources/src/parser/linearringelementparser.cpp000066400000000000000000000067611321622335500250670ustar00rootroot00000000000000#include "parser/linearringelementparser.h" #include #include "parser/nodetypes.h" #include "parser/attributes.h" #include "parser/documentlocation.h" #include "parser/parserutils.hpp" #include #include #include #include namespace citygml { LinearRingElementParser::LinearRingElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, bool interior, std::function callback) : GMLObjectElementParser(documentParser, factory, logger) { m_callback = callback; m_interior = interior; } std::string LinearRingElementParser::elementParserName() const { return "LinearRingElementParser"; } bool LinearRingElementParser::handlesElement(const NodeType::XMLNode& node) const { return node == NodeType::GML_LinearRingNode; } bool LinearRingElementParser::parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { if (!handlesElement(node)) { CITYGML_LOG_ERROR(m_logger, "Expected start tag <" << NodeType::GML_LinearRingNode << "> but got <" << node << "> at " << getDocumentLocation()); throw std::runtime_error("Unexpected start tag found."); } m_model = new LinearRing(attributes.getCityGMLIDAttribute(), !m_interior); return true; } bool LinearRingElementParser::parseElementEndTag(const NodeType::XMLNode&, const std::string&) { if (m_model->getVertices().size() < 4) { CITYGML_LOG_WARN(m_logger, "LinearRing with end tag at " << getDocumentLocation() << " contains less than 4 vertices."); } m_callback(m_model); return true; } bool LinearRingElementParser::parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { if (m_model == nullptr) { throw std::runtime_error("LinearRingElementParser::parseChildElementStartTag called before LinearRingElementParser::parseElementStartTag"); } if (node == NodeType::GML_PosListNode || node == NodeType::GML_PosNode) { std::string dimensions = attributes.getAttribute("srsDimension", "3"); if (dimensions != "3") { CITYGML_LOG_WARN(m_logger, "Attribute srsDimension of element " << node << " contains unsupported value '" << dimensions << "' (only 3 dimensions are support). Trying to parse it anyway..."); } return true; } return GMLObjectElementParser::parseChildElementStartTag(node, attributes); } bool LinearRingElementParser::parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) { if (m_model == nullptr) { throw std::runtime_error("LinearRingElementParser::parseChildElementEndTag called before LinearRingElementParser::parseElementStartTag"); } if (node == NodeType::GML_PosListNode) { m_model->setVertices(parseVecList(characters, m_logger, getDocumentLocation())); return true; } else if (node == NodeType::GML_PosNode) { m_model->addVertex(parseValue(characters, m_logger, getDocumentLocation())); return true; } return GMLObjectElementParser::parseChildElementEndTag(node, characters); } Object* LinearRingElementParser::getObject() { return m_model; } } libcitygml-2.0.8/sources/src/parser/linestringelementparser.cpp000066400000000000000000000077141321622335500251120ustar00rootroot00000000000000#include "parser/linestringelementparser.h" #include #include "parser/nodetypes.h" #include "parser/attributes.h" #include "parser/documentlocation.h" #include "parser/parserutils.hpp" #include #include #include #include #include namespace citygml { LineStringElementParser::LineStringElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function)> callback) : GMLObjectElementParser(documentParser, factory, logger) { m_callback = callback; } std::string LineStringElementParser::elementParserName() const { return "LineStringElementParser"; } bool LineStringElementParser::handlesElement(const NodeType::XMLNode& node) const { return node == NodeType::GML_LineStringNode || node == NodeType::GML_PointNode; } bool LineStringElementParser::parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { if (!handlesElement(node)) { CITYGML_LOG_ERROR(m_logger, "Expected start tag <" << NodeType::GML_LineStringNode << "> or <" << NodeType::GML_PointNode << "> but got <" << node.name() << "> at " << getDocumentLocation()); throw std::runtime_error("Unexpected start tag found."); } m_model = m_factory.createLineString(attributes.getCityGMLIDAttribute()); parseDimension(attributes); return true; } bool LineStringElementParser::parseElementEndTag(const NodeType::XMLNode&, const std::string&) { m_callback(m_model); return true; } bool LineStringElementParser::parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { if (m_model == nullptr) { throw std::runtime_error("LineStringElementParser::parseChildElementStartTag called before LineStringElementParser::parseElementStartTag"); } if (node == NodeType::GML_PosListNode || node == NodeType::GML_PosNode) { parseDimension(attributes); return true; } return GMLObjectElementParser::parseChildElementStartTag(node, attributes); } bool LineStringElementParser::parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) { if (m_model == nullptr) { throw std::runtime_error("LineStringElementParser::parseChildElementEndTag called before LineStringElementParser::parseElementStartTag"); } if (node == NodeType::GML_PosListNode || node == NodeType::GML_PosNode) { if (m_model->getDimensions() < 0) { CITYGML_LOG_ERROR(m_logger, "No srsDimension given for LineString before or as attribute of <" << NodeType::GML_PosListNode << "> child element at " << getDocumentLocation()); } else if (m_model->getDimensions() == 2) { m_model->setVertices2D(parseVecList(characters, m_logger, getDocumentLocation())); } else if (m_model->getDimensions() == 3) { m_model->setVertices3D(parseVecList(characters, m_logger, getDocumentLocation())); } else { CITYGML_LOG_WARN(m_logger, "Unsupported dimension of LineString positions at " << getDocumentLocation() << ". Only 2 and 3 dimensions are supported."); } return true; } return GMLObjectElementParser::parseChildElementEndTag(node, characters); } Object* LineStringElementParser::getObject() { return m_model.get(); } void LineStringElementParser::parseDimension(Attributes& attributes) { std::string dim_str = attributes.getAttribute("srsDimension", ""); if (dim_str.empty()) { return; } int dim = std::stoi(dim_str); m_model->setDimensions(dim); } } libcitygml-2.0.8/sources/src/parser/materialelementparser.cpp000066400000000000000000000113241321622335500245220ustar00rootroot00000000000000#include "parser/materialelementparser.h" #include #include "parser/nodetypes.h" #include "parser/attributes.h" #include "parser/documentlocation.h" #include "parser/parserutils.hpp" #include "parser/skipelementparser.h" #include #include #include #include namespace citygml { MaterialElementParser::MaterialElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function)> callback) : GMLObjectElementParser(documentParser, factory, logger) { m_model = nullptr; m_callback = callback; } std::string MaterialElementParser::elementParserName() const { return "MaterialElementParser"; } bool MaterialElementParser::handlesElement(const NodeType::XMLNode& node) const { return node == NodeType::APP_MaterialNode || node == NodeType::APP_X3DMaterialNode; } bool MaterialElementParser::parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { if (!handlesElement(node)) { CITYGML_LOG_ERROR(m_logger, "Expected start tag <" << NodeType::APP_MaterialNode.name() << "> got " << node << " at " << getDocumentLocation()); throw std::runtime_error("Unexpected start tag found."); } m_model = std::shared_ptr(m_factory.createMaterial(attributes.getCityGMLIDAttribute())); return true; } bool MaterialElementParser::parseElementEndTag(const NodeType::XMLNode&, const std::string&) { m_callback(m_model); return true; } bool MaterialElementParser::parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { if (m_model == nullptr) { throw std::runtime_error("MaterialElementParser::parseChildElementStartTag called before MaterialElementParser::parseElementStartTag"); } if (node == NodeType::APP_DiffuseColorNode || node == NodeType::APP_EmissiveColorNode || node == NodeType::APP_SpecularColorNode || node == NodeType::APP_ShininessNode || node == NodeType::APP_TransparencyNode || node == NodeType::APP_AmbientIntensityNode || node == NodeType::APP_IsFrontNode || node == NodeType::APP_isSmoothNode) { return true; } else if (node == NodeType::APP_TargetNode) { m_lastTargetDefinitionID = attributes.getCityGMLIDAttribute(); return true; } return GMLObjectElementParser::parseChildElementStartTag(node, attributes); } bool MaterialElementParser::parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) { if (m_model == nullptr) { throw std::runtime_error("MaterialElementParser::parseChildElementEndTag called before MaterialElementParser::parseElementStartTag"); } if (node == NodeType::APP_DiffuseColorNode) { m_model->setDiffuse(parseValue(characters, m_logger, getDocumentLocation())); } else if (node == NodeType::APP_EmissiveColorNode) { m_model->setEmissive(parseValue(characters, m_logger, getDocumentLocation())); } else if (node == NodeType::APP_SpecularColorNode) { m_model->setSpecular(parseValue(characters, m_logger, getDocumentLocation())); } else if (node == NodeType::APP_ShininessNode) { m_model->setShininess(parseValue(characters, m_logger, getDocumentLocation())); } else if (node == NodeType::APP_TransparencyNode) { m_model->setTransparency(parseValue(characters, m_logger, getDocumentLocation())); } else if (node == NodeType::APP_AmbientIntensityNode) { m_model->setAmbientIntensity(parseValue(characters, m_logger, getDocumentLocation())); } else if (node == NodeType::APP_IsFrontNode) { m_model->setIsFront(parseValue(characters, m_logger, getDocumentLocation())); } else if (node == NodeType::APP_isSmoothNode) { m_model->setIsSmooth(parseValue(characters, m_logger, getDocumentLocation())); } else if (node == NodeType::APP_TargetNode) { m_factory.createMaterialTargetDefinition(parseReference(characters, m_logger, getDocumentLocation()), m_model, m_lastTargetDefinitionID); m_lastTargetDefinitionID = ""; } else { return GMLObjectElementParser::parseChildElementEndTag(node, characters); } return true; } Object* MaterialElementParser::getObject() { return m_model.get(); } } libcitygml-2.0.8/sources/src/parser/nodetypes.cpp000066400000000000000000000737671321622335500221720ustar00rootroot00000000000000#include "parser/nodetypes.h" #include namespace citygml { // declare static class members std::mutex NodeType::initializedMutex; bool NodeType::nodesInitialized = false; int NodeType::typeCount = -1; std::unordered_map NodeType::nodeNameTypeMap; std::unordered_map NodeType::nodeNameWithPrefixTypeMap; NodeType::XMLNode::XMLNode() { // } NodeType::XMLNode::XMLNode(std::string prefix, std::string name ) : m_name(toLower(name)), m_prefix(toLower(prefix)) { m_typeID = NodeType::typeCount++; } const std::string NodeType::XMLNode::name() const { return m_prefix + ":" + m_name; } const std::string& NodeType::XMLNode::prefix() const { return m_prefix; } const std::string& NodeType::XMLNode::baseName() const { return m_name; } int NodeType::XMLNode::typeID() const { return m_typeID; } bool NodeType::XMLNode::operator==(const NodeType::XMLNode& other) const { return typeID() == other.typeID(); } bool NodeType::XMLNode::operator!=(const NodeType::XMLNode& other) const { return !(*this == other); } bool NodeType::XMLNode::valid() const { return !m_name.empty(); } std::ostream& operator<<(std::ostream& os, const NodeType::XMLNode& o) { if (!o.valid()) { os << "InvalidNode"; } else { os << o.name(); } return os; } const NodeType::XMLNode NodeType::InvalidNode = XMLNode("", ""); #define INITIALIZE_NODE( prefix, elementname ) \ NodeType::prefix ## _ ## elementname ## Node = XMLNode( #prefix , #elementname ); \ NodeType::nodeNameTypeMap[toLower(#elementname)] = &NodeType::prefix ## _ ## elementname ## Node; \ NodeType::nodeNameWithPrefixTypeMap[toLower(#prefix ":" #elementname)] = &NodeType::prefix ## _ ## elementname ## Node; void NodeType::initializeNodeTypes() { // double-checked locking to prevent synchronisation when the node types are already intialized if(!nodesInitialized) { std::lock_guard lock(NodeType::initializedMutex); if (!nodesInitialized) { // CORE INITIALIZE_NODE( CORE, CityModel ) INITIALIZE_NODE( CORE, CityObjectMember ) INITIALIZE_NODE( CORE, CreationDate ) INITIALIZE_NODE( CORE, TerminationDate ) INITIALIZE_NODE( CORE, GeneralizesTo) INITIALIZE_NODE( CORE, ExternalReference) INITIALIZE_NODE( CORE, InformationSystem) INITIALIZE_NODE( CORE, ExternalObject) INITIALIZE_NODE( CORE, Uri) INITIALIZE_NODE( CORE, Name) INITIALIZE_NODE( CORE, Address ) INITIALIZE_NODE( CORE, XalAddress ) INITIALIZE_NODE( CORE, ImplicitGeometry ) INITIALIZE_NODE( CORE, RelativeGMLGeometry ) INITIALIZE_NODE( CORE, TransformationMatrix ) INITIALIZE_NODE( CORE, ReferencePoint) INITIALIZE_NODE( CORE, MimeType) INITIALIZE_NODE( CORE, LibraryObject) // GRP INITIALIZE_NODE( GRP, CityObjectGroup ) INITIALIZE_NODE( GRP, GroupMember ) INITIALIZE_NODE( GRP, Class ) INITIALIZE_NODE( GRP, Function ) INITIALIZE_NODE( GRP, Usage ) INITIALIZE_NODE( GRP, Parent ) INITIALIZE_NODE( GRP, Geometry ) // GEN INITIALIZE_NODE( GEN, Class ) INITIALIZE_NODE( GEN, Function ) INITIALIZE_NODE( GEN, Usage ) INITIALIZE_NODE( GEN, GenericCityObject ) INITIALIZE_NODE( GEN, StringAttribute ) INITIALIZE_NODE( GEN, DoubleAttribute ) INITIALIZE_NODE( GEN, IntAttribute ) INITIALIZE_NODE( GEN, DateAttribute ) INITIALIZE_NODE( GEN, UriAttribute ) INITIALIZE_NODE( GEN, Value ) INITIALIZE_NODE( GEN, Lod0Geometry ) INITIALIZE_NODE( GEN, Lod1Geometry ) INITIALIZE_NODE( GEN, Lod2Geometry ) INITIALIZE_NODE( GEN, Lod3Geometry ) INITIALIZE_NODE( GEN, Lod4Geometry ) INITIALIZE_NODE( GEN, Lod0TerrainIntersection ) INITIALIZE_NODE( GEN, Lod1TerrainIntersection ) INITIALIZE_NODE( GEN, Lod2TerrainIntersection ) INITIALIZE_NODE( GEN, Lod3TerrainIntersection ) INITIALIZE_NODE( GEN, Lod4TerrainIntersection ) INITIALIZE_NODE( GEN, Lod0ImplicitRepresentation ) INITIALIZE_NODE( GEN, Lod1ImplicitRepresentation ) INITIALIZE_NODE( GEN, Lod2ImplicitRepresentation ) INITIALIZE_NODE( GEN, Lod3ImplicitRepresentation ) INITIALIZE_NODE( GEN, Lod4ImplicitRepresentation ) // TEX // INITIALIZE_NODE( GML, TexturedSurface ) // Deprecated // GML INITIALIZE_NODE( GML, Description ) INITIALIZE_NODE( GML, Identifier ) INITIALIZE_NODE( GML, Name ) INITIALIZE_NODE( GML, DescriptionReference ) INITIALIZE_NODE( GML, MetaDataProperty ) INITIALIZE_NODE( GML, Coordinates ) INITIALIZE_NODE( GML, Pos ) INITIALIZE_NODE( GML, BoundedBy ) INITIALIZE_NODE( GML, Envelope ) INITIALIZE_NODE( GML, LowerCorner ) INITIALIZE_NODE( GML, UpperCorner ) INITIALIZE_NODE( GML, Solid ) INITIALIZE_NODE( GML, SurfaceMember ) INITIALIZE_NODE( GML, BaseSurface ) INITIALIZE_NODE( GML, Patches ) INITIALIZE_NODE( GML, TrianglePatches ) INITIALIZE_NODE( GML, SolidMember ) INITIALIZE_NODE( GML, TriangulatedSurface ) INITIALIZE_NODE( GML, Triangle ) INITIALIZE_NODE( GML, Polygon ) INITIALIZE_NODE( GML, Rectangle ) INITIALIZE_NODE( GML, PosList ) INITIALIZE_NODE( GML, OrientableSurface ) INITIALIZE_NODE( GML, LinearRing ) INITIALIZE_NODE( GML, Shell ) INITIALIZE_NODE( GML, PolyhedralSurface ) INITIALIZE_NODE( GML, Surface ) INITIALIZE_NODE( GML, PolygonPatch) INITIALIZE_NODE( GML, LineString) INITIALIZE_NODE( BLDG, Lod1Solid ) INITIALIZE_NODE( BLDG, Lod2Solid ) INITIALIZE_NODE( BLDG, Lod3Solid ) INITIALIZE_NODE( BLDG, Lod4Solid ) INITIALIZE_NODE( BLDG, Lod2Geometry ) INITIALIZE_NODE( BLDG, Lod3Geometry ) INITIALIZE_NODE( BLDG, Lod4Geometry ) INITIALIZE_NODE( BLDG, Lod1MultiCurve ) INITIALIZE_NODE( BLDG, Lod2MultiCurve ) INITIALIZE_NODE( BLDG, Lod3MultiCurve ) INITIALIZE_NODE( BLDG, Lod4MultiCurve ) INITIALIZE_NODE( BLDG, Lod1MultiSurface ) INITIALIZE_NODE( BLDG, Lod2MultiSurface ) INITIALIZE_NODE( BLDG, Lod3MultiSurface ) INITIALIZE_NODE( BLDG, Lod4MultiSurface ) INITIALIZE_NODE( BLDG, Lod1TerrainIntersection ) INITIALIZE_NODE( BLDG, Lod2TerrainIntersection ) INITIALIZE_NODE( BLDG, Lod3TerrainIntersection ) INITIALIZE_NODE( BLDG, Lod4TerrainIntersection ) INITIALIZE_NODE( GML, MultiPoint ) INITIALIZE_NODE( GML, MultiCurve ) INITIALIZE_NODE( GML, MultiSurface ) INITIALIZE_NODE( GML, MultiSolid ) INITIALIZE_NODE( GML, CompositeCurve ) INITIALIZE_NODE( GML, CompositeSurface ) INITIALIZE_NODE( GML, CompositeSolid ) INITIALIZE_NODE( GML, ReferencePoint ) INITIALIZE_NODE( GML, Point ) INITIALIZE_NODE( GML, Interior ) INITIALIZE_NODE( GML, Exterior ) // BLDG INITIALIZE_NODE( BLDG, Building ) INITIALIZE_NODE( BLDG, BuildingPart ) INITIALIZE_NODE( BLDG, Room ) INITIALIZE_NODE( BLDG, Door ) INITIALIZE_NODE( BLDG, Window ) INITIALIZE_NODE( BLDG, BuildingInstallation ) INITIALIZE_NODE( BLDG, MeasuredHeight ) INITIALIZE_NODE( BLDG, Class ) INITIALIZE_NODE( BLDG, Type ) INITIALIZE_NODE( BLDG, Function ) INITIALIZE_NODE( BLDG, Usage ) INITIALIZE_NODE( BLDG, YearOfConstruction ) INITIALIZE_NODE( BLDG, YearOfDemolition ) INITIALIZE_NODE( BLDG, StoreysAboveGround ) INITIALIZE_NODE( BLDG, StoreysBelowGround ) INITIALIZE_NODE( BLDG, StoreyHeightsAboveGround ) INITIALIZE_NODE( BLDG, StoreyHeightsBelowGround ) INITIALIZE_NODE( BLDG, BoundedBy ) INITIALIZE_NODE( BLDG, OuterBuildingInstallation) INITIALIZE_NODE( BLDG, InteriorBuildingInstallation) INITIALIZE_NODE( BLDG, InteriorRoom) INITIALIZE_NODE( BLDG, InteriorFurniture) INITIALIZE_NODE( BLDG, RoomInstallation) INITIALIZE_NODE( BLDG, Opening) INITIALIZE_NODE( BLDG, ConsistsOfBuildingPart ) // CityFurniture INITIALIZE_NODE( FRN, Class ) INITIALIZE_NODE( FRN, Function ) INITIALIZE_NODE( FRN, CityFurniture ) INITIALIZE_NODE( FRN, Lod1Geometry ) INITIALIZE_NODE( FRN, Lod2Geometry ) INITIALIZE_NODE( FRN, Lod3Geometry ) INITIALIZE_NODE( FRN, Lod4Geometry ) INITIALIZE_NODE( FRN, Lod1TerrainIntersection ) INITIALIZE_NODE( FRN, Lod2TerrainIntersection ) INITIALIZE_NODE( FRN, Lod3TerrainIntersection ) INITIALIZE_NODE( FRN, Lod4TerrainIntersection ) INITIALIZE_NODE( FRN, Lod1ImplicitRepresentation ) INITIALIZE_NODE( FRN, Lod2ImplicitRepresentation ) INITIALIZE_NODE( FRN, Lod3ImplicitRepresentation ) INITIALIZE_NODE( FRN, Lod4ImplicitRepresentation ) // BoundarySurfaceType INITIALIZE_NODE( BLDG, WallSurface ) INITIALIZE_NODE( BLDG, RoofSurface ) INITIALIZE_NODE( BLDG, GroundSurface ) INITIALIZE_NODE( BLDG, ClosureSurface ) INITIALIZE_NODE( BLDG, FloorSurface ) INITIALIZE_NODE( BLDG, InteriorWallSurface ) INITIALIZE_NODE( BLDG, CeilingSurface ) INITIALIZE_NODE( BLDG, OuterCeilingSurface ) INITIALIZE_NODE( BLDG, OuterFloorSurface ) INITIALIZE_NODE( BLDG, BuildingFurniture ) INITIALIZE_NODE( BLDG, RoofType) INITIALIZE_NODE( BLDG, CityFurniture ) INITIALIZE_NODE( BLDG, Address) // ADDRESS INITIALIZE_NODE( XAL, AddressDetails ) INITIALIZE_NODE( XAL, Country ) INITIALIZE_NODE( XAL, CountryName ) INITIALIZE_NODE( XAL, CountryNameCode ) INITIALIZE_NODE( XAL, AdministrativeArea ) INITIALIZE_NODE( XAL, AdministrativeAreaName ) INITIALIZE_NODE( XAL, Locality ) INITIALIZE_NODE( XAL, LocalityName ) INITIALIZE_NODE( XAL, PostalCode ) INITIALIZE_NODE( XAL, PostalCodeNumber ) INITIALIZE_NODE( XAL, Thoroughfare ) INITIALIZE_NODE( XAL, ThoroughfareName ) INITIALIZE_NODE( XAL, ThoroughfareNumber ) // WTR INITIALIZE_NODE( WTR, WaterBody ) INITIALIZE_NODE( WTR, WaterSurface ) INITIALIZE_NODE( WTR, WaterGroundSurface ) INITIALIZE_NODE( WTR, WaterClosureSurface ) INITIALIZE_NODE( WTR, Class ) INITIALIZE_NODE( WTR, Function ) INITIALIZE_NODE( WTR, Usage ) INITIALIZE_NODE( WTR, WaterLevel ) INITIALIZE_NODE( WTR, Lod0MultiCurve ) INITIALIZE_NODE( WTR, Lod0MultiSurface ) INITIALIZE_NODE( WTR, Lod1MultiCurve ) INITIALIZE_NODE( WTR, Lod1MultiSurface ) INITIALIZE_NODE( WTR, Lod1Solid ) INITIALIZE_NODE( WTR, Lod2Solid ) INITIALIZE_NODE( WTR, Lod3Solid ) INITIALIZE_NODE( WTR, Lod4Solid ) INITIALIZE_NODE( WTR, Lod2Surface ) INITIALIZE_NODE( WTR, Lod3Surface ) INITIALIZE_NODE( WTR, Lod4Surface ) INITIALIZE_NODE( WTR, BoundedBy ) // VEG INITIALIZE_NODE( VEG, PlantCover ) INITIALIZE_NODE( VEG, SolitaryVegetationObject ) INITIALIZE_NODE( VEG, Lod1ImplicitRepresentation ) INITIALIZE_NODE( VEG, Lod2ImplicitRepresentation ) INITIALIZE_NODE( VEG, Lod3ImplicitRepresentation ) INITIALIZE_NODE( VEG, Lod4ImplicitRepresentation ) INITIALIZE_NODE( VEG, Class ) INITIALIZE_NODE( VEG, Function ) INITIALIZE_NODE( VEG, AverageHeight ) INITIALIZE_NODE( VEG, Species ) INITIALIZE_NODE( VEG, Height ) INITIALIZE_NODE( VEG, TrunkDiameter ) INITIALIZE_NODE( VEG, CrownDiameter ) INITIALIZE_NODE( VEG, Lod0Geometry ) INITIALIZE_NODE( VEG, Lod1Geometry ) INITIALIZE_NODE( VEG, Lod2Geometry ) INITIALIZE_NODE( VEG, Lod3Geometry ) INITIALIZE_NODE( VEG, Lod4Geometry ) // TRANS INITIALIZE_NODE( TRANS, TransportationComplex ) INITIALIZE_NODE( TRANS, TrafficArea ) INITIALIZE_NODE( TRANS, AuxiliaryTrafficArea ) INITIALIZE_NODE( TRANS, Track ) INITIALIZE_NODE( TRANS, Road ) INITIALIZE_NODE( TRANS, Railway ) INITIALIZE_NODE( TRANS, Square ) INITIALIZE_NODE( TRANS, Usage ) INITIALIZE_NODE( TRANS, Function ) INITIALIZE_NODE( TRANS, SurfaceMaterial ) INITIALIZE_NODE( TRANS, Lod0Network ) INITIALIZE_NODE( TRANS, Lod1MultiSurface ) INITIALIZE_NODE( TRANS, Lod2MultiSurface ) INITIALIZE_NODE( TRANS, Lod3MultiSurface ) INITIALIZE_NODE( TRANS, Lod4MultiSurface ) // LUSE INITIALIZE_NODE( LUSE, LandUse ) INITIALIZE_NODE( LUSE, Class ) INITIALIZE_NODE( LUSE, Usage ) INITIALIZE_NODE( LUSE, Function ) INITIALIZE_NODE( LUSE, Lod1MultiSurface ) INITIALIZE_NODE( LUSE, Lod2MultiSurface ) INITIALIZE_NODE( LUSE, Lod3MultiSurface ) INITIALIZE_NODE( LUSE, Lod4MultiSurface ) // DEM (Relief) INITIALIZE_NODE( DEM, ReliefFeature ) INITIALIZE_NODE( DEM, TINRelief ) INITIALIZE_NODE( DEM, RasterRelief ) INITIALIZE_NODE( DEM, MassPointRelief ) INITIALIZE_NODE( DEM, BreaklineRelief ) INITIALIZE_NODE( DEM, Lod ) INITIALIZE_NODE( DEM, Extent ) INITIALIZE_NODE( DEM, ReliefComponent ) INITIALIZE_NODE( DEM, Tin ) INITIALIZE_NODE( DEM, Grid ) INITIALIZE_NODE( DEM, ReliefPoints ) INITIALIZE_NODE( DEM, RidgeOrValleyLines ) INITIALIZE_NODE( DEM, Breaklines ) INITIALIZE_NODE( DEM, Elevation ) // SUB INITIALIZE_NODE( SUB, Tunnel ) INITIALIZE_NODE( SUB, RelativeToTerrain ) // BRID INITIALIZE_NODE( BRID, Bridge ) INITIALIZE_NODE( BRID, BridgeConstructionElement ) INITIALIZE_NODE( BRID, BridgeInstallation ) INITIALIZE_NODE( BRID, BridgePart ) // APP INITIALIZE_NODE( APP, Appearance ) INITIALIZE_NODE( APP, SimpleTexture ) INITIALIZE_NODE( APP, ParameterizedTexture ) INITIALIZE_NODE( APP, GeoreferencedTexture ) INITIALIZE_NODE( APP, ImageURI ) INITIALIZE_NODE( APP, TextureMap ) INITIALIZE_NODE( APP, Target ) INITIALIZE_NODE( APP, TexCoordList ) INITIALIZE_NODE( APP, TextureCoordinates ) INITIALIZE_NODE( APP, TextureType ) INITIALIZE_NODE( APP, Repeat ) INITIALIZE_NODE( APP, WrapMode ) INITIALIZE_NODE( APP, BorderColor ) INITIALIZE_NODE( APP, PreferWorldFile ) INITIALIZE_NODE( APP, ReferencePoint) INITIALIZE_NODE( APP, Orientation) INITIALIZE_NODE( APP, isSmooth) INITIALIZE_NODE( APP, X3DMaterial ) INITIALIZE_NODE( APP, Material ) INITIALIZE_NODE( APP, AppearanceMember ) INITIALIZE_NODE( APP, SurfaceDataMember ) INITIALIZE_NODE( APP, Shininess ) INITIALIZE_NODE( APP, Transparency ) INITIALIZE_NODE( APP, SpecularColor ) INITIALIZE_NODE( APP, DiffuseColor ) INITIALIZE_NODE( APP, EmissiveColor ) INITIALIZE_NODE( APP, AmbientIntensity ) INITIALIZE_NODE( APP, IsFront ) INITIALIZE_NODE( APP, Theme ) INITIALIZE_NODE( APP, MimeType ) nodesInitialized = true; } } } const NodeType::XMLNode&NodeType::getXMLNodeFor(const std::string& name) { initializeNodeTypes(); std::string lowerName = toLower(name); { auto it = nodeNameWithPrefixTypeMap.find(lowerName); if (it != nodeNameWithPrefixTypeMap.end()) { return *it->second; } } std::string nodeName = lowerName; size_t pos = nodeName.find_first_of( ":" ); if ( pos != std::string::npos ) { nodeName = nodeName.substr(pos + 1); } else { // node has no prefix... try with core prefix return getXMLNodeFor("core:" + name); } auto it = nodeNameTypeMap.find(nodeName); if (it == nodeNameTypeMap.end()) { return InvalidNode; } else { return *it->second; } } #define DEFINE_NODE( prefix, elementname ) NodeType::XMLNode NodeType::prefix ## _ ## elementname ## Node; // CORE DEFINE_NODE( CORE, CityModel ) DEFINE_NODE( CORE, CityObjectMember ) DEFINE_NODE( CORE, CreationDate ) DEFINE_NODE( CORE, TerminationDate ) DEFINE_NODE( CORE, GeneralizesTo) DEFINE_NODE( CORE, ExternalReference) DEFINE_NODE( CORE, InformationSystem) DEFINE_NODE( CORE, ExternalObject) DEFINE_NODE( CORE, Uri) DEFINE_NODE( CORE, Name) DEFINE_NODE( CORE, Address ) DEFINE_NODE( CORE, XalAddress ) DEFINE_NODE( CORE, ImplicitGeometry ) DEFINE_NODE( CORE, RelativeGMLGeometry ) DEFINE_NODE( CORE, TransformationMatrix ) DEFINE_NODE( CORE, ReferencePoint) DEFINE_NODE( CORE, MimeType) DEFINE_NODE( CORE, LibraryObject) // GRP DEFINE_NODE( GRP, CityObjectGroup ) DEFINE_NODE( GRP, GroupMember ) DEFINE_NODE( GRP, Class ) DEFINE_NODE( GRP, Function ) DEFINE_NODE( GRP, Usage ) DEFINE_NODE( GRP, Parent ) DEFINE_NODE( GRP, Geometry ) // GEN DEFINE_NODE( GEN, Class ) DEFINE_NODE( GEN, Function ) DEFINE_NODE( GEN, Usage ) DEFINE_NODE( GEN, GenericCityObject ) DEFINE_NODE( GEN, StringAttribute ) DEFINE_NODE( GEN, DoubleAttribute ) DEFINE_NODE( GEN, IntAttribute ) DEFINE_NODE( GEN, DateAttribute ) DEFINE_NODE( GEN, UriAttribute ) DEFINE_NODE( GEN, Value ) DEFINE_NODE( GEN, Lod0Geometry ) DEFINE_NODE( GEN, Lod1Geometry ) DEFINE_NODE( GEN, Lod2Geometry ) DEFINE_NODE( GEN, Lod3Geometry ) DEFINE_NODE( GEN, Lod4Geometry ) DEFINE_NODE( GEN, Lod0TerrainIntersection ) DEFINE_NODE( GEN, Lod1TerrainIntersection ) DEFINE_NODE( GEN, Lod2TerrainIntersection ) DEFINE_NODE( GEN, Lod3TerrainIntersection ) DEFINE_NODE( GEN, Lod4TerrainIntersection ) DEFINE_NODE( GEN, Lod0ImplicitRepresentation ) DEFINE_NODE( GEN, Lod1ImplicitRepresentation ) DEFINE_NODE( GEN, Lod2ImplicitRepresentation ) DEFINE_NODE( GEN, Lod3ImplicitRepresentation ) DEFINE_NODE( GEN, Lod4ImplicitRepresentation ) // TEX // DEFINE_NODE( GML, TexturedSurface ) // Deprecated // GML DEFINE_NODE( GML, Description ) DEFINE_NODE( GML, Identifier ) DEFINE_NODE( GML, Name ) DEFINE_NODE( GML, DescriptionReference ) DEFINE_NODE( GML, MetaDataProperty ) DEFINE_NODE( GML, Coordinates ) DEFINE_NODE( GML, Pos ) DEFINE_NODE( GML, BoundedBy ) DEFINE_NODE( GML, Envelope ) DEFINE_NODE( GML, LowerCorner ) DEFINE_NODE( GML, UpperCorner ) DEFINE_NODE( GML, Solid ) DEFINE_NODE( GML, SurfaceMember ) DEFINE_NODE( GML, BaseSurface ) DEFINE_NODE( GML, Patches ) DEFINE_NODE( GML, TrianglePatches ) DEFINE_NODE( GML, SolidMember ) DEFINE_NODE( GML, TriangulatedSurface ) DEFINE_NODE( GML, Triangle ) DEFINE_NODE( GML, Polygon ) DEFINE_NODE( GML, Rectangle ) DEFINE_NODE( GML, PosList ) DEFINE_NODE( GML, OrientableSurface ) DEFINE_NODE( GML, LinearRing ) DEFINE_NODE( BLDG, Lod1Solid ) DEFINE_NODE( BLDG, Lod2Solid ) DEFINE_NODE( BLDG, Lod3Solid ) DEFINE_NODE( BLDG, Lod4Solid ) DEFINE_NODE( BLDG, Lod2Geometry ) DEFINE_NODE( BLDG, Lod3Geometry ) DEFINE_NODE( BLDG, Lod4Geometry ) DEFINE_NODE( BLDG, Lod1MultiCurve ) DEFINE_NODE( BLDG, Lod2MultiCurve ) DEFINE_NODE( BLDG, Lod3MultiCurve ) DEFINE_NODE( BLDG, Lod4MultiCurve ) DEFINE_NODE( BLDG, Lod1MultiSurface ) DEFINE_NODE( BLDG, Lod2MultiSurface ) DEFINE_NODE( BLDG, Lod3MultiSurface ) DEFINE_NODE( BLDG, Lod4MultiSurface ) DEFINE_NODE( BLDG, Lod1TerrainIntersection ) DEFINE_NODE( BLDG, Lod2TerrainIntersection ) DEFINE_NODE( BLDG, Lod3TerrainIntersection ) DEFINE_NODE( BLDG, Lod4TerrainIntersection ) DEFINE_NODE( GML, MultiPoint ) DEFINE_NODE( GML, MultiCurve ) DEFINE_NODE( GML, MultiSurface ) DEFINE_NODE( GML, MultiSolid ) DEFINE_NODE( GML, CompositeCurve ) DEFINE_NODE( GML, CompositeSurface ) DEFINE_NODE( GML, CompositeSolid ) DEFINE_NODE( GML, ReferencePoint ) DEFINE_NODE( GML, Point ) DEFINE_NODE( GML, Interior ) DEFINE_NODE( GML, Exterior ) DEFINE_NODE( GML, Shell ) DEFINE_NODE( GML, PolyhedralSurface ) DEFINE_NODE( GML, Surface ) DEFINE_NODE( GML, PolygonPatch) DEFINE_NODE( GML, LineString) // BLDG DEFINE_NODE( BLDG, Building ) DEFINE_NODE( BLDG, BuildingPart ) DEFINE_NODE( BLDG, Room ) DEFINE_NODE( BLDG, Door ) DEFINE_NODE( BLDG, Window ) DEFINE_NODE( BLDG, BuildingInstallation ) DEFINE_NODE( BLDG, MeasuredHeight ) DEFINE_NODE( BLDG, Class ) DEFINE_NODE( BLDG, Type ) DEFINE_NODE( BLDG, Function ) DEFINE_NODE( BLDG, Usage ) DEFINE_NODE( BLDG, YearOfConstruction ) DEFINE_NODE( BLDG, YearOfDemolition ) DEFINE_NODE( BLDG, StoreysAboveGround ) DEFINE_NODE( BLDG, StoreysBelowGround ) DEFINE_NODE( BLDG, StoreyHeightsAboveGround ) DEFINE_NODE( BLDG, StoreyHeightsBelowGround ) DEFINE_NODE( BLDG, BoundedBy ) DEFINE_NODE( BLDG, OuterBuildingInstallation) DEFINE_NODE( BLDG, InteriorBuildingInstallation) DEFINE_NODE( BLDG, InteriorRoom) DEFINE_NODE( BLDG, InteriorFurniture) DEFINE_NODE( BLDG, RoomInstallation) DEFINE_NODE( BLDG, Opening) DEFINE_NODE( BLDG, ConsistsOfBuildingPart ) // CityFurniture DEFINE_NODE( FRN, Class ) DEFINE_NODE( FRN, Function ) DEFINE_NODE( FRN, CityFurniture ) DEFINE_NODE( FRN, Lod1Geometry ) DEFINE_NODE( FRN, Lod2Geometry ) DEFINE_NODE( FRN, Lod3Geometry ) DEFINE_NODE( FRN, Lod4Geometry ) DEFINE_NODE( FRN, Lod1TerrainIntersection ) DEFINE_NODE( FRN, Lod2TerrainIntersection ) DEFINE_NODE( FRN, Lod3TerrainIntersection ) DEFINE_NODE( FRN, Lod4TerrainIntersection ) DEFINE_NODE( FRN, Lod1ImplicitRepresentation ) DEFINE_NODE( FRN, Lod2ImplicitRepresentation ) DEFINE_NODE( FRN, Lod3ImplicitRepresentation ) DEFINE_NODE( FRN, Lod4ImplicitRepresentation ) // BoundarySurfaceType DEFINE_NODE( BLDG, WallSurface ) DEFINE_NODE( BLDG, RoofSurface ) DEFINE_NODE( BLDG, GroundSurface ) DEFINE_NODE( BLDG, ClosureSurface ) DEFINE_NODE( BLDG, FloorSurface ) DEFINE_NODE( BLDG, InteriorWallSurface ) DEFINE_NODE( BLDG, CeilingSurface ) DEFINE_NODE( BLDG, OuterCeilingSurface ) DEFINE_NODE( BLDG, OuterFloorSurface ) DEFINE_NODE( BLDG, BuildingFurniture ) DEFINE_NODE( BLDG, RoofType) DEFINE_NODE( BLDG, CityFurniture ) DEFINE_NODE( BLDG, Address) // ADDRESS DEFINE_NODE( XAL, AddressDetails ) DEFINE_NODE( XAL, Country ) DEFINE_NODE( XAL, CountryName ) DEFINE_NODE( XAL, CountryNameCode ) DEFINE_NODE( XAL, AdministrativeArea ) DEFINE_NODE( XAL, AdministrativeAreaName ) DEFINE_NODE( XAL, Locality ) DEFINE_NODE( XAL, LocalityName ) DEFINE_NODE( XAL, PostalCode ) DEFINE_NODE( XAL, PostalCodeNumber ) DEFINE_NODE( XAL, Thoroughfare ) DEFINE_NODE( XAL, ThoroughfareName ) DEFINE_NODE( XAL, ThoroughfareNumber ) // WTR DEFINE_NODE( WTR, WaterBody ) DEFINE_NODE( WTR, WaterSurface ) DEFINE_NODE( WTR, WaterGroundSurface ) DEFINE_NODE( WTR, WaterClosureSurface ) DEFINE_NODE( WTR, Class ) DEFINE_NODE( WTR, Function ) DEFINE_NODE( WTR, Usage ) DEFINE_NODE( WTR, WaterLevel ) DEFINE_NODE( WTR, Lod0MultiCurve ) DEFINE_NODE( WTR, Lod0MultiSurface ) DEFINE_NODE( WTR, Lod1MultiCurve ) DEFINE_NODE( WTR, Lod1MultiSurface ) DEFINE_NODE( WTR, Lod1Solid ) DEFINE_NODE( WTR, Lod2Solid ) DEFINE_NODE( WTR, Lod3Solid ) DEFINE_NODE( WTR, Lod4Solid ) DEFINE_NODE( WTR, Lod2Surface ) DEFINE_NODE( WTR, Lod3Surface ) DEFINE_NODE( WTR, Lod4Surface ) DEFINE_NODE( WTR, BoundedBy ) // VEG DEFINE_NODE( VEG, PlantCover ) DEFINE_NODE( VEG, SolitaryVegetationObject ) DEFINE_NODE( VEG, Lod1ImplicitRepresentation ) DEFINE_NODE( VEG, Lod2ImplicitRepresentation ) DEFINE_NODE( VEG, Lod3ImplicitRepresentation ) DEFINE_NODE( VEG, Lod4ImplicitRepresentation ) DEFINE_NODE( VEG, Class ) DEFINE_NODE( VEG, Function ) DEFINE_NODE( VEG, AverageHeight ) DEFINE_NODE( VEG, Species ) DEFINE_NODE( VEG, Height ) DEFINE_NODE( VEG, TrunkDiameter ) DEFINE_NODE( VEG, CrownDiameter ) DEFINE_NODE( VEG, Lod0Geometry ) DEFINE_NODE( VEG, Lod1Geometry ) DEFINE_NODE( VEG, Lod2Geometry ) DEFINE_NODE( VEG, Lod3Geometry ) DEFINE_NODE( VEG, Lod4Geometry ) // TRANS DEFINE_NODE( TRANS, TransportationComplex ) DEFINE_NODE( TRANS, TrafficArea ) DEFINE_NODE( TRANS, AuxiliaryTrafficArea ) DEFINE_NODE( TRANS, Track ) DEFINE_NODE( TRANS, Road ) DEFINE_NODE( TRANS, Railway ) DEFINE_NODE( TRANS, Square ) DEFINE_NODE( TRANS, Usage ) DEFINE_NODE( TRANS, Function ) DEFINE_NODE( TRANS, SurfaceMaterial ) DEFINE_NODE( TRANS, Lod0Network ) DEFINE_NODE( TRANS, Lod1MultiSurface ) DEFINE_NODE( TRANS, Lod2MultiSurface ) DEFINE_NODE( TRANS, Lod3MultiSurface ) DEFINE_NODE( TRANS, Lod4MultiSurface ) // LUSE DEFINE_NODE( LUSE, LandUse ) DEFINE_NODE( LUSE, Class ) DEFINE_NODE( LUSE, Usage ) DEFINE_NODE( LUSE, Function ) DEFINE_NODE( LUSE, Lod1MultiSurface ) DEFINE_NODE( LUSE, Lod2MultiSurface ) DEFINE_NODE( LUSE, Lod3MultiSurface ) DEFINE_NODE( LUSE, Lod4MultiSurface ) // DEM (Relief) DEFINE_NODE( DEM, ReliefFeature ) DEFINE_NODE( DEM, TINRelief ) DEFINE_NODE( DEM, RasterRelief ) DEFINE_NODE( DEM, MassPointRelief ) DEFINE_NODE( DEM, BreaklineRelief ) DEFINE_NODE( DEM, Lod ) DEFINE_NODE( DEM, Extent ) DEFINE_NODE( DEM, ReliefComponent ) DEFINE_NODE( DEM, Tin ) DEFINE_NODE( DEM, Grid ) DEFINE_NODE( DEM, ReliefPoints ) DEFINE_NODE( DEM, RidgeOrValleyLines ) DEFINE_NODE( DEM, Breaklines ) DEFINE_NODE( DEM, Elevation ) // SUB DEFINE_NODE( SUB, Tunnel ) DEFINE_NODE( SUB, RelativeToTerrain ) // BRID DEFINE_NODE( BRID, Bridge ) DEFINE_NODE( BRID, BridgeConstructionElement ) DEFINE_NODE( BRID, BridgeInstallation ) DEFINE_NODE( BRID, BridgePart ) // APP DEFINE_NODE( APP, Appearance ) DEFINE_NODE( APP, SimpleTexture ) DEFINE_NODE( APP, ParameterizedTexture ) DEFINE_NODE( APP, GeoreferencedTexture ) DEFINE_NODE( APP, ImageURI ) DEFINE_NODE( APP, TextureMap ) DEFINE_NODE( APP, Target ) DEFINE_NODE( APP, TexCoordList ) DEFINE_NODE( APP, TextureCoordinates ) DEFINE_NODE( APP, TextureType ) DEFINE_NODE( APP, Repeat ) DEFINE_NODE( APP, WrapMode ) DEFINE_NODE( APP, BorderColor ) DEFINE_NODE( APP, PreferWorldFile ) DEFINE_NODE( APP, ReferencePoint) DEFINE_NODE( APP, Orientation) DEFINE_NODE( APP, isSmooth) DEFINE_NODE( APP, X3DMaterial ) DEFINE_NODE( APP, Material ) DEFINE_NODE( APP, AppearanceMember ) DEFINE_NODE( APP, SurfaceDataMember ) DEFINE_NODE( APP, Shininess ) DEFINE_NODE( APP, Transparency ) DEFINE_NODE( APP, SpecularColor ) DEFINE_NODE( APP, DiffuseColor ) DEFINE_NODE( APP, EmissiveColor ) DEFINE_NODE( APP, AmbientIntensity ) DEFINE_NODE( APP, IsFront ) DEFINE_NODE( APP, Theme ) DEFINE_NODE( APP, MimeType ) } libcitygml-2.0.8/sources/src/parser/parserxercesc.cpp000066400000000000000000000244541321622335500230160ustar00rootroot00000000000000/* -*-c++-*- libcitygml - Copyright (c) 2010 Joachim Pouderoux, BRGM * * This file is part of libcitygml library * http://code.google.com/p/libcitygml * * libcitygml is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. * * libcitygml is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. */ #include #include #include #include #include #include #include #include "parser/citygmldocumentparser.h" #include "parser/documentlocation.h" #include "parser/attributes.h" #include #include #include #include #include #include #include #include #include #include using namespace citygml; std::string toStdString( const XMLCh* const wstr ) { if (wstr == nullptr) { return ""; } char* tmp = xercesc::XMLString::transcode(wstr); std::string str(tmp); xercesc::XMLString::release(&tmp); return str; } std::shared_ptr toXercesString(const std::string& str) { XMLCh* conv = xercesc::XMLString::transcode(str.c_str()); // Pack xerces string into shared_ptr with custom delete function return std::shared_ptr(conv, [=](XMLCh* str) { xercesc::XMLString::release(&str); }); } class DocumentLocationXercesAdapter : public citygml::DocumentLocation { public: explicit DocumentLocationXercesAdapter(const std::string& fileName) : m_locator(nullptr) , m_fileName(fileName) { } void setLocator(const xercesc::Locator* locator) { m_locator = locator; } // DocumentLocation interface virtual const std::string& getDocumentFileName() const { return m_fileName; } virtual uint64_t getCurrentLine() const { return m_locator != nullptr ? m_locator->getLineNumber() : 0; } virtual uint64_t getCurrentColumn() const { return m_locator != nullptr ? m_locator->getColumnNumber() : 0; } protected: const xercesc::Locator* m_locator; std::string m_fileName; }; class AttributesXercesAdapter : public citygml::Attributes { public: AttributesXercesAdapter(const xercesc::Attributes& attrs, const citygml::DocumentLocation& docLoc, std::shared_ptr logger) : citygml::Attributes(logger), m_attrs(attrs), m_location(docLoc) {} // Attributes interface virtual std::string getAttribute(const std::string& attname, const std::string& defvalue) const { std::shared_ptr name = toXercesString(attname); std::string value = toStdString(m_attrs.getValue(name.get())); return value.empty() ? defvalue : value; } virtual const DocumentLocation& getDocumentLocation() const { return m_location; } protected: const xercesc::Attributes& m_attrs; const citygml::DocumentLocation& m_location; }; // CityGML Xerces-c SAX parsing handler class CityGMLHandlerXerces : public xercesc::DefaultHandler, public citygml::CityGMLDocumentParser { public: CityGMLHandlerXerces( const ParserParams& params, const std::string& fileName, std::shared_ptr logger) : citygml::CityGMLDocumentParser(params, logger), m_documentLocation(DocumentLocationXercesAdapter(fileName)) {} // ContentHandler interface virtual void startElement(const XMLCh* const, const XMLCh* const, const XMLCh* const qname, const xercesc::Attributes& attrs) override { AttributesXercesAdapter attributes(attrs, m_documentLocation, m_logger); CityGMLDocumentParser::startElement(toStdString(qname), attributes); } virtual void endElement(const XMLCh* const, const XMLCh* const, const XMLCh* const qname) override { CityGMLDocumentParser::endElement(toStdString(qname), m_lastcharacters); m_lastcharacters = ""; } virtual void characters(const XMLCh* const chars, const XMLSize_t) override { m_lastcharacters = toStdString(chars); } virtual void startDocument() override { CityGMLDocumentParser::startDocument(); } virtual void endDocument() override { CityGMLDocumentParser::endDocument(); } virtual void setDocumentLocator(const xercesc::Locator* const locator) override { m_documentLocation.setLocator(locator); } // CityGMLDocumentParser interface virtual const citygml::DocumentLocation& getDocumentLocation() const override { return m_documentLocation; } protected: DocumentLocationXercesAdapter m_documentLocation; std::string m_lastcharacters; }; class StdBinInputStream : public xercesc::BinInputStream { public: explicit StdBinInputStream( std::istream& stream ) : BinInputStream(), m_stream( stream ) {} virtual ~StdBinInputStream() {} virtual XMLFilePos curPos() const { return m_stream.tellg(); } virtual XMLSize_t readBytes( XMLByte* const buf, const XMLSize_t maxToRead ) { assert( sizeof(XMLByte) == sizeof(char) ); if ( !m_stream ) return 0; m_stream.read( reinterpret_cast(buf), maxToRead ); return (XMLSize_t)m_stream.gcount(); } virtual const XMLCh* getContentType() const { return nullptr; } private: std::istream& m_stream; }; class StdBinInputSource : public xercesc::InputSource { public: explicit StdBinInputSource( std::istream& stream ) : m_stream( stream ) {} virtual xercesc::BinInputStream* makeStream() const { return new StdBinInputStream( m_stream ); } ~StdBinInputSource() { } private: std::istream& m_stream; }; // Parsing methods namespace citygml { class StdLogger : public CityGMLLogger { public: StdLogger(LOGLEVEL level = LOGLEVEL::LL_ERROR):CityGMLLogger(level){ }; virtual void log(LOGLEVEL level, const std::string& message, const char* file, int line) const { std::ostream& stream = level == LOGLEVEL::LL_ERROR ? std::cerr : std::cout; switch(level) { case LOGLEVEL::LL_DEBUG: stream << "DEBUG"; break; case LOGLEVEL::LL_WARNING: stream << "WARNING"; break; case LOGLEVEL::LL_TRACE: stream << "TRACE"; break; case LOGLEVEL::LL_ERROR: stream << "ERROR"; break; case LOGLEVEL::LL_INFO: stream << "INFO"; break; } if (file) { stream << " [" << file; if (line > -1) { stream << ":" << line; } stream << "]"; } stream << " " << message << std::endl; } }; std::mutex xerces_init_mutex; bool xerces_initialized; bool initXerces(std::shared_ptr logger) { if (xerces_initialized) { return true; } try { xerces_init_mutex.lock(); // Check xerces_initialized again... it could have changed while waiting for the mutex if (!xerces_initialized) { xercesc::XMLPlatformUtils::Initialize(); xerces_initialized = true; } xerces_init_mutex.unlock(); } catch (const xercesc::XMLException& e) { CITYGML_LOG_ERROR(logger, "Could not initialize xercesc XMLPlatformUtils, a XML Exception occurred : " << toStdString(e.getMessage())); return false; } return true; } std::shared_ptr parse(xercesc::InputSource& stream, const ParserParams& params, std::shared_ptr logger, std::string filename = "") { CityGMLHandlerXerces handler( params, filename, logger ); xercesc::SAX2XMLReader* parser = xercesc::XMLReaderFactory::createXMLReader(); parser->setFeature(xercesc::XMLUni::fgSAX2CoreNameSpaces, false); parser->setContentHandler( &handler ); parser->setErrorHandler( &handler ); #ifdef NDEBUG try { #endif parser->parse(stream); #ifdef NDEBUG } catch ( const xercesc::XMLException& e ) { CITYGML_LOG_ERROR(logger, "XML Exception occurred: " << toStdString(e.getMessage())); } catch ( const xercesc::SAXParseException& e ) { CITYGML_LOG_ERROR(logger, "SAXParser Exception occurred: " << toStdString(e.getMessage())); } catch ( const std::exception& e ) { CITYGML_LOG_ERROR(logger, "Unexpected Exception occurred: " << e.what()); } #endif delete parser; return handler.getModel(); } std::shared_ptr load(std::istream& stream, const ParserParams& params, std::shared_ptr logger) { if (!logger) { logger = std::make_shared(); } if (!initXerces(logger)) { return nullptr; } StdBinInputSource streamSource(stream); return parse(streamSource, params, logger); } std::shared_ptr load( const std::string& fname, const ParserParams& params , std::shared_ptr logger) { if (!logger) { logger = std::make_shared(); } if (!initXerces(logger)) { return nullptr; } std::shared_ptr fileName = toXercesString(fname); #ifdef NDEBUG try { #endif xercesc::LocalFileInputSource fileSource(fileName.get()); return parse(fileSource, params, logger, fname); #ifdef NDEBUG } catch (xercesc::XMLException& e) { CITYGML_LOG_ERROR(logger, "Error parsing file " << fname << ": " << e.getMessage()); return nullptr; } #endif } } libcitygml-2.0.8/sources/src/parser/polygonelementparser.cpp000066400000000000000000000073651321622335500244250ustar00rootroot00000000000000#include "parser/polygonelementparser.h" #include #include "parser/nodetypes.h" #include "parser/attributes.h" #include "parser/documentlocation.h" #include "parser/linearringelementparser.h" #include #include #include #include #include namespace citygml { // The nodes that are valid Polygon Objects std::unordered_set typeIDSet; bool typeIDSetInitialized = false; std::mutex polygonElementParser_initializedTypeIDMutex; PolygonElementParser::PolygonElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function)> callback) : GMLObjectElementParser(documentParser, factory, logger) { m_callback = callback; } std::string PolygonElementParser::elementParserName() const { return "PolygonElementParser"; } bool PolygonElementParser::handlesElement(const NodeType::XMLNode& node) const { if (!typeIDSetInitialized) { std::lock_guard lock(polygonElementParser_initializedTypeIDMutex); if(!typeIDSetInitialized) { typeIDSet.insert(NodeType::GML_TriangleNode.typeID()); typeIDSet.insert(NodeType::GML_RectangleNode.typeID()); typeIDSet.insert(NodeType::GML_PolygonNode.typeID()); typeIDSet.insert(NodeType::GML_PolygonPatchNode.typeID()); typeIDSetInitialized = true; } } return typeIDSet.count(node.typeID()) > 0; } bool PolygonElementParser::parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { if (!handlesElement(node)) { CITYGML_LOG_ERROR(m_logger, "Expected start tag of PolygonObject but got <" << node.name() << "> at " << getDocumentLocation()); throw std::runtime_error("Unexpected start tag found."); } m_model = m_factory.createPolygon(attributes.getCityGMLIDAttribute()); return true; } bool PolygonElementParser::parseElementEndTag(const NodeType::XMLNode&, const std::string&) { m_callback(m_model); return true; } bool PolygonElementParser::parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { if (m_model == nullptr) { throw std::runtime_error("PolygonElementParser::parseChildElementStartTag called before PolygonElementParser::parseElementStartTag"); } if (node == NodeType::GML_InteriorNode) { parseRingElement(true); return true; } else if (node == NodeType::GML_ExteriorNode) { parseRingElement(false); return true; } return GMLObjectElementParser::parseChildElementStartTag(node, attributes); } bool PolygonElementParser::parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) { if (m_model == nullptr) { throw std::runtime_error("PolygonElementParser::parseChildElementEndTag called before PolygonElementParser::parseElementStartTag"); } if (node == NodeType::GML_InteriorNode || node == NodeType::GML_ExteriorNode) { return true; } return GMLObjectElementParser::parseChildElementEndTag(node, characters); } Object* PolygonElementParser::getObject() { return m_model.get(); } void PolygonElementParser::parseRingElement(bool interior) { setParserForNextElement(new LinearRingElementParser(m_documentParser, m_factory, m_logger, interior, [this](LinearRing* ring){ m_model->addRing(ring); })); } } libcitygml-2.0.8/sources/src/parser/sequenceparser.cpp000066400000000000000000000042271321622335500231660ustar00rootroot00000000000000#include "parser/sequenceparser.h" #include #include "parser/documentlocation.h" #include "parser/citygmldocumentparser.h" namespace citygml { SequenceParser::SequenceParser(CityGMLDocumentParser& documentParser, std::shared_ptr logger, std::function childParserFactory, const NodeType::XMLNode& parentElement) : ElementParser(documentParser, logger) { m_childParserFactory = childParserFactory; m_containerType = parentElement; m_childParserInstance = nullptr; } bool SequenceParser::startElement(const NodeType::XMLNode& node, Attributes& attributes) { // Note that at this point the start tag of the parent element has already been parsed... hence node must be a child element ElementParser* childParser = m_childParserFactory(); setParserForNextElement(childParser); return childParser->startElement(node, attributes); } bool SequenceParser::endElement(const NodeType::XMLNode& node, const std::string&) { if (node != m_containerType) { CITYGML_LOG_ERROR(m_logger, "Sequence parser was bound to container element <" << m_containerType << "> but found unexpected" " end tag <" << node << "> at " << getDocumentLocation() << ". Ignoring tag..."); return false; } else { m_documentParser.removeCurrentElementParser(this); } return true; } bool SequenceParser::handlesElement(const NodeType::XMLNode& node) const { return getChildParserDummyInstance().handlesElement(node); } std::string SequenceParser::elementParserName() const { return "SequenceParser (" + getChildParserDummyInstance().elementParserName() + ")"; } ElementParser& SequenceParser::getChildParserDummyInstance() const { // Lazy initialize the dummy object (its only used for logging and error reporting) if (m_childParserInstance == nullptr) { m_childParserInstance = std::unique_ptr(m_childParserFactory()); } return *m_childParserInstance; } } libcitygml-2.0.8/sources/src/parser/skipelementparser.cpp000066400000000000000000000027501321622335500236750ustar00rootroot00000000000000#include #include #include #include namespace citygml { SkipElementParser::SkipElementParser(CityGMLDocumentParser& documentParser, std::shared_ptr logger, const NodeType::XMLNode& skipNode) : ElementParser(documentParser, logger) { m_skipNode = skipNode; if (skipNode.valid()) { m_depth = 1; } } std::string SkipElementParser::elementParserName() const { return "SkipElementParser"; } bool SkipElementParser::handlesElement(const NodeType::XMLNode&) const { return true; } bool SkipElementParser::startElement(const NodeType::XMLNode& node, Attributes&) { if (!m_skipNode.valid()) { CITYGML_LOG_TRACE(m_logger, "Skipping element <" << node << "> at " << getDocumentLocation()); m_skipNode = node; m_depth = 1; } else if (node == m_skipNode) { m_depth++; } return true; } bool SkipElementParser::endElement(const NodeType::XMLNode& node, const std::string&) { if (!m_skipNode.valid()) { m_documentParser.removeCurrentElementParser(this); } else if (node == m_skipNode) { m_depth--; if (m_depth == 0) { m_documentParser.removeCurrentElementParser(this); } } return true; } } libcitygml-2.0.8/sources/src/parser/textureelementparser.cpp000066400000000000000000000152421321622335500244270ustar00rootroot00000000000000#include "parser/textureelementparser.h" #include #include "parser/nodetypes.h" #include "parser/attributes.h" #include "parser/documentlocation.h" #include "parser/parserutils.hpp" #include "parser/skipelementparser.h" #include #include #include #include #include #include #include namespace citygml { TextureElementParser::TextureElementParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function)> callback) : GMLObjectElementParser(documentParser, factory, logger) { m_callback = callback; m_model = nullptr; m_currentTexCoords = nullptr; } std::string TextureElementParser::elementParserName() const { return "TextureElementParser"; } bool TextureElementParser::handlesElement(const NodeType::XMLNode& node) const { return node == NodeType::APP_ParameterizedTextureNode; } bool TextureElementParser::parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { if (node != NodeType::APP_ParameterizedTextureNode) { CITYGML_LOG_ERROR(m_logger, "Expected start tag <" << NodeType::APP_ParameterizedTextureNode.name() << "> got " << node << " at " << getDocumentLocation()); throw std::runtime_error("Unexpected start tag found."); } m_model = m_factory.createTexture(attributes.getCityGMLIDAttribute()); return true; } bool TextureElementParser::parseElementEndTag(const NodeType::XMLNode&, const std::string&) { m_callback(m_model); return true; } bool TextureElementParser::parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { if (m_model == nullptr) { throw std::runtime_error("TextureElementParser::parseChildElementStartTag called before TextureElementParser::parseElementStartTag"); } if (node == NodeType::APP_ImageURINode || node == NodeType::APP_TextureTypeNode || node == NodeType::APP_WrapModeNode || node == NodeType::APP_BorderColorNode || node == NodeType::APP_TexCoordListNode || node == NodeType::APP_IsFrontNode || node == NodeType::APP_MimeTypeNode) { return true; } else if (node == NodeType::APP_TargetNode) { if (m_currentTexTargetDef != nullptr) { CITYGML_LOG_WARN(m_logger, "Nested texture target definition detected at: " << getDocumentLocation()); } else { m_currentTexTargetDef = m_factory.createTextureTargetDefinition(parseReference(attributes.getAttribute("uri"), m_logger, getDocumentLocation()), m_model, attributes.getCityGMLIDAttribute()); } return true; } else if (node == NodeType::APP_TextureCoordinatesNode) { if (m_currentTexTargetDef == nullptr) { CITYGML_LOG_WARN(m_logger, "Found texture coordinates node (" << NodeType::APP_TextureCoordinatesNode << ") outside Texture target node at: " << getDocumentLocation()); } else if (m_currentTexCoords != nullptr) { CITYGML_LOG_WARN(m_logger, "Nested texture coordinates definition detected at: " << getDocumentLocation()); } else { m_currentTexCoords = std::make_shared(attributes.getCityGMLIDAttribute(), parseReference(attributes.getAttribute("ring"), m_logger, getDocumentLocation())); } return true; } return GMLObjectElementParser::parseChildElementStartTag(node, attributes); } bool TextureElementParser::parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) { if (m_model == nullptr) { throw std::runtime_error("TextureElementParser::parseChildElementEndTag called before TextureElementParser::parseElementStartTag"); } if (node == NodeType::APP_ImageURINode) { m_model->setUrl(characters); } else if (node == NodeType::APP_TextureTypeNode) { m_model->setAttribute(node.name(), characters); } else if (node == NodeType::APP_WrapModeNode) { if (!m_model->setWrapModeFromString(characters)) { CITYGML_LOG_WARN(m_logger, "Unknown texture wrap mode " << characters << " at: " << getDocumentLocation()); } } else if (node == NodeType::APP_IsFrontNode) { m_model->setIsFront(parseValue(characters, m_logger, getDocumentLocation())); } else if (node == NodeType::APP_BorderColorNode) { std::vector colorValues = parseVecList(characters, m_logger, getDocumentLocation()); colorValues.push_back(1.f); // if 3 values are given, the fourth (alpha) is set to 1.0 by default if (colorValues.size() >= 4) { m_model->setBorderColor(TVec4f(colorValues[0], colorValues[1], colorValues[2], colorValues[3])); } else { CITYGML_LOG_WARN(m_logger, "Expected 3 or more float values in node " << NodeType::APP_BorderColorNode << " but got " << colorValues.size() << " at: " << getDocumentLocation()); } } else if (node == NodeType::APP_TexCoordListNode) { if (m_currentTexCoords != nullptr) { CITYGML_LOG_WARN(m_logger, "TexCoordList node finished before TextureCoordinates child is finished at " << getDocumentLocation()); m_currentTexCoords = nullptr; } } else if (node == NodeType::APP_TextureCoordinatesNode) { if (m_currentTexCoords != nullptr && m_currentTexTargetDef != nullptr) { m_currentTexCoords->setCoords(parseVecList(characters, m_logger, getDocumentLocation())); m_currentTexTargetDef->addTexCoordinates(m_currentTexCoords); m_currentTexCoords = nullptr; } else { CITYGML_LOG_WARN(m_logger, "Unexpected end tag <" << NodeType::APP_TextureCoordinatesNode << " at: " << getDocumentLocation()); } } else if (node == NodeType::APP_TargetNode) { m_currentTexTargetDef = nullptr; } else if (node == NodeType::APP_MimeTypeNode) { m_model->setAttribute(node.name(), characters); } else { return GMLObjectElementParser::parseChildElementEndTag(node, characters); } return true; } Object* TextureElementParser::getObject() { return m_model.get(); } } libcitygml-2.0.8/test/000077500000000000000000000000001321622335500146415ustar00rootroot00000000000000libcitygml-2.0.8/test/CMakeLists.txt000066400000000000000000000015451321622335500174060ustar00rootroot00000000000000IF(WIN32) SET(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} /NODEFAULTLIB:MSVCRT") ENDIF() FIND_PACKAGE( OpenGL REQUIRED ) FIND_PACKAGE( Xerces REQUIRED ) IF( LIBCITYGML_DYNAMIC ) ADD_DEFINITIONS( -DLIBCITYGML_DYNAMIC ) ELSE( LIBCITYGML_DYNAMIC ) ADD_DEFINITIONS( -DLIBCITYGML_STATIC ) ENDIF( LIBCITYGML_DYNAMIC ) # INCLUDE_DIRECTORIES( ${CITYGML_INCLUDE_DIR} ) INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/sources/include ${CMAKE_BINARY_DIR}/sources/include) SET( PRG_SRCS citygmltest.cpp ) ADD_EXECUTABLE( citygmltest ${PRG_SRCS} ) TARGET_LINK_LIBRARIES( citygmltest citygml ${XERCESC_LIBRARY} ${OPENGL_LIBRARIES} ) if(NOT DEFINED BIN_INSTALL_DIR) set(BIN_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/bin") endif(NOT DEFINED BIN_INSTALL_DIR) install(TARGETS citygmltest RUNTIME DESTINATION ${BIN_INSTALL_DIR}) libcitygml-2.0.8/test/citygmltest.cpp000066400000000000000000000124171321622335500177220ustar00rootroot00000000000000/* -*-c++-*- citygml2vrml - Copyright (c) 2010 Joachim Pouderoux, BRGM * * This file is part of libcitygml library * http://code.google.com/p/libcitygml * * libcitygml is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. * * libcitygml is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. */ #include #include #include #include #include #include #include void analyzeObject( const citygml::CityObject*, unsigned int ); void usage() { std::cout << "Usage: citygmltest [-options...] " << std::endl; std::cout << " Options:" << std::endl; std::cout << " -log Print some information during parsing" << std::endl; std::cout << " -filter CityGML objects to parse (default:All)" << std::endl << " The mask is composed of:" << std::endl << " GenericCityObject, Building, Room," << std::endl << " BuildingInstallation, BuildingFurniture, Door, Window, " << std::endl << " CityFurniture, Track, Road, Railway, Square, PlantCover," << std::endl << " SolitaryVegetationObject, WaterBody, TINRelief, LandUse," << std::endl << " Tunnel, Bridge, BridgeConstructionElement," << std::endl << " BridgeInstallation, BridgePart, All" << std::endl << " and seperators |,&,~." << std::endl << " Examples:" << std::endl << " \"All&~Track&~Room\" to parse everything but tracks & rooms" << std::endl << " \"Road&Railway\" to parse only roads & railways" << std::endl; std::cout << " -destSRS Destination SRS (default: no transform)" << std::endl; exit( EXIT_FAILURE ); } int main( int argc, char **argv ) { if ( argc < 2 ) usage(); int fargc = 1; bool log = false; citygml::ParserParams params; for ( int i = 1; i < argc; i++ ) { std::string param = std::string( argv[i] ); std::transform( param.begin(), param.end(), param.begin(), tolower ); if ( param == "-log" ) { log = true; fargc = i+1; } //if ( param == "-filter" ) { if ( i == argc - 1 ) usage(); params.objectsMask = argv[i+1]; i++; fargc = i+1; } if ( param == "-destsrs" ) { if ( i == argc - 1 ) usage(); params.destSRS = argv[i+1]; i++; fargc = i+1; } } if ( argc - fargc < 1 ) usage(); std::cout << "Parsing CityGML file " << argv[fargc] << " using libcitygml v." << LIBCITYGML_VERSIONSTR << "..." << std::endl; time_t start; time( &start ); #if 0 std::ifstream file; file.open( argv[fargc], std::ifstream::in ); std::shared_ptr city = citygml::load( file, params ); #else std::shared_ptr city; try{ city = citygml::load( argv[fargc], params ); }catch(const std::runtime_error& e){ } #endif time_t end; time( &end ); if ( !city ) return EXIT_FAILURE; std::cout << "Done in " << difftime( end, start ) << " seconds." << std::endl; /* std::cout << "Analyzing the city objects..." << std::endl; citygml::CityObjectsMap::const_iterator it = cityObjectsMap.begin(); for ( ; it != cityObjectsMap.end(); ++it ) { const citygml::CityObjects& v = it->second; std::cout << ( log ? " Analyzing " : " Found " ) << v.size() << " " << citygml::getCityObjectsClassName( it->first ) << ( ( v.size() > 1 ) ? "s" : "" ) << "..." << std::endl; if ( log ) { for ( unsigned int i = 0; i < v.size(); i++ ) { std::cout << " + found object " << v[i]->getId(); if ( v[i]->getChildCount() > 0 ) std::cout << " with " << v[i]->getChildCount() << " children"; std::cout << " with " << v[i]->size() << " geometr" << ( ( v[i]->size() > 1 ) ? "ies" : "y" ); std::cout << std::endl; } } } */ if ( log ) { std::cout << std::endl << "Objects hierarchy:" << std::endl; // const citygml::ConstCityObjects& roots = city->getRootCityObjects(); // for ( unsigned int i = 0; i < roots.size(); i++ ) analyzeObject( roots[ i ], 2 ); } std::cout << "Done." << std::endl; return EXIT_SUCCESS; } void analyzeObject( const citygml::CityObject* object, unsigned int indent ) { // for ( unsigned int i = 0; i < indent; i++ ) std::cout << " "; // std::cout << "Object " << citygml::getCityObjectsClassName( object->getType() ) << ": " << object->getId() << std::endl; // for ( unsigned int i = 0; i < object->getChildCount(); i++ ) // analyzeObject( object->getChild(i), indent+1 ); }