<div dir="ltr">AI is helping me remember<div><br></div><div>for the FindMatches() routine would you want it matching as close as possible C types or would you want a simplified API for Java that mogt communicate info via an array of strings (or one formatted string). Sorry if that sounds out of left field.</div><div><br></div><div>One AI said this:</div><div><div class="gmail-otQkpb" role="heading" style="font-family:"Google Sans",Roboto,sans-serif;font-size:20px;font-weight:600;margin:24px 0px 12px;border-bottom:0px rgb(22,23,26)">2. Handle Java JNI Typemaps</div><div class="gmail-n6owBd gmail-awi2gc" style="font-family:"Google Sans",Roboto,sans-serif;font-size:16px;margin:12px 0px 16px;border-bottom:0px rgb(22,23,26)">Because <code dir="ltr" class="gmail-KDcb0c" style="font-size:14px;margin:0px;border-bottom:0.571429px solid rgb(240,242,245)">int**</code> and object arrays (<code dir="ltr" class="gmail-KDcb0c" style="font-size:14px;margin:0px;border-bottom:0.571429px solid rgb(240,242,245)">OSRSpatialReferenceShadow***</code>) do not map cleanly to standard Java types, you must ensure your SWIG configuration or a companion helper helper translates them into manageable objects on the Java side.</div><div class="gmail-n6owBd gmail-awi2gc" style="font-family:"Google Sans",Roboto,sans-serif;font-size:16px;margin:12px 0px 16px;border-bottom:0px rgb(22,23,26)">Alternatively, if dealing with direct pointer manipulation via SWIG typemaps is too complex, developers routinely implement a <span class="gmail-rQesXe gmail-MPyX" style="font-weight:700;margin:0px;border-bottom:0px rgb(22,23,26)">custom C++ wrapper function</span> inside <code dir="ltr" class="gmail-KDcb0c" style="font-size:14px;margin:0px;border-bottom:0.571429px solid rgb(240,242,245)">osr.i</code> that bundles the results into a string format (such as an array of matching EPSG strings and confidences) before passing it over the JNI boundary:</div><div class="gmail-yhAwj" style="font-family:"Google Sans",Roboto,sans-serif;font-size:14px;margin:0px;border-bottom:0px rgb(22,23,26)"></div><div class="gmail-r1PmQe" style="font-family:"Google Sans",Roboto,sans-serif;font-size:14px;margin:4px 0px 0px;border-bottom:0px rgb(22,23,26)"><div style="margin:0px;border-bottom:0px rgb(22,23,26)"><div class="gmail-pHpOfb" style="margin:0px;border-bottom:0.571429px solid rgb(240,242,245)"><div class="gmail-z0e9Qd" style="margin:0px;border-bottom:0px rgb(22,23,26)"><div class="gmail-vVRw1d" style="font-size:20px;margin:0px;border-bottom:0px rgb(22,23,26)">swig</div></div><div class="gmail-pCTyYe" dir="ltr" style="margin:0px;border-bottom:0px rgb(22,23,26)"><pre style="margin:14px 0px;border-bottom:0px rgb(22,23,26)"><code style="margin:0px;border-bottom:0px rgb(22,23,26)"><span class="gmail-undefined" style="margin:0px;border-bottom:0px rgb(22,23,26)">%extend OSRSpatialReferenceShadow {
    // A simplified wrapper returning matches as formatted string arrays to avoid pointer hell
    char** FindMatchesSimple(char** options) {
        int nEntries = 0;
        int* panConfidence = NULL;
        OGRSpatialReferenceH* pahSRS = OGRSpatialReference_FindMatches(self, options, &nEntries, &panConfidence);
        
        char** papszResult = NULL;
        // Construct a structured string array containing "EPSG:Code,Confidence"
        for(int i = 0; i < nEntries; i++) {
            const char* pszAuthName = OGRSpatialReference_GetAttrValue(pahSRS[i], "AUTHORITY", 0);
            const char* pszAuthCode = OGRSpatialReference_GetAttrValue(pahSRS[i], "AUTHORITY", 1);
            // Format string logic, append to papszResult...<br>            // BDZ - TODO - NOTE - This is the real work needed to finish this method.
        }
        
        OSRFreeSRSArray(pahSRS);
        CPLFree(panConfidence);
        return papszResult;
    }
}</span></code></pre></div></div></div></div></div></div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Thu, Aug 13, 2026 at 3:08 PM Barry DeZonia <<a href="mailto:bdezonia@gmail.com">bdezonia@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">I could maybe help here but, good god, it's been a long time since I've worked on the Java bindings and I remember almost nothing. Maybe if I inspect the Java bindings code I will remember some stuff. Naively, the function signature looks pretty simple to translate.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Aug 13, 2026 at 6:53 AM Even Rouault via gdal-dev <<a href="mailto:gdal-dev@lists.osgeo.org" target="_blank">gdal-dev@lists.osgeo.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><u></u>

  
    
  
  <div>
    <p>Tom,</p>
    <p>yes FindMatches() is what is needed for your use case and it is
      not currently available in the Java bindings. That would require
      someone to write the appropriate typemap(s) to map the C types to
      Java types.</p>
    <p>Even</p>
    <div>Le 13/08/2026 à 13:15, Tom Moore via
      gdal-dev a écrit :<br>
    </div>
    <blockquote type="cite">
      
      
      <div>Hi all,</div>
      <div><br>
      </div>
      <div>I'm running into a case where
        SpatialReference.AutoIdentifyEPSG() fails on a completely
        standard, well-formed ESRI-dialect .prj file, even though the
        underlying PROJ identification machinery (proj_identify(), as
        exercised via "projinfo --identify") resolves it correctly with
        100% confidence. I'd like to know whether this is a known
        limitation, and whether there's a recommended workaround for
        Java bindings users specifically, since FindMatches() isn't
        exposed there.</div>
      <div><br>
      </div>
      <div>Environment:</div>
      <div>- GDAL 3.11.1 (Windows build)</div>
      <div>- PROJ 9.6.2</div>
      <div>- Java bindings (org.gdal.osr / SWIG)</div>
      <div><br>
      </div>
      <div>Input WKT (contents of a shapefile .prj, ESRI dialect):</div>
      <div><br>
      </div>
      <div>PROJCS["NAD_1983_UTM_Zone_11N",GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-117.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]</div>
      <div><br>
      </div>
      <div>QGIS correctly identifies this as <a>EPSG:26911</a>.</div>
      <div><br>
      </div>
      <div>What I tried (Java):</div>
      <div><br>
      </div>
      <div>    SpatialReference srs = new SpatialReference();</div>
      <div>    srs.ImportFromESRI(lines);   // also tried plain
        ImportFromWkt() but got the same result</div>
      <div>   
        srs.SetAxisMappingStrategy(osrConstants.OAMS_TRADITIONAL_GIS_ORDER);</div>
      <div><br>
      </div>
      <div>    try {</div>
      <div>        srs.AutoIdentifyEPSG();</div>
      <div>    } catch (Exception ex) {</div>
      <div>        System.out.println("Exception: " + ex.getMessage());</div>
      <div>    }</div>
      <div>    System.out.println("code = " +
        srs.GetAuthorityCode(null));</div>
      <div><br>
      </div>
      <div>Result:</div>
      <div><br>
      </div>
      <div>    Exception: OGR Error: Unsupported SRS</div>
      <div>    code = null</div>
      <div><br>
      </div>
      <div>gdal.GetLastErrorType() / GetLastErrorMsg() are empty.  No
        additional diagnostic detail is surfaced beyond the generic
        exception.</div>
      <div><br>
      </div>
      <div>I ruled out several things before suspecting this is a
        AutoIdentifyEPSG() limitation rather than an environment/config
        issue on my end:</div>
      <div><br>
      </div>
      <div>1. proj.db itself is correct.  Confirmed by mounting the
        exact same proj.db (from the PROJ 9 data directory used by my
        JAva app) into a clean <a href="http://ghcr.io/osgeo/gdal:ubuntu-small-latest" target="_blank">ghcr.io/osgeo/gdal:ubuntu-small-latest</a>
        container and running `gdalsrsinfo -e` against the same .prj
        file. It resolved to <a>EPSG:26911</a> correctly, full WKT2 with all
        authority IDs.</div>
      <div>2. PROJ_LIB / PROJ_DATA environment variables are set
        correctly and confirmed using System.getenv() to be visible to
        the process</div>
      <div>3. Tried MorphFromESRI() (both via ImportFromESRI() alone,
        and combined with an explicit MorphFromESRI() call) - no change.</div>
      <div>4. Tried explicit
        SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER) before
        calling AutoIdentifyEPSG() - no change.</div>
      <div>5. Ran the projinfo.exe from the gdal build that I am using
        with the Java app directly against the same .prj file:</div>
      <div><br>
      </div>
      <div>    projinfo.exe --identify fmu.prj</div>
      <div>    ...</div>
      <div>    Identification match count: 1</div>
      <div>    <a>EPSG:26911</a>: 100 %</div>
      <div><br>
      </div>
      <div>So proj_identify() / FindMatches()-equivalent logic resolves
        this WKT perfectly in the exact same native build, but
        AutoIdentifyEPSG() fails on it.</div>
      <div><br>
      </div>
      <div>This looks consistent with a few things I found in the
        tracker/mailing list archives while investigating:</div>
      <div><br>
      </div>
      <div>- <a href="https://trac.osgeo.org/gdal/ticket/6188" target="_blank">https://trac.osgeo.org/gdal/ticket/6188</a>
        -- maintainer comment noting AutoIdentifyEPSG() has "very
        limited capabilities" and would need fuzzy matching to handle
        inexact datum/ellipsoid names, "especially when dealing with WKT
        coming from ESRI." </div>
      <div>- <a href="https://github.com/OSGeo/gdal/issues/4038" target="_blank">https://github.com/OSGeo/gdal/issues/4038</a>
        -- near-identical repro WKT (ESRI-dialect UTM), with a
        maintainer noting AutoIdentifyEPSG() can return
        OGRERR_UNSUPPORTED_SRS while having still injected partial
        AUTHORITY tags into sub-nodes.  This matches what I see when
        printing the WKT after the failed call (DATUM gets <a>EPSG:6269</a>,
        but the top-level PROJCS never gets an ID).</div>
      <div>- <a href="https://github.com/OSGeo/gdal/issues/2303" target="_blank">https://github.com/OSGeo/gdal/issues/2303</a>
        -- shows the standard Python workaround (fall back to
        FindMatches() when AutoIdentifyEPSG() fails), which leads to my
        second question below.</div>
      <div><br>
      </div>
      <div>Questions:</div>
      <div><br>
      </div>
      <div>1. Is AutoIdentifyEPSG() failing on this ESRI-dialect
        NAD83/UTM WKT a known limitation, or does this look like a
        genuine regression/bug worth filing?</div>
      <div>2. FindMatches() does not appear to be exposed in the Java
        SWIG bindings (org.gdal.osr.SpatialReference).  Is that correct,
        or am I missing something? If it's genuinely absent, is there
        any appetite for adding it, given it's the documented fallback
        for exactly this situation in other language bindings?</div>
      <div>3. Short of shelling out to "projinfo --identify" as a
        subprocess, is there a recommended in-process approach for Java
        bindings users to reach the same identification logic?</div>
      <div><br>
      </div>
      <div>Happy to provide a minimal reproducible test case / file a
        tracker issue if that's useful, but I wanted to check here first
        in case this is already understood behavior.</div>
      <div><br>
      </div>
      <div>Thanks,</div>
      <div>Tom</div>
      <div><br>
      </div>
      <br>
      <fieldset></fieldset>
      <pre>_______________________________________________
gdal-dev mailing list
<a href="mailto:gdal-dev@lists.osgeo.org" target="_blank">gdal-dev@lists.osgeo.org</a>
<a href="https://lists.osgeo.org/mailman/listinfo/gdal-dev" target="_blank">https://lists.osgeo.org/mailman/listinfo/gdal-dev</a>
</pre>
    </blockquote>
    <pre cols="72">-- 
<a href="http://www.spatialys.com" target="_blank">http://www.spatialys.com</a>
My software is free, but my time generally not.
LLMs contribute to global warming and brain rot.
Let's guillotine them! "Ah ! ça ira, ça ira, ça ira !"</pre>
  </div>

_______________________________________________<br>
gdal-dev mailing list<br>
<a href="mailto:gdal-dev@lists.osgeo.org" target="_blank">gdal-dev@lists.osgeo.org</a><br>
<a href="https://lists.osgeo.org/mailman/listinfo/gdal-dev" rel="noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/gdal-dev</a><br>
</blockquote></div>
</blockquote></div>