提交 93c4271e4e636e2ca05189f8f26c33138c97b7fe

作者 qingxiongf
2 个父辈 0f66855e 2af08eb5
@@ -19,7 +19,7 @@ namespace tileserver @@ -19,7 +19,7 @@ namespace tileserver
19 DmpEsriBundleV1Provider:: DmpEsriBundleV1Provider(const std::string& rootPath) 19 DmpEsriBundleV1Provider:: DmpEsriBundleV1Provider(const std::string& rootPath)
20 : DmpAbstractEsriBundleProvider(rootPath) 20 : DmpAbstractEsriBundleProvider(rootPath)
21 { 21 {
22 - // _rootPath ="/mnt/d/Data/tile/GDMap/_alllayers"; 22 + //rootPath_ ="/mnt/d/Code/tiles/GDMap/_alllayers";
23 } 23 }
24 void DmpEsriBundleV1Provider::WriteTile(const int row, const int col, const int level, const std::string& format, DmpServerResponse& response) 24 void DmpEsriBundleV1Provider::WriteTile(const int row, const int col, const int level, const std::string& format, DmpServerResponse& response)
25 { 25 {
@@ -91,14 +91,14 @@ namespace tileserver @@ -91,14 +91,14 @@ namespace tileserver
91 std::string format=dmpTileLayer->getFormat(); 91 std::string format=dmpTileLayer->getFormat();
92 // std::string lowerPoint=std::to_string(rectangle.xmin())+" "+std::to_string(rectangle.ymin()); 92 // std::string lowerPoint=std::to_string(rectangle.xmin())+" "+std::to_string(rectangle.ymin());
93 // std::string upperPoint=std::to_string(rectangle.xmax())+" "+std::to_string(rectangle.ymax()); 93 // std::string upperPoint=std::to_string(rectangle.xmax())+" "+std::to_string(rectangle.ymax());
94 - DmpPoint min=DmpPoint(rectangle.xmin(),rectangle.ymin());  
95 - DmpPoint max=DmpPoint(rectangle.xmax(),rectangle.ymax()); 94 + DmpPoint min=DmpPoint(rectangle.xmin(),rectangle.ymax());
  95 + DmpPoint max=DmpPoint(rectangle.xmax(),rectangle.ymin());
96 std::vector<DmpTileMatrixSet*> tileMatrixSets; 96 std::vector<DmpTileMatrixSet*> tileMatrixSets;
97 dmpTileLayer->getTileMatrixSets(tileMatrixSets); 97 dmpTileLayer->getTileMatrixSets(tileMatrixSets);
98 double resolution; 98 double resolution;
99 DmpPoint origin; 99 DmpPoint origin;
100 int iLevel,xMinTile,yMinTile, xMaxTile, yMaxTile,buffLen; 100 int iLevel,xMinTile,yMinTile, xMaxTile, yMaxTile,buffLen;
101 - if(!TileProviderFactory::GetTileScale(dmpTileLayer,iLevel,xMinTile,yMinTile, xMaxTile, yMaxTile)) 101 + if(!TileProviderFactory::GetTileScale(dmpTileLayer,iLevel,xMinTile,yMinTile, xMaxTile, yMaxTile,origin,resolution))
102 { 102 {
103 response.sendError(500, "缩略图范围错误:("); 103 response.sendError(500, "缩略图范围错误:(");
104 return; 104 return;
@@ -122,13 +122,45 @@ namespace tileserver @@ -122,13 +122,45 @@ namespace tileserver
122 //cairo_surface_write_to_png (surface, "./wmts.png"); 122 //cairo_surface_write_to_png (surface, "./wmts.png");
123 } 123 }
124 } 124 }
  125 +
  126 + cairo_surface_t* newimage=surface;
  127 +
  128 + int w,h;
  129 + w = cairo_image_surface_get_width (newimage);
  130 + h = cairo_image_surface_get_height (newimage);
  131 + DmpPoint topLeft;
  132 + // yMinTile=190;
  133 + // xMinTile=143;
  134 + TileProviderFactory::RowColToPoint(origin,xMinTile,yMaxTile,resolution,topLeft);
  135 + DmpPoint botRight;
  136 + // yMaxTile=191;
  137 + // xMaxTile=144;
  138 + //TileProviderFactory::RowColToPoint(origin,xMaxTile+1,yMinTile+1,resolution,botRight);
  139 +
  140 + DmpPoint clipPoint;
  141 + int wClip,hClip;
  142 + TileProviderFactory::GetClipBox(topLeft,min,max,resolution,clipPoint,wClip,hClip);
  143 +
  144 + cairo_surface_t *surface0 = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,wClip, hClip);
  145 + cairo_t *cr0 =cairo_create (surface0);
  146 +
  147 + //cairo_rectangle(cr0,clipPoint.x(),clipPoint.y(),wClip,hClip);
  148 + cairo_rectangle(cr0,0,0,wClip,hClip);
  149 + cairo_set_source_surface (cr0, surface,-clipPoint.x(), -clipPoint.y());
  150 + cairo_clip(cr0);
  151 + cairo_paint(cr0);
  152 +
  153 + //cairo_surface_write_to_png (surface0, "./wmtsbbox.png");
  154 +
