提交 88f465bc1b429c3a7dd584114f7d0f31e2af418b

作者 qingxiongf
1 个父辈 cff1cbd2

wfs and loadService

... ... @@ -94,6 +94,78 @@ bool DmpVectorLayer::writeXml(boost::property_tree::ptree &layerNode)
94 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 169 void DmpVectorLayer::setRenderer(DmpFeatureRenderer *renderer)
98 170 {
99 171
... ...
... ... @@ -44,6 +44,7 @@ class CORE_EXPORT DmpVectorLayer : public DmpMapLayer
44 44 DmpMapLayerRenderer *createMapRenderer(DmpRenderContext &rendererContext);
45 45 bool readXml(const boost::property_tree::ptree &layerNode);
46 46 bool writeXml(boost::property_tree::ptree &layerNode);
  47 + bool writejson(std::string& json);
47 48
48 49 DmpFeatureRenderer *renderer() { return renderer_; }
49 50 void setRenderer(DmpFeatureRenderer *renderer);
... ...
... ... @@ -148,4 +148,45 @@ void DmpMapServerUtil::responseGeojson(shared_ptr<DmpPgsql> pPgsqlConn, std::str
148 148 }
149 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 }
\ No newline at end of file
... ...
... ... @@ -22,6 +22,8 @@ namespace mapserver
22 22 static void responseGeojson(shared_ptr<DmpPgsql> pPgsqlConn, std::string &responseData,const string& layerName,const std::string &srid);
23 23 static void toJsonString(std::string &s);
24 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 11 #include "dmpserverresponse.h"
12 12 #include "dmpserverrequest.h"
13 13 #include "dmpproject.h"
  14 +#include "dmpvectorlayer.h"
14 15 #include "dmpserverproject.h"
15 16 #include <boost/property_tree/ptree.hpp>
16 17 #include <boost/property_tree/json_parser.hpp>
... ... @@ -21,6 +22,9 @@ namespace DmpMapping
21 22 bool loadService(const DmpServerContext &context, ProjectMap& vectorMappingProjects)
22 23 {
23 24 const char *data = (char *)(context.request()->GetData());
  25 + std::string name = context.serverProject()->name();
  26 + std::string title = context.serverProject()->title();
  27 +
24 28 if(data== nullptr || *data == '\0')
25 29 {
26 30 LOGGER_ERROR("post 参数错误");
... ... @@ -54,9 +58,54 @@ namespace DmpMapping
54 58 return false;
55 59 }
56 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 109 return true;
61 110 }
62 111 else
... ... @@ -105,11 +154,13 @@ namespace DmpMapping
105 154 std::string projData;
106 155 if (!DmpServerUtils::Base64Decode(project, &projData))
107 156 {
  157 + context.response()->writeJson("{\"status\":\"false\",\"message\":\"base64转码错误\"}");
108 158 return false;
109 159 }
110 160 shared_ptr<DmpProject> project(new DmpProject());
111 161 if (!project->Read(projData))
112 162 {
  163 + context.response()->writeJson("{\"status\":\"false\",\"message\":\"DMD文档错误\"}");
113 164 return false;
114 165 }
115 166 vectorMappingProjects[guid] = project;
... ... @@ -121,7 +172,6 @@ namespace DmpMapping
121 172 context.response()->writeJson("{\"status\":\"false\",\"message\":\"post 参数错误!\"}");
122 173 return false;
123 174 }
124   -
125 175 }
126 176 catch (boost::property_tree::ptree_bad_path &e)
127 177 {
... ... @@ -135,7 +185,8 @@ namespace DmpMapping
135 185 context.response()->writeJson("{\"status\":\"false\",\"message\":\"post 参数错误\"}");
136 186 return false;
137 187 }
138   - return false;
  188 + context.response()->writeJson("{\"status\":\"false\",\"message\":\"未知错误\"}");
  189 + return false;
139 190 }
140 191
141 192 }
\ No newline at end of file
... ...
... ... @@ -187,6 +187,7 @@ namespace DmpMapping
187 187 else
188 188 {
189 189 LOGGER_ERROR("not find dir " + imagePath);
  190 + context.response()->writeJson(R"("{"value":[]}")");
190 191 }
191 192
192 193 ptDoc.add_child("value", ptRoot);
... ...
... ... @@ -97,7 +97,10 @@ namespace DmpMapping
97 97 std::string DmpMappingParameters::MapGuid() const
98 98 {
99 99 std::string value = "";
100   - GetStringParameter("GUID",value);
  100 + if(!GetStringParameter("GUID",value))
  101 + {
  102 + GetStringParameter("MappingGUID",value);
  103 + }
101 104 return value;
102 105 }
103 106
... ...
... ... @@ -37,27 +37,27 @@ namespace DmpWfs
37 37
38 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 44 else
45 45 {
46   - condition += " and ";
  46 + condition_ += " and ";
47 47 condition += c;
48 48 }
49 49 }
50 50
51 51 void DmpSqlFactory::appendCondition(std::string &c)
52 52 {
53   - if (condition.size() == 0)
  53 + if (condition_.size() == 0)
54 54 {
55 55 condition = c;
56 56 }
57 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 70 }
71 71 else
72 72 {
73   - if (this->prop.size() == 0)
  73 + if (this->prop_.size() == 0)
74 74 {
75 75 sql += "*";
76 76 }
77 77 else
78   - sql += this->prop;
  78 + sql += this->prop_;
79 79 }
80 80 sql += " from \"";
81   - sql += this->table;
  81 + sql += this->table_;
