aboutsummaryrefslogtreecommitdiff
path: root/src/iso19111/factory.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2021-04-11 13:27:35 +0200
committerEven Rouault <even.rouault@spatialys.com>2021-04-12 12:48:42 +0200
commitd582ac8bae02b25e25685755173715ebf9349573 (patch)
treea02305fcb019ba5013cec218209b0c09a473005a /src/iso19111/factory.cpp
parent3bc25ac8a9deb868174a19392266dd2c870e3179 (diff)
downloadPROJ-d582ac8bae02b25e25685755173715ebf9349573.tar.gz
PROJ-d582ac8bae02b25e25685755173715ebf9349573.zip
Add proj_get_celestial_body_name() and make proj_get_crs_info_list_from_database() filter on and return celestial body name
Diffstat (limited to 'src/iso19111/factory.cpp')
-rw-r--r--src/iso19111/factory.cpp60
1 files changed, 40 insertions, 20 deletions
diff --git a/src/iso19111/factory.cpp b/src/iso19111/factory.cpp
index 7037d642..19db111b 100644
--- a/src/iso19111/factory.cpp
+++ b/src/iso19111/factory.cpp
@@ -3544,7 +3544,8 @@ const DatabaseContextNNPtr &AuthorityFactory::databaseContext() const {
AuthorityFactory::CRSInfo::CRSInfo()
: authName{}, code{}, name{}, type{ObjectType::CRS}, deprecated{},
bbox_valid{}, west_lon_degree{}, south_lat_degree{}, east_lon_degree{},
- north_lat_degree{}, areaName{}, projectionMethodName{} {}
+ north_lat_degree{}, areaName{}, projectionMethodName{},
+ celestialBodyName{} {}
//! @endcond
// ---------------------------------------------------------------------------
@@ -7350,52 +7351,70 @@ std::list<AuthorityFactory::CRSInfo> AuthorityFactory::getCRSInfoList() const {
return sql;
};
+ const auto getJoinCelestialBody = [](const char *crs_alias) {
+ std::string sql("JOIN geodetic_datum gd ON gd.auth_name = ");
+ sql += crs_alias;
+ sql += ".datum_auth_name AND gd.code = ";
+ sql += crs_alias;
+ sql += ".datum_code "
+ "JOIN ellipsoid e ON e.auth_name = gd.ellipsoid_auth_name "
+ "AND e.code = gd.ellipsoid_code "
+ "JOIN celestial_body cb ON "
+ "cb.auth_name = e.celestial_body_auth_name "
+ "AND cb.code = e.celestial_body_code ";
+ return sql;
+ };
+
std::string sql = "SELECT * FROM ("
"SELECT c.auth_name, c.code, c.name, c.type, "
"c.deprecated, "
"a.west_lon, a.south_lat, a.east_lon, a.north_lat, "
- "a.description, NULL FROM geodetic_crs c " +
- getSqlArea("geodetic_crs");
+ "a.description, NULL, cb.name FROM geodetic_crs c ";
+ sql += getSqlArea("geodetic_crs");
+ sql += getJoinCelestialBody("c");
ListOfParams params;
if (d->hasAuthorityRestriction()) {
- sql += " WHERE c.auth_name = ?";
+ sql += "WHERE c.auth_name = ? ";
params.emplace_back(d->authority());
}
- sql += " UNION ALL ";
- sql += "SELECT c.auth_name, c.code, c.name, 'projected', "
+ sql += "UNION ALL SELECT c.auth_name, c.code, c.name, 'projected', "
"c.deprecated, "
"a.west_lon, a.south_lat, a.east_lon, a.north_lat, "
- "a.description, cm.name AS conversion_method_name FROM "
- "projected_crs c ";
- sql += getSqlArea("projected_crs");
- sql += "LEFT JOIN conversion_table conv ON "
+ "a.description, cm.name, cb.name AS conversion_method_name FROM "
+ "projected_crs c "
+ "LEFT JOIN conversion_table conv ON "
"c.conversion_auth_name = conv.auth_name AND "
"c.conversion_code = conv.code "
"LEFT JOIN conversion_method cm ON "
"conv.method_auth_name = cm.auth_name AND "
- "conv.method_code = cm.code";
+ "conv.method_code = cm.code "
+ "JOIN geodetic_crs gcrs ON "
+ "gcrs.auth_name = c.geodetic_crs_auth_name "
+ "AND gcrs.code = c.geodetic_crs_code ";
+ sql += getSqlArea("projected_crs");
+ sql += getJoinCelestialBody("gcrs");
if (d->hasAuthorityRestriction()) {
- sql += " WHERE c.auth_name = ?";
+ sql += "WHERE c.auth_name = ? ";
params.emplace_back(d->authority());
}
- sql += " UNION ALL ";
- sql += "SELECT c.auth_name, c.code, c.name, 'vertical', "
+ // FIXME: we can't handle non-EARTH vertical CRS for now
+ sql += "UNION ALL SELECT c.auth_name, c.code, c.name, 'vertical', "
"c.deprecated, "
"a.west_lon, a.south_lat, a.east_lon, a.north_lat, "
- "a.description, NULL FROM vertical_crs c ";
+ "a.description, NULL, 'Earth' FROM vertical_crs c ";
sql += getSqlArea("vertical_crs");
if (d->hasAuthorityRestriction()) {
- sql += " WHERE c.auth_name = ?";
+ sql += "WHERE c.auth_name = ? ";
params.emplace_back(d->authority());
}
- sql += " UNION ALL ";
- sql += "SELECT c.auth_name, c.code, c.name, 'compound', "
+ // FIXME: we can't handle non-EARTH vertical CRS for now
+ sql += "UNION ALL SELECT c.auth_name, c.code, c.name, 'compound', "
"c.deprecated, "
"a.west_lon, a.south_lat, a.east_lon, a.north_lat, "
- "a.description, NULL FROM compound_crs c ";
+ "a.description, NULL, 'Earth' FROM compound_crs c ";
sql += getSqlArea("compound_crs");
if (d->hasAuthorityRestriction()) {
- sql += " WHERE c.auth_name = ?";
+ sql += "WHERE c.auth_name = ? ";
params.emplace_back(d->authority());
}
sql += ") r ORDER BY auth_name, code";
@@ -7432,6 +7451,7 @@ std::list<AuthorityFactory::CRSInfo> AuthorityFactory::getCRSInfoList() const {
}
info.areaName = row[9];
info.projectionMethodName = row[10];
+ info.celestialBodyName = row[11];
res.emplace_back(info);
}
return res;