125 std::string responseData; 155 std::string responseData;
126 - cairo_surface_write_to_png_stream(surface, TileProviderFactory::cairo_write_func, &responseData); 156 + cairo_surface_write_to_png_stream(surface0, TileProviderFactory::cairo_write_func, &responseData);
127 157
128 response.removeHeader("Content-Type"); 158 response.removeHeader("Content-Type");
129 std::string f = (format == "jpg") ? "image/jpg" : "image/png"; 159 std::string f = (format == "jpg") ? "image/jpg" : "image/png";
130 response.setHeader("Content-Type", f); 160 response.setHeader("Content-Type", f);
131 - response.write(responseData); 161 + response.write(responseData);
  162 + cairo_destroy (cr0);
  163 + cairo_surface_destroy (surface0);
132 cairo_destroy (cr); 164 cairo_destroy (cr);
133 cairo_surface_destroy (surface); 165 cairo_surface_destroy (surface);
134 } 166 }
@@ -81,14 +81,15 @@ namespace tileserver @@ -81,14 +81,15 @@ namespace tileserver
81 std::string format=dmpTileLayer->getFormat(); 81 std::string format=dmpTileLayer->getFormat();
82 // std::string lowerPoint=std::to_string(rectangle.xmin())+" "+std::to_string(rectangle.ymin()); 82 // std::string lowerPoint=std::to_string(rectangle.xmin())+" "+std::to_string(rectangle.ymin());
83 // std::string upperPoint=std::to_string(rectangle.xmax())+" "+std::to_string(rectangle.ymax()); 83 // std::string upperPoint=std::to_string(rectangle.xmax())+" "+std::to_string(rectangle.ymax());
84 - DmpPoint min=DmpPoint(rectangle.xmin(),rectangle.ymin());  
85 - DmpPoint max=DmpPoint(rectangle.xmax(),rectangle.ymax()); 84 + DmpPoint min=DmpPoint(rectangle.xmin(),rectangle.ymax());
  85 + DmpPoint max=DmpPoint(rectangle.xmax(),rectangle.ymin());
86 std::vector<DmpTileMatrixSet*> tileMatrixSets; 86 std::vector<DmpTileMatrixSet*> tileMatrixSets;
87 dmpTileLayer->getTileMatrixSets(tileMatrixSets); 87 dmpTileLayer->getTileMatrixSets(tileMatrixSets);
88 - double resolution;  
89 DmpPoint origin; 88 DmpPoint origin;
  89 + double resolution;
  90 +
90 int iLevel,xMinTile,yMinTile, xMaxTile, yMaxTile,buffLen; 91 int iLevel,xMinTile,yMinTile, xMaxTile, yMaxTile,buffLen;
91 - if(!TileProviderFactory::GetTileScale(dmpTileLayer,iLevel,xMinTile,yMinTile, xMaxTile, yMaxTile)) 92 + if(!TileProviderFactory::GetTileScale(dmpTileLayer,iLevel,xMinTile,yMinTile, xMaxTile, yMaxTile,origin,resolution))
92 { 93 {
93 response.sendError(500, "缩略图范围错误:("); 94 response.sendError(500, "缩略图范围错误:(");
94 return; 95 return;
@@ -116,27 +117,40 @@ namespace tileserver @@ -116,27 +117,40 @@ namespace tileserver
116 117
117 } 118 }
118 119
119 - cairo_surface_t *newimage=cairo_image_surface_create_from_png ("/mnt/d/56.png"); 120 + //cairo_surface_t *newimage=cairo_image_surface_create_from_png ("/mnt/d/56.png");
  121 + cairo_surface_t* newimage=surface;
