[PROJ] More confusion regarding proj 6
Nyall Dawson
nyall.dawson at gmail.com
Tue Apr 30 03:58:17 PDT 2019
On Tue, 30 Apr 2019 at 20:44, Even Rouault <even.rouault at spatialys.com> wrote:
>
> Hi Nyall,
> >
> > Q1:
> >
> > I have the WKT string:
> >
> > GEOGCS["WGS 84",
> > DATUM["WGS_1984",
> > SPHEROID["WGS 84",6378137,298.257223563,
> > AUTHORITY["EPSG","7030"]],
> > TOWGS84[0,0,0,0,0,0,0],
> > AUTHORITY["EPSG","6326"]],
> > PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],
> > UNIT["DMSH",0.0174532925199433,AUTHORITY["EPSG","9108"]],
> > AXIS["Lat",NORTH],
> > AXIS["Long",EAST],
> > AUTHORITY["EPSG","4326"]]
> >
> > I call proj_create_from_wkt using this string, and get an object back.
> > But calling methods like proj_get_id_auth_name or proj_get_id_code
> > gives no result here. I'd expect EPSG/4326. What am I missing?
>
> OK, I admit this is subtle. The issue here is that there is a TOWGS84[]
> clause, hence the returned object is not a GeographicCRS, but a BoundCRS of a
> GeographicCRS (a rather useless one, because the DATUM is already WGS84, so
> the TOWGS84[] clause could have been omitted). The BoundCRS has not the ID
> attached to it, only its base CRS.
>
> Let me advertize again the projinfo utility as a investigation tool, because
> projinfo 'GEOGCS["WGS...' will return the WKT2_2018 representation, which
> shows that it is a BOUNDCRS)
>
> The following will give you what you expect:
>
> #include "proj.h"
> #include <assert.h>
> #include <stdio.h>
>
> int main()
> {
> PJ_CONTEXT* ctx = NULL;
> PJ* p = proj_create_from_wkt(ctx,
> "GEOGCS[\"WGS 84\","
> "DATUM[\"WGS_1984\","
> " SPHEROID[\"WGS 84\",6378137,298.257223563,"
> " AUTHORITY[\"EPSG\",\"7030\"]],"
> " TOWGS84[0,0,0,0,0,0,0],"
> " AUTHORITY[\"EPSG\",\"6326\"]],"
> "PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],"
> "UNIT[\"DMSH\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9108\"]],"
> "AXIS[\"Lat\",NORTH],"
> "AXIS[\"Long\",EAST],"
> "AUTHORITY[\"EPSG\",\"4326\"]]", NULL, NULL, NULL);
>
> assert(proj_get_type(p) == PJ_TYPE_BOUND_CRS);
> PJ* base = proj_get_source_crs(ctx, p);
>
> printf("%s %s\n", proj_get_id_auth_name(base, 0), proj_get_id_code(base,
> 0));
> proj_destroy(base);
> proj_destroy(p);
> return 0;
> }
>
> >
> > Q2:
> >
> > If I call proj_create using "+proj=longlat +ellps=WGS84
> > +towgs84=0,0,0,0,0,0,0 +no_defs +type=crs", I get something back. What
> > is this something? Trying to call proj_crs_get_coordinate_system on
> > the returned value throws the error "Object is not a SingleCRS". How
> > can I get a coordinate system from this result?
>
> Same as above. A boundCRS (and projinfo is still of help here :-)) You can get
> the coordinate system of its sourceCRS by first fetching it with
> proj_get_source_crs().
>
> >
> > Q3:
> >
> > Sometimes the objects returned by database creation are CompoundCRS. I
> > gather I should be using proj_crs_get_sub_crs to get the horizontal
> > crs from these, but the docs state: "Index of the CRS component
> > (typically 0 = horizontal, 1 = vertical)". Can I just blindly call use
> > an index of 0 and hope for the best? I can't see any other methods to
> > work with CompoundCRS objects, so I can't iterate through the indexes
> > as I don't know how many there are. Or are there always 2?
>
> There should be (normally) at least 2 components in a CompoundCRS. In theory
> there might be more, but that would be completely exotic objects (spatio-
> temporal CRS, spatio-temporal-parametric CRS) and you shouldn't encounter them
> in practice.
>
> proj_crs_get_sub_crs(crs, idx) will cleanly return NULL if you try to access a
> component that does not exist. Yes, there is not function to return the number
> of components, so checking for NULL is the way to go.
Perfect -- many thanks Even! Sounds like most of my issues are
stemming from similar underlying causes, and I'll need to wrap up a
generic "getHorizontalSingleCRSfromPJ" function which handles these
different situations.
Nyall
>
> Even
>
> --
> Spatialys - Geospatial professional services
> http://www.spatialys.com
More information about the PROJ
mailing list