正在显示
15 个修改的文件
包含
428 行增加
和
110 行删除
| @@ -94,6 +94,78 @@ bool DmpVectorLayer::writeXml(boost::property_tree::ptree &layerNode) | @@ -94,6 +94,78 @@ bool DmpVectorLayer::writeXml(boost::property_tree::ptree &layerNode) | ||
| 94 | return true; | 94 | return true; |
| 95 | } | 95 | } |
| 96 | 96 | ||
| 97 | +bool DmpVectorLayer::writejson(std::string& json) | ||
| 98 | +{ | ||
| 99 | + string shapeTypeString ="UNKNOWORD"; | ||
| 100 | + | ||
| 101 | + switch (wkbType_) | ||
| 102 | + { | ||
| 103 | + case DmpWkbTypes::Point: shapeTypeString = "POINT"; | ||
| 104 | + break; | ||
| 105 | + case DmpWkbTypes::MultiPoint: shapeTypeString = "MULTIPOINT"; | ||
| 106 | + break; | ||
| 107 | + case DmpWkbTypes::LineString: shapeTypeString = "LINESTRING"; | ||
| 108 | + break; | ||
| 109 | + case DmpWkbTypes::MultiLineString: shapeTypeString = "MULTILINESTRING"; | ||
| 110 | + break; | ||
| 111 | + case DmpWkbTypes::Polygon : shapeTypeString = "POLYGON"; | ||
| 112 | + break; | ||
| 113 | + case DmpWkbTypes::MultiPolygon : shapeTypeString = "MULTIPOLYGON"; | ||
| 114 | + break; | ||
| 115 | + default: | ||
| 116 | + shapeTypeString ="UNKNOWORD"; | ||
| 117 | + break; | ||
| 118 | + } | ||
| 119 | + | ||
| 120 | + bool alwaysShow = this->minScale() == 0 && this->maxScale() >10000000000; | ||
| 121 | + char buff_maxscale[100]; | ||
| 122 | + char buff_minscale[100]; | ||
| 123 | + if(this->maxScale() > 100000000) | ||
| 124 | + { | ||
| 125 | + sprintf(buff_maxscale,"%e", this->maxScale()); | ||
| 126 | + } | ||
| 127 | + else | ||
| 128 | + { | ||
| 129 | + sprintf(buff_maxscale,"%.0f", this->maxScale()); | ||
| 130 | + } | ||
| 131 | + | ||
| 132 | + if(this->minScale() > 100000000) | ||
| 133 | + { | ||
| 134 | + sprintf(buff_minscale,"%e", this->minScale() ); | ||
| 135 | + } | ||
| 136 | + else | ||
| 137 | + { | ||
| 138 | + sprintf(buff_minscale,"%.0f", this->minScale() ); | ||
| 139 | + } | ||
| 140 | + //Display scale setting type="1" geometry="Point" alwaysShow="true" maxScale="0" maxScale="50000"> | ||
| 141 | + char resultbuff[1000]; | ||
| 142 | + sprintf(resultbuff, | ||
| 143 | + R"({"workspace":"","type":"1","dbsourceid":"%s","data":"","schema":"%s","alias":"%s","name":"%s","id":"%s","filter":"%s","visible":"%s","tag":"","minScale":"%s","maxScale":"%s","geometry":"%s","alwaysShow":"%s")", | ||
| 144 | + this->source().c_str(), | ||
| 145 | + this->schema().c_str(), | ||
| 146 | + this->title().c_str(), | ||
| 147 | + this->name().c_str(), | ||
| 148 | + this->id().c_str(), | ||
| 149 | + this->wherestr_.c_str(), | ||
| 150 | + "true", | ||
| 151 | + buff_minscale,buff_maxscale, | ||
| 152 | + shapeTypeString.c_str(), | ||
| 153 | + alwaysShow?"true":"false" | ||
| 154 | + ); | ||
| 155 | + | ||
| 156 | + json.append(resultbuff); | ||
| 157 | + if(this->renderer_30_ != nullptr) | ||
| 158 | + { | ||
| 159 | + | ||
| 160 | + json.append(","); | ||
| 161 | + DmapCore_30::AppendBuffer ab; | ||
| 162 | + this->renderer_30_->ToJson(&ab); | ||
| 163 | + json.append(ab.GetString()); | ||
| 164 | + } | ||
| 165 | + json.append("}"); | ||
| 166 | + return true; | ||
| 167 | +} | ||
| 168 | + | ||
| 97 | void DmpVectorLayer::setRenderer(DmpFeatureRenderer *renderer) | 169 | void DmpVectorLayer::setRenderer(DmpFeatureRenderer *renderer) |
| 98 | { | 170 | { |
| 99 | 171 |
| @@ -44,6 +44,7 @@ class CORE_EXPORT DmpVectorLayer : public DmpMapLayer | @@ -44,6 +44,7 @@ class CORE_EXPORT DmpVectorLayer : public DmpMapLayer | ||
| 44 | DmpMapLayerRenderer *createMapRenderer(DmpRenderContext &rendererContext); | 44 | DmpMapLayerRenderer *createMapRenderer(DmpRenderContext &rendererContext); |
| 45 | bool readXml(const boost::property_tree::ptree &layerNode); | 45 | bool readXml(const boost::property_tree::ptree &layerNode); |
| 46 | bool writeXml(boost::property_tree::ptree &layerNode); | 46 | bool writeXml(boost::property_tree::ptree &layerNode); |
| 47 | + bool writejson(std::string& json); | ||
| 47 | 48 | ||
| 48 | DmpFeatureRenderer *renderer() { return renderer_; } | 49 | DmpFeatureRenderer *renderer() { return renderer_; } |
| 49 | void setRenderer(DmpFeatureRenderer *renderer); | 50 | void setRenderer(DmpFeatureRenderer *renderer); |
| @@ -148,4 +148,45 @@ void DmpMapServerUtil::responseGeojson(shared_ptr<DmpPgsql> pPgsqlConn, std::str | @@ -148,4 +148,45 @@ void DmpMapServerUtil::responseGeojson(shared_ptr<DmpPgsql> pPgsqlConn, std::str | ||
| 148 | } | 148 | } |
| 149 | return strsrc; | 149 | return strsrc; |
| 150 | } | 150 | } |
| 151 | + | ||
| 152 | + | ||
| 153 | + | ||
| 154 | + std::vector<std::string> DmpMapServerUtil::stringSplit(const std::string &str, const std::string &pattern) | ||
| 155 | + { | ||
| 156 | + vector<std::string> stringList; | ||
| 157 | + std::string subStr; | ||
| 158 | + std::string tPattern; | ||
| 159 | + size_t patternLen = pattern.length(); | ||
| 160 | + for (size_t i = 0; i < str.length(); i++) | ||
| 161 | + { | ||
| 162 | + if(pattern[0] == str[i]) | ||
| 163 | + { | ||
| 164 | + tPattern = str.substr(i, patternLen); | ||
| 165 | + if(tPattern == pattern) | ||
| 166 | + { | ||
| 167 | + i += patternLen -1; | ||
| 168 | + if(!subStr.empty()) | ||
| 169 | + { | ||
| 170 | + stringList.push_back(subStr); | ||
| 171 | + subStr.clear(); | ||
| 172 | + } | ||
| 173 | + } | ||
| 174 | + else | ||
| 175 | + { | ||
| 176 | + subStr.push_back(str[i]); | ||
| 177 | + } | ||
| 178 | + } | ||
| 179 | + else | ||
| 180 | + { | ||
| 181 | + subStr.push_back(str[i]); | ||
| 182 | + } | ||
| 183 | + } | ||
| 184 | + | ||
| 185 | + if(!subStr.empty()) | ||
| 186 | + { | ||
| 187 | + stringList.push_back(subStr); | ||
| 188 | + } | ||
| 189 | + return stringList; | ||
| 190 | + | ||
| 191 | + } | ||
| 151 | } | 192 | } |
| @@ -22,6 +22,8 @@ namespace mapserver | @@ -22,6 +22,8 @@ namespace mapserver | ||
| 22 | static void responseGeojson(shared_ptr<DmpPgsql> pPgsqlConn, std::string &responseData,const string& layerName,const std::string &srid); | 22 | static void responseGeojson(shared_ptr<DmpPgsql> pPgsqlConn, std::string &responseData,const string& layerName,const std::string &srid); |
| 23 | static void toJsonString(std::string &s); | 23 | static void toJsonString(std::string &s); |
| 24 | static std::string replace(std::string strsrc, std::string strfind, std::string strrep); | 24 | static std::string replace(std::string strsrc, std::string strfind, std::string strrep); |
| 25 | + | ||
| 26 | + static std::vector<std::string> stringSplit(const std::string &str, const std::string &pattern); | ||
| 25 | }; | 27 | }; |
| 26 | } | 28 | } |
| 27 | 29 |
| @@ -11,6 +11,7 @@ | @@ -11,6 +11,7 @@ | ||
| 11 | #include "dmpserverresponse.h" | 11 | #include "dmpserverresponse.h" |
| 12 | #include "dmpserverrequest.h" | 12 | #include "dmpserverrequest.h" |
| 13 | #include "dmpproject.h" | 13 | #include "dmpproject.h" |
| 14 | +#include "dmpvectorlayer.h" | ||
| 14 | #include "dmpserverproject.h" | 15 | #include "dmpserverproject.h" |
| 15 | #include <boost/property_tree/ptree.hpp> | 16 | #include <boost/property_tree/ptree.hpp> |
| 16 | #include <boost/property_tree/json_parser.hpp> | 17 | #include <boost/property_tree/json_parser.hpp> |
| @@ -21,6 +22,9 @@ namespace DmpMapping | @@ -21,6 +22,9 @@ namespace DmpMapping | ||
| 21 | bool loadService(const DmpServerContext &context, ProjectMap& vectorMappingProjects) | 22 | bool loadService(const DmpServerContext &context, ProjectMap& vectorMappingProjects) |
| 22 | { | 23 | { |
| 23 | const char *data = (char *)(context.request()->GetData()); | 24 | const char *data = (char *)(context.request()->GetData()); |
| 25 | + std::string name = context.serverProject()->name(); | ||
| 26 | + std::string title = context.serverProject()->title(); | ||
| 27 | + | ||
| 24 | if(data== nullptr || *data == '\0') | 28 | if(data== nullptr || *data == '\0') |
| 25 | { | 29 | { |
| 26 | LOGGER_ERROR("post 参数错误"); | 30 | LOGGER_ERROR("post 参数错误"); |
| @@ -54,9 +58,54 @@ namespace DmpMapping | @@ -54,9 +58,54 @@ namespace DmpMapping | ||
| 54 | return false; | 58 | return false; |
| 55 | } | 59 | } |
| 56 | vectorMappingProjects[guid] = project; | 60 | vectorMappingProjects[guid] = project; |
| 57 | - context.response()->removeHeader("Content-Type"); | ||
| 58 | - context.response()->setHeader("Content-Type", "text/xml;charset=utf-8"); | ||
| 59 | - context.response()->write(projectData); | 61 | + |
| 62 | + int i = 0; | ||
| 63 | + double minx, miny, maxx, maxy; | ||
| 64 | + std::map<std::string, DmpMapLayer *> mapLayers = project->mapLayers(); | ||
| 65 | + for (std::map<std::string, DmpMapLayer *>::iterator iter = mapLayers.begin(); iter != mapLayers.end(); iter++) | ||
| 66 | + { | ||
| 67 | + DmpMapLayer *layer = iter->second; | ||
| 68 | + if (i == 0) | ||
| 69 | + { | ||
| 70 | + minx = layer->extent().xmin(); | ||
| 71 | + miny = layer->extent().ymin(); | ||
| 72 | + maxx = layer->extent().xmax(); | ||
| 73 | + maxy = layer->extent().ymax(); | ||
| 74 | + } | ||
| 75 | + else | ||
| 76 | + { | ||
| 77 | + if (minx > layer->extent().xmin()) | ||
| 78 | + minx = layer->extent().xmin(); | ||
| 79 | + if (miny > layer->extent().ymin()) | ||
| 80 | + miny = layer->extent().ymin(); | ||
| 81 | + if (maxx < layer->extent().xmax()) | ||
| 82 | + maxx = layer->extent().xmax(); | ||
| 83 | + if (maxy < layer->extent().ymax()) | ||
| 84 | + maxy = layer->extent().ymax(); | ||
| 85 | + } | ||
| 86 | + } | ||
| 87 | + | ||
| 88 | + char buff[250]; | ||
| 89 | + sprintf(buff, "{\"name\":\"%s\",\"title\":\"%s\",\"boundingBox\":{\"minx\":%f, \"miny\":%f,\"maxx\":%f, \"maxy\":%f }", | ||
| 90 | + name.c_str(), title.c_str(),minx, miny, maxx, maxy); | ||
| 91 | + | ||
| 92 | + std::string json = buff; | ||
| 93 | + json.append(",\"maplayer\":["); | ||
| 94 | + | ||
| 95 | + i = 0; | ||
| 96 | + for (std::map<std::string, DmpMapLayer *>::iterator iter = mapLayers.begin(); iter != mapLayers.end(); iter++) | ||
| 97 | + { | ||
| 98 | + DmpVectorLayer *layer = (DmpVectorLayer*) iter->second; | ||
| 99 | + if(i>0) | ||
| 100 | + { | ||
| 101 | + json.append(","); | ||
| 102 | + } | ||
| 103 | + layer->writejson(json); | ||
| 104 | + } | ||
| 105 | + | ||
| 106 | + json.append("]}"); | ||
| 107 | + | ||
| 108 | + context.response()->write( project->WriteJson()); | ||
| 60 | return true; | 109 | return true; |
| 61 | } | 110 | } |
| 62 | else | 111 | else |
| @@ -105,11 +154,13 @@ namespace DmpMapping | @@ -105,11 +154,13 @@ namespace DmpMapping | ||
| 105 | std::string projData; | 154 | std::string projData; |
| 106 | if (!DmpServerUtils::Base64Decode(project, &projData)) | 155 | if (!DmpServerUtils::Base64Decode(project, &projData)) |
| 107 | { | 156 | { |
| 157 | + context.response()->writeJson("{\"status\":\"false\",\"message\":\"base64转码错误\"}"); | ||
| 108 | return false; | 158 | return false; |
| 109 | } | 159 | } |
| 110 | shared_ptr<DmpProject> project(new DmpProject()); | 160 | shared_ptr<DmpProject> project(new DmpProject()); |
| 111 | if (!project->Read(projData)) | 161 | if (!project->Read(projData)) |
| 112 | { | 162 | { |
| 163 | + context.response()->writeJson("{\"status\":\"false\",\"message\":\"DMD文档错误\"}"); | ||
| 113 | return false; | 164 | return false; |
| 114 | } | 165 | } |
| 115 | vectorMappingProjects[guid] = project; | 166 | vectorMappingProjects[guid] = project; |
| @@ -121,7 +172,6 @@ namespace DmpMapping | @@ -121,7 +172,6 @@ namespace DmpMapping | ||
| 121 | context.response()->writeJson("{\"status\":\"false\",\"message\":\"post 参数错误!\"}"); | 172 | context.response()->writeJson("{\"status\":\"false\",\"message\":\"post 参数错误!\"}"); |
| 122 | return false; | 173 | return false; |
| 123 | } | 174 | } |
| 124 | - | ||
| 125 | } | 175 | } |
| 126 | catch (boost::property_tree::ptree_bad_path &e) | 176 | catch (boost::property_tree::ptree_bad_path &e) |
| 127 | { | 177 | { |
| @@ -135,7 +185,8 @@ namespace DmpMapping | @@ -135,7 +185,8 @@ namespace DmpMapping | ||
| 135 | context.response()->writeJson("{\"status\":\"false\",\"message\":\"post 参数错误\"}"); | 185 | context.response()->writeJson("{\"status\":\"false\",\"message\":\"post 参数错误\"}"); |
| 136 | return false; | 186 | return false; |
| 137 | } | 187 | } |
| 138 | - return false; | 188 | + context.response()->writeJson("{\"status\":\"false\",\"message\":\"未知错误\"}"); |
| 189 | + return false; | ||
| 139 | } | 190 | } |
| 140 | 191 | ||
| 141 | } | 192 | } |
| @@ -187,6 +187,7 @@ namespace DmpMapping | @@ -187,6 +187,7 @@ namespace DmpMapping | ||
| 187 | else | 187 | else |
| 188 | { | 188 | { |
| 189 | LOGGER_ERROR("not find dir " + imagePath); | 189 | LOGGER_ERROR("not find dir " + imagePath); |
| 190 | + context.response()->writeJson(R"("{"value":[]}")"); | ||
| 190 | } | 191 | } |
| 191 | 192 | ||
| 192 | ptDoc.add_child("value", ptRoot); | 193 | ptDoc.add_child("value", ptRoot); |
| @@ -97,7 +97,10 @@ namespace DmpMapping | @@ -97,7 +97,10 @@ namespace DmpMapping | ||
| 97 | std::string DmpMappingParameters::MapGuid() const | 97 | std::string DmpMappingParameters::MapGuid() const |
| 98 | { | 98 | { |
| 99 | std::string value = ""; | 99 | std::string value = ""; |
| 100 | - GetStringParameter("GUID",value); | 100 | + if(!GetStringParameter("GUID",value)) |
| 101 | + { | ||
| 102 | + GetStringParameter("MappingGUID",value); | ||
| 103 | + } | ||
| 101 | return value; | 104 | return value; |
| 102 | } | 105 | } |
| 103 | 106 |
| @@ -37,27 +37,27 @@ namespace DmpWfs | @@ -37,27 +37,27 @@ namespace DmpWfs | ||
| 37 | 37 | ||
| 38 | void DmpSqlFactory::appendCondition(char *c) | 38 | void DmpSqlFactory::appendCondition(char *c) |
| 39 | { | 39 | { |
| 40 | - if (condition.size() == 0) | 40 | + if (condition_.size() == 0) |
| 41 | { | 41 | { |
| 42 | - condition = c; | 42 | + condition_ = c; |
| 43 | } | 43 | } |
| 44 | else | 44 | else |
| 45 | { | 45 | { |
| 46 | - condition += " and "; | 46 | + condition_ += " and "; |
| 47 | condition += c; | 47 | condition += c; |
| 48 | } | 48 | } |
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | void DmpSqlFactory::appendCondition(std::string &c) | 51 | void DmpSqlFactory::appendCondition(std::string &c) |
| 52 | { | 52 | { |
| 53 | - if (condition.size() == 0) | 53 | + if (condition_.size() == 0) |
| 54 | { | 54 | { |
| 55 | condition = c; | 55 | condition = c; |
| 56 | } | 56 | } |
| 57 | else | 57 | else |
| 58 | { | 58 | { |
| 59 | - condition += " and "; | ||
| 60 | - condition += c; | 59 | + condition_ += " and "; |
| 60 | + condition_ += c; | ||
| 61 | } | 61 | } |
| 62 | } | 62 | } |
| 63 | 63 | ||
| @@ -70,27 +70,27 @@ namespace DmpWfs | @@ -70,27 +70,27 @@ namespace DmpWfs | ||
| 70 | } | 70 | } |
| 71 | else | 71 | else |
| 72 | { | 72 | { |
| 73 | - if (this->prop.size() == 0) | 73 | + if (this->prop_.size() == 0) |
| 74 | { | 74 | { |
| 75 | sql += "*"; | 75 | sql += "*"; |
| 76 | } | 76 | } |
| 77 | else | 77 | else |
| 78 | - sql += this->prop; | 78 | + sql += this->prop_; |
| 79 | } | 79 | } |
| 80 | sql += " from \""; | 80 | sql += " from \""; |
| 81 | - sql += this->table; | 81 | + sql += this->table_; |
| 82 | sql += "\" where "; | 82 | sql += "\" where "; |
| 83 | - if (this->condition.size() == 0) | 83 | + if (this->condition_.size() == 0) |
| 84 | { | 84 | { |
| 85 | sql += "1=1"; | 85 | sql += "1=1"; |
| 86 | } | 86 | } |
| 87 | else | 87 | else |
| 88 | { | 88 | { |
| 89 | - sql += this->condition; | 89 | + sql += this->condition_; |
| 90 | } | 90 | } |
| 91 | - if (this->order.size() > 0) | 91 | + if (this->order_.size() > 0) |
| 92 | { | 92 | { |
| 93 | - sql += this->order; | 93 | + sql += this->order_; |
| 94 | } | 94 | } |
| 95 | 95 | ||
| 96 | if (count_ <= 0) | 96 | if (count_ <= 0) |
| @@ -106,4 +106,6 @@ namespace DmpWfs | @@ -106,4 +106,6 @@ namespace DmpWfs | ||
| 106 | return sql; | 106 | return sql; |
| 107 | } | 107 | } |
| 108 | 108 | ||
| 109 | + | ||
| 110 | + | ||
| 109 | } | 111 | } |
| @@ -20,15 +20,18 @@ namespace DmpWfs | @@ -20,15 +20,18 @@ namespace DmpWfs | ||
| 20 | ~DmpSqlFactory(void); | 20 | ~DmpSqlFactory(void); |
| 21 | 21 | ||
| 22 | void setStartIndexCount(int startIndex, int count, const std::string &resultType); | 22 | void setStartIndexCount(int startIndex, int count, const std::string &resultType); |
| 23 | - void appendCondition(std::string &c); | 23 | + void appendCondition(const std::string &c); |
| 24 | void appendCondition(char *c); | 24 | void appendCondition(char *c); |
| 25 | + void setProp(const std::string& prop) { prop_ = prop; } | ||
| 26 | + void setTable(const std::string& table){ table_ = table; } | ||
| 27 | + void setOrder(const std::string& order){ order_ = order; } | ||
| 25 | std::string getSql(); | 28 | std::string getSql(); |
| 26 | 29 | ||
| 27 | private: | 30 | private: |
| 28 | - std::string prop; | ||
| 29 | - std::string condition; | ||
| 30 | - std::string order; | ||
| 31 | - std::string table; | 31 | + std::string prop_; |
| 32 | + std::string condition_; | ||
| 33 | + std::string order_; | ||
| 34 | + std::string table_; | ||
| 32 | 35 | ||
| 33 | std::string resultType_; | 36 | std::string resultType_; |
| 34 | int startIndex_; | 37 | int startIndex_; |
| @@ -6,15 +6,30 @@ | @@ -6,15 +6,30 @@ | ||
| 6 | * Email: qingxiongf@chinadci.com | 6 | * Email: qingxiongf@chinadci.com |
| 7 | * copyright: 广州城市信息研究所有限公司 | 7 | * copyright: 广州城市信息研究所有限公司 |
| 8 | ***************************************************************************/ | 8 | ***************************************************************************/ |
| 9 | + | ||
| 9 | #include "dmpwfsfilter.h" | 10 | #include "dmpwfsfilter.h" |
| 11 | + | ||
| 12 | + | ||
| 10 | namespace DmpWfs | 13 | namespace DmpWfs |
| 11 | { | 14 | { |
| 12 | 15 | ||
| 13 | - dmpwfsfilter::dmpwfsfilter(/* args */) | 16 | + DmpWfsFilter::DmpWfsFilter(/* args */) |
| 14 | { | 17 | { |
| 15 | } | 18 | } |
| 16 | 19 | ||
| 17 | - dmpwfsfilter::~dmpwfsfilter() | 20 | + DmpWfsFilter::~DmpWfsFilter() |
| 18 | { | 21 | { |
| 19 | } | 22 | } |
| 23 | + | ||
| 24 | + bool DmpWfsFilter::Parse(const std::string& filter) | ||
| 25 | + { | ||
| 26 | + | ||
| 27 | + return false; | ||
| 28 | + } | ||
| 29 | + | ||
| 30 | + bool DmpWfsFilter::ParseOrder(const std::string& orderby) | ||
| 31 | + { | ||
| 32 | + return false; | ||
| 33 | + } | ||
| 34 | + | ||
| 20 | } | 35 | } |
| @@ -9,19 +9,55 @@ | @@ -9,19 +9,55 @@ | ||
| 9 | 9 | ||
| 10 | #ifndef __dmpwfsfilter_h__ | 10 | #ifndef __dmpwfsfilter_h__ |
| 11 | #define __dmpwfsfilter_h__ | 11 | #define __dmpwfsfilter_h__ |
| 12 | +#include <boost/property_tree/ptree.hpp> | ||
| 13 | +#include <boost/property_tree/xml_parser.hpp> | ||
| 14 | +#include <boost/typeof/typeof.hpp> | ||
| 15 | +#include <string> | ||
| 16 | +#include "dmpwfsgmlobject.h" | ||
| 12 | 17 | ||
| 13 | namespace DmpWfs | 18 | namespace DmpWfs |
| 14 | { | 19 | { |
| 15 | - class dmpwfsfilter | ||
| 16 | - { | 20 | + class DmpWfsFilter |
| 21 | + { | ||
| 17 | public: | 22 | public: |
| 18 | - dmpwfsfilter(/* args */); | ||
| 19 | - ~dmpwfsfilter(); | 23 | + DmpWfsFilter(/* args */); |
| 24 | + ~DmpWfsFilter(); | ||
| 25 | + | ||
| 26 | + bool Parse(const std::string &filter); | ||
| 27 | + bool ParseOrder(const std::string &orderby); | ||
| 28 | + std::string getSql() const { return sql_; } | ||
| 29 | + | ||
| 20 | private: | 30 | private: |
| 21 | - /* data */ | 31 | + std::string sql_; |
| 32 | + | ||
| 33 | + int pGeometry(boost::property_tree::ptree ptree, DmpWfsGmlObject **g); | ||
| 34 | + int pGeometryPoint(boost::property_tree::ptree ptree, DmpWfsGmlObject **g); | ||
| 35 | + int pGeometryLineString(boost::property_tree::ptree ptree, DmpWfsGmlObject **g); | ||
| 36 | + int pGeometryMultiPolyline(boost::property_tree::ptree ptree, DmpWfsGmlObject **g); | ||
| 37 | + int pGeometryMultiPolygon(boost::property_tree::ptree ptree, DmpWfsGmlObject **g); | ||
| 38 | + int pGeometryPolygon(boost::property_tree::ptree ptree, DmpWfsGmlObject **g); | ||
| 39 | + int pGeometryMultiPoint(boost::property_tree::ptree ptree, DmpWfsGmlObject **g); | ||
| 40 | + int pGeometryPolyline(boost::property_tree::ptree ptree, DmpWfsGmlObject **g); | ||
| 41 | + int pGeometryEnvope(boost::property_tree::ptree ptree, DmpWfsGmlObject **g); | ||
| 42 | + int pGeometryPointArray(boost::property_tree::ptree ptree, std::vector<double> &v); | ||
| 43 | + int pGeometryPointValue(char *p, std::vector<double> &v); | ||
| 44 | + int pGeometryDouble(char *d, bool space_before, bool space_after, double &dbl); | ||
| 45 | + int pGeometryPointValuePos(char *p, std::vector<double> &v); | ||
| 46 | + int pGeometryPointValuePosList(boost::property_tree::ptree ptree, std::vector<double> &v); | ||
| 47 | + int pGeometryPointValueCoordinates(char *p, std::vector<double> &v); | ||
| 48 | + int pGeometryPointValuePointRep(boost::property_tree::ptree ptree, std::vector<double> &v); | ||
| 49 | + int pGeometryPointValueCoord(boost::property_tree::ptree ptree, std::vector<double> &v); | ||
| 50 | + int pGeometryGetDis(boost::property_tree::ptree ptree, double &dis); | ||
| 51 | + int pGeometrySql(char *function, char *oracle_mask, int isDisjoin, boost::property_tree::ptree ptree, bool useBuffer); //char *function,char *field,DmpWfsGmlObject *g,std::string &str); | ||
| 52 | + private: | ||
| 53 | + void GetQueryField(const char *field); | ||
| 54 | + void _AppendProperty(std::string &sql, const char *str); | ||
| 55 | + int _PropertyParse(boost::property_tree::ptree ptreeode, int &isExpression, int isLike = 0); | ||
| 56 | + int _PropertyParse4(boost::property_tree::ptree ptreeode, char *f); | ||
| 57 | + int _PropertyParseFunction(boost::property_tree::ptree ptree); | ||
| 58 | + int _PropertyOneEqual(boost::property_tree::ptree ptree, char *type, int isLike = 0); | ||
| 22 | }; | 59 | }; |
| 23 | - | ||
| 24 | - | 60 | + |
| 25 | } | 61 | } |
| 26 | 62 | ||
| 27 | #endif // __dmpwfsfilter_h__ | 63 | #endif // __dmpwfsfilter_h__ |
| @@ -8,6 +8,11 @@ | @@ -8,6 +8,11 @@ | ||
| 8 | ***************************************************************************/ | 8 | ***************************************************************************/ |
| 9 | #include "dmpwfsgetfeature.h" | 9 | #include "dmpwfsgetfeature.h" |
| 10 | #include "dmpsqlfactory.h" | 10 | #include "dmpsqlfactory.h" |
| 11 | +#include "dmpmapserverutil.h" | ||
| 12 | +#include "dmpvectorlayer.h" | ||
| 13 | +#include "dmpwfsfilter.h" | ||
| 14 | +#include <string.h> | ||
| 15 | + | ||
| 11 | namespace DmpWfs | 16 | namespace DmpWfs |
| 12 | { | 17 | { |
| 13 | void writeGetFeature(const DmpServerContext &context,const DmpWfsParameters& params, | 18 | void writeGetFeature(const DmpServerContext &context,const DmpWfsParameters& params, |
| @@ -30,6 +35,11 @@ namespace DmpWfs | @@ -30,6 +35,11 @@ namespace DmpWfs | ||
| 30 | std::string featureID = params.FeatureID(); | 35 | std::string featureID = params.FeatureID(); |
| 31 | std::string propertyName = params.PropertyName(); | 36 | std::string propertyName = params.PropertyName(); |
| 32 | std::string resultType = params.ResultType(); | 37 | std::string resultType = params.ResultType(); |
| 38 | + std::string filter = params.Filter(); | ||
| 39 | + | ||
| 40 | + std::string sortby = params.Sortby(); | ||
| 41 | + | ||
| 42 | + | ||
| 33 | 43 | ||
| 34 | sqlFactory.setStartIndexCount(startIndex, maxFeatures, resultType); | 44 | sqlFactory.setStartIndexCount(startIndex, maxFeatures, resultType); |
| 35 | 45 | ||
| @@ -38,95 +48,86 @@ namespace DmpWfs | @@ -38,95 +48,86 @@ namespace DmpWfs | ||
| 38 | { | 48 | { |
| 39 | char *idstring[1000]; | 49 | char *idstring[1000]; |
| 40 | //将ID值以逗号分开,并返回个数 | 50 | //将ID值以逗号分开,并返回个数 |
| 41 | - /* | ||
| 42 | - int idn = StringHelp::ParseStringTok(parseString.featureid, ',', idstring, 1000); | ||
| 43 | - for (int i = 0; i < idn; i++) | 51 | + |
| 52 | + vector<string> stringlist = mapserver::DmpMapServerUtil::stringSplit(propertyName, ","); | ||
| 53 | + for (int i = 0; i < stringlist.size(); i++) | ||
| 44 | { | 54 | { |
| 45 | char *ss[2]; | 55 | char *ss[2]; |
| 46 | //形式:LayerName.ID | 56 | //形式:LayerName.ID |
| 47 | - int n = StringHelp::ParseStringTok(idstring[i], '.', ss, 2); | ||
| 48 | - if (n == 2) | 57 | + vector<string> stringList1 = mapserver::DmpMapServerUtil::stringSplit(idstring[i], "."); |
| 58 | + // int n = StringHelp::ParseStringTok(idstring[i], '.', ss, 2); | ||
| 59 | + if (stringList1.size() == 2) | ||
| 49 | { | 60 | { |
| 50 | - if (parseString.layerName == 0) | 61 | + if (typeName.empty()) |
| 51 | { | 62 | { |
| 52 | - parseString.layerName = ss[0]; | 63 | + typeName = stringList1[0]; |
| 53 | } | 64 | } |
| 54 | - ids.push_back(ss[1]); | 65 | + ids.push_back(stringList1[1]); |
| 55 | } | 66 | } |
| 56 | - else if (n == 1) | 67 | + else if (stringList1.size() == 1) |
| 57 | { | 68 | { |
| 58 | - ids.push_back(ss[0]); | 69 | + ids.push_back(stringList1[0]); |
| 59 | } | 70 | } |
| 60 | } | 71 | } |
| 61 | - */ | ||
| 62 | } | 72 | } |
| 63 | 73 | ||
| 64 | - /* std::vector<std::string> props; | 74 | + std::vector<std::string> props; |
| 65 | std::vector<std::string> propsAs; | 75 | std::vector<std::string> propsAs; |
| 66 | if (propertyName.empty()) | 76 | if (propertyName.empty()) |
| 67 | { | 77 | { |
| 68 | - char *idstring[1000]; | ||
| 69 | - int idn = StringHelp::ParseStringTok(parseString.propertyname, ',', idstring, 1000); | ||
| 70 | - for (int i = 0; i < idn; i++) | 78 | + |
| 79 | + vector<string> stringlist = mapserver::DmpMapServerUtil::stringSplit(propertyName, ","); | ||
| 80 | + for (int i = 0; i < stringlist.size(); i++) | ||
| 71 | { | 81 | { |
| 72 | - char *ss[2]; | 82 | + // char *ss[2]; |
| 73 | std::string sProp, sPropAs; | 83 | std::string sProp, sPropAs; |
| 74 | - int n = StringHelp::ParseStringTok(idstring[i], '.', ss, 2); | ||
| 75 | - if (n == 2) | 84 | + vector<string> layernameSplit = mapserver::DmpMapServerUtil::stringSplit(stringlist[i], "."); |
| 85 | + if (layernameSplit.size() == 2) | ||
| 76 | { | 86 | { |
| 77 | - if (parseString.layerName == 0) | 87 | + if (typeName.empty()) |
| 78 | { | 88 | { |
| 79 | - parseString.layerName = ss[0]; | 89 | + typeName = layernameSplit[0]; |
| 80 | } | 90 | } |
| 81 | //又以空格分开 | 91 | //又以空格分开 |
| 82 | - StringHelp::GetAsStringSql(ss[1], sProp, sPropAs); | 92 | + // StringHelp::GetAsStringSql(ss[1], sProp, sPropAs); |
| 83 | props.push_back(sProp); | 93 | props.push_back(sProp); |
| 84 | propsAs.push_back(sPropAs); | 94 | propsAs.push_back(sPropAs); |
| 85 | //sPropOrig=ss[1]; | 95 | //sPropOrig=ss[1]; |
| 86 | } | 96 | } |
| 87 | - else if (n == 1) | 97 | + else if (layernameSplit.size() == 1) |
| 88 | { | 98 | { |
| 89 | - StringHelp::GetAsStringSql(ss[0], sProp, sPropAs); | 99 | + // StringHelp::GetAsStringSql(ss[0], sProp, sPropAs); |
| 90 | props.push_back(sProp); | 100 | props.push_back(sProp); |
| 91 | propsAs.push_back(sPropAs); //props.push_back(ss[0]); | 101 | propsAs.push_back(sPropAs); //props.push_back(ss[0]); |
| 92 | } | 102 | } |
| 93 | } | 103 | } |
| 94 | } | 104 | } |
| 95 | - */ | ||
| 96 | - | ||
| 97 | - // if (parseString.layerName == 0) | ||
| 98 | - // return Error(buff, ErrorClass::ParaError, "layername not exist", ab); | ||
| 99 | - | ||
| 100 | - //const char *realLayer=0; | ||
| 101 | - //GetUpLayerID是干什么的? | ||
| 102 | - //似乎就是加了些L啊什么的。。 。 | ||
| 103 | - // if (_GetUperLayerId(parseString.layerName, sLayer) == false) | ||
| 104 | - // return Error(buff, ErrorClass::ParaError, "layer not exist", ab); | 105 | + |
| 105 | 106 | ||
| 106 | - /* shared_ptr<MapLayer> mapLayer = service->GetLayer(parseString.layerName); | 107 | + if (typeName.empty()) |
| 108 | + { | ||
| 109 | + return "layername not exist"; | ||
| 110 | + } | ||
| 107 | 111 | ||
| 108 | - | 112 | + DmpVectorLayer* mapLayer =(DmpVectorLayer*) project->getLayer(typeName);//GetLayer(parseString.layerName); |
| 109 | if(mapLayer == nullptr) | 113 | if(mapLayer == nullptr) |
| 110 | { | 114 | { |
| 111 | - return Error(buff, ErrorClass::ParaError, "layer not find", ab); | 115 | + return "layer not find"; |
| 112 | } | 116 | } |
| 113 | 117 | ||
| 114 | - shared_ptr<Workspace> pWorkspace = DataSourcePools::get_instance()->GetWorkspace(mapLayer->m_dbSource); | ||
| 115 | - if(pWorkspace == nullptr) | 118 | + shared_ptr<DmpPgsql> pPgsqlConn = DmpPgsqlSourcePools::get_instance()->GetPgsqlConn(mapLayer->source()); |
| 119 | + if(pPgsqlConn == nullptr) | ||
| 116 | { | 120 | { |
| 117 | - return Error(buff, ErrorClass::DatabaseDisconnect, "连接数据库失败", ab); | 121 | + return "连接数据库失败"; |
| 118 | } | 122 | } |
| 119 | - shared_ptr<dmapFields> fields = pWorkspace->GetFields(mapLayer->m_layerName,""); | 123 | + // shared_ptr<dmapFields> fields = pWorkspace->GetFields(mapLayer->m_layerName,""); |
| 120 | 124 | ||
| 121 | - if(fields == nullptr) | 125 | + //if(fields == nullptr) |
| 122 | { | 126 | { |
| 123 | - return Error(buff, ErrorClass::ParaError, "layername not exist", ab); | 127 | + //return Error(buff, ErrorClass::ParaError, "layername not exist", ab); |
| 124 | } | 128 | } |
| 125 | 129 | ||
| 126 | - | ||
| 127 | - | ||
| 128 | - | ||
| 129 | - shared_ptr<TableDesc> pTabledesc = this->ToTableDesc(fields,mapLayer->m_layerName); | 130 | + // shared_ptr<TableDesc> pTabledesc = this->ToTableDesc(fields,mapLayer->m_layerName); |
| 130 | 131 | ||
| 131 | 132 | ||
| 132 | size_t propCount = props.size(); | 133 | size_t propCount = props.size(); |
| @@ -145,63 +146,62 @@ namespace DmpWfs | @@ -145,63 +146,62 @@ namespace DmpWfs | ||
| 145 | { | 146 | { |
| 146 | sleft = s.substr(0, at1); | 147 | sleft = s.substr(0, at1); |
| 147 | sright = s.substr(at1 + 1, s.length() - 2 - at1); | 148 | sright = s.substr(at1 + 1, s.length() - 2 - at1); |
| 148 | - if (_stricmp(sleft.c_str(), "distinct") == 0) | 149 | + if (boost::iequals(sleft, "distinct")) |
| 149 | { | 150 | { |
| 150 | - sF = sF + sleft + " " + fields->GetFieldQuery(sright.c_str()); | 151 | + // sF = sF + sleft + " " + fields->GetFieldQuery(sright.c_str()); |
| 151 | } | 152 | } |
| 152 | else | 153 | else |
| 153 | { | 154 | { |
| 154 | - sF = sF + sleft + "(" + fields->GetFieldQuery(sright.c_str()) + ")"; | 155 | + // sF = sF + sleft + "(" + fields->GetFieldQuery(sright.c_str()) + ")"; |
| 155 | } | 156 | } |
| 156 | } | 157 | } |
| 157 | else | 158 | else |
| 158 | { | 159 | { |
| 159 | - sF = sF + fields->GetFieldQuery(s.c_str()); | 160 | + // sF = sF + fields->GetFieldQuery(s.c_str()); |
| 160 | } | 161 | } |
| 161 | 162 | ||
| 162 | } | 163 | } |
| 163 | - sqlF.prop = sF; | 164 | + |
| 165 | + sqlFactory.setProp(sF); | ||
| 164 | } | 166 | } |
| 165 | else | 167 | else |
| 166 | { | 168 | { |
| 167 | - bool isJson = (parseString.format && (strcmpi(parseString.format, "geojson") ==0 || strcmpi(parseString.format, "json") ==0)); | ||
| 168 | - this->GetAllField( srsOut, sqlF.prop,mapLayer,pWorkspace,isJson); | 169 | + // bool isJson = (parseString.format && (strcmpi(parseString.format, "geojson") ==0 || strcmpi(parseString.format, "json") ==0)); |
| 170 | + // this->GetAllField( srsOut, sqlF.prop,mapLayer,pWorkspace,isJson); | ||
| 169 | } | 171 | } |
| 170 | 172 | ||
| 171 | size_t idCount = ids.size(); | 173 | size_t idCount = ids.size(); |
| 172 | 174 | ||
| 173 | - | ||
| 174 | - | ||
| 175 | - if (parseString.filter) | 175 | + |
| 176 | + if (!filter.empty()) | ||
| 176 | { | 177 | { |
| 177 | - clsFilter filter(mapLayer->m_srid); | 178 | + DmpWfsFilter wfsFilter; |
| 178 | 179 | ||
| 179 | - if (filter.Parse(parseString.filter, pTabledesc.get(),DatabaseTypePostgreSQL)) | 180 | + if(wfsFilter.Parse(filter)) |
| 180 | { | 181 | { |
| 181 | - return Error(buff, ErrorClass::FilterError, filter.err, ab); | 182 | + return "解析查询器错误"; |
| 182 | } | 183 | } |
| 183 | 184 | ||
| 184 | - sqlF.AppendCondition(filter.sql); | 185 | + sqlFactory.appendCondition(wfsFilter.getSql()); |
| 185 | } | 186 | } |
| 186 | - if (parseString.sortby) | 187 | + |
| 188 | + if (!sortby.empty()) | ||
| 187 | { | 189 | { |
| 188 | - clsFilter filter(mapLayer->m_srid); | ||
| 189 | - if (filter.ParseOrder(parseString.sortby, pTabledesc.get(), DatabaseTypePostgreSQL)) | 190 | + DmpWfsFilter wfsFilter; |
| 191 | + if (wfsFilter.ParseOrder(sortby)) | ||
| 190 | { | 192 | { |
| 191 | - return Error(buff, ErrorClass::SortError, filter.err, ab); | 193 | + return "参数sortby 解析错误!"; |
| 192 | } | 194 | } |
| 193 | - sqlF.order = filter.sql; | 195 | + sqlFactory.setOrder(wfsFilter.getSql()); |
| 194 | } | 196 | } |
| 195 | - sqlF.table = mapLayer->m_layerName; | ||
| 196 | - std::string sq = sqlF.GetSql(DatabaseTypePostgreSQL); | ||
| 197 | - | ||
| 198 | - bool returnResult = pWorkspace->ExecWaitBinary(sq); | ||
| 199 | - if (!returnResult) | 197 | + sqlFactory.setTable(mapLayer->name()); |
| 198 | + std::string sql = sqlFactory.getSql(); | ||
| 199 | + if (!pPgsqlConn->ExecWaitBinary(sql)) | ||
| 200 | { | 200 | { |
| 201 | - return Error(buff, ErrorClass::QueryError, pWorkspace->m_sError.c_str(), ab); | 201 | + return "查询错误:" + pPgsqlConn->error(); |
| 202 | } | 202 | } |
| 203 | - int ver = ParseString::GetGMLVersion(parseString.version, parseString.outputFormat); | ||
| 204 | - if (parseString.format && (strcmpi(parseString.format, "geojson") ==0|| strcmpi(parseString.format, "json")==0)) | 203 | + // int ver = ParseString::GetGMLVersion(parseString.version, parseString.outputFormat); |
| 204 | + /* if (parseString.format && (strcmpi(parseString.format, "geojson") ==0|| strcmpi(parseString.format, "json")==0)) | ||
| 205 | { | 205 | { |
| 206 | isPicture = 10; | 206 | isPicture = 10; |
| 207 | return this->FormatWFSJsonCAll(pWorkspace, ab, parseString.layerName, buff, ver); | 207 | return this->FormatWFSJsonCAll(pWorkspace, ab, parseString.layerName, buff, ver); |
| @@ -214,6 +214,20 @@ namespace DmpWfs | @@ -214,6 +214,20 @@ namespace DmpWfs | ||
| 214 | return ""; | 214 | return ""; |
| 215 | } | 215 | } |
| 216 | 216 | ||
| 217 | - | ||
| 218 | - | 217 | + void getAsStringSql(const string& str, std::string &sProp, std::string &sAs) |
| 218 | + { | ||
| 219 | + //char *ss[2]; | ||
| 220 | + vector<string> layernameSplit = mapserver::DmpMapServerUtil::stringSplit(str, "."); | ||
| 221 | + //int n = ParseStringTok(str, ' ', ss, 2); | ||
| 222 | + if (layernameSplit.size() == 1) | ||
| 223 | + { | ||
| 224 | + sProp = layernameSplit[0]; | ||
| 225 | + sAs = ""; | ||
| 226 | + } | ||
| 227 | + else if (layernameSplit.size() > 1) | ||
| 228 | + { | ||
| 229 | + sProp = layernameSplit[0]; | ||
| 230 | + sAs = layernameSplit[1]; | ||
| 231 | + } | ||
| 232 | + } | ||
| 219 | } | 233 | } |
| @@ -14,11 +14,12 @@ | @@ -14,11 +14,12 @@ | ||
| 14 | #include <boost/typeof/typeof.hpp> | 14 | #include <boost/typeof/typeof.hpp> |
| 15 | #include <memory> | 15 | #include <memory> |
| 16 | #include <vector> | 16 | #include <vector> |
| 17 | +#include <string> | ||
| 17 | #include "dmpproject.h" | 18 | #include "dmpproject.h" |
| 18 | #include "dmpwfsparameters.h" | 19 | #include "dmpwfsparameters.h" |
| 19 | #include "dmpservercontext.h" | 20 | #include "dmpservercontext.h" |
| 20 | #include "dmppgsqlsourcepools.h" | 21 | #include "dmppgsqlsourcepools.h" |
| 21 | - | 22 | +using namespace mapserver; |
| 22 | namespace DmpWfs | 23 | namespace DmpWfs |
| 23 | { | 24 | { |
| 24 | void writeGetFeature(const DmpServerContext &context,const DmpWfsParameters& params, | 25 | void writeGetFeature(const DmpServerContext &context,const DmpWfsParameters& params, |
| @@ -29,7 +30,9 @@ namespace DmpWfs | @@ -29,7 +30,9 @@ namespace DmpWfs | ||
| 29 | // const DmpProject* project, | 30 | // const DmpProject* project, |
| 30 | // bool projectSettings = false); | 31 | // bool projectSettings = false); |
| 31 | 32 | ||
| 32 | - | 33 | + |
| 34 | + void getAsStringSql(const string& str,std::string &sProp,std::string &sAs); | ||
| 35 | + | ||
| 33 | } | 36 | } |
| 34 | 37 | ||
| 35 | #endif // __dmpwfsgetfeature_h__ | 38 | #endif // __dmpwfsgetfeature_h__ |
| 1 | +/************************************************************************** | ||
| 2 | +* file: dmpwfsgmlobject.cpp | ||
| 3 | + | ||
| 4 | +* Author: qingxiongf | ||
| 5 | +* Date: 2022-01-06 13:39:11 | ||
| 6 | +* Email: qingxiongf@chinadci.com | ||
| 7 | +* copyright: 广州城市信息研究所有限公司 | ||
| 8 | +***************************************************************************/ | ||
| 9 | + | ||
| 10 | +#include "dmpwfsgmlobject.h" | ||
| 11 | + | ||
| 12 | + | ||
| 13 | + DmpWfsGmlObject::DmpWfsGmlObject() | ||
| 14 | +{ | ||
| 15 | + | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | + | ||
| 19 | + ~DmpWfsGmlObject::DmpWfsGmlObject() | ||
| 20 | +{ | ||
| 21 | + | ||
| 22 | +} |
| 1 | +/************************************************************************** | ||
| 2 | +* file: dmpwfsgmlobject.h | ||
| 3 | + | ||
| 4 | +* Author: qingxiongf | ||
| 5 | +* Date: 2022-01-06 13:39:03 | ||
| 6 | +* Email: qingxiongf@chinadci.com | ||
| 7 | +* copyright: 广州城市信息研究所有限公司 | ||
| 8 | +***************************************************************************/ | ||
| 9 | + | ||
| 10 | +#ifndef __dmpwfsgmlobject_h__ | ||
| 11 | +#define __dmpwfsgmlobject_h__ | ||
| 12 | +#include <string> | ||
| 13 | + | ||
| 14 | +namespace DmpWfs | ||
| 15 | +{ | ||
| 16 | + class DmpWfsGmlObject | ||
| 17 | + { | ||
| 18 | + public: | ||
| 19 | + DmpWfsGmlObject(void); | ||
| 20 | + | ||
| 21 | + public: | ||
| 22 | + ~DmpWfsGmlObject(void); | ||
| 23 | + | ||
| 24 | + public: | ||
| 25 | + virtual void getString(std::string &str) = 0; | ||
| 26 | + virtual void getObj(void *sg) = 0; | ||
| 27 | + virtual void getRect(double &x1, double &y1, double &x2, double &y2) = 0; | ||
| 28 | + }; | ||
| 29 | + | ||
| 30 | + class DmpWfsGmlPoint : public DmpWfsGmlObject | ||
| 31 | + { | ||
| 32 | + public: | ||
| 33 | + DmpWfsGmlPoint(void); | ||
| 34 | + DmpWfsGmlPoint(double x, double y); | ||
| 35 | + ~DmpWfsGmlPoint(void); | ||
| 36 | + | ||
| 37 | + public: | ||
| 38 | + void getObj(void *sg); | ||
| 39 | + void getString(std::string &s); | ||
| 40 | + void getRect(double &x11, double &y11, double &x22, double &y22); | ||
| 41 | + | ||
| 42 | + private: | ||
| 43 | + double x; | ||
| 44 | + double y; | ||
| 45 | + }; | ||
| 46 | + | ||
| 47 | + | ||
| 48 | + | ||
| 49 | + | ||
| 50 | +} | ||
| 51 | + | ||
| 52 | +#endif // __dmpwfsgmlobject_h__ |
请
注册
或
登录
后发表评论