120 122
121 - //cairo_arc (newcr, 128.0, 128.0, 76.8, 0, 2*3.14);  
122 int w,h; 123 int w,h;
123 w = cairo_image_surface_get_width (newimage); 124 w = cairo_image_surface_get_width (newimage);
124 h = cairo_image_surface_get_height (newimage); 125 h = cairo_image_surface_get_height (newimage);
  126 + DmpPoint topLeft;
  127 + // yMinTile=190;
  128 + // xMinTile=143;
  129 + TileProviderFactory::RowColToPoint(origin,xMinTile,yMaxTile,resolution,topLeft);
  130 + //DmpPoint botRight=DmpPoint((xMaxTile-xMinTile+1)*resolution,(yMaxTile-xMinTile+1)*resolution);
  131 + // yMaxTile=191;
  132 + // xMaxTile=144;
  133 + //TileProviderFactory::RowColToPoint(origin,xMaxTile+1,yMinTile+1,resolution,botRight);
  134 + DmpPoint clipPoint;
  135 + int wClip,hClip;
125 136
126 - cairo_surface_t *surface0 = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w/2, h/2); 137 + TileProviderFactory::GetClipBox(topLeft,min,max,resolution,clipPoint,wClip,hClip);
  138 +
  139 + cairo_surface_t *surface0 = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,wClip, hClip);
127 cairo_t *cr0 =cairo_create (surface0); 140 cairo_t *cr0 =cairo_create (surface0);
  141 + cairo_rectangle(cr0,0,0,wClip,hClip);
  142 + //cairo_rectangle(cr0,w/4,h/4,w/2,h/4);
128 cairo_clip(cr0); 143 cairo_clip(cr0);
129 - //cairo_scale (cr0, w/2, h/2);  
130 - cairo_set_source_surface (cr0, newimage, 0, 0);  
131 -  
132 144
  145 + cairo_set_source_surface (cr0, newimage,-clipPoint.x(), -clipPoint.y());
  146 +
133 cairo_paint(cr0); 147 cairo_paint(cr0);
134 //cairo_surface_write_to_png (surface0, "./wmts.png"); 148 //cairo_surface_write_to_png (surface0, "./wmts.png");
135 - cairo_surface_destroy (surface0);  
136 - 149 + // cairo_surface_destroy (surface0);
  150 +
137 151
138 std::string responseData; 152 std::string responseData;
139 - cairo_surface_write_to_png_stream(surface, TileProviderFactory::cairo_write_func, &responseData); 153 + cairo_surface_write_to_png_stream(surface0, TileProviderFactory::cairo_write_func, &responseData);
140 //cairo_surface_write_to_png_stream(newimage, TileProviderFactory::cairo_write_func, &responseData); 154 //cairo_surface_write_to_png_stream(newimage, TileProviderFactory::cairo_write_func, &responseData);
141 155
142 response.removeHeader("Content-Type"); 156 response.removeHeader("Content-Type");
@@ -144,8 +158,8 @@ namespace tileserver @@ -144,8 +158,8 @@ namespace tileserver
144 response.setHeader("Content-Type", f); 158 response.setHeader("Content-Type", f);
145 response.write(responseData); 159 response.write(responseData);
146 //response.writeContent(&responseData,imageLen); 160 //response.writeContent(&responseData,imageLen);
147 -  
148 - 161 + cairo_destroy (cr0);
  162 + cairo_surface_destroy (surface0);
