Skip to content

Commit

Permalink
createFromCRSCodesWithIntermediates(): improve perf when no match
Browse files Browse the repository at this point in the history
createFromCRSCodesWithIntermediates() runs a rather costly self-join.
Only run it if the source and target CRS are the source/target of a
coordinate operation. This helps for the performance of
proj_create_crs_to_crs() when run on projected CRS for example that are
extremely unlikely to be the source/target of an operation (except
currently the Finish ones). For the EPSG:26915 to EPSG:3857 case of
OSGeo/gdal#3470, this helps decreasing the
time of proj_create_crs_to_crs() from 18 ms to 10 ms.
  • Loading branch information
rouault committed Mar 18, 2021
1 parent 6293c43 commit 9393831
Showing 1 changed file with 16 additions and 0 deletions.
16 changes: 16 additions & 0 deletions src/iso19111/factory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4243,6 +4243,22 @@ AuthorityFactory::createFromCRSCodesWithIntermediates(
return listTmp;
}

const auto CheckIfHasOperations = [=](const std::string &auth_name,
const std::string &code) {
return !(d->run("SELECT 1 FROM coordinate_operation_view WHERE "
"(source_crs_auth_name = ? AND source_crs_code = ?) OR "
"(target_crs_auth_name = ? AND target_crs_code = ?)",
{auth_name, code, auth_name, code})
.empty());
};

// If the source or target CRS are not the source or target of an operation,
// do not run the next costly requests.
if (!CheckIfHasOperations(sourceCRSAuthName, sourceCRSCode) ||
!CheckIfHasOperations(targetCRSAuthName, targetCRSCode)) {
return listTmp;
}

const std::string sqlProlog(
discardSuperseded
?
Expand Down

0 comments on commit 9393831

Please sign in to comment.