今天突然給了個任務讓測試點在面內演算法,然後通過SuperMap iServerJava 6R發布出來並測試並發訪問效能。好久沒結果Java突然有點亂,鬍子眉毛一把抓,不過思路總算清晰起來了,記錄下來以備後需尋找吧。
測試總體思路
1、擴充領域開發開出點在面內REST介面。
(1)擴充Component。
擴充Componentpackage com.zhangwei.Extend;import java.util.List;import com.supermap.services.components.Component;import com.supermap.services.components.ComponentContext;import com.supermap.services.components.ComponentContextAware;import com.supermap.services.components.commontypes.Feature;import com.supermap.services.components.commontypes.Geometry;import com.supermap.services.components.spi.DataProvider;@Component(providerTypes={DataProvider.class}, optional=false, type = "")public class InWithComponent implements ComponentContextAware{//資料提供者 private DataProvider dataProvider = null; /** * 建構函式 */ public InWithComponent() { } /*** * 思路: * 1、從資料集中查詢相應ID的資料,現在假設一個點,多個面對象。 * 2、判斷點是否在對象幾何中。 */ public Geometry inWithString(String datasourceNameR,String datasetNameR,int[] idsR,String datasourceNameP,String datasetNameP,int[] idsP) { List<Feature> listFeatureListR = dataProvider.getFeature(datasourceNameR,datasetNameR,idsR,null); List<Feature> listFeatureListP = dataProvider.getFeature(datasourceNameP,datasetNameP,idsP,null); int geometryLength = listFeatureListR.size(); int i = 0; //是否是結果標識 boolean flag = false; while(i<geometryLength) { if (Geometry.isPointInPolygon(listFeatureListP.get(0).geometry.points[0], listFeatureListR.get(i).geometry)) { flag = true; //System.out.println(flag+""); } else { flag = false; } i++; }return listFeatureListR.get(i-1).geometry;} /*** * 上下文 */ public void setComponentContext(ComponentContext context) { List<Object> providers = context.getProviders(Object.class); if(providers != null) { for(Object provider : providers) { if(provider instanceof DataProvider) { this.dataProvider = (DataProvider)provider; } } } }}
(2)擴充服務介面,由於是測試,此處不用Restlet或者JAX-RS,此處為了類比資料傳輸對伺服器影響,所以直接加了參數解析及返回結果,其實只是測試之用。
擴充介面package com.zhangwei.Extend;import java.io.IOException;import java.io.PrintWriter;import java.util.List;import java.util.Random;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.supermap.services.Interface;import com.supermap.services.InterfaceContext;import com.supermap.services.InterfaceContextAware;import com.supermap.services.components.commontypes.Geometry;@Interface(componentTypes = { InWithComponent.class }, optional = false, multiple = false)public class ISWithInServlet extends HttpServlet implements InterfaceContextAware{private static final long serialVersionUID = 1L;private InWithComponent inWithComponent = null;private String id = null;public ISWithInServlet() {this.id = String.valueOf(System.currentTimeMillis()); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { PrintWriter out; response.setContentType("text/html;charset=UTF-8"); response.setCharacterEncoding("UTF-8"); request.getParameter("in").toString(); out = response.getWriter(); int[] idsR = new int[2];idsR[0] = generateRandom(1,72);idsR[1] = generateRandom(1,72);int[] idsP = new int[1];idsP[0] = generateRandom(1,163); Geometry geometry = inWithComponent.inWithString("World","Ocean",idsR,"World","Capitals",idsP); out.print("[6390,,4883,4882,183,7136,7135,181,180,2987,651,,4578,4577]"+geometry.id); out.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } public void setInterfaceContext(InterfaceContext context) { this.getServletContext().setAttribute(this.id + "InterfaceContext", context); List<Object> components = context.getComponents(Object.class); if (components != null) { for (Object component : components) { if (component instanceof InWithComponent) { this.inWithComponent = (InWithComponent) component; break; } } } } /** * java中如何擷取某個範圍內的隨機數 * @param a * @param b * @return */ public static int generateRandom(int a, int b) { int temp = 0; try { if (a > b) { temp = new Random().nextInt(a - b); return temp + b; } else { temp = new Random().nextInt(b - a); return temp + a; } } catch (Exception e) { e.printStackTrace(); } return temp + a; }}