149 cairo_destroy (cr); 163 cairo_destroy (cr);
150 cairo_surface_destroy (surface); 164 cairo_surface_destroy (surface);
151 } 165 }
@@ -77,7 +77,7 @@ namespace tileserver @@ -77,7 +77,7 @@ namespace tileserver
77 double resolution; 77 double resolution;
78 DmpPoint origin; 78 DmpPoint origin;
79 int iLevel,xMinTile,yMinTile, xMaxTile, yMaxTile; 79 int iLevel,xMinTile,yMinTile, xMaxTile, yMaxTile;
80 - if(!TileProviderFactory::GetTileScale(dmpTileLayer,iLevel,xMinTile,yMinTile, xMaxTile, yMaxTile)) 80 + if(!TileProviderFactory::GetTileScale(dmpTileLayer,iLevel,xMinTile,yMinTile, xMaxTile, yMaxTile,origin,resolution))
81 { 81 {
82 response.sendError(500, "缩略图范围错误:("); 82 response.sendError(500, "缩略图范围错误:(");
83 return; 83 return;
@@ -135,7 +135,7 @@ namespace tileserver @@ -135,7 +135,7 @@ namespace tileserver
135 xTile=floor(abs(origin.x()-point.x())/resolution); 135 xTile=floor(abs(origin.x()-point.x())/resolution);
136 yTile=floor(abs(origin.y()-point.y())/resolution); 136 yTile=floor(abs(origin.y()-point.y())/resolution);
137 } 137 }
138 - bool TileProviderFactory::GetTileScale(DmpTileLayer* dmpTileLayer,int& iLevel,int& xMinTile,int& yMinTile,int& xMaxTile,int& yMaxTile) 138 + bool TileProviderFactory::GetTileScale(DmpTileLayer* dmpTileLayer,int& iLevel,int& xMinTile,int& yMinTile,int& xMaxTile,int& yMaxTile,DmpPoint& origin,double& resolution)
139 { 139 {
140 std::string tilePath=dmpTileLayer->getDataSource(); 140 std::string tilePath=dmpTileLayer->getDataSource();
141 DmpRectangle rectangle=dmpTileLayer->extent(); 141 DmpRectangle rectangle=dmpTileLayer->extent();
@@ -143,8 +143,8 @@ namespace tileserver @@ -143,8 +143,8 @@ namespace tileserver
143 DmpPoint max=DmpPoint(rectangle.xmax(),rectangle.ymax()); 143 DmpPoint max=DmpPoint(rectangle.xmax(),rectangle.ymax());
144 std::vector<DmpTileMatrixSet*> tileMatrixSets; 144 std::vector<DmpTileMatrixSet*> tileMatrixSets;
145 dmpTileLayer->getTileMatrixSets(tileMatrixSets); 145 dmpTileLayer->getTileMatrixSets(tileMatrixSets);
146 - DmpPoint origin;  
147 - double resolution; 146 + // DmpPoint origin;
  147 + // double resolution;
148 //筛选合适的切片层级 148 //筛选合适的切片层级
149 iLevel=TileProviderFactory::screenTileMatrix(min,max,tileMatrixSets,resolution,origin); 149 iLevel=TileProviderFactory::screenTileMatrix(min,max,tileMatrixSets,resolution,origin);
150 if(iLevel==-1) 150 if(iLevel==-1)
@@ -157,6 +157,13 @@ namespace tileserver @@ -157,6 +157,13 @@ namespace tileserver
157 TileProviderFactory::PointToRowCol(max,origin,resolution,xMaxTile,yMaxTile); 157 TileProviderFactory::PointToRowCol(max,origin,resolution,xMaxTile,yMaxTile);
158 return true; 158 return true;
159 } 159 }
  160 + void TileProviderFactory::RowColToPoint(DmpPoint& origin,int xTile,int yTile,double resolution,DmpPoint& tileTopleft)
  161 + {
  162 + double xTileP=origin.x()+(xTile)*resolution;
  163 + double yTileP=origin.y()-(yTile)*resolution;
  164 +
  165 + tileTopleft=DmpPoint(xTileP,yTileP);
  166 + }
