{"id":6647,"date":"2017-08-28T16:39:00","date_gmt":"2017-08-28T15:39:00","guid":{"rendered":"https:\/\/www.geomatys.com\/?p=6647"},"modified":"2024-12-12T11:31:11","modified_gmt":"2024-12-12T10:31:11","slug":"proj-4-versus-apache-sis-a-performance-comparison","status":"publish","type":"post","link":"https:\/\/www.geomatys.com\/en\/2017\/08\/28\/proj-4-versus-apache-sis-a-performance-comparison\/","title":{"rendered":"Proj.4 versus Apache SIS: a performance comparison"},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"6647\" class=\"elementor elementor-6647\" data-elementor-settings=\"{&quot;ha_cmc_init_switcher&quot;:&quot;no&quot;}\">\n\t\t\t\t\t\t<section class=\"has_eae_slider elementor-section elementor-top-section elementor-element elementor-element-30ef1e56 elementor-section-full_width elementor-section-height-default elementor-section-height-default exad-glass-effect-no wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no exad-sticky-section-no\" data-eae-slider=\"76048\" data-id=\"30ef1e56\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"has_eae_slider elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-29e194f8 exad-glass-effect-no exad-sticky-section-no\" data-eae-slider=\"96071\" data-id=\"29e194f8\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-1d9118b exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-shortcode\" data-id=\"1d9118b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"6348\" class=\"elementor elementor-6348\" data-elementor-settings=\"{&quot;ha_cmc_init_switcher&quot;:&quot;no&quot;}\">\n\t\t\t\t\t\t<section class=\"has_eae_slider elementor-section elementor-top-section elementor-element elementor-element-ed073a7 elementor-section-full_width elementor-section-height-default elementor-section-height-default exad-glass-effect-no wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-equal-height-no exad-sticky-section-no\" data-eae-slider=\"24263\" data-id=\"ed073a7\" data-element_type=\"section\" data-e-type=\"section\" id=\"header\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"has_eae_slider elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-7ab1d90 exad-glass-effect-no exad-sticky-section-no\" data-eae-slider=\"60117\" data-id=\"7ab1d90\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a2d436c exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-image\" data-id=\"a2d436c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/www.geomatys.com\/en\/\">\n\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"768\" height=\"148\" src=\"https:\/\/i0.wp.com\/www.geomatys.com\/wp-content\/uploads\/2023\/01\/logo-geomatys.png?fit=768%2C148&amp;ssl=1\" class=\"attachment-medium_large size-medium_large wp-image-3137\" alt=\"\" srcset=\"https:\/\/i0.wp.com\/www.geomatys.com\/wp-content\/uploads\/2023\/01\/logo-geomatys.png?w=982&amp;ssl=1 982w, https:\/\/i0.wp.com\/www.geomatys.com\/wp-content\/uploads\/2023\/01\/logo-geomatys.png?resize=300%2C58&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.geomatys.com\/wp-content\/uploads\/2023\/01\/logo-geomatys.png?resize=768%2C148&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.geomatys.com\/wp-content\/uploads\/2023\/01\/logo-geomatys.png?w=188&amp;ssl=1 188w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"has_eae_slider elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-53d36e8 exad-glass-effect-no exad-sticky-section-no\" data-eae-slider=\"11232\" data-id=\"53d36e8\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-49481ed wpr-pointer-none wpr-nav-menu-bp-mobile wpr-main-menu-align-left wpr-main-menu-align--tablet_extraleft wpr-main-menu-align--tabletleft wpr-main-menu-align--mobileleft wpr-sub-icon-caret-down wpr-sub-menu-fx-fade wpr-mobile-menu-display-dropdown wpr-mobile-menu-full-width wpr-mobile-toggle-v1 wpr-sub-divider-yes wpr-mobile-divider-yes exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-wpr-mega-menu\" data-id=\"49481ed\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;menu_layout&quot;:&quot;horizontal&quot;}\" data-widget_type=\"wpr-mega-menu.default\">\n\t\t\t\t\t<nav class=\"wpr-nav-menu-container wpr-mega-menu-container wpr-nav-menu-horizontal\" data-trigger=\"hover\"><ul id=\"menu-1-49481ed\" class=\"wpr-nav-menu wpr-mega-menu\"><li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-7251\"><a href=\"https:\/\/www.geomatys.com\/en\/solutions-logicielles\/\" class=\"wpr-menu-item wpr-pointer-item\"><span>Softwares<\/span><i class=\"wpr-sub-icon fas\" aria-hidden=\"true\"><\/i><\/a>\n<ul  class=\"sub-menu wpr-sub-menu\">\n\t<li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-8212\"><a target=\"_blank\" href=\"http:\/\/www.examind.com?utm_source=geomatys\" class=\"wpr-sub-menu-item\"><span>Examind Suite<\/span><\/a>\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7250\"><a href=\"https:\/\/www.geomatys.com\/en\/apache-sis\/\" class=\"wpr-sub-menu-item\"><span>Apache-SIS<\/span><\/a><\/ul>\n<\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-7253\"><a href=\"https:\/\/www.geomatys.com\/en\/solutions-metier\/\" class=\"wpr-menu-item wpr-pointer-item\"><span>Services<\/span><i class=\"wpr-sub-icon fas\" aria-hidden=\"true\"><\/i><\/a>\n<ul  class=\"sub-menu wpr-sub-menu\">\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-9571\"><a href=\"https:\/\/www.geomatys.com\/en\/vigiearth\/\" class=\"wpr-sub-menu-item\"><span>VigiEarth<\/span><\/a>\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7254\"><a href=\"https:\/\/www.geomatys.com\/en\/solutions-metier\/aqualit\/\" class=\"wpr-sub-menu-item\"><span>AQUALIT<\/span><\/a>\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7830\"><a href=\"https:\/\/www.geomatys.com\/en\/shoreint\/\" class=\"wpr-sub-menu-item\"><span>ShoreInt &#8211; OPAT<\/span><\/a>\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7256\"><a href=\"https:\/\/www.geomatys.com\/en\/solutions-metier\/epiwise\/\" class=\"wpr-sub-menu-item\"><span>EpiWise<\/span><\/a><\/ul>\n<\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7259\"><a href=\"https:\/\/www.geomatys.com\/en\/qui-sommes-nous\/\" class=\"wpr-menu-item wpr-pointer-item\"><span>The company<\/span><\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8317\"><a href=\"https:\/\/www.geomatys.com\/en\/rse\/\" class=\"wpr-menu-item wpr-pointer-item\"><span>CSR<\/span><\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7258\"><a href=\"https:\/\/www.geomatys.com\/en\/contact\/\" class=\"wpr-menu-item wpr-pointer-item\"><span>Contact Us<\/span><\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8286\"><a href=\"https:\/\/www.geomatys.com\/en\/blog\/\" class=\"wpr-menu-item wpr-pointer-item\"><span>Blog<\/span><\/a><\/li>\n<li class=\"trp-language-switcher-container menu-item menu-item-type-post_type menu-item-object-language_switcher current-language-menu-item menu-item-8210\"><a href=\"https:\/\/www.geomatys.com\/en\/wp-json\/wp\/v2\/posts\/6647\" class=\"wpr-menu-item wpr-pointer-item\"><span><span data-no-translation><img data-recalc-dims=\"1\" decoding=\"async\" class=\"trp-flag-image\" src=\"https:\/\/i0.wp.com\/www.geomatys.com\/wp-content\/plugins\/translatepress-multilingual\/assets\/images\/flags\/fr_FR.png?resize=18%2C12&#038;ssl=1\" width=\"18\" height=\"12\" alt=\"fr_FR\" title=\"French\"><span class=\"trp-ls-language-name\">FR<\/span><\/span><\/span><\/a><\/li>\n<\/ul><\/nav><nav class=\"wpr-mobile-nav-menu-container\"><div class=\"wpr-mobile-toggle-wrap\"><div class=\"wpr-mobile-toggle\"><span class=\"wpr-mobile-toggle-line\"><\/span><span class=\"wpr-mobile-toggle-line\"><\/span><span class=\"wpr-mobile-toggle-line\"><\/span><\/div><\/div><div class=\"wpr-mobile-mega-menu-wrap\" toggle-backface=\"\"><ul id=\"mobile-menu-2-49481ed\" class=\"wpr-mobile-nav-menu wpr-mobile-mega-menu\"><li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-7251\"><a href=\"https:\/\/www.geomatys.com\/en\/solutions-logicielles\/\" class=\"wpr-mobile-menu-item\">Softwares<i class=\"wpr-mobile-sub-icon\"><\/i><\/a>\n<ul  class=\"sub-menu wpr-mobile-sub-menu\">\n\t<li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-8212\"><a target=\"_blank\" href=\"http:\/\/www.examind.com?utm_source=geomatys\" class=\"wpr-mobile-sub-menu-item\">Examind Suite<\/a>\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7250\"><a href=\"https:\/\/www.geomatys.com\/en\/apache-sis\/\" class=\"wpr-mobile-sub-menu-item\">Apache-SIS<\/a><\/ul>\n<\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-7253\"><a href=\"https:\/\/www.geomatys.com\/en\/solutions-metier\/\" class=\"wpr-mobile-menu-item\">Services<i class=\"wpr-mobile-sub-icon\"><\/i><\/a>\n<ul  class=\"sub-menu wpr-mobile-sub-menu\">\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-9571\"><a href=\"https:\/\/www.geomatys.com\/en\/vigiearth\/\" class=\"wpr-mobile-sub-menu-item\">VigiEarth<\/a>\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7254\"><a href=\"https:\/\/www.geomatys.com\/en\/solutions-metier\/aqualit\/\" class=\"wpr-mobile-sub-menu-item\">AQUALIT<\/a>\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7830\"><a href=\"https:\/\/www.geomatys.com\/en\/shoreint\/\" class=\"wpr-mobile-sub-menu-item\">ShoreInt &#8211; OPAT<\/a>\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7256\"><a href=\"https:\/\/www.geomatys.com\/en\/solutions-metier\/epiwise\/\" class=\"wpr-mobile-sub-menu-item\">EpiWise<\/a><\/ul>\n<\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7259\"><a href=\"https:\/\/www.geomatys.com\/en\/qui-sommes-nous\/\" class=\"wpr-mobile-menu-item\">The company<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8317\"><a href=\"https:\/\/www.geomatys.com\/en\/rse\/\" class=\"wpr-mobile-menu-item\">CSR<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7258\"><a href=\"https:\/\/www.geomatys.com\/en\/contact\/\" class=\"wpr-mobile-menu-item\">Contact Us<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8286\"><a href=\"https:\/\/www.geomatys.com\/en\/blog\/\" class=\"wpr-mobile-menu-item\">Blog<\/a><\/li>\n<li class=\"trp-language-switcher-container menu-item menu-item-type-post_type menu-item-object-language_switcher current-language-menu-item menu-item-8210\"><a href=\"https:\/\/www.geomatys.com\/en\/wp-json\/wp\/v2\/posts\/6647\" class=\"wpr-mobile-menu-item\"><span data-no-translation><img data-recalc-dims=\"1\" decoding=\"async\" class=\"trp-flag-image\" src=\"https:\/\/i0.wp.com\/www.geomatys.com\/wp-content\/plugins\/translatepress-multilingual\/assets\/images\/flags\/fr_FR.png?resize=18%2C12&#038;ssl=1\" width=\"18\" height=\"12\" alt=\"fr_FR\" title=\"French\"><span class=\"trp-ls-language-name\">FR<\/span><\/span><\/a><\/li>\n<\/ul><\/div><\/nav>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"has_eae_slider elementor-element elementor-element-a90be09 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-eae-slider=\"69835\" data-id=\"a90be09\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-21281f9 exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-heading\" data-id=\"21281f9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Proj.4 versus Apache SIS: a performance comparison<\/h1>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"has_eae_slider elementor-element elementor-element-a7e932e e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-eae-slider=\"6526\" data-id=\"a7e932e\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-35f9d16 wpr-post-info-align-left exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-wpr-post-info\" data-id=\"35f9d16\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"wpr-post-info.default\">\n\t\t\t\t\t<ul class=\"wpr-post-info wpr-post-info-horizontal\"><li class=\"wpr-post-info-date\"><span>28\/08\/2017<\/span><\/li><li class=\"wpr-post-info-author\"><span>Martin Desruisseaux<\/span><\/li><\/ul>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"has_eae_slider elementor-element elementor-element-e62d8e7 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-eae-slider=\"49870\" data-id=\"e62d8e7\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e2fb645 exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-text-editor\" data-id=\"e2fb645\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>In August 17<sup>th<\/sup> 2017, we presented an introduction to Apache Spatial Information System (SIS) in the Free and Open Source Software for Geospatial (FOSS4G) conference. Discussions about performance and accuracy were planed, but skipped because of lack of time. A first part of the results that we intended to show are below.<\/p><p>Disclaimer: the author of this blog is an Apache SIS contributor.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d65ae4d exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-heading\" data-id=\"d65ae4d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Summary<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8a7a48a exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-text-editor\" data-id=\"8a7a48a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>The performance of two map projection libraries were compared:<\/p><ul><li>Proj.4, a library in the C language.<\/li><li>Apache Spatial Information System (SIS), a library in the Java language.<\/li><\/ul><p>The benchmark code was written in Java. The Proj.4 functions were invoked through the Java Native Interfaces (JNI). The use of JNI introduces a bias in benchmark measurements for Proj.4, but this bias is estimated lower than one standard deviation in the time measurements. In our results, Proj.4 is faster except for the Mercator inverse projection. The Proj.4 performance advantage is explained by the cost of Java 8 trigonometric functions like <code>Math.sin(\u03c6)<\/code> and <code>Math.asin(y)<\/code>compared to their C counterparts. Java 9 is known to be faster than Java 8 but has not been tested yet. The Mercator inverse projection exception is explained by the mathematical work done in Apache SIS, where some formulas have been rewritten in more efficient ways using mathematical equivalences; in the Mercator case those gains outweigh the handicap of slower trigonometric functions. In a few extreme cases, Apache SIS is 400 times faster than Proj.4. Those extreme cases are explained by Apache SIS capability to detect when a chain of coordinate operations can be simplified as an affine transform. In all tested map projections, Proj.4 and Apache SIS results differ by a few micrometres or less. In datum shift tests, Proj.4 and Apache SIS are sometime in agreement and sometime apart by one or two meters. Those differences are explained by the way the two libraries use the EPSG geodetic dataset. More details are given in the discussion after \u201cMaterial and method\u201d section.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"has_eae_slider elementor-element elementor-element-6f535ae e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-eae-slider=\"29723\" data-id=\"6f535ae\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f229356 exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-heading\" data-id=\"f229356\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Material and method<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c52fbac exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-text-editor\" data-id=\"c52fbac\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>The benchmark compared Proj.4 release 4.9.3 (August 2016) with Apache SIS 0.8-jdk8-SNAPSHOT (August 2017). The environment is Java 1.8.0_144-b01 on MacOS 10.12.6.<\/p><p>The tests use the GeoAPI interfaces. GeoAPI 3.0 is an OGC standard which allows to write code without knowledge of the underlying implementation. It is similar in this respect to Java DataBase Connectivity (JDBC) interfaces. This approach allows us to write benchmark or test codes only once, then execute it on arbitrary GeoAPI implementations. Apache SIS is one such implementations. The <code>sis-gdal<\/code> module provides another implementation as wrappers around the Proj.4 library (another variant is available in <code>geoapi-proj4<\/code> module provided by the GeoAPI project).<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"has_eae_slider elementor-element elementor-element-d9482bb e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-eae-slider=\"64304\" data-id=\"d9482bb\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2ad1bf5 exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-heading\" data-id=\"2ad1bf5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Coordinate Reference System (CRS) instantiations<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3e1d796 exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-text-editor\" data-id=\"3e1d796\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>All Coordinate Reference System (CRS) objects are created from an EPSG code through the GeoAPI <code>CRSAuthorityFactory<\/code> interface. The Apache SIS <code>CRS<\/code> class provides convenience static methods which delegate to GeoAPI implementations for performing the real work. Coordinate Reference Systems backed by Proj.4 are created as below. Note that despite the <code>\u201cepsg\u201d<\/code> part, this is considered a Proj4 definition (indicated by the <code>\u201cProj4::\u201d<\/code> prefix) rather than an EPSG definition. Those definitions differ in axis order and sometime in units of measurement.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-90a26ac exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-text-editor\" data-id=\"90a26ac\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Coordinate Reference Systems backed by Apache SIS are created as below. The first line creates a CRS as defined by EPSG. The second line modifies the CRS for the same axis order than Proj.4 (note that the CRS intentionally lost its \u201cEPSG::4326\u201d identifier in this process).<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b935fc3 exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-text-editor\" data-id=\"b935fc3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p><em><b>Note:<\/b> alternatively, we could have created the Proj.4 CRS with <code>\u201cProj4::+init=epsg:4326 +axis=neu\u201d<\/code>definition string. But this approach forces us to maintain a list of axis orientations for all supported EPSG codes. This is the approach implemented by GeoAPI wrappers for Proj.4, as a way to get an EPSG factory closer to authoritative definitions. Apache SIS takes a different approach where EPSG codes are handled by Apache SIS itself and the codes provided by Proj.4 are considered to be in a different, non-EPSG, name space.<\/em><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"has_eae_slider elementor-element elementor-element-9fbe536 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-eae-slider=\"24825\" data-id=\"9fbe536\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1e06bcf exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-heading\" data-id=\"1e06bcf\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Coordinate Operation instantiations<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f303069 exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-text-editor\" data-id=\"f303069\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Many coordinate operations may exist for the same pair of source and target CRS. For example the EPSG geodetic dataset contains about 85 operations from NAD27 to WGS84, each operation using a different set of parameters for different state or geographic area. For making a choice, the Apache SIS <code>CRS<\/code> class provides another convenience method:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-09fa6a8 exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-text-editor\" data-id=\"09fa6a8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>The <code>areaOfInterest<\/code> option is set to null in this test, which default to the widest domain of validity. Note that in the case of NAD27 to WGS84 transformations, the \u201cwidest domain of validity\u201d criterion causes Apache SIS to select a transformation for Canada, not for USA. In order to avoid ambiguity, \u201cNAD27 to WGS84\u201d transformations are not compared in this benchmark. The issue of Proj.4 and Apache SIS selecting different transformations will be discussed in more details in another blog post, to be named \u201cProj.4 versus Apache SIS: an accuracy comparison\u201d. For the performance comparison discussed in this post, suffice to say that we verified that the benchmark compares the same operation methods.<\/p><p>All coordinate conversions or transformations are executed through the GeoAPI <code>MathTransform<\/code>interface. In the Proj.4 wrapper case, <code>MathTransform<\/code> delegates to Proj.4 <code>pj_transform<\/code>function. All those functions can work on arbitrary number of coordinates. Our benchmark uses this capability for applying coordinate operations on groups of 65536 coordinates. In Proj.4 case, this means one single JNI call and one single <code>pj_transform<\/code> call per group of 65536 coordinates. The cost of those calls has been estimated by performing an identity transform (where source and destination CRS are the same) on 65536 random coordinates with Proj.4 and assuming that all the execution time were due to JNI overhead. We measured 0.2 milliseconds, which is about 0.6% of the average execution time of other coordinate operations tested in this benchmark.<\/p><p>Conversions or transformations have been tested between the following pairs of CRS. Those pairs have been selected in order to use different operation methods: Cylindrical Equal Area (spherical and ellipsoidal cases), Pseudo-Mercator, Mercator, Lambert Conic Conformal, Polar Stereographic, Albers Equal Area, Geocentric translations and Position Vector transformation. This list does not include any Transverse Mercator (TM) test because there is at least 3 different TM approximations which are considered by EPSG as 3 different projection methods. Since Proj.4 and Apache SIS do not use the same approximation (Apache SIS uses the method recommended in <a href=\"http:\/\/www.epsg.org\/Guidancenotes.aspx\">EPSG guidance note 7-2<\/a>), tests involving the TM projection would not be comparing the same thing.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-061c4d5 eael-dt-th-align-center eael-table-align-center exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-eael-data-table\" data-id=\"061c4d5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"eael-data-table.default\">\n\t\t\t\t\t\t\t<div class=\"eael-data-table-wrap\" data-table_id=\"061c4d5\" id=\"eael-data-table-wrapper-061c4d5\" data-custom_responsive=\"false\">\n\t\t\t<table class=\"tablesorter eael-data-table center\" id=\"eael-data-table-061c4d5\">\n\t\t\t    <thead>\n\t\t\t        <tr class=\"table-header\">\n\t\t\t\t\t\t\t\t\t            <th class=\"\" id=\"\" colspan=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"data-table-header-text\">SOURCE CRS<\/span><\/th>\n\t\t\t        \t\t\t\t            <th class=\"\" id=\"\" colspan=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"data-table-header-text\">TARGET CRS<\/span><\/th>\n\t\t\t        \t\t\t\t        <\/tr>\n\t\t\t    <\/thead>\n\t\t\t  \t<tbody>\n\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \t\t\t\t\t\t\t\t\t\t\t<td colspan=\"\" rowspan=\"\" class=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"td-content-wrapper\"><div class=\"td-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEPSG:4053 \u2013 International 1924 Authalic Sphere\t\t\t\t\t\t\t\t\t\t\t\t<\/div><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \t\t\t\t\t\t\t\t\t\t\t<td colspan=\"\" rowspan=\"\" class=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"td-content-wrapper\"><div class=\"td-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEPSG:3410 \u2013 NSIDC EASE-Grid Global\t\t\t\t\t\t\t\t\t\t\t\t<\/div><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/tr>\n\t\t\t        \t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \t\t\t\t\t\t\t\t\t\t\t<td colspan=\"\" rowspan=\"\" class=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"td-content-wrapper\"><div class=\"td-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEPSG:4326 \u2013 WGS 84\t\t\t\t\t\t\t\t\t\t\t\t<\/div><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \t\t\t\t\t\t\t\t\t\t\t<td colspan=\"\" rowspan=\"\" class=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"td-content-wrapper\"><div class=\"td-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEPSG:6933 \u2013 WGS 84 \/ NSIDC EASE-Grid 2.0 Global\t\t\t\t\t\t\t\t\t\t\t\t<\/div><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/tr>\n\t\t\t        \t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \t\t\t\t\t\t\t\t\t\t\t<td colspan=\"\" rowspan=\"\" class=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"td-content-wrapper\"><div class=\"td-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEPSG:4326 \u2013 WGS 84\t\t\t\t\t\t\t\t\t\t\t\t<\/div><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \t\t\t\t\t\t\t\t\t\t\t<td colspan=\"\" rowspan=\"\" class=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"td-content-wrapper\"><div class=\"td-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEPSG:3857 \u2013 WGS 84 \/ Pseudo-Mercator\t\t\t\t\t\t\t\t\t\t\t\t<\/div><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/tr>\n\t\t\t        \t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \t\t\t\t\t\t\t\t\t\t\t<td colspan=\"\" rowspan=\"\" class=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"td-content-wrapper\"><div class=\"td-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEPSG:4326 \u2013 WGS 84\t\t\t\t\t\t\t\t\t\t\t\t<\/div><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \t\t\t\t\t\t\t\t\t\t\t<td colspan=\"\" rowspan=\"\" class=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"td-content-wrapper\"><div class=\"td-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEPSG:3395 \u2013 WGS 84 \/ World Mercator\t\t\t\t\t\t\t\t\t\t\t\t<\/div><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/tr>\n\t\t\t        \t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \t\t\t\t\t\t\t\t\t\t\t<td colspan=\"\" rowspan=\"\" class=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"td-content-wrapper\"><div class=\"td-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEPSG:4269 \u2013 NAD83\t\t\t\t\t\t\t\t\t\t\t\t<\/div><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \t\t\t\t\t\t\t\t\t\t\t<td colspan=\"\" rowspan=\"\" class=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"td-content-wrapper\"><div class=\"td-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEPSG:3978 \u2013 NAD83 \/ Canada Atlas Lambert\t\t\t\t\t\t\t\t\t\t\t\t<\/div><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/tr>\n\t\t\t        \t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \t\t\t\t\t\t\t\t\t\t\t<td colspan=\"\" rowspan=\"\" class=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"td-content-wrapper\"><div class=\"td-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEPSG:4326 \u2013 WGS 84\t\t\t\t\t\t\t\t\t\t\t\t<\/div><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \t\t\t\t\t\t\t\t\t\t\t<td colspan=\"\" rowspan=\"\" class=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"td-content-wrapper\"><div class=\"td-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEPSG:3031 \u2013 WGS 84 \/ Antarctic Polar Stereographic\t\t\t\t\t\t\t\t\t\t\t\t<\/div><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/tr>\n\t\t\t        \t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \t\t\t\t\t\t\t\t\t\t\t<td colspan=\"\" rowspan=\"\" class=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"td-content-wrapper\"><div class=\"td-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEPSG:4269 \u2013 NAD83\t\t\t\t\t\t\t\t\t\t\t\t<\/div><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \t\t\t\t\t\t\t\t\t\t\t<td colspan=\"\" rowspan=\"\" class=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"td-content-wrapper\"><div class=\"td-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEPSG:5070 \u2013 NAD83 \/ Conus Albers\t\t\t\t\t\t\t\t\t\t\t\t<\/div><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/tr>\n\t\t\t        \t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \t\t\t\t\t\t\t\t\t\t\t<td colspan=\"\" rowspan=\"\" class=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"td-content-wrapper\"><div class=\"td-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEPSG:3994 \u2013 WGS 84 \/ Mercator 41\t\t\t\t\t\t\t\t\t\t\t\t<\/div><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \t\t\t\t\t\t\t\t\t\t\t<td colspan=\"\" rowspan=\"\" class=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"td-content-wrapper\"><div class=\"td-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEPSG:3395 \u2013 WGS 84 \/ World Mercator\t\t\t\t\t\t\t\t\t\t\t\t<\/div><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/tr>\n\t\t\t        \t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \t\t\t\t\t\t\t\t\t\t\t<td colspan=\"\" rowspan=\"\" class=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"td-content-wrapper\"><div class=\"td-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEPSG:4301 \u2013 Tokyo\t\t\t\t\t\t\t\t\t\t\t\t<\/div><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \t\t\t\t\t\t\t\t\t\t\t<td colspan=\"\" rowspan=\"\" class=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"td-content-wrapper\"><div class=\"td-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEPSG:4612 \u2013 JGD2000\t\t\t\t\t\t\t\t\t\t\t\t<\/div><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/tr>\n\t\t\t        \t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \t\t\t\t\t\t\t\t\t\t\t<td colspan=\"\" rowspan=\"\" class=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"td-content-wrapper\"><div class=\"td-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEPSG:4277 \u2013 OSGB 1936\t\t\t\t\t\t\t\t\t\t\t\t<\/div><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \t\t\t\t\t\t\t\t\t\t\t<td colspan=\"\" rowspan=\"\" class=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"td-content-wrapper\"><div class=\"td-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEPSG:4230 \u2013 ED50\t\t\t\t\t\t\t\t\t\t\t\t<\/div><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/tr>\n\t\t\t        \t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \t\t\t\t\t\t\t\t\t\t\t<td colspan=\"\" rowspan=\"\" class=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"td-content-wrapper\"><div class=\"td-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEPSG:4625 \u2013 Martinique 1938\t\t\t\t\t\t\t\t\t\t\t\t<\/div><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \t\t\t\t\t\t\t\t\t\t\t<td colspan=\"\" rowspan=\"\" class=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"td-content-wrapper\"><div class=\"td-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEPSG:5489 \u2013 RGAF09\t\t\t\t\t\t\t\t\t\t\t\t<\/div><\/div>\n\t\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/tr>\n\t\t\t        \t\t\t    <\/tbody>\n\t\t\t<\/table>\n\t\t<\/div>\n\t  \t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ce9bde4 exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-text-editor\" data-id=\"ce9bde4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>For each pair of CRS, a geographic bounding box is determined as below:<\/p><ul><li>If the EPSG geodetic dataset has an explicit coordinate operation for a given pair of CRS, then the domain of validity of that operation is used.<\/li><li>Otherwise the intersection of the domain of validity of source and target CRS is used.<\/li><\/ul><p>The geographic bounding box is divided in a grid of 256\u00d7256 equally-spaced cells. A coordinate is created at a random location inside each cell. Those coordinates are stored in an array of 65536 coordinates, then the coordinates are shuffled in random order. The result is named \u201coriginal coordinates\u201d and will not change anymore, in order to give us a stable reference for step 3 below. Then:<\/p><ol><li>Convert all coordinates from source CRS to target CRS (forward operation) with one single <code>MathTransform<\/code> method call. Execution time is measured.<\/li><li>Convert all step 1 results from target CRS to source CRS (inverse operation) with one single <code>MathTransform<\/code> method call. Execution time is measured.<\/li><li>The two above steps should cancel each other. This is verified by computing the average distance (in metres) between <em>original coordinates<\/em> and step 2 results, together with standard deviation. This distance is named \u201cdrift\u201d in following discussion.<\/li><li>Steps 1 to 3 are repeated 100 times (as recommended by <a href=\"http:\/\/www.iogp.org\/Geomatics\/#gigs\">Geospatial Integrity of Geoscience Software<\/a> tests), using step 2 outputs as step 1 inputs. Execution times are ignored for the 10 first executions in order to give a chance to the Java Virtual Machine to \u201cwarm up\u201d (i.e. compile the Java code). After 10 iterations, statistics on execution time are accumulated.<\/li><\/ol><p>Note that the drift after 100 iterations is not necessarily equal to 100 times the drift after one iteration. For some map projections, the drift increases linearly as we would intuitively expect. But for some other projections, the drift increases asymptomatically. An example will be given in the \u201cProj.4 versus Apache SIS: an accuracy comparison\u201d blog post.<\/p><p>Performances can be impacted by the precision of map projection algorithms. For example many map projections use iterative algorithms, where iterations are executed until the error falls below some arbitrary threshold value. Implementations with smaller threshold will iterate more often and consequently will appear slower (if everything else is equal). To be strict, we should compare implementations of equal precision. But for this benchmark we only verify that we are comparing implementations having at least a centimetric precision, as required by EPSG. We do not check the absolute precision (that would be the topic of other tests) but only the internal consistency as given by the drift measurement described at step 3 above.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"has_eae_slider elementor-element elementor-element-b0737fd e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-eae-slider=\"23473\" data-id=\"b0737fd\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f8fa91a exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-heading\" data-id=\"f8fa91a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Results and discussion<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f0b7077 exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-text-editor\" data-id=\"f0b7077\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>For all tested projections except Proj.4 <i>Cylindrical Equal Area<\/i> (ellipsoidal case), the drift after 100 iterations (i.e. after executing a \u201cforward \u2013 inverse\u201d cycle one hundred times) is less than one millimetre. The sole exception is the Proj.4 <code>\"cea\"<\/code> projection, which drifted by (6 \u00b1 5) centimetres (for all measurements in this page, the value on right side of \u00b1 is one standard deviation. Assuming a gaussian distribution, (6 \u00b1 5) cm means that about 68% of points drifted by a value between 1 and 11 cm). This drift occurs because the Cylindrical Equal Area inverse projection is approximated by a series expansion (\u03c6 \u2248 c<sub>1<\/sub>\u22c5sin(2\u03b2) + c<sub>2<\/sub>\u22c5sin(4\u03b2) + c<sub>3<\/sub>\u22c5sin(8\u03b2)) which would need one more term. This is not Proj.4 \u201cfault\u201d since it implements the series expansion as published in both Snyder book (equation 3-18) and EPSG guidance note. The drift does not happen with Apache SIS because its high eccentricity support (for planetary CRS) fixed the imprecision as a side effect. That later topic will be discussed in the \u201cProj.4 versus Apache SIS: an accuracy comparison\u201d blog post.<\/p><p>The performance comparison results is show below. Dark blue and red bars are Apache SIS average execution times; light blue and orange bars are Proj.4 average execution times. Smaller is better. Discussion follow.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c38aaab exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-image\" data-id=\"c38aaab\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"800\" height=\"400\" src=\"https:\/\/i0.wp.com\/www.geomatys.com\/wp-content\/uploads\/2023\/11\/benchmark-1024x512-1.png?fit=800%2C400&amp;ssl=1\" class=\"attachment-large size-large wp-image-6652\" alt=\"\" srcset=\"https:\/\/i0.wp.com\/www.geomatys.com\/wp-content\/uploads\/2023\/11\/benchmark-1024x512-1.png?w=1024&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.geomatys.com\/wp-content\/uploads\/2023\/11\/benchmark-1024x512-1.png?resize=300%2C150&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.geomatys.com\/wp-content\/uploads\/2023\/11\/benchmark-1024x512-1.png?resize=768%2C384&amp;ssl=1 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-37c6732 exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-text-editor\" data-id=\"37c6732\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>The \u27dd\u27de symbols at the tip of bars represent one standard deviation above and below the cumulated (forward + inverse) execution time. For Proj.4, execution time measurements have standard deviations ranging from 0.3 to 2 milliseconds. Since we estimated JNI cost to be less than 0.2 milliseconds, that cost appear to be smaller than our time measurement uncertainties.<\/p><p>Proj.4 appears faster than Apache SIS in most cases. The cause for this performance difference can be isolated more easily by looking at the Cylindrical Equal Area (Spherical) projection. This particular operation method contains a single sin(\u03c6) in the forward projection case and a single asin(y) in the inverse projection case, ignoring multiplications and additions. A micro-benchmark invoking sin(\u03c6) and asin(y) on 65536 random values in a loop, without any other arithmetic operations, reproduced approximatively the same execution time. This suggests that the Apache SIS execution time is mostly due to slower trigonometric functions in Java 8 compared to C. The same micro-benchmark on Java 9 release candidate 1 shows a sin(\u03c6) function 3 to 4 time faster than in Java 8. The Java 9 performance improvement brings the forward projection at the same speed level than Proj.4. However the asin(y) performance stay the same in Java 9 than in Java 8. We could not yet test what will be the net performance gain on Java 9 since Apache SIS needs some work for Java 9 compatibility.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-04c814f exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-text-editor\" data-id=\"04c814f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p><em><b>Note:<\/b> the slower trigonometric functions in Java 8 come from stricter requirements. Java does not require the exact same result on all platforms, but requires the computed results to be within 1 ULP of exact results for most trigonometric functions. By contrast, the C\/C++ language allows more flexibility in favour of performance. The precision requirement could be a reason why the Apache SIS drift is smaller than Proj.4 drift for map projections based on exact formulas, but this hypothesis has not been verified.<\/em><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4c41e69 exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-text-editor\" data-id=\"4c41e69\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>While Proj.4 is generally faster, there is some exceptions. The Mercator inverse projection is faster with Apache SIS than with Proj.4. The reason is that Proj.4 uses an iterative algorithm while Apache SIS uses a series expansion. That series expansion is not given explicitly in Snyder\u2019s book, but can be inferred from the understanding that Mercator projection is the limit case of Lambert Conic Conformal projection when the standard parallels are at the equator. The difference between Apache SIS and Proj.4 results is less than a nanometre.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1e7a4bb exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-text-editor\" data-id=\"1e7a4bb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p><em><b>Note:<\/b> series expansions are generally faster but their precision depends on the number of terms, which is hard-coded. This number of terms is usually selected for planets having an eccentricity not greater than Earth\u2019s eccentricity. On the other hand, iterative algorithm are slower but can adapt to planets having greater eccentricity. Proj.4 implementation follows Snyder\u2019s book, which gives an iterative algorithm for the Mercator projection and a series expansion for Lambert Conic Conformal. Apache SIS uses a mix of both: it starts with a series expansion for performance reasons, then continue with iterative algorithm if needed. This approach will be discussed in the future \u201cProj.4 versus Apache SIS: an accuracy comparison\u201d blog post.<\/em><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"has_eae_slider elementor-element elementor-element-9afefea e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-eae-slider=\"68333\" data-id=\"9afefea\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3f0b7f7 exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-text-editor\" data-id=\"3f0b7f7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>An extreme case is the conversion from WGS 84 \/ Mercator 41 (EPSG:3994) to WGS 84 \/ World Mercator (EPSG:3395). Those two projections differ only by the scale factor or latitude of standard parallel. In the Mercator projection case, a change of standard parallel can be mapped to a change of scale factor (such equivalence does not exist for every map projections). Consequently the \u201cMercator 41\u201d to \u201cWorld Mercator\u201d conversion can be represented by the following chain of operations:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-acc2b0c exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-image\" data-id=\"acc2b0c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"547\" height=\"47\" src=\"https:\/\/i0.wp.com\/www.geomatys.com\/wp-content\/uploads\/2023\/11\/T1-1.png?fit=547%2C47&amp;ssl=1\" class=\"attachment-large size-large wp-image-6654\" alt=\"\" srcset=\"https:\/\/i0.wp.com\/www.geomatys.com\/wp-content\/uploads\/2023\/11\/T1-1.png?w=547&amp;ssl=1 547w, https:\/\/i0.wp.com\/www.geomatys.com\/wp-content\/uploads\/2023\/11\/T1-1.png?resize=300%2C26&amp;ssl=1 300w\" sizes=\"(max-width: 547px) 100vw, 547px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6e71309 exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-text-editor\" data-id=\"6e71309\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>In this chain, the green boxes represent linear operations. We show only the scale factors for simplicity, but those green boxes can also contain longitude rotations, unit conversions, everything that can be represented by an affine transform. Having extracted linear operations out, the remaining non-linear parts in yellow boxes depend only on eccentricity (for the Mercator projection; other map projections have more non-linear terms). Since in this particular case nothing stands between the \u201cinverse Mercator\u201d and \u201cMercator\u201d operations (i.e. there is no datum shift) and those two operations use the same eccentricity, they cancel each other:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a422f03 exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-image\" data-id=\"a422f03\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"547\" height=\"47\" src=\"https:\/\/i0.wp.com\/www.geomatys.com\/wp-content\/uploads\/2023\/11\/T2-1.png?fit=547%2C47&amp;ssl=1\" class=\"attachment-large size-large wp-image-6655\" alt=\"\" srcset=\"https:\/\/i0.wp.com\/www.geomatys.com\/wp-content\/uploads\/2023\/11\/T2-1.png?w=547&amp;ssl=1 547w, https:\/\/i0.wp.com\/www.geomatys.com\/wp-content\/uploads\/2023\/11\/T2-1.png?resize=300%2C26&amp;ssl=1 300w\" sizes=\"(max-width: 547px) 100vw, 547px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-12325df exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-text-editor\" data-id=\"12325df\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>By performing this decomposition, Apache SIS has been able to determine that the \u201cWGS 84 \/ Mercator 41\u201d to \u201cWGS 84 \/ World Mercator\u201d conversion simplifies to an affine transform. Such affine transform are much faster to execute than any map projection except Plate Carr\u00e9; at least 400 times faster for the particular conversion tested here.<\/p><p>Apache SIS performs such decomposition not only for the Mercator projection, but for <em>all<\/em>coordinate operations implemented in SIS: all map projections, all datum shift methods, any operation with any number of dimensions. In practice, there is not so many cases where a whole chain of operations can be simplified to an affine transform, so performance gain as spectacular as 400 times are not so common. However there is a lot of cases where some intermediate steps can be simplified, for example conversions from radians to degrees (e.g. the output of inverse projection) followed by a conversion from degrees to radians (e.g. the input of forward projection). Those simplifications do not always bring noticeable performance gains since saving a few multiplications has negligible effect compared to trigonometric function costs. But they contribute to reducing rounding errors, open the door to more optimizations in the future and make much easier the calculation of <a href=\"http:\/\/sis.apache.org\/book\/en\/developer-guide.html#TransformDerivative\">Jacobian matrices<\/a>. The Jacobian matrices help to speedup higher-level operations discussed in previous blog posts (e.g. envelope transformations and raster resampling).<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t<div class=\"has_eae_slider elementor-element elementor-element-a87e846 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-child\" data-eae-slider=\"44499\" data-id=\"a87e846\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ec58774 exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-heading\" data-id=\"ec58774\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Conclusion<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-877773f exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-text-editor\" data-id=\"877773f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>When operating on 65536 coordinates by method call, Proj.4 is generally faster than Apache SIS on Java 8. This difference in performance is due in large part to trigonometric functions. Faster trigonometric functions in Java 9 should help to reduce the performance gap in the general case, but not eliminate it since not all trigonometric functions have been improved. However there is cases where Apache SIS appears faster than Proj.4 despite the trigonometric function costs. Those cases can be explained by the mathematical analytic done in Apache SIS and the aggressive decomposition of some coordinate operation steps into (affine transform + non linear function) tupples. This Apache SIS architecture also gives other mathematical tools for more optimizations, like <a href=\"http:\/\/sis.apache.org\/book\/en\/developer-guide.html#TransformDerivative\">Jacobian matrices<\/a> used for faster and more accurate envelope transformations.<\/p><p>Proj.4 and Apache SIS numerical results are in agreement for coordinate <em>conversions<\/em> (including map projections), but can differ by one or two metres for coordinate <em>transformations<\/em> (including datum shifts). Those differences are caused by different ways to use the EPSG geodetic dataset (<em>early-binding<\/em> versus <em>late-binding<\/em> approaches) and will be discussed in more details in another blog post, \u201cProj.4 versus Apache SIS: an accuracy comparison\u201d.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"has_eae_slider elementor-section elementor-top-section elementor-element elementor-element-1a47b00e elementor-section-full_width elementor-section-height-default elementor-section-height-default exad-glass-effect-no wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no exad-sticky-section-no\" data-eae-slider=\"91540\" data-id=\"1a47b00e\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"has_eae_slider elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3e448cd9 exad-glass-effect-no exad-sticky-section-no\" data-eae-slider=\"18039\" data-id=\"3e448cd9\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5ed294e6 exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-shortcode\" data-id=\"5ed294e6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"5276\" class=\"elementor elementor-5276\" data-elementor-settings=\"{&quot;ha_cmc_init_switcher&quot;:&quot;no&quot;}\">\n\t\t\t\t\t\t<section class=\"has_eae_slider elementor-section elementor-top-section elementor-element elementor-element-267b5fb elementor-section-boxed elementor-section-height-default elementor-section-height-default exad-glass-effect-no wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no exad-sticky-section-no\" data-eae-slider=\"83148\" data-id=\"267b5fb\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"has_eae_slider elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-8dac029 exad-glass-effect-no exad-sticky-section-no\" data-eae-slider=\"74540\" data-id=\"8dac029\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ff0bb56 hfe-nav-menu__align-center hfe-nav-menu__breakpoint-mobile hfe-submenu-icon-arrow hfe-link-redirect-child exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-navigation-menu\" data-id=\"ff0bb56\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;padding_vertical_menu_item&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:7,&quot;sizes&quot;:[]},&quot;menu_space_between&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:0,&quot;sizes&quot;:[]},&quot;padding_horizontal_menu_item&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:15,&quot;sizes&quot;:[]},&quot;padding_horizontal_menu_item_tablet_extra&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;padding_horizontal_menu_item_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;padding_horizontal_menu_item_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;padding_vertical_menu_item_tablet_extra&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;padding_vertical_menu_item_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;padding_vertical_menu_item_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;menu_space_between_tablet_extra&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;menu_space_between_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;menu_space_between_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;dropdown_border_radius&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;top&quot;:&quot;&quot;,&quot;right&quot;:&quot;&quot;,&quot;bottom&quot;:&quot;&quot;,&quot;left&quot;:&quot;&quot;,&quot;isLinked&quot;:true},&quot;dropdown_border_radius_tablet_extra&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;top&quot;:&quot;&quot;,&quot;right&quot;:&quot;&quot;,&quot;bottom&quot;:&quot;&quot;,&quot;left&quot;:&quot;&quot;,&quot;isLinked&quot;:true},&quot;dropdown_border_radius_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;top&quot;:&quot;&quot;,&quot;right&quot;:&quot;&quot;,&quot;bottom&quot;:&quot;&quot;,&quot;left&quot;:&quot;&quot;,&quot;isLinked&quot;:true},&quot;dropdown_border_radius_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;top&quot;:&quot;&quot;,&quot;right&quot;:&quot;&quot;,&quot;bottom&quot;:&quot;&quot;,&quot;left&quot;:&quot;&quot;,&quot;isLinked&quot;:true},&quot;padding_horizontal_dropdown_item&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;padding_horizontal_dropdown_item_tablet_extra&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;padding_horizontal_dropdown_item_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;padding_horizontal_dropdown_item_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;padding_vertical_dropdown_item&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:15,&quot;sizes&quot;:[]},&quot;padding_vertical_dropdown_item_tablet_extra&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;padding_vertical_dropdown_item_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;padding_vertical_dropdown_item_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;distance_from_menu&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;distance_from_menu_tablet_extra&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;distance_from_menu_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;distance_from_menu_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;toggle_size&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;toggle_size_tablet_extra&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;toggle_size_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;toggle_size_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;toggle_border_width&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;toggle_border_width_tablet_extra&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;toggle_border_width_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;toggle_border_width_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;toggle_border_radius&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;toggle_border_radius_tablet_extra&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;toggle_border_radius_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;toggle_border_radius_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"navigation-menu.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t<div class=\"hfe-nav-menu hfe-layout-vertical hfe-nav-menu-layout vertical\" data-layout=\"vertical\">\n\t\t\t\t<div role=\"button\" class=\"hfe-nav-menu__toggle elementor-clickable\" tabindex=\"0\" aria-label=\"Menu Toggle\">\n\t\t\t\t\t<span class=\"screen-reader-text\">Menu<\/span>\n\t\t\t\t\t<div class=\"hfe-nav-menu-icon\">\n\t\t\t\t\t\t<i aria-hidden=\"true\"  class=\"fas fa-align-justify\"><\/i>\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<nav class=\"hfe-nav-menu__layout-vertical hfe-nav-menu__submenu-arrow\" data-toggle-icon=\"&lt;i aria-hidden=&quot;true&quot; tabindex=&quot;0&quot; class=&quot;fas fa-align-justify&quot;&gt;&lt;\/i&gt;\" data-close-icon=\"&lt;i aria-hidden=&quot;true&quot; tabindex=&quot;0&quot; class=&quot;far fa-window-close&quot;&gt;&lt;\/i&gt;\" data-full-width=\"yes\">\n\t\t\t\t\t<ul id=\"menu-1-ff0bb56\" class=\"hfe-nav-menu\"><li id=\"menu-item-624\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-privacy-policy parent hfe-creative-menu\"><a href=\"https:\/\/www.geomatys.com\/en\/privacy-policy\/\" class = \"hfe-menu-item\">Privacy Policy<\/a><\/li>\n<li id=\"menu-item-4761\" class=\"menu-item menu-item-type-post_type menu-item-object-page parent hfe-creative-menu\"><a href=\"https:\/\/www.geomatys.com\/en\/mentions-legales\/\" class = \"hfe-menu-item\">Mentions l\u00e9gales<\/a><\/li>\n<li id=\"menu-item-625\" class=\"menu-item menu-item-type-custom menu-item-object-custom parent hfe-creative-menu\"><a href=\"#header\" class = \"hfe-menu-item\">Retour en haut<\/a><\/li>\n<\/ul> \n\t\t\t\t<\/nav>\n\t\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"has_eae_slider elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-8da774f exad-glass-effect-no exad-sticky-section-no\" data-eae-slider=\"25966\" data-id=\"8da774f\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-654cb58 exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-image\" data-id=\"654cb58\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/www.geomatys.com\/en\/\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"58\" src=\"https:\/\/i0.wp.com\/www.geomatys.com\/wp-content\/uploads\/2023\/01\/logo-geomatys.png?fit=300%2C58&amp;ssl=1\" class=\"attachment-medium size-medium wp-image-3137\" alt=\"\" srcset=\"https:\/\/i0.wp.com\/www.geomatys.com\/wp-content\/uploads\/2023\/01\/logo-geomatys.png?w=982&amp;ssl=1 982w, https:\/\/i0.wp.com\/www.geomatys.com\/wp-content\/uploads\/2023\/01\/logo-geomatys.png?resize=300%2C58&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.geomatys.com\/wp-content\/uploads\/2023\/01\/logo-geomatys.png?resize=768%2C148&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.geomatys.com\/wp-content\/uploads\/2023\/01\/logo-geomatys.png?w=188&amp;ssl=1 188w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-22e6314 elementor-shape-rounded elementor-grid-0 e-grid-align-center exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-social-icons\" data-id=\"22e6314\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"social-icons.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-social-icons-wrapper elementor-grid\" role=\"list\">\n\t\t\t\t\t\t\t<span class=\"elementor-grid-item\" role=\"listitem\">\n\t\t\t\t\t<a class=\"elementor-icon elementor-social-icon elementor-social-icon-linkedin elementor-repeater-item-69ef169\" href=\"https:\/\/www.linkedin.com\/company\/geomatys\/\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-screen-only\">Linkedin<\/span>\n\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"fab fa-linkedin\"><\/i>\t\t\t\t\t<\/a>\n\t\t\t\t<\/span>\n\t\t\t\t\t\t\t<span class=\"elementor-grid-item\" role=\"listitem\">\n\t\t\t\t\t<a class=\"elementor-icon elementor-social-icon elementor-social-icon-twitter elementor-repeater-item-ae824dc\" href=\"https:\/\/twitter.com\/Geomatys\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-screen-only\">Twitter<\/span>\n\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"fab fa-twitter\"><\/i>\t\t\t\t\t<\/a>\n\t\t\t\t<\/span>\n\t\t\t\t\t\t\t<span class=\"elementor-grid-item\" role=\"listitem\">\n\t\t\t\t\t<a class=\"elementor-icon elementor-social-icon elementor-social-icon-youtube elementor-repeater-item-c0981b6\" href=\"https:\/\/www.youtube.com\/channel\/UCQK9UM2EbzdlKLqnq3ogJBA\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-screen-only\">Youtube<\/span>\n\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"fab fa-youtube\"><\/i>\t\t\t\t\t<\/a>\n\t\t\t\t<\/span>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Proj.4 versus Apache SIS: a performance comparison 28\/08\/2017 Martin Desruisseaux In August 17th 2017, we presented an introduction to Apache Spatial Information System (SIS) in the Free and Open Source Software for Geospatial (FOSS4G) conference. Discussions about performance and accuracy were planed, but skipped because of lack of time. A first part of the results that we intended to show are below. Disclaimer: the author of this blog is an Apache SIS contributor. Summary The performance of two map projection libraries were compared: Proj.4, a library in the C language. Apache Spatial Information System (SIS), a library in the Java language. The benchmark code was written in Java. The Proj.4 functions were invoked through the Java Native Interfaces (JNI). The use of JNI introduces a bias in benchmark measurements for Proj.4, but this bias is estimated lower than one standard deviation in the time measurements. In our results, Proj.4 is faster except for the Mercator inverse projection. The Proj.4 performance advantage is explained by the cost of Java 8 trigonometric functions like Math.sin(\u03c6) and Math.asin(y)compared to their C counterparts. Java 9 is known to be faster than Java 8 but has not been tested yet. The Mercator inverse projection exception is explained by the mathematical work done in Apache SIS, where some formulas have been rewritten in more efficient ways using mathematical equivalences; in the Mercator case those gains outweigh the handicap of slower trigonometric functions. In a few extreme cases, Apache SIS is 400 times faster than Proj.4. Those extreme cases are explained by Apache SIS capability to detect when a chain of coordinate operations can be simplified as an affine transform. In all tested map projections, Proj.4 and Apache SIS results differ by a few micrometres or less. In datum shift tests, Proj.4 and Apache SIS are sometime in agreement and sometime apart by one or two meters. Those differences are explained by the way the two libraries use the EPSG geodetic dataset. More details are given in the discussion after \u201cMaterial and method\u201d section. Material and method The benchmark compared Proj.4 release 4.9.3 (August 2016) with Apache SIS 0.8-jdk8-SNAPSHOT (August 2017). The environment is Java 1.8.0_144-b01 on MacOS 10.12.6. The tests use the GeoAPI interfaces. GeoAPI 3.0 is an OGC standard which allows to write code without knowledge of the underlying implementation. It is similar in this respect to Java DataBase Connectivity (JDBC) interfaces. This approach allows us to write benchmark or test codes only once, then execute it on arbitrary GeoAPI implementations. Apache SIS is one such implementations. The sis-gdal module provides another implementation as wrappers around the Proj.4 library (another variant is available in geoapi-proj4 module provided by the GeoAPI project). Coordinate Reference System (CRS) instantiations All Coordinate Reference System (CRS) objects are created from an EPSG code through the GeoAPI CRSAuthorityFactory interface. The Apache SIS CRS class provides convenience static methods which delegate to GeoAPI implementations for performing the real work. Coordinate Reference Systems backed by Proj.4 are created as below. Note that despite the \u201cepsg\u201d part, this is considered a Proj4 definition (indicated by the \u201cProj4::\u201d prefix) rather than an EPSG definition. Those definitions differ in axis order and sometime in units of measurement. CoordinateReferenceSystem crs = CRS.forCode(&ldquo;Proj4::+init=epsg:4326&rdquo;); Coordinate Reference Systems backed by Apache SIS are created as below. The first line creates a CRS as defined by EPSG. The second line modifies the CRS for the same axis order than Proj.4 (note that the CRS intentionally lost its \u201cEPSG::4326\u201d identifier in this process). CoordinateReferenceSystem crs = CRS.forCode(&ldquo;EPSG::4326&rdquo;); crs = AbstractCRS.castOrCopy(crs).forConvention(AxesConvention.RIGHT_HANDED); Note: alternatively, we could have created the Proj.4 CRS with \u201cProj4::+init=epsg:4326 +axis=neu\u201ddefinition string. But this approach forces us to maintain a list of axis orientations for all supported EPSG codes. This is the approach implemented by GeoAPI wrappers for Proj.4, as a way to get an EPSG factory closer to authoritative definitions. Apache SIS takes a different approach where EPSG codes are handled by Apache SIS itself and the codes provided by Proj.4 are considered to be in a different, non-EPSG, name space. Coordinate Operation instantiations Many coordinate operations may exist for the same pair of source and target CRS. For example the EPSG geodetic dataset contains about 85 operations from NAD27 to WGS84, each operation using a different set of parameters for different state or geographic area. For making a choice, the Apache SIS CRS class provides another convenience method: CoordinateOperation op = CRS.findOperation(sourceCRS, targetCRS, areaOfInterest); The areaOfInterest option is set to null in this test, which default to the widest domain of validity. Note that in the case of NAD27 to WGS84 transformations, the \u201cwidest domain of validity\u201d criterion causes Apache SIS to select a transformation for Canada, not for USA. In order to avoid ambiguity, \u201cNAD27 to WGS84\u201d transformations are not compared in this benchmark. The issue of Proj.4 and Apache SIS selecting different transformations will be discussed in more details in another blog post, to be named \u201cProj.4 versus Apache SIS: an accuracy comparison\u201d. For the performance comparison discussed in this post, suffice to say that we verified that the benchmark compares the same operation methods. All coordinate conversions or transformations are executed through the GeoAPI MathTransforminterface. In the Proj.4 wrapper case, MathTransform delegates to Proj.4 pj_transformfunction. All those functions can work on arbitrary number of coordinates. Our benchmark uses this capability for applying coordinate operations on groups of 65536 coordinates. In Proj.4 case, this means one single JNI call and one single pj_transform call per group of 65536 coordinates. The cost of those calls has been estimated by performing an identity transform (where source and destination CRS are the same) on 65536 random coordinates with Proj.4 and assuming that all the execution time were due to JNI overhead. We measured 0.2 milliseconds, which is about 0.6% of the average execution time of other coordinate operations tested in this benchmark. Conversions or transformations have been tested between the following pairs of CRS. Those pairs have been selected in order to use different operation methods: Cylindrical Equal Area<\/p>","protected":false},"author":3,"featured_media":6652,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_umich_oidc_access":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-6647","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-actus"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.geomatys.com\/wp-content\/uploads\/2023\/11\/benchmark-1024x512-1.png?fit=1024%2C512&ssl=1","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.geomatys.com\/en\/wp-json\/wp\/v2\/posts\/6647","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.geomatys.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.geomatys.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.geomatys.com\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.geomatys.com\/en\/wp-json\/wp\/v2\/comments?post=6647"}],"version-history":[{"count":0,"href":"https:\/\/www.geomatys.com\/en\/wp-json\/wp\/v2\/posts\/6647\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.geomatys.com\/en\/wp-json\/wp\/v2\/media\/6652"}],"wp:attachment":[{"href":"https:\/\/www.geomatys.com\/en\/wp-json\/wp\/v2\/media?parent=6647"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.geomatys.com\/en\/wp-json\/wp\/v2\/categories?post=6647"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.geomatys.com\/en\/wp-json\/wp\/v2\/tags?post=6647"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}