提交 1f320f7d20bf767f33a3310e4d76e41f1ca06e1b

作者 LJH 李佳桓
1 个父辈 aa754cb6

ljh

... ... @@ -19,7 +19,7 @@ namespace tileserver
19 19 DmpEsriBundleV1Provider:: DmpEsriBundleV1Provider(const std::string& rootPath)
20 20 : DmpAbstractEsriBundleProvider(rootPath)
21 21 {
22   - // _rootPath ="/mnt/d/Data/tile/GDMap/_alllayers";
  22 + //rootPath_ ="/mnt/d/Code/tiles/GDMap/_alllayers";
23 23 }
24 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 91 std::string format=dmpTileLayer->getFormat();
92 92 // std::string lowerPoint=std::to_string(rectangle.xmin())+" "+std::to_string(rectangle.ymin());
93 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 96 std::vector<DmpTileMatrixSet*> tileMatrixSets;
97 97 dmpTileLayer->getTileMatrixSets(tileMatrixSets);
98 98 double resolution;
99 99 DmpPoint origin;
100 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 103 response.sendError(500, "缩略图范围错误:(");
104 104 return;
... ... @@ -122,13 +122,45 @@ namespace tileserver
122 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 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 158 response.removeHeader("Content-Type");
129 159 std::string f = (format == "jpg") ? "image/jpg" : "image/png";
130 160 response.setHeader("Content-Type", f);
131   - response.write(responseData);
  161 + response.write(responseData);
  162 + cairo_destroy (cr0);
  163 + cairo_surface_destroy (surface0);
132 164 cairo_destroy (cr);
133 165 cairo_surface_destroy (surface);
134 166 }
... ...
... ... @@ -81,14 +81,15 @@ namespace tileserver
81 81 std::string format=dmpTileLayer->getFormat();
82 82 // std::string lowerPoint=std::to_string(rectangle.xmin())+" "+std::to_string(rectangle.ymin());
83 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 86 std::vector<DmpTileMatrixSet*> tileMatrixSets;
87 87 dmpTileLayer->getTileMatrixSets(tileMatrixSets);
88   - double resolution;
89 88 DmpPoint origin;
  89 + double resolution;
  90 +
90 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 94 response.sendError(500, "缩略图范围错误:(");
94 95 return;
... ... @@ -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 123 int w,h;
123 124 w = cairo_image_surface_get_width (newimage);
124 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 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 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 147 cairo_paint(cr0);
134 148 //cairo_surface_write_to_png (surface0, "./wmts.png");
135   - cairo_surface_destroy (surface0);
136   -
  149 + // cairo_surface_destroy (surface0);
  150 +
137 151
138 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 154 //cairo_surface_write_to_png_stream(newimage, TileProviderFactory::cairo_write_func, &responseData);
141 155
142 156 response.removeHeader("Content-Type");
... ... @@ -144,8 +158,8 @@ namespace tileserver
144 158 response.setHeader("Content-Type", f);
145 159 response.write(responseData);
146 160 //response.writeContent(&responseData,imageLen);
147   -
148   -
  161 + cairo_destroy (cr0);
  162 + cairo_surface_destroy (surface0);
149 163 cairo_destroy (cr);
150 164 cairo_surface_destroy (surface);
151 165 }
... ...
... ... @@ -77,7 +77,7 @@ namespace tileserver
77 77 double resolution;
78 78 DmpPoint origin;
79 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 82 response.sendError(500, "缩略图范围错误:(");
83 83 return;
... ...
... ... @@ -135,7 +135,7 @@ namespace tileserver
135 135 xTile=floor(abs(origin.x()-point.x())/resolution);
136 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 140 std::string tilePath=dmpTileLayer->getDataSource();
141 141 DmpRectangle rectangle=dmpTileLayer->extent();
... ... @@ -143,8 +143,8 @@ namespace tileserver
143 143 DmpPoint max=DmpPoint(rectangle.xmax(),rectangle.ymax());
144 144 std::vector<DmpTileMatrixSet*> tileMatrixSets;
145 145 dmpTileLayer->getTileMatrixSets(tileMatrixSets);
146   - DmpPoint origin;
147   - double resolution;
  146 + // DmpPoint origin;
  147 + // double resolution;
148 148 //筛选合适的切片层级
149 149 iLevel=TileProviderFactory::screenTileMatrix(min,max,tileMatrixSets,resolution,origin);
150 150 if(iLevel==-1)
... ... @@ -157,6 +157,13 @@ namespace tileserver
157 157 TileProviderFactory::PointToRowCol(max,origin,resolution,xMaxTile,yMaxTile);
158 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 167 bool TileProviderFactory::BufferCopy(cairo_surface_t *pClsCSFrom, cairo_surface_t *pClsCSTo, cairo_t *cr,int x,int y)
161 168 {
162 169 if (pClsCSFrom == NULL||pClsCSTo == NULL)
... ... @@ -178,4 +185,30 @@ namespace tileserver
178 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 }
\ No newline at end of file
... ...
... ... @@ -42,13 +42,14 @@ namespace tileserver
42 42 static int screenTileMatrix(DmpPoint& min,DmpPoint& max,std::vector<DmpTileMatrixSet*>& tileMatrixSets,double& resolution,DmpPoint& origin);
43 43 static int screenTileMatrix2(DmpPoint& min,DmpPoint& max,std::vector<DmpTileMatrixSet*>& tileMatrixSets,double& resolution,DmpPoint& origin);
44 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 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 49 private:
49 50 TileProviderFactory();
  51 +
50 52 };
51   -
52   -
  53 +
53 54 }
54 55 #endif //__dmptileproviderfactory_h__
... ...
注册登录 后发表评论