160 bool TileProviderFactory::BufferCopy(cairo_surface_t *pClsCSFrom, cairo_surface_t *pClsCSTo, cairo_t *cr,int x,int y) 167 bool TileProviderFactory::BufferCopy(cairo_surface_t *pClsCSFrom, cairo_surface_t *pClsCSTo, cairo_t *cr,int x,int y)
161 { 168 {
162 if (pClsCSFrom == NULL||pClsCSTo == NULL) 169 if (pClsCSFrom == NULL||pClsCSTo == NULL)
@@ -178,4 +185,30 @@ namespace tileserver @@ -178,4 +185,30 @@ namespace tileserver
178 return CAIRO_STATUS_SUCCESS; 185 return CAIRO_STATUS_SUCCESS;
179 } 186 }
180 187
  188 + void TileProviderFactory::GetClipBox(DmpPoint& point0,DmpPoint& bboxPoint0,DmpPoint& bboxPoint1,const double& resolution,DmpPoint & topLeftP,int& wBbox,int &hBbox)
  189 + {
  190 + //默认切片256*256
  191 + double xTile,yTile,xBox,yBox,xTop,yTop,xTopleft,yTopleft;
  192 + // //大图坐标距离
  193 + // xTile=abs(point0.x()-point1.x());
  194 + // yTile=abs(point0.y()-point1.y());
  195 + // //bbox坐标距离 distance pixel
  196 + xBox=abs(bboxPoint1.x()-bboxPoint0.x());
  197 + yBox=abs(bboxPoint1.y()-bboxPoint0.y());
  198 + //bbox左上与大图距离
  199 + xTopleft=abs(bboxPoint0.x()-point0.x());
  200 + yTopleft=abs(bboxPoint0.y()-point0.y());
  201 + // //获取bbox在合成大图种的范围及左上角坐标,默认大图左上角坐标为(0,0)像素坐标
  202 + // int xTopLeftDistance=wImage*xTopleft/xTile;
  203 + // int yTopLeftDistance=hImage*yTopleft/yTile;
  204 +
  205 + // int wBboxDistance=wImage*xBox/xTile;
  206 + // int hBboxDistance=hImage*yBox/yTile;
  207 + DmpPoint BboxP=DmpPoint(xTopleft*256/resolution,yTopleft*256/resolution);
  208 + topLeftP=BboxP;
  209 + wBbox=xBox*256/resolution;
  210 + hBbox=yBox*256/resolution;
  211 +
  212 +
  213 + }
181 } 214 }
@@ -42,13 +42,14 @@ namespace tileserver @@ -42,13 +42,14 @@ namespace tileserver
42 static int screenTileMatrix(DmpPoint& min,DmpPoint& max,std::vector<DmpTileMatrixSet*>& tileMatrixSets,double& resolution,DmpPoint& origin); 42 static int screenTileMatrix(DmpPoint& min,DmpPoint& max,std::vector<DmpTileMatrixSet*>& tileMatrixSets,double& resolution,DmpPoint& origin);
43 static int screenTileMatrix2(DmpPoint& min,DmpPoint& max,std::vector<DmpTileMatrixSet*>& tileMatrixSets,double& resolution,DmpPoint& origin); 43 static int screenTileMatrix2(DmpPoint& min,DmpPoint& max,std::vector<DmpTileMatrixSet*>& tileMatrixSets,double& resolution,DmpPoint& origin);
44 static void PointToRowCol(DmpPoint& point,DmpPoint& origin,double resolution,int& xTile,int& yTile); 44 static void PointToRowCol(DmpPoint& point,DmpPoint& origin,double resolution,int& xTile,int& yTile);
45 - static bool GetTileScale(DmpTileLayer* dmpTileLayer,int& iLevel,int& xMinTile,int& yMinTile,int& xMaxTile,int& yMaxTile); 45 + static bool GetTileScale(DmpTileLayer* dmpTileLayer,int& iLevel,int& xMinTile,int& yMinTile,int& xMaxTile,int& yMaxTile,DmpPoint& origin,double& resolution);
46 static cairo_status_t cairo_write_func(void *pbuff, const unsigned char *data, unsigned int length); 46 static cairo_status_t cairo_write_func(void *pbuff, const unsigned char *data, unsigned int length);
47 - 47 + static void RowColToPoint(DmpPoint& origin,int xTile,int yTile,double resolution,DmpPoint& point0);
  48 + static void GetClipBox(DmpPoint& point0,DmpPoint& bboxPoint0,DmpPoint& bboxPoint1,const double& resolution ,DmpPoint & topLeftP,int& wBbox,int &hBbox);
48 private: 49 private:
49 TileProviderFactory(); 50 TileProviderFactory();
  51 +
50 }; 52 };
51 -  
52 - 53 +
53 } 54 }
54 #endif //__dmptileproviderfactory_h__ 55 #endif //__dmptileproviderfactory_h__
注册登录 后发表评论