82 82 sql += "\" where ";
83   - if (this->condition.size() == 0)
  83 + if (this->condition_.size() == 0)
84 84 {
85 85 sql += "1=1";
86 86 }
87 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 96 if (count_ <= 0)
... ... @@ -106,4 +106,6 @@ namespace DmpWfs
106 106 return sql;
107 107 }
108 108
  109 +
  110 +
109 111 }
\ No newline at end of file
... ...
... ... @@ -20,15 +20,18 @@ namespace DmpWfs
20 20 ~DmpSqlFactory(void);
21 21
22 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 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 28 std::string getSql();
26 29
27 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 36 std::string resultType_;
34 37 int startIndex_;
... ...
... ... @@ -6,15 +6,30 @@
6 6 * Email: qingxiongf@chinadci.com
7 7 * copyright: 广州城市信息研究所有限公司
8 8 ***************************************************************************/
  9 +
9 10 #include "dmpwfsfilter.h"
  11 +
  12 +
10 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 }
\ No newline at end of file
... ...
... ... @@ -9,19 +9,55 @@
9 9
10 10 #ifndef __dmpwfsfilter_h__
11 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 18 namespace DmpWfs
14 19 {
15   - class dmpwfsfilter
16   - {
  20 + class DmpWfsFilter
  21 + {
17 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 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 63 #endif // __dmpwfsfilter_h__
... ...
... ... @@ -8,6 +8,11 @@
8 8 ***************************************************************************/
9 9 #include "dmpwfsgetfeature.h"
10 10 #include "dmpsqlfactory.h"
  11 +#include "dmpmapserverutil.h"
  12 +#include "dmpvectorlayer.h"
  13 +#include "dmpwfsfilter.h"
  14 +#include <string.h>
  15 +
11 16 namespace DmpWfs
12 17 {
13 18 void writeGetFeature(const DmpServerContext &context,const DmpWfsParameters& params,
... ... @@ -30,6 +35,11 @@ namespace DmpWfs
30 35 std::string featureID = params.FeatureID();
31 36 std::string propertyName = params.PropertyName();
32 37 std::string resultType = params.ResultType();
  38 + std::string filter = params.Filter();
  39 +
  40 + std::string sortby = params.Sortby();
  41 +
  42 +
33 43
34 44 sqlFactory.setStartIndexCount(startIndex, maxFeatures, resultType);
35 45
... ... @@ -38,95 +48,86 @@ namespace DmpWfs
38 48 {
39 49 char *idstring[1000];
40 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 55 char *ss[2];
46 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 75 std::vector<std::string> propsAs;
66 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 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 93 props.push_back(sProp);
84 94 propsAs.push_back(sPropAs);
85 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 100 props.push_back(sProp);
91 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 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 133 size_t propCount = props.size();
... ... @@ -145,63 +146,62 @@ namespace DmpWfs
145 146 {
146 147 sleft = s.substr(0, at1);
147 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 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 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 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 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 206 isPicture = 10;
207 207 return this->FormatWFSJsonCAll(pWorkspace, ab, parseString.layerName, buff, ver);
... ... @@ -214,6 +214,20 @@ namespace DmpWfs
214 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 }
\ No newline at end of file
... ...
... ... @@ -14,11 +14,12 @@
14 14 #include <boost/typeof/typeof.hpp>
15 15 #include <memory>
16 16 #include <vector>
  17 +#include <string>
17 18 #include "dmpproject.h"
18 19 #include "dmpwfsparameters.h"
19 20 #include "dmpservercontext.h"
20 21 #include "dmppgsqlsourcepools.h"
21   -
  22 +using namespace mapserver;
22 23 namespace DmpWfs
23 24 {
24 25 void writeGetFeature(const DmpServerContext &context,const DmpWfsParameters& params,
... ... @@ -29,7 +30,9 @@ namespace DmpWfs
29 30 // const DmpProject* project,
30 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 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 +}
\ No newline at end of file
... ...
  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__
... ...
注册登录 后发表评论