aboutsummaryrefslogtreecommitdiff
path: root/src/io.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2018-11-26 15:47:57 +0100
committerEven Rouault <even.rouault@spatialys.com>2018-11-29 00:35:25 +0100
commit67758b2c67ea329116b59818c038797667c4e1d1 (patch)
tree7e6b4ead6cbe9251ea5ef64d6c45179287597b2e /src/io.cpp
parent7e05bd0ff52fe3ba78dfd75f9ebebe3dfe715bca (diff)
downloadPROJ-67758b2c67ea329116b59818c038797667c4e1d1.tar.gz
PROJ-67758b2c67ea329116b59818c038797667c4e1d1.zip
Redirect epsg:XXXX and IGNF:XXXX CRS expansions to the database, and remove the data/epsg and data/IGNF files
Diffstat (limited to 'src/io.cpp')
-rw-r--r--src/io.cpp85
1 files changed, 49 insertions, 36 deletions
diff --git a/src/io.cpp b/src/io.cpp
index 15df312b..7a0a7435 100644
--- a/src/io.cpp
+++ b/src/io.cpp
@@ -7009,14 +7009,15 @@ PROJStringParser::createFromPROJString(const std::string &projString) {
// Those used to come from a text init file
// We only support them in compatibility mode
- if (ci_starts_with(d->steps_[0].name, "epsg:") ||
- ci_starts_with(d->steps_[0].name, "IGNF:")) {
+ const std::string &stepName = d->steps_[0].name;
+ if (ci_starts_with(stepName, "epsg:") ||
+ ci_starts_with(stepName, "IGNF:")) {
bool usePROJ4InitRules = d->usePROJ4InitRules_;
if (!usePROJ4InitRules) {
PJ_CONTEXT *ctx = proj_context_create();
if (ctx) {
- usePROJ4InitRules =
- proj_context_get_use_proj4_init_rules(ctx) == TRUE;
+ usePROJ4InitRules = proj_context_get_use_proj4_init_rules(
+ ctx, FALSE) == TRUE;
proj_context_destroy(ctx);
}
}
@@ -7024,41 +7025,52 @@ PROJStringParser::createFromPROJString(const std::string &projString) {
throw ParsingException("init=epsg:/init=IGNF: syntax not "
"supported in non-PROJ4 emulation mode");
}
- auto obj =
- createFromUserInput(d->steps_[0].name, d->dbContext_, true);
- auto crs = dynamic_cast<CRS *>(obj.get());
- if (crs) {
- PropertyMap properties;
- properties.set(IdentifiedObject::NAME_KEY, crs->nameStr());
- const auto &extent = getExtent(crs);
- if (extent) {
- properties.set(common::ObjectUsage::DOMAIN_OF_VALIDITY_KEY,
- NN_NO_CHECK(extent));
- }
- auto geogCRS = dynamic_cast<GeographicCRS *>(crs);
- if (geogCRS) {
- // Override with longitude latitude in radian
- return GeographicCRS::create(
- properties, geogCRS->datum(), geogCRS->datumEnsemble(),
- EllipsoidalCS::createLongitudeLatitude(
- UnitOfMeasure::RADIAN));
- }
- auto projCRS = dynamic_cast<ProjectedCRS *>(crs);
- if (projCRS) {
- // Override with easting northing order
- const auto &conv = projCRS->derivingConversionRef();
- if (conv->method()->getEPSGCode() !=
- EPSG_CODE_METHOD_TRANSVERSE_MERCATOR_SOUTH_ORIENTATED) {
- return ProjectedCRS::create(
- properties, projCRS->baseCRS(), conv,
- CartesianCS::createEastingNorthing(
- projCRS->coordinateSystem()
- ->axisList()[0]
- ->unit()));
+
+ PJ_CONTEXT *ctx = proj_context_create();
+ char unused[256];
+ std::string initname(stepName);
+ initname.resize(initname.find(':'));
+ int file_found =
+ pj_find_file(ctx, initname.c_str(), unused, sizeof(unused));
+ proj_context_destroy(ctx);
+ if (!file_found) {
+ auto obj = createFromUserInput(stepName, d->dbContext_, true);
+ auto crs = dynamic_cast<CRS *>(obj.get());
+ if (crs) {
+ PropertyMap properties;
+ properties.set(IdentifiedObject::NAME_KEY, crs->nameStr());
+ const auto &extent = getExtent(crs);
+ if (extent) {
+ properties.set(
+ common::ObjectUsage::DOMAIN_OF_VALIDITY_KEY,
+ NN_NO_CHECK(extent));
+ }
+ auto geogCRS = dynamic_cast<GeographicCRS *>(crs);
+ if (geogCRS) {
+ // Override with longitude latitude in radian
+ return GeographicCRS::create(
+ properties, geogCRS->datum(),
+ geogCRS->datumEnsemble(),
+ EllipsoidalCS::createLongitudeLatitude(
+ UnitOfMeasure::RADIAN));
+ }
+ auto projCRS = dynamic_cast<ProjectedCRS *>(crs);
+ if (projCRS) {
+ // Override with easting northing order
+ const auto &conv = projCRS->derivingConversionRef();
+ if (conv->method()->getEPSGCode() !=
+ EPSG_CODE_METHOD_TRANSVERSE_MERCATOR_SOUTH_ORIENTATED) {
+ return ProjectedCRS::create(
+ properties, projCRS->baseCRS(), conv,
+ CartesianCS::createEastingNorthing(
+ projCRS->coordinateSystem()
+ ->axisList()[0]
+ ->unit()));
+ }
}
}
+ return obj;
}
- return obj;
}
paralist *init = pj_mkparam(("init=" + d->steps_[0].name).c_str());
@@ -7284,6 +7296,7 @@ PROJStringParser::createFromPROJString(const std::string &projString) {
throw ParsingException("out of memory");
}
proj_log_func(pj_context, &logger, Logger::log);
+ proj_context_use_proj4_init_rules(pj_context, d->usePROJ4InitRules_);
auto pj = proj_create(pj_context, projString.c_str());
bool valid = pj != nullptr;
proj_destroy(pj);