aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2019-02-20 15:03:55 +0100
committerEven Rouault <even.rouault@spatialys.com>2019-02-20 15:03:55 +0100
commit2272ba8f6a77903203632111a44b44e544fe332b (patch)
tree98e0581307448b731fc58a8e84905d07fe132f55
parent04844ac495f65e824a0bd9f9e49ea3360f2c063f (diff)
downloadPROJ-2272ba8f6a77903203632111a44b44e544fe332b.tar.gz
PROJ-2272ba8f6a77903203632111a44b44e544fe332b.zip
projinfo: advertize the use of '--spatial-test intersects' when it can bring more results
-rwxr-xr-xscripts/reformat_cpp.sh2
-rw-r--r--src/apps/projinfo.cpp106
-rwxr-xr-xtest/cli/testprojinfo4
-rw-r--r--test/cli/testprojinfo_out.dist69
4 files changed, 140 insertions, 41 deletions
diff --git a/scripts/reformat_cpp.sh b/scripts/reformat_cpp.sh
index b3140ebe..cc10b53e 100755
--- a/scripts/reformat_cpp.sh
+++ b/scripts/reformat_cpp.sh
@@ -15,7 +15,7 @@ esac
TOPDIR="$SCRIPT_DIR/.."
-for i in "$TOPDIR"/include/proj/*.hpp "$TOPDIR"/include/proj/internal/*.hpp "$TOPDIR"/src/iso19111/*.cpp "$TOPDIR"/test/unit/*.cpp; do
+for i in "$TOPDIR"/include/proj/*.hpp "$TOPDIR"/include/proj/internal/*.hpp "$TOPDIR"/src/iso19111/*.cpp "$TOPDIR"/test/unit/*.cpp "$TOPDIR"/src/apps/projinfo.cpp; do
if ! echo "$i" | grep -q "lru_cache.hpp"; then
"$SCRIPT_DIR"/reformat.sh "$i";
fi
diff --git a/src/apps/projinfo.cpp b/src/apps/projinfo.cpp
index 9f908c8a..9472d99e 100644
--- a/src/apps/projinfo.cpp
+++ b/src/apps/projinfo.cpp
@@ -136,11 +136,11 @@ static std::string c_ify_string(const std::string &str) {
// ---------------------------------------------------------------------------
-static BaseObjectNNPtr buildObject(DatabaseContextPtr dbContext,
- const std::string &user_string,
- bool kindIsCRS, const std::string &context,
- bool buildBoundCRSToWGS84, CoordinateOperationContext::IntermediateCRSUse allowUseIntermediateCRS,
- bool quiet) {
+static BaseObjectNNPtr buildObject(
+ DatabaseContextPtr dbContext, const std::string &user_string,
+ bool kindIsCRS, const std::string &context, bool buildBoundCRSToWGS84,
+ CoordinateOperationContext::IntermediateCRSUse allowUseIntermediateCRS,
+ bool quiet) {
BaseObjectPtr obj;
std::string l_user_string(user_string);
@@ -213,7 +213,8 @@ static BaseObjectNNPtr buildObject(DatabaseContextPtr dbContext,
if (buildBoundCRSToWGS84) {
auto crs = std::dynamic_pointer_cast<CRS>(obj);
if (crs) {
- obj = crs->createBoundCRSToWGS84IfPossible(dbContext, allowUseIntermediateCRS)
+ obj = crs->createBoundCRSToWGS84IfPossible(dbContext,
+ allowUseIntermediateCRS)
.as_nullable();
}
}
@@ -223,8 +224,10 @@ static BaseObjectNNPtr buildObject(DatabaseContextPtr dbContext,
// ---------------------------------------------------------------------------
-static void outputObject(DatabaseContextPtr dbContext, BaseObjectNNPtr obj,
- CoordinateOperationContext::IntermediateCRSUse allowUseIntermediateCRS, const OutputOptions &outputOpt) {
+static void outputObject(
+ DatabaseContextPtr dbContext, BaseObjectNNPtr obj,
+ CoordinateOperationContext::IntermediateCRSUse allowUseIntermediateCRS,
+ const OutputOptions &outputOpt) {
auto identified = dynamic_cast<const IdentifiedObject *>(obj.get());
if (!outputOpt.quiet && identified && identified->isDeprecated()) {
@@ -260,7 +263,7 @@ static void outputObject(DatabaseContextPtr dbContext, BaseObjectNNPtr obj,
}
auto crs = nn_dynamic_pointer_cast<CRS>(obj);
if (!outputOpt.quiet) {
- if( crs ) {
+ if (crs) {
std::cout << "PROJ.4 string:" << std::endl;
} else {
std::cout << "PROJ string:" << std::endl;
@@ -271,8 +274,8 @@ static void outputObject(DatabaseContextPtr dbContext, BaseObjectNNPtr obj,
if (crs) {
objToExport =
nn_dynamic_pointer_cast<IPROJStringExportable>(
- crs->createBoundCRSToWGS84IfPossible(dbContext,
- allowUseIntermediateCRS));
+ crs->createBoundCRSToWGS84IfPossible(
+ dbContext, allowUseIntermediateCRS));
}
if (!objToExport) {
objToExport = projStringExportable;
@@ -411,8 +414,8 @@ static void outputObject(DatabaseContextPtr dbContext, BaseObjectNNPtr obj,
std::shared_ptr<IWKTExportable> objToExport;
if (crs) {
objToExport = nn_dynamic_pointer_cast<IWKTExportable>(
- crs->createBoundCRSToWGS84IfPossible(dbContext,
- allowUseIntermediateCRS));
+ crs->createBoundCRSToWGS84IfPossible(
+ dbContext, allowUseIntermediateCRS));
}
if (!objToExport) {
objToExport = wktExportable;
@@ -514,26 +517,25 @@ static void outputOperations(
DatabaseContextPtr dbContext, const std::string &sourceCRSStr,
const std::string &targetCRSStr, const ExtentPtr &bboxFilter,
CoordinateOperationContext::SpatialCriterion spatialCriterion,
+ bool spatialCriterionExplictlySpecified,
CoordinateOperationContext::SourceTargetCRSExtentUse crsExtentUse,
CoordinateOperationContext::GridAvailabilityUse gridAvailabilityUse,
CoordinateOperationContext::IntermediateCRSUse allowUseIntermediateCRS,
const std::vector<std::pair<std::string, std::string>> &pivots,
const std::string &authority, bool usePROJGridAlternatives,
bool showSuperseded, const OutputOptions &outputOpt, bool summary) {
- auto sourceObj = buildObject(dbContext, sourceCRSStr, true, "source CRS",
- false,
- CoordinateOperationContext::IntermediateCRSUse::NEVER,
- outputOpt.quiet);
+ auto sourceObj = buildObject(
+ dbContext, sourceCRSStr, true, "source CRS", false,
+ CoordinateOperationContext::IntermediateCRSUse::NEVER, outputOpt.quiet);
auto sourceCRS = nn_dynamic_pointer_cast<CRS>(sourceObj);
if (!sourceCRS) {
std::cerr << "source CRS string is not a CRS" << std::endl;
std::exit(1);
}
- auto targetObj = buildObject(dbContext, targetCRSStr, true, "target CRS",
- false,
- CoordinateOperationContext::IntermediateCRSUse::NEVER,
- outputOpt.quiet);
+ auto targetObj = buildObject(
+ dbContext, targetCRSStr, true, "target CRS", false,
+ CoordinateOperationContext::IntermediateCRSUse::NEVER, outputOpt.quiet);
auto targetCRS = nn_dynamic_pointer_cast<CRS>(targetObj);
if (!targetCRS) {
std::cerr << "target CRS string is not a CRS" << std::endl;
@@ -541,6 +543,7 @@ static void outputOperations(
}
std::vector<CoordinateOperationNNPtr> list;
+ size_t spatialCriterionPartialIntersectionResultCount = 0;
try {
auto authFactory =
dbContext
@@ -558,6 +561,21 @@ static void outputOperations(
ctxt->setDiscardSuperseded(!showSuperseded);
list = CoordinateOperationFactory::create()->createOperations(
NN_NO_CHECK(sourceCRS), NN_NO_CHECK(targetCRS), ctxt);
+ if (!spatialCriterionExplictlySpecified &&
+ spatialCriterion == CoordinateOperationContext::SpatialCriterion::
+ STRICT_CONTAINMENT) {
+ try {
+ ctxt->setSpatialCriterion(
+ CoordinateOperationContext::SpatialCriterion::
+ PARTIAL_INTERSECTION);
+ spatialCriterionPartialIntersectionResultCount =
+ CoordinateOperationFactory::create()
+ ->createOperations(NN_NO_CHECK(sourceCRS),
+ NN_NO_CHECK(targetCRS), ctxt)
+ .size();
+ } catch (const std::exception &) {
+ }
+ }
} catch (const std::exception &e) {
std::cerr << "createOperations() failed with: " << e.what()
<< std::endl;
@@ -567,8 +585,14 @@ static void outputOperations(
outputObject(dbContext, list[0], allowUseIntermediateCRS, outputOpt);
return;
}
+ std::cout << "Candidate operations found: " << list.size() << std::endl;
+ if (spatialCriterionPartialIntersectionResultCount > list.size()) {
+ std::cout << "Note: using '--spatial-test intersects' would bring "
+ "more results ("
+ << spatialCriterionPartialIntersectionResultCount << ")"
+ << std::endl;
+ }
if (summary) {
- std::cout << "Candidate operations found: " << list.size() << std::endl;
for (const auto &op : list) {
outputOperationSummary(op);
}
@@ -576,18 +600,15 @@ static void outputOperations(
bool first = true;
for (size_t i = 0; i < list.size(); ++i) {
const auto &op = list[i];
- if (list.size() > 1) {
- if (!first) {
- std::cout << std::endl;
- }
- first = false;
- std::cout << "-------------------------------------"
- << std::endl;
- std::cout << "Operation n"
- "\xC2\xB0"
- << (i + 1) << ":" << std::endl
- << std::endl;
+ if (!first) {
+ std::cout << std::endl;
}
+ first = false;
+ std::cout << "-------------------------------------" << std::endl;
+ std::cout << "Operation n"
+ "\xC2\xB0"
+ << (i + 1) << ":" << std::endl
+ << std::endl;
outputOperationSummary(op);
std::cout << std::endl;
outputObject(dbContext, op, allowUseIntermediateCRS, outputOpt);
@@ -614,6 +635,7 @@ int main(int argc, char **argv) {
bool summary = false;
ExtentPtr bboxFilter = nullptr;
std::string area;
+ bool spatialCriterionExplictlySpecified = false;
CoordinateOperationContext::SpatialCriterion spatialCriterion =
CoordinateOperationContext::SpatialCriterion::STRICT_CONTAINMENT;
CoordinateOperationContext::SourceTargetCRSExtentUse crsExtentUse =
@@ -622,7 +644,8 @@ int main(int argc, char **argv) {
CoordinateOperationContext::GridAvailabilityUse gridAvailabilityUse =
CoordinateOperationContext::GridAvailabilityUse::USE_FOR_SORTING;
CoordinateOperationContext::IntermediateCRSUse allowUseIntermediateCRS =
- CoordinateOperationContext::IntermediateCRSUse::IF_NO_DIRECT_TRANSFORMATION;
+ CoordinateOperationContext::IntermediateCRSUse::
+ IF_NO_DIRECT_TRANSFORMATION;
std::vector<std::pair<std::string, std::string>> pivots;
bool usePROJGridAlternatives = true;
std::string mainDBPath;
@@ -768,6 +791,7 @@ int main(int argc, char **argv) {
} else if (arg == "--spatial-test" && i + 1 < argc) {
i++;
std::string value(argv[i]);
+ spatialCriterionExplictlySpecified = true;
if (ci_equal(value, "contains")) {
spatialCriterion = CoordinateOperationContext::
SpatialCriterion::STRICT_CONTAINMENT;
@@ -822,9 +846,10 @@ int main(int argc, char **argv) {
if (ci_equal(std::string(value), "always")) {
allowUseIntermediateCRS =
CoordinateOperationContext::IntermediateCRSUse::ALWAYS;
- } else if (ci_equal(std::string(value), "if_no_direct_transformation")) {
- allowUseIntermediateCRS =
- CoordinateOperationContext::IntermediateCRSUse::IF_NO_DIRECT_TRANSFORMATION;
+ } else if (ci_equal(std::string(value),
+ "if_no_direct_transformation")) {
+ allowUseIntermediateCRS = CoordinateOperationContext::
+ IntermediateCRSUse::IF_NO_DIRECT_TRANSFORMATION;
} else if (ci_equal(std::string(value), "never")) {
allowUseIntermediateCRS =
CoordinateOperationContext::IntermediateCRSUse::NEVER;
@@ -918,8 +943,8 @@ int main(int argc, char **argv) {
}
if (outputOpt.quiet &&
- (outputOpt.PROJ5 + outputOpt.WKT2_2018 +
- outputOpt.WKT2_2015 + outputOpt.WKT1_GDAL) != 1) {
+ (outputOpt.PROJ5 + outputOpt.WKT2_2018 + outputOpt.WKT2_2015 +
+ outputOpt.WKT1_GDAL) != 1) {
std::cerr << "-q can only be used with a single output format"
<< std::endl;
usage();
@@ -1055,7 +1080,8 @@ int main(int argc, char **argv) {
outputOperations(
dbContext, sourceCRSStr, targetCRSStr, bboxFilter, spatialCriterion,
- crsExtentUse, gridAvailabilityUse, allowUseIntermediateCRS, pivots, authority,
+ spatialCriterionExplictlySpecified, crsExtentUse,
+ gridAvailabilityUse, allowUseIntermediateCRS, pivots, authority,
usePROJGridAlternatives, showSuperseded, outputOpt, summary);
}
diff --git a/test/cli/testprojinfo b/test/cli/testprojinfo
index 111c071e..24a1fdd5 100755
--- a/test/cli/testprojinfo
+++ b/test/cli/testprojinfo
@@ -53,6 +53,10 @@ echo "Testing projinfo -s EPSG:4326 -t EPSG:32631" >> ${OUT}
$EXE -s EPSG:4326 -t EPSG:32631 >>${OUT}
echo "" >>${OUT}
+echo "Testing projinfo -s NAD27 -t NAD83" >> ${OUT}
+$EXE -s NAD27 -t NAD83 >>${OUT}
+echo "" >>${OUT}
+
echo "Testing projinfo -s NAD27 -t NAD83 --grid-check none --spatial-test intersects --summary" >> ${OUT}
$EXE -s NAD27 -t NAD83 --grid-check none --spatial-test intersects --summary >>${OUT}
echo "" >>${OUT}
diff --git a/test/cli/testprojinfo_out.dist b/test/cli/testprojinfo_out.dist
index 15372803..0ce6150d 100644
--- a/test/cli/testprojinfo_out.dist
+++ b/test/cli/testprojinfo_out.dist
@@ -136,6 +136,10 @@ GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.25722
Testing projinfo -s EPSG:4326 -t EPSG:32631
+Candidate operations found: 1
+-------------------------------------
+Operation n°1:
+
EPSG:16031, UTM zone 31N, 0 m, World - N hemisphere - 0°E to 6°E
PROJ string:
@@ -162,6 +166,70 @@ CONVERSION["UTM zone 31N",
ID["EPSG",8807]],
ID["EPSG",16031]]
+Testing projinfo -s NAD27 -t NAD83
+Candidate operations found: 1
+Note: using '--spatial-test intersects' would bring more results (7)
+-------------------------------------
+Operation n°1:
+
+unknown id, Null geographic offset from NAD27 to NAD83, unknown accuracy, World
+
+PROJ string:
+
+
+WKT2_2018 string:
+COORDINATEOPERATION["Null geographic offset from NAD27 to NAD83",
+ SOURCECRS[
+ GEOGCRS["NAD27",
+ DATUM["North American Datum 1927",
+ ELLIPSOID["Clarke 1866",6378206.4,294.978698213898,
+ LENGTHUNIT["metre",1]]],
+ PRIMEM["Greenwich",0,
+ ANGLEUNIT["degree",0.0174532925199433]],
+ CS[ellipsoidal,2],
+ AXIS["geodetic latitude (Lat)",north,
+ ORDER[1],
+ ANGLEUNIT["degree",0.0174532925199433]],
+ AXIS["geodetic longitude (Lon)",east,
+ ORDER[2],
+ ANGLEUNIT["degree",0.0174532925199433]],
+ USAGE[
+ SCOPE["unknown"],
+ AREA["North America - NAD27"],
+ BBOX[7.15,167.65,83.17,-47.74]],
+ ID["EPSG",4267]]],
+ TARGETCRS[
+ GEOGCRS["NAD83",
+ DATUM["North American Datum 1983",
+ ELLIPSOID["GRS 1980",6378137,298.257222101,
+ LENGTHUNIT["metre",1]]],
+ PRIMEM["Greenwich",0,
+ ANGLEUNIT["degree",0.0174532925199433]],
+ CS[ellipsoidal,2],
+ AXIS["geodetic latitude (Lat)",north,
+ ORDER[1],
+ ANGLEUNIT["degree",0.0174532925199433]],
+ AXIS["geodetic longitude (Lon)",east,
+ ORDER[2],
+ ANGLEUNIT["degree",0.0174532925199433]],
+ USAGE[
+ SCOPE["unknown"],
+ AREA["North America - NAD83"],
+ BBOX[14.92,167.65,86.46,-47.74]],
+ ID["EPSG",4269]]],
+ METHOD["Geographic2D offsets",
+ ID["EPSG",9619]],
+ PARAMETER["Latitude offset",0,
+ ANGLEUNIT["degree",0.0174532925199433],
+ ID["EPSG",8601]],
+ PARAMETER["Longitude offset",0,
+ ANGLEUNIT["degree",0.0174532925199433],
+ ID["EPSG",8602]],
+ USAGE[
+ SCOPE["unknown"],
+ AREA["World"],
+ BBOX[-90,-180,90,180]]]
+
Testing projinfo -s NAD27 -t NAD83 --grid-check none --spatial-test intersects --summary
Candidate operations found: 7
DERIVED_FROM(EPSG):1312, NAD27 to NAD83 (3), 1.0 m, Canada
@@ -173,6 +241,7 @@ EPSG:1573, NAD27 to NAD83 (6), 1.5 m, Canada - Quebec
unknown id, Null geographic offset from NAD27 to NAD83, unknown accuracy, World
Testing projinfo -s NAD27 -t NAD83 --grid-check none --spatial-test intersects
+Candidate operations found: 7
-------------------------------------
Operation n°1: