From: Jody G. <jga...@re...> - 2008-07-22 21:39:09
|
So I am back to trying out epsg-hsql with udig. Last time I tried I was able to see the epsg authority but unable to retrieve a list of known codes. This time I am getting a very deep stack trace with way more classloader fun than I am used to debugging. This email is a starting place; I will comment as I learn more. Martin I assume nothing has changed on your end? Here is the stack trace: > org.opengis.referencing.NoSuchAuthorityCodeException: Authority "EPSG" > is unknown or doesn't match the supplied hints. Maybe it is defined in > an unreachable JAR file? > at > org.geotools.referencing.factory.ManyAuthoritiesFactory.noSuchAuthority(ManyAuthoritiesFactory.java:488) > at > org.geotools.referencing.factory.ManyAuthoritiesFactory.getAuthorityFactory(ManyAuthoritiesFactory.java:466) > at > org.geotools.referencing.factory.ManyAuthoritiesFactory.getCRSAuthorityFactory(ManyAuthoritiesFactory.java:547) > at > org.geotools.referencing.factory.AuthorityFactoryAdapter.createCoordinateReferenceSystem(AuthorityFactoryAdapter.java:798) > at > org.geotools.referencing.factory.ThreadedAuthorityFactory.createCoordinateReferenceSystem(ThreadedAuthorityFactory.java:728) > at > org.geotools.referencing.DefaultAuthorityFactory.createCoordinateReferenceSystem(DefaultAuthorityFactory.java:179) > at org.geotools.referencing.CRS.decode(CRS.java:416) > at org.geotools.referencing.CRS.decode(CRS.java:344) > at > net.refractions.udig.libs.internal.Activator.checkReferencingEpsg(Activator.java:87) > at > net.refractions.udig.libs.internal.Activator.start(Activator.java:66) > at > org.eclipse.osgi.framework.internal.core.BundleContextImpl$2.run(BundleContextImpl.java:999) > at java.security.AccessController.doPrivileged(Native Method) > at > org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:993) > at > org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:974) > at > org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:346) > at > org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:260) > at > org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:400) > at > org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:111) > at > org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:417) > at > org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:189) > at > org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass(BundleLoader.java:340) > at > org.eclipse.osgi.framework.internal.core.SingleSourcePackage.loadClass(SingleSourcePackage.java:37) > at > org.eclipse.osgi.framework.internal.core.BundleLoader.findClassInternal(BundleLoader.java:405) > at > org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:369) > at > org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:357) > at > org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:83) > at java.lang.ClassLoader.loadClass(Unknown Source) > at java.lang.ClassLoader.loadClassInternal(Unknown Source) > at java.lang.Class.getDeclaredConstructors0(Native Method) > at java.lang.Class.privateGetDeclaredConstructors(Unknown Source) > at java.lang.Class.getConstructor0(Unknown Source) > at java.lang.Class.newInstance0(Unknown Source) > at java.lang.Class.newInstance(Unknown Source) > at > org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator(AbstractBundle.java:136) > at > org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:970) > at > org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:346) > at > org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:260) > at > org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:400) > at > org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:111) > at > org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:417) > at > org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:189) > at > org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass(BundleLoader.java:340) > at > org.eclipse.osgi.framework.internal.core.SingleSourcePackage.loadClass(SingleSourcePackage.java:37) > at > org.eclipse.osgi.framework.internal.core.BundleLoader.findClassInternal(BundleLoader.java:405) > at > org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:369) > at > org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:357) > at > org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:83) > at java.lang.ClassLoader.loadClass(Unknown Source) > at java.lang.ClassLoader.loadClassInternal(Unknown Source) > at java.lang.Class.getDeclaredConstructors0(Native Method) > at java.lang.Class.privateGetDeclaredConstructors(Unknown Source) > at java.lang.Class.getConstructor0(Unknown Source) > at java.lang.Class.newInstance0(Unknown Source) > at java.lang.Class.newInstance(Unknown Source) > at > org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator(AbstractBundle.java:136) > at > org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:970) > at > org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:346) > at > org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:260) > at > org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:400) > at > org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:111) > at > org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:417) > at > org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:189) > at > org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass(BundleLoader.java:340) > at > org.eclipse.osgi.framework.internal.core.BundleLoader.findClassInternal(BundleLoader.java:408) > at > org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:369) > at > org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:357) > at > org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:83) > at java.lang.ClassLoader.loadClass(Unknown Source) > at > org.eclipse.osgi.framework.internal.core.BundleLoader.loadClass(BundleLoader.java:289) > at > org.eclipse.osgi.framework.internal.core.BundleHost.loadClass(BundleHost.java:227) > at > org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass(AbstractBundle.java:1269) > at > org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:160) > at > org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:788) > at > org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) > at > org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:51) > at > org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:165) > at > org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:106) > at > org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:76) > at > org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:363) > at > org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:176) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) > at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) > at java.lang.reflect.Method.invoke(Unknown Source) > at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:508) > at org.eclipse.equinox.launcher.Main.basicRun(Main.java:447) > at org.eclipse.equinox.launcher.Main.run(Main.java:1173) > at org.eclipse.equinox.launcher.Main.main(Main.java:1148) |
From: Martin D. <mar...@ge...> - 2008-07-22 21:45:16
|
Jody Garnett a écrit : > This email is a starting place; I will comment as I learn more. Martin I > assume nothing has changed on your end? No I haven't done any significant work in EPSG factory for a year or so... I will look if I have idea. Martin |
From: Jody G. <jga...@re...> - 2008-07-23 00:32:34
|
Okay making some progress here - 1. You may not of done significant work in the last year - but we are running in a new version of Eclipse; and thus a new version of OSGi which is trying to buckle down even harder on the kind of hacking we like to do with FactorySPI. 2. FactoryRegistry.scanForPlugins is not getting called by ReferencingFactoryFinder.scanForPlugins() - it does not do this because at the time it is called the factoryRegistry is null. I was trying to *force* a scanForPlugins() while the current thread was in a good classloader to you know ... find stuff. Apparently this is not the way so I will need to experiment. 3. NoSuchAuthorityCodeException is created - without FactoryRegistry.scanForPlugins being called at all So this is confusing for me? The joys of referencing... So far the debug walkthrough looks like this (stop me if there are any surprises): CRS.decode CRS.getAuthorityFactory DefaultAuthorityFactory<init> DefaultAuthorityFactory.getBackingFactory ReferencingFactoryFinder.getCRSAuthoritFactories ReferencingFactoryFinder.getFactories ReferencingFactoryFinder.getServiceRegistry <-- I suspect this method should of called scanForPlugins? <--this method gets a lazy set; when asked for the contents WebCRSFactory and AutoCRSFactory are around but no EPSG factory Please note I am making use of the Hints.FORCE_LONGITUDE_FIRST_AXIS_ORDER hint. So it makes sense that the EPSG factory is not found on the classpath when requested with this Hint. So what is the story again on how these hints are supposed to be used? Is this a case where a global hint (used to describe what the application wants to work with) is interfering with your ability to discover everything on the classpath? Now this is uDig so I am willing to take a little pain here; but I don't want to kill myself on this stuff. It was recommended to me that I should set these hints globally ... perhaps we just have a debugging problem with referencing. Jody Martin Desruisseaux wrote: > Jody Garnett a écrit : >> This email is a starting place; I will comment as I learn more. >> Martin I assume nothing has changed on your end? > > No I haven't done any significant work in EPSG factory for a year or > so... > > I will look if I have idea. > > Martin |
From: Jody G. <jga...@re...> - 2008-07-23 00:39:54
|
Jody Garnett wrote: > Please note I am making use of the Hints.FORCE_LONGITUDE_FIRST_AXIS_ORDER hint. So it makes sense that the > EPSG factory is not found on the classpath when requested with this Hint. > > So what is the story again on how these hints are supposed to be used? > Is this a case where a global hint (used to describe what the > application wants to work with) is interfering with your ability to > discover everything on the classpath? > > Now this is uDig so I am willing to take a little pain here; but I don't > want to kill myself on this stuff. It was recommended to me that I > should set these hints globally ... perhaps we just have a debugging > problem with referencing. > Turning off the FORCE_LONGITUDE_FIRST_AXIS_ORDER as a global default allowed the epsg-hsql authority factory to be discovered. Martin are you still interested in breaking apart the "service discovery" use of factory spi form the management of factory instances? Right now we are asking FactorySPI to pull double duty - something I don't believe it is set up for ... witness the amazing lengths we go to to make a no argument constructor available (for discouvery) along with a constructor that accepts some form of configuration (in the forms of Hints). I am willing to write up a change proposal to this effect. Jody |
From: Jody G. <jga...@re...> - 2008-07-23 01:02:47
|
Mixed success here Martin :-) UDig trunk is able to draw using epsg-hsql - and the results look good. I have been forced to turn off the various global hints as they mess up our ability to find stuff on the classpath. But for today this is worth a commit :-) Jody > Jody Garnett a écrit : >> This email is a starting place; I will comment as I learn more. >> Martin I assume nothing has changed on your end? > > No I haven't done any significant work in EPSG factory for a year or > so... > > I will look if I have idea. > > Martin |
From: Martin D. <mar...@ge...> - 2008-07-23 14:15:50
|
Hello Jody Jody Garnett a écrit : > Martin are you still interested in breaking apart the "service > discovery" use of factory spi form the management of factory instances? It is a good time to revisit the factory system since I'm in cleaning stage right now. I'm sorry that it caused you so much pain with Eclipse classloading. However I don't know yet what a replacement would look like. Do you have any idea? Martin |
From: Jody G. <jga...@re...> - 2008-07-23 16:48:53
|
I got a couple of ideas; but the first one is "low stress"... 1. Reduce FatorySPI use to *just* service discovery ... so an AuthorityFactoryServiceProvider 2. Have create methods on AuthorityFactoryServiceProvider to create the existing AuthorityFactory instances 3. The AuthorityFactoryServiceProvider can cache and recycle instances if needed This is to simplify the problem so we can explore the various plug-in models with out tearing our hair out (I don't think either of us have much left?). Martin Desruisseaux wrote: > Hello Jody > > Jody Garnett a écrit : >> Martin are you still interested in breaking apart the "service >> discovery" use of factory spi form the management of factory instances? > It is a good time to revisit the factory system since I'm in cleaning > stage right now. I'm sorry that it caused you so much pain with > Eclipse classloading. I don't think it was you; I think it is just us pushing the envelope of what Java is capable of years before really good systems were set up. > However I don't know yet what a replacement would look like. Do you > have any idea? I have several thoughts we can explore... In the "library should not force a technological direction on a client application" corner: - We may be able to trade some of the "auto wiring" we currently enjoy; for some configuration steps similar to GeoTools.init - a bold decision but one that may be worthwhile - There are a bazillion containers that can handle the wiring (and even the auto wiring) given nice clean factories with their dependencies advertised - this may just allow automation of the configuration step mentioned above In the "library needs a plug-in system" corner: - OSGi is the obvious one; there are two competing JSRs in the pipe right now and they are already working on compromise. Whatever solution emerges will need to deal with a growing body of OSGi based applications. - Spring has gotten *very very* good at being used inside a library and not inflicting unwanted interfaces and so on into client code (it was one of their funded technical directions for Spring 2.5). Those two may amount to the same thing: - Spring has seen the writing on the wall and is supporting OSGi at some level - Spring is good about isolating your code from subsystems like OSGi (or whatever that othe JSR is) - Spring is just another one of those bazillion containers that handle wiring In anycase let us get 2.5.x safely branched and we can work on this together. Jody |
From: Jody G. <jga...@re...> - 2008-07-25 20:09:44
Attachments:
epsg-hsql.PNG
|
Jody Garnett wrote: > So I am back to trying out epsg-hsql with udig. > > Last time I tried I was able to see the epsg authority but unable to > retrieve a list of known codes. This time I am getting a very deep stack > trace with way more classloader fun than I am used to debugging. > > This email is a starting place; I will comment as I learn more. Martin I > assume nothing has changed on your end? > Hi Martin - first some good news. The big problem last time I tried to use epsg-hsql was obtaining a list of all valid codes - this now works :-) When I type 4326 into the search field I get two things listed: - UNNAMED:4326 - EPSG:$326 Perhaps this is indicative of a problem we can test for? However as the attached screen snap shows things are far from perfect. If I arrange for my map projection to match the data projection everything is fine; the following was taken based on a transformation from > GEOGCS["GCS_WGS_1984", > DATUM["D_WGS_1984", > SPHEROID["WGS_1984", 6378137.0, 298.257223563]], > PRIMEM["Greenwich", 0.0], > UNIT["degree", 0.017453292519943295], > AXIS["Longitude", EAST], > AXIS["Latitude", NORTH]] To: > GEOGCS["WGS 84", > DATUM["World Geodetic System 1984", > SPHEROID["WGS 84", 6378137.0, 298.257223563, > AUTHORITY["EPSG","7030"]], > AUTHORITY["EPSG","6326"]], > PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], > UNIT["degree", 0.017453292519943295], > AXIS["Geodetic latitude", NORTH], > AXIS["Geodetic longitude", EAST], > AUTHORITY["EPSG","4326"]] |
From: Jody G. <jga...@re...> - 2008-07-28 18:24:40
|
Martin Desruisseaux wrote: > Jody Garnett a écrit : >> I tried that already; it had no effect so I rolled it back. I was >> more concerned that the global hints activly prevent the epsg-hsql >> authority from showing up (it is literally never found). > I was going to suggest you to run the program that I wrote a years or > so ago, which was dumping a snapshot of all registered factories as a > tree. But I'm unable to remember where I put it. I just spend > half-an-hour searching in the JIRA database (we created a JIRA task > with usage instruction and screenshot), and I'm totally unable to find > it back... > > GeoTools is a bazar (I'm partially responsible for that as well), and > this bazar is hurting all of us :( I document things - here is the link: Here is the dump when no global hints are used: > Referencing failed to produce expected transformation; check that axis > order settings are correct. > Referencing failed to transformation with expected accuracy: Off by > 344.02671383679035 > DefaultAuthorityFactory["All"] (crs, buffered) > ????ManyAuthoritiesFactory["All"] (crs, cs, datum, operation, optional) > ????ThreadedHsqlEpsgFactory["EPSG"] (crs, cs, datum, operation, > buffered, optional, registered) > ? ????FactoryUsingHSQL["EPSG"] (crs, cs, datum, operation) > ? ????ReferencingObjectFactory[direct] (crs, cs, datum, > buffered, registered) > ? ????DatumAliases[direct] (datum, registered) > ????AutoCRSFactory["AUTO2", "AUTO"] (crs, registered) > ? ????ReferencingObjectFactory[direct] (crs, cs, datum, > buffered, registered) > ? ????DatumAliases[direct] (datum, registered) > ????HTTP_AuthorityFactory["http://www.opengis.net"] (crs, cs, > datum, operation, optional, registered) > ? ????AllAuthoritiesFactory["All"] (crs, cs, datum, operation, > optional) > ? ????ThreadedHsqlEpsgFactory["EPSG"] (crs, cs, datum, > operation, buffered, optional, registered) > ? ? ????FactoryUsingHSQL["EPSG"] (crs, cs, datum, operation) > ? ? ????ReferencingObjectFactory[direct] (crs, cs, > datum, buffered, registered) > ? ? ????DatumAliases[direct] (datum, registered) > ? ????AutoCRSFactory["AUTO2", "AUTO"] (crs, registered) > ? ? ????ReferencingObjectFactory[direct] (crs, cs, datum, > buffered, registered) > ? ? ????DatumAliases[direct] (datum, registered) > ? ????WebCRSFactory["CRS"] (crs, registered) > ? ? ????ReferencingObjectFactory[direct] (crs, cs, datum, > buffered, registered) > ? ? ????DatumAliases[direct] (datum, registered) > ? ????URN_AuthorityFactory["urn:ogc:def", "urn:x-ogc:def"] > (crs, cs, datum, operation, optional, registered) > ????WebCRSFactory["CRS"] (crs, registered) > ? ????ReferencingObjectFactory[direct] (crs, cs, datum, > buffered, registered) > ? ????DatumAliases[direct] (datum, registered) > ????URN_AuthorityFactory["urn:ogc:def", "urn:x-ogc:def"] (crs, cs, > datum, operation, optional, registered) > ????AllAuthoritiesFactory["All"] (crs, cs, datum, operation, > optional) > ????ThreadedHsqlEpsgFactory["EPSG"] (crs, cs, datum, > operation, buffered, optional, registered) > ? ????FactoryUsingHSQL["EPSG"] (crs, cs, datum, operation) > ? ????ReferencingObjectFactory[direct] (crs, cs, > datum, buffered, registered) > ? ????DatumAliases[direct] (datum, registered) > ????AutoCRSFactory["AUTO2", "AUTO"] (crs, registered) > ? ????ReferencingObjectFactory[direct] (crs, cs, datum, > buffered, registered) > ? ????DatumAliases[direct] (datum, registered) > ????HTTP_AuthorityFactory["http://www.opengis.net"] (crs, > cs, datum, operation, optional, registered) > ????WebCRSFactory["CRS"] (crs, registered) > ????ReferencingObjectFactory[direct] (crs, cs, datum, > buffered, registered) > ????DatumAliases[direct] (datum, registered) |
From: Jody G. <jga...@re...> - 2008-07-28 18:33:21
|
Here is what it looks like when global hints are used: Map<Key, Boolean> map = new HashMap<Key, Boolean> (); map.put( Hints.FORCE_LONGITUDE_FIRST_AXIS_ORDER, true ); map.put( Hints.FORCE_STANDARD_AXIS_DIRECTIONS, true ); map.put( Hints.FORCE_STANDARD_AXIS_UNITS, true ); map.put( Hints.LENIENT_DATUM_SHIFT, true ); Hints global = new Hints(map); GeoTools.init( global ); CRS.main(new String[]{"-dependencies"}); Results in the following: > DefaultAuthorityFactory["All"] (crs, buffered) > ????ManyAuthoritiesFactory["All"] (crs, cs, datum, operation, optional) > ????WebCRSFactory["CRS"] (crs, registered) > ? ????ReferencingObjectFactory[direct] (crs, cs, datum, > buffered, registered) > ? ????DatumAliases[direct] (datum, registered) > ????AutoCRSFactory["AUTO2", "AUTO"] (crs, registered) > ? ????ReferencingObjectFactory[direct] (crs, cs, datum, > buffered, registered) > ? ????DatumAliases[direct] (datum, registered) > ????URN_AuthorityFactory["urn:ogc:def", "urn:x-ogc:def"] (crs, cs, > datum, operation, optional, registered) > ? ????AllAuthoritiesFactory["All"] (crs, cs, datum, operation, > optional) > ? ????ThreadedHsqlEpsgFactory["EPSG"] (crs, cs, datum, > operation, buffered, optional, registered) > ? ? ????FactoryUsingHSQL["EPSG"] (crs, cs, datum, operation) > ? ? ????ReferencingObjectFactory[direct] (crs, cs, > datum, buffered, registered) > ? ? ????DatumAliases[direct] (datum, registered) > ? ????WebCRSFactory["CRS"] (crs, registered) > ? ? ????ReferencingObjectFactory[direct] (crs, cs, datum, > buffered, registered) > ? ? ????DatumAliases[direct] (datum, registered) > ? ????AutoCRSFactory["AUTO2", "AUTO"] (crs, registered) > ? ? ????ReferencingObjectFactory[direct] (crs, cs, datum, > buffered, registered) > ? ? ????DatumAliases[direct] (datum, registered) > ? ????HTTP_AuthorityFactory["http://www.opengis.net"] (crs, > cs, datum, operation, optional, registered) > ????HTTP_AuthorityFactory["http://www.opengis.net"] (crs, cs, > datum, operation, optional, registered) > ????AllAuthoritiesFactory["All"] (crs, cs, datum, operation, > optional) > ????ThreadedHsqlEpsgFactory["EPSG"] (crs, cs, datum, > operation, buffered, optional, registered) > ? ????FactoryUsingHSQL["EPSG"] (crs, cs, datum, operation) > ? ????ReferencingObjectFactory[direct] (crs, cs, > datum, buffered, registered) > ? ????DatumAliases[direct] (datum, registered) > ????WebCRSFactory["CRS"] (crs, registered) > ? ????ReferencingObjectFactory[direct] (crs, cs, datum, > buffered, registered) > ? ????DatumAliases[direct] (datum, registered) > ????AutoCRSFactory["AUTO2", "AUTO"] (crs, registered) > ? ????ReferencingObjectFactory[direct] (crs, cs, datum, > buffered, registered) > ? ????DatumAliases[direct] (datum, registered) > ????URN_AuthorityFactory["urn:ogc:def", "urn:x-ogc:def"] > (crs, cs, datum, operation, optional, registered) |