LAPTOP-SB56SG4Q\86185
3 years ago
37 changed files with 98636 additions and 1 deletions
@ -1,3 +1,6 @@ |
|||||||
# open-JSD-7866 |
# open-JSD-7866 |
||||||
|
|
||||||
JSD-7866 开源任务材料 |
jsd-7866 开源材料\ |
||||||
|
免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ |
||||||
|
仅作为开发者学习参考使用!禁止用于任何商业用途!\ |
||||||
|
为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系hugh处理。 |
Binary file not shown.
Binary file not shown.
@ -0,0 +1,37 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?><plugin> |
||||||
|
<id>com.fr.plugin.zzl.point.map</id> |
||||||
|
<name><![CDATA[定制点地图]]></name> |
||||||
|
<active>yes</active> |
||||||
|
<version>1.0.0</version> |
||||||
|
<env-version>10.0</env-version> |
||||||
|
<jartime>2020-11-02</jartime> |
||||||
|
<vendor>fr.open</vendor> |
||||||
|
<description><![CDATA[定制点地图]]></description> |
||||||
|
<change-notes><![CDATA[ |
||||||
|
[2021-12-31]初始化插定制点地图<br/> |
||||||
|
]]></change-notes> |
||||||
|
<extra-core> |
||||||
|
</extra-core> |
||||||
|
<lifecycle-monitor class="com.fr.plugin.POMapLifeCycleMonitor"/> |
||||||
|
|
||||||
|
<!-- <extra-chart>--> |
||||||
|
<!-- <IndependentChartProvider class="com.fr.plugin.provider.POMapExtentChartProvider" plotID="PO_MAP_CHART"/>--> |
||||||
|
<!-- </extra-chart>--> |
||||||
|
|
||||||
|
<extra-chart> |
||||||
|
<ChartTypeProvider class="com.fr.plugin.provider.POMapChatType" plotID="PO_MAP_CHART"/> |
||||||
|
</extra-chart> |
||||||
|
<!-- <extra-decision>--> |
||||||
|
<!-- <WebResourceProvider class="com.fr.plugin.PointMapResource"/>--> |
||||||
|
<!-- </extra-decision>--> |
||||||
|
<extra-core> |
||||||
|
<WebService class="com.fr.plugin.PointMapService"/> |
||||||
|
</extra-core> |
||||||
|
<extra-chart-designer> |
||||||
|
<ChartTypeUIProvider class="com.fr.plugin.provider.POMapUI" plotID="PO_MAP_CHART"/> |
||||||
|
</extra-chart-designer> |
||||||
|
<!-- <extra-chart-designer>--> |
||||||
|
<!-- <IndependentChartUIProvider class="com.fr.plugin.provider.POMapExtendedChartUIProvider" plotID="PO_MAP_CHART"/>--> |
||||||
|
<!-- </extra-chart-designer>--> |
||||||
|
<function-recorder class="com.fr.plugin.provider.POMapChatType"/> |
||||||
|
</plugin> |
@ -0,0 +1,13 @@ |
|||||||
|
package com.fr.plugin; |
||||||
|
|
||||||
|
import com.fr.stable.fun.JavaScriptPlaceHolder; |
||||||
|
import com.fr.stable.fun.impl.AbstractJavaScriptPlaceHolder; |
||||||
|
|
||||||
|
public class POMapJavaScriptPlaceHolder extends AbstractJavaScriptPlaceHolder { |
||||||
|
private String key = "6bda7bee13cc20deca6ec53e54290cd6"; |
||||||
|
public JavaScriptPlaceHolder.ScriptTag[] holderScripts() { |
||||||
|
return new ScriptTag[]{ |
||||||
|
JavaScriptPlaceHolder.ScriptTag.build().src("https://webapi.amap.com/maps?v=1.4.15&key="+key), |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
package com.fr.plugin; |
||||||
|
|
||||||
|
import com.fr.plugin.context.PluginContext; |
||||||
|
import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor; |
||||||
|
|
||||||
|
public class POMapLifeCycleMonitor extends AbstractPluginLifecycleMonitor { |
||||||
|
@Override |
||||||
|
public void afterRun(PluginContext pluginContext) { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void beforeStop(PluginContext pluginContext) { |
||||||
|
|
||||||
|
} |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
package com.fr.plugin; |
||||||
|
|
||||||
|
import com.fr.decision.fun.impl.AbstractWebResourceProvider; |
||||||
|
import com.fr.decision.web.MainComponent; |
||||||
|
import com.fr.form.web.FormMainComponent; |
||||||
|
import com.fr.plugin.components.MapComponent; |
||||||
|
import com.fr.web.struct.Atom; |
||||||
|
|
||||||
|
public class PointMapResource extends AbstractWebResourceProvider { |
||||||
|
|
||||||
|
/** |
||||||
|
* 需要附加到的主组件 |
||||||
|
* |
||||||
|
* @return 主组件 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Override |
||||||
|
public Atom attach() { |
||||||
|
return FormMainComponent.KEY; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 客户端所需的组件 |
||||||
|
* |
||||||
|
* @return 组件 |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public Atom client() { |
||||||
|
return MapComponent.KEY; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,34 @@ |
|||||||
|
package com.fr.plugin; |
||||||
|
import com.fr.base.TableData; |
||||||
|
import com.fr.form.main.Form; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.plugin.model.PointModel; |
||||||
|
import com.fr.script.Calculator; |
||||||
|
import com.fr.stable.fun.Service; |
||||||
|
import com.fr.web.core.FormSessionIDInfor; |
||||||
|
import com.fr.web.utils.WebUtils; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
public class PointMapService implements Service { |
||||||
|
@Override |
||||||
|
public String actionOP() { |
||||||
|
return "mapCarData"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void process(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, String op, String cmd) throws Exception { |
||||||
|
// String sessionId = httpServletRequest.getParameter("sessionId");
|
||||||
|
// String paths = httpServletRequest.getParameter("path");
|
||||||
|
// JSONObject jsonObject = new JSONObject();
|
||||||
|
// if (session != null) {
|
||||||
|
// Form form = session.getForm2Show();
|
||||||
|
// TableData cars = form.getTableData("cars");
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
// WebUtils.printAsJSON(httpServletResponse,jsonObject);
|
||||||
|
} |
||||||
|
} |
@ -0,0 +1,90 @@ |
|||||||
|
package com.fr.plugin.chart; |
||||||
|
|
||||||
|
import com.fr.extended.chart.AbstractChart; |
||||||
|
import com.fr.extended.chart.HyperLinkPara; |
||||||
|
import com.fr.extended.chart.StringFormula; |
||||||
|
import com.fr.extended.chart.export.ExportProcessor; |
||||||
|
import com.fr.general.GeneralUtils; |
||||||
|
import com.fr.json.*; |
||||||
|
import com.fr.log.FineLoggerFactory; |
||||||
|
import com.fr.stable.web.Repository; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
public class POMapChart extends AbstractChart<POMapDataConfig> { |
||||||
|
|
||||||
|
private static final String ID = "ZZL_PO_MAP_CHART"; |
||||||
|
private static final String NAME = "定制点地图"; |
||||||
|
|
||||||
|
public POMapChart() { |
||||||
|
FineLoggerFactory.getLogger().error("定制点地图初始化POMapChart"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected String getChartID() { |
||||||
|
return ID; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getChartName() { |
||||||
|
return NAME; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected String demoImagePath() { |
||||||
|
return "com/fr/plugin/img/logo.png"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void addJSON(POMapDataConfig dataConfig, JSONObject jsonObject, Repository repo, JSONPara para) throws JSONException { |
||||||
|
jsonObject.put("trialLicenseWater", ""); |
||||||
|
List<Object> position = new ArrayList<>(); |
||||||
|
List<Object> titles = new ArrayList<>(); |
||||||
|
List<Object> area = new ArrayList<>(); |
||||||
|
if (dataConfig != null) { |
||||||
|
if (dataConfig.getX() != null) { |
||||||
|
area = dataConfig.getX().getValues(); |
||||||
|
} |
||||||
|
|
||||||
|
if (dataConfig.getY() != null) { |
||||||
|
position = dataConfig.getY().getValues(); |
||||||
|
} |
||||||
|
if (dataConfig.getTitle() != null) { |
||||||
|
titles = dataConfig.getTitle().getValues(); |
||||||
|
} |
||||||
|
} |
||||||
|
jsonObject.put("lat", new JSONArray(area)); |
||||||
|
jsonObject.put("lng", new JSONArray(position)); |
||||||
|
jsonObject.put("titles", new JSONArray(titles)); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected String[] requiredJS() { |
||||||
|
return new String[]{ |
||||||
|
"/com/fr/plugin/js/map.js", |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected String[] requiredCSS() { |
||||||
|
return new String[]{ |
||||||
|
"/com/fr/plugin/css/map.css", |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected String wrapperName() { |
||||||
|
return "poMapWrapper"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected HyperLinkPara[] hyperLinkParas() { |
||||||
|
return new HyperLinkPara[0]; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected List<StringFormula> formulas() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,282 @@ |
|||||||
|
package com.fr.plugin.chart; |
||||||
|
|
||||||
|
import com.fanruan.api.cal.FormulaKit; |
||||||
|
import com.fanruan.api.report.chart.BaseChartWithData; |
||||||
|
import com.fanruan.api.util.IOKit; |
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
import com.fr.base.BaseFormula; |
||||||
|
import com.fr.base.chart.cross.FormulaProcessor; |
||||||
|
import com.fr.chart.ChartWebParaProvider; |
||||||
|
import com.fr.form.ui.FRChartCategory; |
||||||
|
import com.fr.json.JSONArray; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.log.FineLoggerFactory; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
import com.fr.stable.xml.XMLPrintWriter; |
||||||
|
import com.fr.stable.xml.XMLableReader; |
||||||
|
|
||||||
|
import java.awt.*; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Objects; |
||||||
|
|
||||||
|
public class POMapChartData extends BaseChartWithData { |
||||||
|
@Override |
||||||
|
public String getID() { |
||||||
|
return "ZZL_PO_MAP_CHART"; |
||||||
|
} |
||||||
|
|
||||||
|
private String pointIcon; |
||||||
|
private String center; |
||||||
|
private String fontName; |
||||||
|
private String fontSize; |
||||||
|
private Color fontColor; |
||||||
|
private Color textBoxColor; |
||||||
|
private String lineSize; |
||||||
|
private String lineStyle; |
||||||
|
private String textBoxWidth; |
||||||
|
private String mapUrl; |
||||||
|
private String textBoxLeft; |
||||||
|
|
||||||
|
public String getTextBoxLeft() { |
||||||
|
return textBoxLeft; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTextBoxLeft(String textBoxLeft) { |
||||||
|
this.textBoxLeft = textBoxLeft; |
||||||
|
} |
||||||
|
|
||||||
|
public String getMapUrl() { |
||||||
|
return mapUrl; |
||||||
|
} |
||||||
|
|
||||||
|
public void setMapUrl(String mapUrl) { |
||||||
|
this.mapUrl = mapUrl; |
||||||
|
} |
||||||
|
|
||||||
|
public String getCenter() { |
||||||
|
return center; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCenter(String center) { |
||||||
|
this.center = center; |
||||||
|
} |
||||||
|
|
||||||
|
public String getPointIcon() { |
||||||
|
return pointIcon; |
||||||
|
} |
||||||
|
|
||||||
|
public void setPointIcon(String pointIcon) { |
||||||
|
this.pointIcon = pointIcon; |
||||||
|
} |
||||||
|
|
||||||
|
public String getFontName() { |
||||||
|
return fontName; |
||||||
|
} |
||||||
|
|
||||||
|
public void setFontName(String fontName) { |
||||||
|
this.fontName = fontName; |
||||||
|
} |
||||||
|
|
||||||
|
public String getFontSize() { |
||||||
|
return fontSize; |
||||||
|
} |
||||||
|
|
||||||
|
public void setFontSize(String fontSize) { |
||||||
|
this.fontSize = fontSize; |
||||||
|
} |
||||||
|
|
||||||
|
public Color getFontColor() { |
||||||
|
return fontColor; |
||||||
|
} |
||||||
|
|
||||||
|
public void setFontColor(Color fontColor) { |
||||||
|
this.fontColor = fontColor; |
||||||
|
} |
||||||
|
|
||||||
|
public String getLineSize() { |
||||||
|
return lineSize; |
||||||
|
} |
||||||
|
|
||||||
|
public void setLineSize(String lineSize) { |
||||||
|
this.lineSize = lineSize; |
||||||
|
} |
||||||
|
|
||||||
|
public String getLineStyle() { |
||||||
|
return lineStyle; |
||||||
|
} |
||||||
|
|
||||||
|
public void setLineStyle(String lineStyle) { |
||||||
|
this.lineStyle = lineStyle; |
||||||
|
} |
||||||
|
|
||||||
|
private BaseFormula titleFormula = FormulaKit.newFormula(StringKit.EMPTY); |
||||||
|
|
||||||
|
public BaseFormula getTitleFormula() { |
||||||
|
return titleFormula; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTitleFormula(BaseFormula titleFormula) { |
||||||
|
this.titleFormula = titleFormula; |
||||||
|
} |
||||||
|
|
||||||
|
public Color getTextBoxColor() { |
||||||
|
return textBoxColor; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTextBoxColor(Color textBoxColor) { |
||||||
|
this.textBoxColor = textBoxColor; |
||||||
|
} |
||||||
|
|
||||||
|
public String getTextBoxWidth() { |
||||||
|
return textBoxWidth; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTextBoxWidth(String textBoxWidth) { |
||||||
|
this.textBoxWidth = textBoxWidth; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public FRChartCategory getFRChartCategory() { |
||||||
|
return super.getFRChartCategory(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected Image designImage(int width, int height, int resolution, ChartWebParaProvider chartWebPara) { |
||||||
|
return IOKit.readImageWithCache("com/fr/plugin/img/logo.png"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public POMapChartData clone() throws CloneNotSupportedException { |
||||||
|
POMapChartData result = (POMapChartData) super.clone(); |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
//从xml中读取对象的属性。
|
||||||
|
@Override |
||||||
|
public void readAttr(XMLableReader xmLableReader) { |
||||||
|
|
||||||
|
super.readAttr(xmLableReader); |
||||||
|
this.setFontSize(xmLableReader.getAttrAsString("FontSize", "12")); |
||||||
|
String fontColor = xmLableReader.getAttrAsString("FontColor", Color.BLACK.getRGB() + ""); |
||||||
|
if (StringUtils.isNotBlank(fontColor)) { |
||||||
|
int anInt = Integer.parseInt(fontColor); |
||||||
|
this.setFontColor(new Color(anInt)); |
||||||
|
} |
||||||
|
String textBoxColor = xmLableReader.getAttrAsString("TextBoxColor", Color.BLACK.getRGB() + ""); |
||||||
|
if (StringUtils.isNotBlank(textBoxColor)) { |
||||||
|
int anInt = Integer.parseInt(textBoxColor); |
||||||
|
this.setTextBoxColor(new Color(anInt)); |
||||||
|
} |
||||||
|
this.setTextBoxLeft(xmLableReader.getAttrAsString("TextBoxLeft", "12")); |
||||||
|
this.setTextBoxWidth(xmLableReader.getAttrAsString("TextBoxWidth", "30")); |
||||||
|
this.setLineStyle(xmLableReader.getAttrAsString("LineStyle", "实线")); |
||||||
|
this.setPointIcon(xmLableReader.getAttrAsString("PointIcon", "")); |
||||||
|
this.setFontName(xmLableReader.getAttrAsString("FontName", "")); |
||||||
|
this.setLineSize(xmLableReader.getAttrAsString("LineSize", "12")); |
||||||
|
this.setMapUrl(xmLableReader.getAttrAsString("MapUrl", "")); |
||||||
|
this.setCenter(xmLableReader.getAttrAsString("Center", "11583663.78341984, 3588508.27616124")); |
||||||
|
} |
||||||
|
|
||||||
|
//将对象的属性写入xml中。
|
||||||
|
@Override |
||||||
|
public void writeAttr(XMLPrintWriter writer) { |
||||||
|
super.writeAttr(writer); |
||||||
|
writer.attr("FontSize", fontSize); |
||||||
|
if (fontColor != null) { |
||||||
|
writer.attr("FontColor", fontColor.getRGB() + ""); |
||||||
|
} |
||||||
|
if (textBoxColor != null) { |
||||||
|
writer.attr("TextBoxColor", textBoxColor.getRGB() + ""); |
||||||
|
} |
||||||
|
writer.attr("LineStyle", lineStyle); |
||||||
|
writer.attr("PointIcon", pointIcon); |
||||||
|
writer.attr("FontName", fontName); |
||||||
|
writer.attr("LineSize", lineSize); |
||||||
|
writer.attr("Center", center); |
||||||
|
writer.attr("MapUrl", mapUrl); |
||||||
|
writer.attr("TextBoxLeft", textBoxLeft); |
||||||
|
writer.attr("TextBoxWidth", textBoxWidth); |
||||||
|
} |
||||||
|
|
||||||
|
private static String colorToHexValue(Color color) { |
||||||
|
if (color == null) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
return "#" + intToHexValue(color.getRed()) + intToHexValue(color.getGreen()) + intToHexValue(color.getBlue()); |
||||||
|
} |
||||||
|
|
||||||
|
private static String intToHexValue(int number) { |
||||||
|
String result = Integer.toHexString(number & 0xff); |
||||||
|
while (result.length() < 2) { |
||||||
|
result = "0" + result; |
||||||
|
} |
||||||
|
return result.toUpperCase(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
/** |
||||||
|
* //创建Echarts饼图需要的options,根据自身的属性来定义options中的配置项。
|
||||||
|
* //调用前,已经对FieldCollection中的字段做了对应的汇总计算,可以直接通过getFieldCollection获取到字段集合,从而获取其中的计算结果。
|
||||||
|
*/ |
||||||
|
public JSONObject createAttributeConfig(ChartWebParaProvider chartWebPara) { |
||||||
|
FineLoggerFactory.getLogger().info("开始组装JSON"); |
||||||
|
JSONObject jsonObject = super.createAttributeConfig(chartWebPara); |
||||||
|
POMapListData fieldCollection = getFieldCollection(POMapListData.class); |
||||||
|
|
||||||
|
java.util.List<Object> position = new ArrayList<>(); |
||||||
|
java.util.List<Object> titles = new ArrayList<>(); |
||||||
|
List<Object> area = new ArrayList<>(); |
||||||
|
if (fieldCollection != null) { |
||||||
|
if (fieldCollection.getLat() != null) { |
||||||
|
area = fieldCollection.getLat().getValues(); |
||||||
|
} |
||||||
|
if (fieldCollection.getLng() != null) { |
||||||
|
position = fieldCollection.getLng().getValues(); |
||||||
|
} |
||||||
|
if (fieldCollection.getTitle() != null) { |
||||||
|
titles = fieldCollection.getTitle().getValues(); |
||||||
|
} |
||||||
|
} |
||||||
|
jsonObject.put("lat", new JSONArray(area)); |
||||||
|
jsonObject.put("lng", new JSONArray(position)); |
||||||
|
jsonObject.put("titles", new JSONArray(titles)); |
||||||
|
|
||||||
|
jsonObject.put("mapCenter", this.center) |
||||||
|
.put("lineStyle", this.lineStyle) |
||||||
|
.put("fontSize", this.fontSize) |
||||||
|
.put("pointIcon", this.pointIcon) |
||||||
|
.put("fontName", this.fontName) |
||||||
|
.put("lineSize", this.lineSize) |
||||||
|
.put("mapUrl", this.mapUrl) |
||||||
|
.put("textBoxWidth", this.textBoxWidth) |
||||||
|
.put("textBoxColor", colorToHexValue(this.textBoxColor)) |
||||||
|
.put("mapUrl", this.mapUrl) |
||||||
|
.put("textBoxLeft", this.textBoxLeft) |
||||||
|
.put("fontColor", colorToHexValue(this.fontColor)); |
||||||
|
|
||||||
|
return jsonObject; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void dealFormula(FormulaProcessor formulaProcessor) { |
||||||
|
if (titleFormula != null) { |
||||||
|
formulaProcessor.dealWith(titleFormula); |
||||||
|
} |
||||||
|
super.dealFormula(formulaProcessor); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean equals(Object o) { |
||||||
|
if (this == o) return true; |
||||||
|
if (o == null || getClass() != o.getClass()) return false; |
||||||
|
if (!super.equals(o)) return false; |
||||||
|
POMapChartData that = (POMapChartData) o; |
||||||
|
return Objects.equals(pointIcon, that.pointIcon) && Objects.equals(center, that.center) && Objects.equals(fontName, that.fontName) && Objects.equals(fontSize, that.fontSize) && Objects.equals(fontColor, that.fontColor) && Objects.equals(textBoxColor, that.textBoxColor) && Objects.equals(lineSize, that.lineSize) && Objects.equals(lineStyle, that.lineStyle) && Objects.equals(textBoxWidth, that.textBoxWidth) && Objects.equals(mapUrl, that.mapUrl) && Objects.equals(textBoxLeft, that.textBoxLeft) && Objects.equals(titleFormula, that.titleFormula); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int hashCode() { |
||||||
|
return Objects.hash(super.hashCode(), pointIcon, center, fontName, fontSize, fontColor, textBoxColor, lineSize, lineStyle, textBoxWidth, mapUrl, textBoxLeft, titleFormula); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,87 @@ |
|||||||
|
package com.fr.plugin.chart; |
||||||
|
|
||||||
|
import com.fr.extended.chart.AbstractDataConfig; |
||||||
|
import com.fr.extended.chart.ExtendedField; |
||||||
|
import com.fr.stable.AssistUtils; |
||||||
|
import com.fr.stable.xml.XMLPrintWriter; |
||||||
|
import com.fr.stable.xml.XMLableReader; |
||||||
|
|
||||||
|
import java.util.Objects; |
||||||
|
|
||||||
|
public class POMapDataConfig extends AbstractDataConfig { |
||||||
|
|
||||||
|
private ExtendedField x = new ExtendedField(); |
||||||
|
private ExtendedField y = new ExtendedField(); |
||||||
|
private ExtendedField title = new ExtendedField(); |
||||||
|
|
||||||
|
public ExtendedField getTitle() { |
||||||
|
return title; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTitle(ExtendedField title) { |
||||||
|
this.title = title; |
||||||
|
} |
||||||
|
|
||||||
|
public ExtendedField getX() { |
||||||
|
return x; |
||||||
|
} |
||||||
|
|
||||||
|
public void setX(ExtendedField x) { |
||||||
|
this.x = x; |
||||||
|
} |
||||||
|
|
||||||
|
public ExtendedField getY() { |
||||||
|
return y; |
||||||
|
} |
||||||
|
|
||||||
|
public void setY(ExtendedField y) { |
||||||
|
this.y = y; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void readAttr(XMLableReader reader) { |
||||||
|
readExtendedField(x, "x", reader); |
||||||
|
readExtendedField(y, "y", reader); |
||||||
|
readExtendedField(title, "title", reader); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void writeAttr(XMLPrintWriter writer) { |
||||||
|
writeExtendedField(x, "x", writer); |
||||||
|
writeExtendedField(y, "y", writer); |
||||||
|
writeExtendedField(title, "title", writer); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public ExtendedField[] dataSetFields() { |
||||||
|
return new ExtendedField[]{ |
||||||
|
x, |
||||||
|
y, |
||||||
|
title |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public POMapDataConfig clone() throws CloneNotSupportedException { |
||||||
|
POMapDataConfig result = new POMapDataConfig(); |
||||||
|
result.setX(this.getX().clone()); |
||||||
|
result.setY(this.getY().clone()); |
||||||
|
result.setTitle(this.getTitle().clone()); |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean equals(Object o) { |
||||||
|
if (this == o) return true; |
||||||
|
if (o == null || getClass() != o.getClass()) return false; |
||||||
|
if (!super.equals(o)) return false; |
||||||
|
POMapDataConfig that = (POMapDataConfig) o; |
||||||
|
return Objects.equals(x, that.x) && Objects.equals(y, that.y) && Objects.equals(title, that.title); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int hashCode() { |
||||||
|
return Objects.hash(x, y, title); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,38 @@ |
|||||||
|
package com.fr.plugin.chart; |
||||||
|
|
||||||
|
import com.fanruan.api.report.chart.field.BaseColumnFieldCollection; |
||||||
|
import com.fr.chartx.data.annotations.KeyField; |
||||||
|
import com.fr.chartx.data.field.ColumnField; |
||||||
|
|
||||||
|
public class POMapListData extends BaseColumnFieldCollection { |
||||||
|
@KeyField |
||||||
|
private ColumnField lat = new ColumnField(); |
||||||
|
|
||||||
|
private ColumnField lng = new ColumnField(); |
||||||
|
|
||||||
|
private ColumnField title = new ColumnField(); |
||||||
|
|
||||||
|
public ColumnField getLat() { |
||||||
|
return lat; |
||||||
|
} |
||||||
|
|
||||||
|
public void setLat(ColumnField lat) { |
||||||
|
this.lat = lat; |
||||||
|
} |
||||||
|
|
||||||
|
public ColumnField getLng() { |
||||||
|
return lng; |
||||||
|
} |
||||||
|
|
||||||
|
public void setLng(ColumnField lng) { |
||||||
|
this.lng = lng; |
||||||
|
} |
||||||
|
|
||||||
|
public ColumnField getTitle() { |
||||||
|
return title; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTitle(ColumnField title) { |
||||||
|
this.title = title; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,69 @@ |
|||||||
|
package com.fr.plugin.components; |
||||||
|
|
||||||
|
import com.fr.web.struct.AssembleComponent; |
||||||
|
import com.fr.web.struct.Atom; |
||||||
|
import com.fr.web.struct.Component; |
||||||
|
import com.fr.web.struct.Filter; |
||||||
|
import com.fr.web.struct.browser.RequestClient; |
||||||
|
import com.fr.web.struct.category.ScriptPath; |
||||||
|
import com.fr.web.struct.category.StylePath; |
||||||
|
|
||||||
|
public class MapComponent extends AssembleComponent { |
||||||
|
public static final MapComponent KEY = new MapComponent(); |
||||||
|
|
||||||
|
/** |
||||||
|
* 返回需要引入的JS脚本路径 |
||||||
|
* |
||||||
|
* @param client 请求客户端描述 |
||||||
|
* @return JS脚本路径 |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public ScriptPath script(RequestClient client) { |
||||||
|
return ScriptPath.build("com/fr/plugin/js/map.js"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 返回需要引入的CSS样式路径 |
||||||
|
* |
||||||
|
* @param client 请求客户端描述 |
||||||
|
* @return CSS样式路径 |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public StylePath style(RequestClient client) { |
||||||
|
//如果不需要就直接返回 StylePath.EMPTY;
|
||||||
|
return StylePath.build("com/fr/plugin/css/map.css"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 通过给定的资源过滤器控制是否加载这个资源 |
||||||
|
* |
||||||
|
* @return 资源过滤器 |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public Filter filter() { |
||||||
|
return new Filter() { |
||||||
|
@Override |
||||||
|
public boolean accept() { |
||||||
|
//任何情况下我们都在平台组件加载时加载我们的组件
|
||||||
|
return true; |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Atom[] refer() { |
||||||
|
return new Atom[]{ |
||||||
|
new Component() { |
||||||
|
@Override |
||||||
|
public ScriptPath script(RequestClient requestClient) { |
||||||
|
return ScriptPath.build("com/fr/plugin/js/openlayer/ol.js"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public StylePath style(RequestClient requestClient) { |
||||||
|
return StylePath.build("com/fr/plugin/js/openlayer/ol.css"); |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
package com.fr.plugin.model; |
||||||
|
|
||||||
|
public class PointModel { |
||||||
|
private String lat; |
||||||
|
private String lng; |
||||||
|
private String title; |
||||||
|
|
||||||
|
public String getLat() { |
||||||
|
return lat; |
||||||
|
} |
||||||
|
|
||||||
|
public void setLat(String lat) { |
||||||
|
this.lat = lat; |
||||||
|
} |
||||||
|
|
||||||
|
public String getLng() { |
||||||
|
return lng; |
||||||
|
} |
||||||
|
|
||||||
|
public void setLng(String lng) { |
||||||
|
this.lng = lng; |
||||||
|
} |
||||||
|
|
||||||
|
public String getTitle() { |
||||||
|
return title; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTitle(String title) { |
||||||
|
this.title = title; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,39 @@ |
|||||||
|
package com.fr.plugin.pane; |
||||||
|
|
||||||
|
import com.fanruan.api.design.chart.BaseOtherPane; |
||||||
|
import com.fanruan.api.design.ui.component.formula.UIFormulaTextField; |
||||||
|
import com.fr.chart.chartattr.ChartCollection; |
||||||
|
import com.fr.design.mainframe.chart.AbstractChartAttrPane; |
||||||
|
import com.fr.plugin.chart.POMapChartData; |
||||||
|
|
||||||
|
import javax.swing.*; |
||||||
|
import java.awt.*; |
||||||
|
|
||||||
|
public class POMapChartAttrPane extends AbstractChartAttrPane { |
||||||
|
|
||||||
|
private UIFormulaTextField title; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
protected JPanel createContentPane() { |
||||||
|
JPanel panel = new JPanel(new BorderLayout(0, 6)); |
||||||
|
title = new UIFormulaTextField(); |
||||||
|
panel.add(title, BorderLayout.CENTER); |
||||||
|
return panel; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String title4PopupWindow() { |
||||||
|
return "样式"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void populate(ChartCollection chartCollection) { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void update(ChartCollection chartCollection) { |
||||||
|
|
||||||
|
} |
||||||
|
} |
@ -0,0 +1,68 @@ |
|||||||
|
package com.fr.plugin.pane; |
||||||
|
|
||||||
|
import com.fanruan.api.design.DesignKit; |
||||||
|
import com.fanruan.api.design.chart.field.BaseCellDataFieldsPane; |
||||||
|
import com.fanruan.api.design.ui.component.formula.UIFormulaTextField; |
||||||
|
import com.fr.plugin.chart.POMapListData; |
||||||
|
|
||||||
|
import java.awt.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* 单元格数据集 |
||||||
|
*/ |
||||||
|
public class POMapDataFieldsPane extends BaseCellDataFieldsPane<POMapListData> { |
||||||
|
|
||||||
|
private UIFormulaTextField lngPane; |
||||||
|
private UIFormulaTextField latPane; |
||||||
|
private UIFormulaTextField titlePane; |
||||||
|
|
||||||
|
public void initComponents() { |
||||||
|
lngPane = new UIFormulaTextField(); |
||||||
|
latPane = new UIFormulaTextField(); |
||||||
|
titlePane = new UIFormulaTextField(); |
||||||
|
super.initComponents(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected String[] fieldLabels() { |
||||||
|
return new String[]{ |
||||||
|
DesignKit.i18nText("Lat数据"), |
||||||
|
DesignKit.i18nText("Lng数据"), |
||||||
|
DesignKit.i18nText("信息标签") |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected Component[] fieldComponents() { |
||||||
|
return new Component[]{ |
||||||
|
latPane, |
||||||
|
lngPane, |
||||||
|
titlePane |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected UIFormulaTextField[] formulaPanes() { |
||||||
|
return new UIFormulaTextField[]{ |
||||||
|
latPane, |
||||||
|
lngPane, |
||||||
|
titlePane |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void populateBean(POMapListData dataConf) { |
||||||
|
populateField(latPane, dataConf.getLat()); |
||||||
|
populateField(lngPane, dataConf.getLng()); |
||||||
|
populateField(titlePane, dataConf.getTitle()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public POMapListData updateBean() { |
||||||
|
POMapListData dataConfig = new POMapListData(); |
||||||
|
updateField(latPane, dataConfig.getLat()); |
||||||
|
updateField(lngPane, dataConfig.getLng()); |
||||||
|
updateField(titlePane, dataConfig.getTitle()); |
||||||
|
return dataConfig; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,68 @@ |
|||||||
|
package com.fr.plugin.pane; |
||||||
|
|
||||||
|
import com.fanruan.api.design.DesignKit; |
||||||
|
import com.fanruan.api.design.chart.field.BaseDataSetFieldsPane; |
||||||
|
import com.fanruan.api.design.ui.component.UIComboBox; |
||||||
|
import com.fanruan.api.design.ui.component.chart.CalculateComboBox; |
||||||
|
import com.fr.plugin.chart.POMapListData; |
||||||
|
|
||||||
|
import java.awt.*; |
||||||
|
|
||||||
|
//数据集数据源
|
||||||
|
public class POMapDataSetFieldsPane extends BaseDataSetFieldsPane<POMapListData> { |
||||||
|
|
||||||
|
private UIComboBox lngPane; |
||||||
|
private UIComboBox latPane; |
||||||
|
private UIComboBox titlePane; |
||||||
|
|
||||||
|
public void initComponents() { |
||||||
|
titlePane = new UIComboBox(); |
||||||
|
lngPane = new UIComboBox(); |
||||||
|
latPane = new UIComboBox(); |
||||||
|
super.initComponents(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected String[] fieldLabels() { |
||||||
|
return new String[]{ |
||||||
|
DesignKit.i18nText("Lat数据"), |
||||||
|
DesignKit.i18nText("Lng数据"), |
||||||
|
DesignKit.i18nText("信息标签") |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected Component[] fieldComponents() { |
||||||
|
return new Component[]{ |
||||||
|
latPane, |
||||||
|
lngPane, |
||||||
|
titlePane |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected UIComboBox[] filedComboBoxes() { |
||||||
|
return new UIComboBox[]{ |
||||||
|
latPane, |
||||||
|
lngPane, |
||||||
|
titlePane |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void populateBean(POMapListData dataConf) { |
||||||
|
populateField(latPane, dataConf.getLat()); |
||||||
|
populateField(lngPane, dataConf.getLng()); |
||||||
|
populateField(titlePane, dataConf.getTitle()); |
||||||
|
// populateFunctionField(titlePane, calculateComboBox, dataConf.getValue());
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public POMapListData updateBean() { |
||||||
|
POMapListData dataConfig = new POMapListData(); |
||||||
|
updateField(latPane, dataConfig.getLat()); |
||||||
|
updateField(lngPane, dataConfig.getLng()); |
||||||
|
updateField(titlePane, dataConfig.getTitle()); |
||||||
|
return dataConfig; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,52 @@ |
|||||||
|
package com.fr.plugin.pane; |
||||||
|
|
||||||
|
import com.fr.design.formula.TinyFormulaPane; |
||||||
|
import com.fr.extended.chart.AbstractExtendedChartReportDataPane; |
||||||
|
import com.fr.plugin.chart.POMapDataConfig; |
||||||
|
|
||||||
|
public class POMapReportDataPane extends AbstractExtendedChartReportDataPane<POMapDataConfig> { |
||||||
|
|
||||||
|
private TinyFormulaPane xPane; |
||||||
|
private TinyFormulaPane yPane; |
||||||
|
private TinyFormulaPane titlePane; |
||||||
|
|
||||||
|
@Override |
||||||
|
protected String[] fieldLabel() { |
||||||
|
return new String[]{ |
||||||
|
"lat字段", |
||||||
|
"lng字段", |
||||||
|
"标题字段" |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected TinyFormulaPane[] formulaPanes() { |
||||||
|
if (xPane == null) { |
||||||
|
xPane = new TinyFormulaPane(); |
||||||
|
yPane = new TinyFormulaPane(); |
||||||
|
titlePane = new TinyFormulaPane(); |
||||||
|
} |
||||||
|
return new TinyFormulaPane[]{ |
||||||
|
xPane, |
||||||
|
yPane, |
||||||
|
titlePane |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void populate(POMapDataConfig dataConf) { |
||||||
|
populateField(xPane, dataConf.getX()); |
||||||
|
populateField(yPane, dataConf.getY()); |
||||||
|
populateField(titlePane, dataConf.getTitle()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected POMapDataConfig update() { |
||||||
|
POMapDataConfig dataConfig = new POMapDataConfig(); |
||||||
|
|
||||||
|
updateField(xPane, dataConfig.getX()); |
||||||
|
updateField(yPane, dataConfig.getY()); |
||||||
|
updateField(titlePane, dataConfig.getTitle()); |
||||||
|
return dataConfig; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,132 @@ |
|||||||
|
package com.fr.plugin.pane; |
||||||
|
|
||||||
|
import com.fanruan.api.design.chart.BaseOtherPane; |
||||||
|
import com.fanruan.api.design.ui.component.*; |
||||||
|
import com.fanruan.api.design.ui.layout.TableLayoutKit; |
||||||
|
import com.fr.design.layout.TableLayout; |
||||||
|
import com.fr.plugin.chart.POMapChartData; |
||||||
|
|
||||||
|
import javax.swing.*; |
||||||
|
import java.awt.*; |
||||||
|
|
||||||
|
public class POMapStylePane extends BaseOtherPane<POMapChartData> { |
||||||
|
|
||||||
|
private UITextField pointIcon; |
||||||
|
private UITextField mapUrl; |
||||||
|
private UITextField fontName; |
||||||
|
private UITextField center; |
||||||
|
private UINumberField fontSize; |
||||||
|
private UINumberField textBoxWidth; |
||||||
|
private UINumberField textBoxLeft;//信息框举例顶部的间距
|
||||||
|
private UIColorButton textBoxBackgroundColor; |
||||||
|
private UIColorButton fontColor; |
||||||
|
private UINumberField lineSize; |
||||||
|
private UIComboBox<String> lineStyle; |
||||||
|
|
||||||
|
@Override |
||||||
|
public void populate(POMapChartData ob) { |
||||||
|
if (pointIcon != null) { |
||||||
|
pointIcon.setText(ob.getPointIcon()); |
||||||
|
fontName.setText(ob.getFontName()); |
||||||
|
center.setText(ob.getCenter()); |
||||||
|
mapUrl.setText(ob.getMapUrl()); |
||||||
|
textBoxWidth.setText(ob.getTextBoxWidth()); |
||||||
|
fontSize.setText(ob.getFontSize()); |
||||||
|
fontColor.setColor(ob.getFontColor()); |
||||||
|
textBoxLeft.setText(ob.getTextBoxLeft()); |
||||||
|
textBoxBackgroundColor.setColor(ob.getTextBoxColor()); |
||||||
|
lineSize.setText(ob.getLineSize()); |
||||||
|
lineStyle.setSelectedItem(ob.getLineStyle()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void update(POMapChartData ob) { |
||||||
|
ob.setFontColor(this.fontColor.getColor()); |
||||||
|
ob.setFontName(this.fontName.getText()); |
||||||
|
ob.setMapUrl(this.mapUrl.getText()); |
||||||
|
ob.setCenter(this.center.getText()); |
||||||
|
ob.setTextBoxWidth(this.textBoxWidth.getText()); |
||||||
|
ob.setTextBoxLeft(this.textBoxLeft.getText()); |
||||||
|
ob.setFontSize(this.fontSize.getText()); |
||||||
|
ob.setTextBoxColor(this.textBoxBackgroundColor.getColor()); |
||||||
|
if (this.lineStyle.getSelectedItem() != null) { |
||||||
|
ob.setLineStyle(this.lineStyle.getSelectedItem().toString()); |
||||||
|
} |
||||||
|
ob.setLineSize(this.lineSize.getText()); |
||||||
|
ob.setPointIcon(this.pointIcon.getText()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected JPanel createContentPane() { |
||||||
|
if (pointIcon == null) { |
||||||
|
pointIcon = new UITextField(); |
||||||
|
fontName = new UITextField(); |
||||||
|
mapUrl = new UITextField(); |
||||||
|
textBoxWidth = new UINumberField(); |
||||||
|
textBoxBackgroundColor = new UIColorButton(); |
||||||
|
center = new UITextField(); |
||||||
|
fontSize = new UINumberField(12); |
||||||
|
fontColor = new UIColorButton(); |
||||||
|
lineSize = new UINumberField(12); |
||||||
|
textBoxLeft = new UINumberField(12); |
||||||
|
lineStyle = new UIComboBox<String>(new String[]{ |
||||||
|
"虚线", |
||||||
|
"实线" |
||||||
|
}); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
Component[][] components=new Component[][]{ |
||||||
|
new Component[]{ |
||||||
|
new UILabel("地图url"),mapUrl, |
||||||
|
}, |
||||||
|
new Component[]{ |
||||||
|
new UILabel("点位图片"),pointIcon, |
||||||
|
}, |
||||||
|
new Component[]{ |
||||||
|
new UILabel("字体颜色"),fontColor, |
||||||
|
}, |
||||||
|
new Component[]{ |
||||||
|
new UILabel("线段粗细"),lineSize, |
||||||
|
}, |
||||||
|
new Component[]{ |
||||||
|
new UILabel("线段类型"),lineStyle, |
||||||
|
}, |
||||||
|
new Component[]{ |
||||||
|
new UILabel("地图中心位置"),center, |
||||||
|
}, |
||||||
|
new Component[]{ |
||||||
|
new UILabel("字号"),fontSize, |
||||||
|
}, |
||||||
|
new Component[]{ |
||||||
|
new UILabel("字体名称"),fontName, |
||||||
|
}, |
||||||
|
new Component[]{ |
||||||
|
new UILabel("信息框宽度"),textBoxWidth, |
||||||
|
}, |
||||||
|
new Component[]{ |
||||||
|
new UILabel("信息框背景色"),textBoxBackgroundColor, |
||||||
|
}, |
||||||
|
new Component[]{ |
||||||
|
new UILabel("信息框和点距离"),textBoxLeft, |
||||||
|
}, |
||||||
|
}; |
||||||
|
|
||||||
|
double p = TableLayoutKit.PREFERRED; |
||||||
|
double f = TableLayout.FILL; |
||||||
|
double[] rowSize=new double[]{p,p,p,p,p,p,p,p,p,p,p}; |
||||||
|
double[] columnSize=new double[]{p, f}; |
||||||
|
JPanel jPanel = new JPanel(); |
||||||
|
jPanel.setLayout(new BorderLayout()); |
||||||
|
JPanel tableLayoutPane = TableLayoutKit.createTableLayoutPane(components, rowSize, columnSize); |
||||||
|
jPanel.add(tableLayoutPane, BorderLayout.NORTH); |
||||||
|
jPanel.setSize(300,600); |
||||||
|
return jPanel; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String title4PopupWindow() { |
||||||
|
return "样式"; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,52 @@ |
|||||||
|
package com.fr.plugin.pane; |
||||||
|
|
||||||
|
import com.fr.design.gui.icombobox.UIComboBox; |
||||||
|
import com.fr.extended.chart.AbstractExtendedChartTableDataPane; |
||||||
|
import com.fr.plugin.chart.POMapDataConfig; |
||||||
|
|
||||||
|
public class POMapTableDataPane extends AbstractExtendedChartTableDataPane<POMapDataConfig> { |
||||||
|
private UIComboBox xComboBox; |
||||||
|
private UIComboBox yComboBox; |
||||||
|
private UIComboBox titleComboBox; |
||||||
|
|
||||||
|
@Override |
||||||
|
protected String[] fieldLabels() { |
||||||
|
return new String[]{ |
||||||
|
"lat字段", |
||||||
|
"lng字段", |
||||||
|
"标题字段" |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected UIComboBox[] filedComboBoxes() { |
||||||
|
if (xComboBox == null) { |
||||||
|
xComboBox = new UIComboBox(); |
||||||
|
yComboBox = new UIComboBox(); |
||||||
|
titleComboBox=new UIComboBox(); |
||||||
|
} |
||||||
|
return new UIComboBox[]{ |
||||||
|
xComboBox, |
||||||
|
yComboBox, |
||||||
|
titleComboBox |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void populate(POMapDataConfig dataConf) { |
||||||
|
populateField(xComboBox, dataConf.getX()); |
||||||
|
populateField(yComboBox, dataConf.getY()); |
||||||
|
populateField(titleComboBox, dataConf.getTitle()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected POMapDataConfig update() { |
||||||
|
POMapDataConfig dataConfig = new POMapDataConfig(); |
||||||
|
|
||||||
|
updateField(xComboBox, dataConfig.getX()); |
||||||
|
updateField(yComboBox, dataConfig.getY()); |
||||||
|
updateField(titleComboBox, dataConfig.getTitle()); |
||||||
|
|
||||||
|
return dataConfig; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,51 @@ |
|||||||
|
package com.fr.plugin.pane; |
||||||
|
|
||||||
|
import com.fanruan.api.design.chart.DefaultTypePane; |
||||||
|
import com.fanruan.api.design.ui.component.UIButtonGroup; |
||||||
|
import com.fr.plugin.chart.POMapChartData; |
||||||
|
|
||||||
|
import javax.swing.*; |
||||||
|
import java.awt.*; |
||||||
|
|
||||||
|
public class POMapTypePane extends DefaultTypePane<POMapChartData> { |
||||||
|
|
||||||
|
private UIButtonGroup buttonGroup = new UIButtonGroup(new String[]{ |
||||||
|
"定制点地图" |
||||||
|
}); |
||||||
|
|
||||||
|
@Override |
||||||
|
protected String[] getTypeIconPath() { |
||||||
|
return new String[]{ |
||||||
|
"com/fr/plugin/img/logo.png", |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected int getSelectIndexInChart(POMapChartData chart) { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void setSelectIndexInChart(POMapChartData chart, int index) { |
||||||
|
//选择的图表
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected Component[][] getPaneComponents(JPanel typePane) { |
||||||
|
return new Component[][]{ |
||||||
|
new Component[]{typePane}, |
||||||
|
new Component[]{buttonGroup} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void populateBean(POMapChartData ob) { |
||||||
|
super.populateBean(ob); |
||||||
|
buttonGroup.setSelectedIndex(0); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void updateBean(POMapChartData ob) { |
||||||
|
super.updateBean(ob); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,50 @@ |
|||||||
|
package com.fr.plugin.provider; |
||||||
|
|
||||||
|
import com.fanruan.api.report.chart.BaseChartType; |
||||||
|
import com.fanruan.api.report.chart.BaseChartWithData; |
||||||
|
import com.fr.log.FineLoggerFactory; |
||||||
|
import com.fr.plugin.chart.POMapChartData; |
||||||
|
import com.fr.plugin.transform.ExecuteFunctionRecord; |
||||||
|
import com.fr.plugin.transform.FunctionRecorder; |
||||||
|
|
||||||
|
@FunctionRecorder |
||||||
|
public class POMapChatType extends BaseChartType { |
||||||
|
|
||||||
|
@Override |
||||||
|
@ExecuteFunctionRecord |
||||||
|
public void init() { |
||||||
|
super.init(); |
||||||
|
FineLoggerFactory.getLogger().error("定制点地图初始化"); |
||||||
|
} |
||||||
|
|
||||||
|
public BaseChartWithData[] getChartTypes() { |
||||||
|
return new BaseChartWithData[]{ |
||||||
|
new POMapChartData(), |
||||||
|
}; |
||||||
|
} |
||||||
|
@Override |
||||||
|
public String[] getRequiredJS() { |
||||||
|
FineLoggerFactory.getLogger().error("定制点地图初始化 获取js依赖"); |
||||||
|
return new String[]{ |
||||||
|
"/com/fr/plugin/js/map.js", |
||||||
|
"/com/fr/plugin/js/openlayer/ol.js", |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String[] getRequiredCss() { |
||||||
|
return new String[]{ |
||||||
|
"/com/fr/plugin/js/openlayer/ol.css", |
||||||
|
"/com/fr/plugin/css/map.css" |
||||||
|
}; |
||||||
|
} |
||||||
|
/** |
||||||
|
* JS对象名,该对象一般是一个函数,执行后会在给定的dom中绘制图表 |
||||||
|
* |
||||||
|
* @return JS对象名 |
||||||
|
*/ |
||||||
|
public String getWrapperName() { |
||||||
|
return "poMapWrapper"; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,46 @@ |
|||||||
|
package com.fr.plugin.provider; |
||||||
|
|
||||||
|
import com.fanruan.api.design.chart.BaseOtherPane; |
||||||
|
import com.fr.design.gui.frpane.AttributeChangeListener; |
||||||
|
import com.fr.design.mainframe.chart.AbstractChartAttrPane; |
||||||
|
import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; |
||||||
|
import com.fr.extended.chart.AbstractExtendedChartTableDataPane; |
||||||
|
import com.fr.extended.chart.AbstractExtendedChartUIProvider; |
||||||
|
import com.fr.plugin.pane.POMapStylePane; |
||||||
|
import com.fr.plugin.pane.POMapTableDataPane; |
||||||
|
import com.fr.plugin.transform.ExecuteFunctionRecord; |
||||||
|
import com.fr.plugin.transform.FunctionRecorder; |
||||||
|
|
||||||
|
@FunctionRecorder |
||||||
|
public class POMapExtendedChartUIProvider extends AbstractExtendedChartUIProvider { |
||||||
|
|
||||||
|
@Override |
||||||
|
@ExecuteFunctionRecord |
||||||
|
protected AbstractExtendedChartTableDataPane getTableDataSourcePane() { |
||||||
|
return new POMapTableDataPane(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected AbstractReportDataContentPane getReportDataSourcePane() { |
||||||
|
// return new POMapReportDataPane();
|
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String[] getDemoImagePath() { |
||||||
|
return new String[]{ |
||||||
|
"com/fr/plugin/img/logo.png" |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getIconPath() { |
||||||
|
return "com/fr/design/images/form/toolbar/map.png"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public AbstractChartAttrPane[] getAttrPaneArray(AttributeChangeListener listener) { |
||||||
|
//就这里了
|
||||||
|
return new AbstractChartAttrPane[]{new POMapStylePane()}; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,12 @@ |
|||||||
|
package com.fr.plugin.provider; |
||||||
|
|
||||||
|
import com.fr.extended.chart.AbstractChart; |
||||||
|
import com.fr.extended.chart.AbstractExtentChartProvider; |
||||||
|
import com.fr.plugin.chart.POMapChart; |
||||||
|
|
||||||
|
public class POMapExtentChartProvider extends AbstractExtentChartProvider { |
||||||
|
@Override |
||||||
|
protected AbstractChart createChart() { |
||||||
|
return new POMapChart(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,48 @@ |
|||||||
|
package com.fr.plugin.provider; |
||||||
|
|
||||||
|
import com.fanruan.api.design.chart.*; |
||||||
|
import com.fr.design.gui.frpane.AttributeChangeListener; |
||||||
|
import com.fr.plugin.pane.POMapDataFieldsPane; |
||||||
|
import com.fr.plugin.pane.POMapDataSetFieldsPane; |
||||||
|
import com.fr.plugin.pane.POMapStylePane; |
||||||
|
import com.fr.plugin.pane.POMapTypePane; |
||||||
|
|
||||||
|
public class POMapUI extends BaseChartTypeUI { |
||||||
|
|
||||||
|
@Override |
||||||
|
public DefaultTypePane getPlotTypePane() { |
||||||
|
return new POMapTypePane(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public BaseDataPane getChartDataPane(AttributeChangeListener listener) { |
||||||
|
return new BaseDataPane(listener) { |
||||||
|
@Override |
||||||
|
protected SingleDataPane createSingleDataPane() { |
||||||
|
return new SingleDataPane(new POMapDataSetFieldsPane(), new POMapDataFieldsPane()); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
public BaseOtherPane[] getAttrPaneArray(AttributeChangeListener listener) { |
||||||
|
return new BaseOtherPane[]{new POMapStylePane()}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getIconPath() { |
||||||
|
return "com/fr/design/images/form/toolbar/map.png"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getName() { |
||||||
|
return "定制点地图"; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public String[] getDemoImagePath() { |
||||||
|
return new String[]{ |
||||||
|
"com/fr/plugin/img/logo.png" |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,79 @@ |
|||||||
|
package com.fr.plugin.utils; |
||||||
|
|
||||||
|
import java.awt.geom.Point2D; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
public class CompUtils { |
||||||
|
/** |
||||||
|
* 判断点是否在多边形内 |
||||||
|
* @param point 检测点 |
||||||
|
* @param pts 多边形的顶点 |
||||||
|
* @return 点在多边形内返回true,否则返回false |
||||||
|
*/ |
||||||
|
public static boolean IsPtInPoly(Point2D.Double point, List<Point2D.Double> pts){ |
||||||
|
|
||||||
|
int N = pts.size(); |
||||||
|
boolean boundOrVertex = true; //如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true
|
||||||
|
int intersectCount = 0;//cross points count of x
|
||||||
|
double precision = 2e-10; //浮点类型计算时候与0比较时候的容差
|
||||||
|
Point2D.Double p1, p2;//neighbour bound vertices
|
||||||
|
Point2D.Double p = point; //当前点
|
||||||
|
|
||||||
|
p1 = pts.get(0);//left vertex
|
||||||
|
for(int i = 1; i <= N; ++i){//check all rays
|
||||||
|
if(p.equals(p1)){ |
||||||
|
return boundOrVertex;//p is an vertex
|
||||||
|
} |
||||||
|
|
||||||
|
p2 = pts.get(i % N);//right vertex
|
||||||
|
if(p.x < Math.min(p1.x, p2.x) || p.x > Math.max(p1.x, p2.x)){//ray is outside of our interests
|
||||||
|
p1 = p2; |
||||||
|
continue;//next ray left point
|
||||||
|
} |
||||||
|
|
||||||
|
if(p.x > Math.min(p1.x, p2.x) && p.x < Math.max(p1.x, p2.x)){//ray is crossing over by the algorithm (common part of)
|
||||||
|
if(p.y <= Math.max(p1.y, p2.y)){//x is before of ray
|
||||||
|
if(p1.x == p2.x && p.y >= Math.min(p1.y, p2.y)){//overlies on a horizontal ray
|
||||||
|
return boundOrVertex; |
||||||
|
} |
||||||
|
|
||||||
|
if(p1.y == p2.y){//ray is vertical
|
||||||
|
if(p1.y == p.y){//overlies on a vertical ray
|
||||||
|
return boundOrVertex; |
||||||
|
}else{//before ray
|
||||||
|
++intersectCount; |
||||||
|
} |
||||||
|
}else{//cross point on the left side
|
||||||
|
double xinters = (p.x - p1.x) * (p2.y - p1.y) / (p2.x - p1.x) + p1.y;//cross point of y
|
||||||
|
if(Math.abs(p.y - xinters) < precision){//overlies on a ray
|
||||||
|
return boundOrVertex; |
||||||
|
} |
||||||
|
|
||||||
|
if(p.y < xinters){//before ray
|
||||||
|
++intersectCount; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}else{//special case when ray is crossing through the vertex
|
||||||
|
if(p.x == p2.x && p.y <= p2.y){//p crossing over p2
|
||||||
|
Point2D.Double p3 = pts.get((i+1) % N); //next vertex
|
||||||
|
if(p.x >= Math.min(p1.x, p3.x) && p.x <= Math.max(p1.x, p3.x)){//p.x lies between p1.x & p3.x
|
||||||
|
++intersectCount; |
||||||
|
}else{ |
||||||
|
intersectCount += 2; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
p1 = p2;//next ray left point
|
||||||
|
} |
||||||
|
|
||||||
|
if(intersectCount % 2 == 0){//偶数在多边形外
|
||||||
|
return false; |
||||||
|
} else { //奇数在多边形内
|
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,23 @@ |
|||||||
|
.ol-mouse-position{ |
||||||
|
top: unset!important; |
||||||
|
right: unset!important; |
||||||
|
left: 0; |
||||||
|
bottom: 0; |
||||||
|
} |
||||||
|
.maptopare{ |
||||||
|
position: absolute; |
||||||
|
top: 0; |
||||||
|
right: 0; |
||||||
|
z-index: 999999; |
||||||
|
} |
||||||
|
#popup-content { |
||||||
|
background: #fff; |
||||||
|
/*width: 120px;*/ |
||||||
|
/*height: 40px;*/ |
||||||
|
padding: 10px; |
||||||
|
text-align: center; |
||||||
|
border-radius: 3px; |
||||||
|
} |
||||||
|
.ol-viewport{ |
||||||
|
cursor: auto; |
||||||
|
} |
After Width: | Height: | Size: 291 KiB |
After Width: | Height: | Size: 3.0 KiB |
@ -0,0 +1,415 @@ |
|||||||
|
!(function () { |
||||||
|
|
||||||
|
Van.FRChartBridge.poMapWrapper = Van.FRChartBridge.AbstractChart.extend({ |
||||||
|
//初始化方法,这里使用echarts的初始化方法,并且在echarts图表的点击事件中绑定了超链方法
|
||||||
|
_init: function (dom, option) { |
||||||
|
var that = this; |
||||||
|
var action = $(dom); |
||||||
|
var id = this.uuid(); |
||||||
|
action.attr("id", id); |
||||||
|
var datas = this.options.chartAttr; |
||||||
|
var center = [11583663.78341984, 3588508.27616124]; |
||||||
|
if (datas.mapCenter) { |
||||||
|
center = JSON.parse("[" + datas.mapCenter + "]"); |
||||||
|
} |
||||||
|
var mapUrl = 'https://{a-c}.tile.thunderforest.com/cycle/{z}/{x}/{y}.png?apikey=76aa4d0c90314c6fbfbe574ec63e0b26' |
||||||
|
if (datas.mapUrl) { |
||||||
|
mapUrl = datas.mapUrl |
||||||
|
} |
||||||
|
/** |
||||||
|
* EPSG:4326 |
||||||
|
在世界地图方面,EPSG:4326是比较著名的一个,又名WGS84,是一个地理的非项目坐标系。它是lat,longs(经纬度)GPS显示器。它的单位是十进制度。EPSG:4326无法在平面地图上以有意义的方式显示。 |
||||||
|
EPSG:3857 |
||||||
|
另一个比较知名的编码是EPSG:3857,这也是一张世界地图,目前主要是各大互联网地图公司以它为基准,例如Google地图,Microsoft地图都在用它。 |
||||||
|
* @type {ol.proj.Projection} |
||||||
|
*/ |
||||||
|
var lt3857=ol.proj.get("EPSG:3857") |
||||||
|
// var lt4326=ol.proj.get("EPSG:4326") //又名WGS84
|
||||||
|
var map = window.map = new ol.Map({ |
||||||
|
target: id, |
||||||
|
controls: ol.control.defaults().extend([ |
||||||
|
new ol.control.MousePosition() |
||||||
|
]), |
||||||
|
layers: [ |
||||||
|
new ol.layer.Tile({ |
||||||
|
source: new ol.source.XYZ({ |
||||||
|
projection:lt3857, |
||||||
|
url:mapUrl |
||||||
|
}) |
||||||
|
}), |
||||||
|
], |
||||||
|
view: new ol.View({ |
||||||
|
center: ol.proj.fromLonLat(center), |
||||||
|
zoom: 12 |
||||||
|
}) |
||||||
|
}); |
||||||
|
var imageUrl = datas.pointIcon || 'https://openlayers.org/en/v4.6.5/examples/data/icon.png' |
||||||
|
var style = new ol.style.Style({ |
||||||
|
image: new ol.style.Icon(({ |
||||||
|
anchor: [0.5, 46], |
||||||
|
anchorXUnits: 'fraction', |
||||||
|
anchorYUnits: 'pixels', |
||||||
|
opacity: 0.95, |
||||||
|
src: imageUrl |
||||||
|
})), |
||||||
|
stroke: new ol.style.Stroke({ |
||||||
|
color: '#ffcc33', |
||||||
|
width: 2, |
||||||
|
lineDash: [4, 4], // 重点在这
|
||||||
|
}), |
||||||
|
text: new ol.style.Text({ |
||||||
|
font: datas.fontSize + 'px ' + datas.fontName, //字体与大小
|
||||||
|
fill: new ol.style.Fill({ //文字填充色
|
||||||
|
color: datas.fontColor |
||||||
|
}), |
||||||
|
text: "xxxxxx", |
||||||
|
stroke: new ol.style.Stroke({ //文字边界宽度与颜色
|
||||||
|
color: '#fff', |
||||||
|
width: 3 |
||||||
|
}) |
||||||
|
}) |
||||||
|
}); |
||||||
|
var allFeature = []; |
||||||
|
for (var i = 0; i < datas.lat.length; i++) { |
||||||
|
var coreLocation = [parseFloat(datas.lat[i]), parseFloat(datas.lng[i])]; |
||||||
|
var target=ol.proj.fromLonLat(coreLocation) |
||||||
|
var pp = new ol.geom.Point(target) |
||||||
|
var feature = new ol.Feature(pp) |
||||||
|
feature.set("type", "zzl") |
||||||
|
feature.set("local", target) |
||||||
|
feature.set("title", datas.titles[i]); |
||||||
|
// feature.setStyle(style);
|
||||||
|
allFeature.push(feature); |
||||||
|
// source.addFeature(feature);
|
||||||
|
} |
||||||
|
var source = new ol.source.Vector({ |
||||||
|
// features: allFeature
|
||||||
|
}); |
||||||
|
|
||||||
|
//初始化聚合标注数据源
|
||||||
|
var clusterSource = new ol.source.Cluster({ |
||||||
|
distance: 20, |
||||||
|
source: source |
||||||
|
}); |
||||||
|
|
||||||
|
//样式缓存
|
||||||
|
var styleCache = {}; |
||||||
|
|
||||||
|
// 聚合
|
||||||
|
var clusters = new ol.layer.Vector({ |
||||||
|
source: clusterSource, |
||||||
|
style: function (feature) { |
||||||
|
var size = feature.get('features').length; |
||||||
|
//只有一个的,给他加一个overlayer
|
||||||
|
if (size === 1) { |
||||||
|
var fu = feature.get('features')[0]; |
||||||
|
if (!fu.get("ov")) { |
||||||
|
let title = fu.get("title"); |
||||||
|
let local = fu.get("local"); |
||||||
|
let ov = createOverF(fu, title, local); |
||||||
|
fu.set("ov", ov); |
||||||
|
map.addOverlay(ov); |
||||||
|
} |
||||||
|
style = new ol.style.Style({ |
||||||
|
image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({ |
||||||
|
anchor: [0.5, 46], |
||||||
|
anchorXUnits: 'fraction', |
||||||
|
anchorYUnits: 'pixels', |
||||||
|
opacity: 0.95, |
||||||
|
src: imageUrl |
||||||
|
})) |
||||||
|
}); |
||||||
|
} else { |
||||||
|
var fes = feature.get('features'); |
||||||
|
$.each(fes, function (i, fu) { |
||||||
|
if (fu.get("ov")) { |
||||||
|
map.removeOverlay(fu.get('ov')); |
||||||
|
fu.set("ov", undefined) |
||||||
|
} |
||||||
|
}); |
||||||
|
var fu = feature.get('features')[0]; |
||||||
|
|
||||||
|
style = new ol.style.Style({ |
||||||
|
image: new ol.style.Circle({ |
||||||
|
radius: 10, |
||||||
|
stroke: new ol.style.Stroke({ |
||||||
|
color: '#fff' |
||||||
|
}), |
||||||
|
fill: new ol.style.Fill({ |
||||||
|
color: '#3399CC' |
||||||
|
}) |
||||||
|
}), |
||||||
|
text: new ol.style.Text({ |
||||||
|
text: size.toString(), |
||||||
|
fill: new ol.style.Fill({ |
||||||
|
color: '#fff' |
||||||
|
}) |
||||||
|
}) |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
return style; |
||||||
|
} |
||||||
|
}); |
||||||
|
//用来鼠标绘制内容的层
|
||||||
|
var source1 = new ol.source.Vector(); |
||||||
|
var vector1 = new ol.layer.Vector({ |
||||||
|
source: source1 |
||||||
|
}); |
||||||
|
map.addLayer(vector1); |
||||||
|
|
||||||
|
// // 监听地图分辨率改变事件
|
||||||
|
map.getView().on('change:resolution', function (event) { |
||||||
|
if (map.getView().getZoom() >= 13) { |
||||||
|
clusterSource.setDistance(0); |
||||||
|
} else { |
||||||
|
clusterSource.setDistance(40); |
||||||
|
} |
||||||
|
}) |
||||||
|
|
||||||
|
var draw; // global so we can remove it later
|
||||||
|
var modify; |
||||||
|
var textBoxLeft = datas.textBoxLeft || "12"; |
||||||
|
// 绑定属性框移动事件
|
||||||
|
var dragPan; |
||||||
|
// 监听鼠标点击事件
|
||||||
|
let offsetXY = [0, 0]; |
||||||
|
map.getInteractions().forEach(function (interaction) { |
||||||
|
if (interaction instanceof ol.interaction.DragPan) { |
||||||
|
dragPan = interaction; |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
map.on('pointermove', function (evt) { |
||||||
|
var overlay = map.get("moveingOverlayer") |
||||||
|
if (overlay && overlay.get('dragging') === true) { |
||||||
|
// 将当前的鼠标位置减去偏移量,得到基点应该所处的位置
|
||||||
|
let coor = [evt.coordinate[0] - offsetXY[0], evt.coordinate[1] - offsetXY[1]]; |
||||||
|
overlay.setPosition(coor); |
||||||
|
// 保存最新坐标,因为使用getPostion()方法无法获取overlay的坐标
|
||||||
|
overlay.set("coordinate", coor); |
||||||
|
// 绘制虚线
|
||||||
|
} |
||||||
|
}); |
||||||
|
var lineSize = datas.lineSize || 4 |
||||||
|
if (datas.lineStyle === "虚线") { |
||||||
|
var lineStyle = new ol.style.Style({ |
||||||
|
fill: new ol.style.Fill({ |
||||||
|
color: 'rgba(255, 255, 255, 0.2)' |
||||||
|
}), |
||||||
|
stroke: new ol.style.Stroke({ |
||||||
|
color: '#ffcc33', |
||||||
|
width: lineSize, |
||||||
|
lineDash: [1, 2, 3, 4, 5, 6] |
||||||
|
}), |
||||||
|
image: new ol.style.Circle({ |
||||||
|
radius: 7, |
||||||
|
fill: new ol.style.Fill({ |
||||||
|
color: '#ffcc33' |
||||||
|
}) |
||||||
|
}) |
||||||
|
}); |
||||||
|
|
||||||
|
} else { |
||||||
|
var lineStyle = new ol.style.Style({ |
||||||
|
fill: new ol.style.Fill({ |
||||||
|
color: 'rgba(255, 255, 255, 0.2)' |
||||||
|
}), |
||||||
|
stroke: new ol.style.Stroke({ |
||||||
|
color: '#ffcc33', |
||||||
|
width: lineSize, |
||||||
|
}), |
||||||
|
image: new ol.style.Circle({ |
||||||
|
radius: 7, |
||||||
|
fill: new ol.style.Fill({ |
||||||
|
color: '#ffcc33' |
||||||
|
}) |
||||||
|
}) |
||||||
|
}); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
function createOverF(fue, content, postion) { |
||||||
|
var overlayerJq = $(" <div class=\"ol-popup\" >\n" + |
||||||
|
" <div id=\"popup-content\" style='font-family: "+datas.fontName+";color:" + datas.fontColor + ";width: " + datas.textBoxWidth + "px;font-size:"+datas.fontSize+"px;background: " + datas.textBoxColor + "' class=\"popup-content\">" + content + "</div>\n" + |
||||||
|
" </div>"); |
||||||
|
overlayerJq.on("mousedown", function (evt) { |
||||||
|
console.info("信息框鼠标按下") |
||||||
|
dragPan.setActive(false); |
||||||
|
var overlay = $(this).data("overlayer"); |
||||||
|
overlay.set('dragging', true); |
||||||
|
// 获取事件点击的坐标值
|
||||||
|
let evtCoord = map.getEventCoordinate(evt); |
||||||
|
let domCoord = overlay.get("coordinate"); |
||||||
|
// 计算鼠标点击位置和基点坐标(可能是div的左上角)之间的偏移量
|
||||||
|
offsetXY = [evtCoord[0] - domCoord[0], evtCoord[1] - domCoord[1]]; |
||||||
|
map.set("moveingOverlayer", overlay) |
||||||
|
}).on("mouseup", function (evt) { |
||||||
|
//当鼠标释放
|
||||||
|
console.info("鼠标抬起") |
||||||
|
var overlay = $(this).data("overlayer"); |
||||||
|
overlay.set('dragging', false); |
||||||
|
// var local=overlay.get("coordinate")
|
||||||
|
var fu = overlay.get("fue") |
||||||
|
map.set("moveingOverlayer", null) |
||||||
|
//鼠标释放之后给画一条线
|
||||||
|
var oldLine = overlay.get("oldLine") |
||||||
|
if (oldLine) { |
||||||
|
source1.removeFeature(oldLine); |
||||||
|
} |
||||||
|
let evtCoord = map.getEventCoordinate(evt); |
||||||
|
var local = fu.get("local"); |
||||||
|
var fline = new ol.Feature({ |
||||||
|
geometry: new ol.geom.LineString([local, evtCoord]) |
||||||
|
}); |
||||||
|
fline.setStyle(lineStyle); |
||||||
|
overlay.set("oldLine", fline) |
||||||
|
source1.addFeature(fline); |
||||||
|
}); |
||||||
|
var overlayerDom = overlayerJq[0]; |
||||||
|
var overlay = new ol.Overlay({ |
||||||
|
element: overlayerDom, |
||||||
|
positioning: 'bottom-center', // 覆盖层位置
|
||||||
|
autoPan: true, // 是否自动平移,当点击时对话框超出屏幕边距,会自动平移地图使其可见
|
||||||
|
autoPanMargin: 20, // 设置自动平移边距
|
||||||
|
offset: [0, -parseInt(textBoxLeft)], // 覆盖层偏移起点的位置
|
||||||
|
className: 'overlay-info', |
||||||
|
position: postion |
||||||
|
}); |
||||||
|
overlay.set("fue", fue);//绑定的fu
|
||||||
|
overlay.set("coordinate", postion);//初始坐标
|
||||||
|
$(overlayerJq).data("overlayer", overlay); |
||||||
|
return overlay; |
||||||
|
} |
||||||
|
|
||||||
|
function addInteraction(type) { |
||||||
|
if (modify) { |
||||||
|
map.removeInteraction(modify); |
||||||
|
modify = null; |
||||||
|
} |
||||||
|
if (draw) { |
||||||
|
map.removeInteraction(draw); |
||||||
|
draw = null; |
||||||
|
} |
||||||
|
$(action).find(".ol-viewport").css("cursor", "auto") |
||||||
|
var geometryFunction; |
||||||
|
var maxPoints; |
||||||
|
if (type === "LineString") { |
||||||
|
maxPoints = 2; |
||||||
|
geometryFunction = function (coordinates, geometry) { |
||||||
|
if (!geometry) { |
||||||
|
geometry = new ol.geom.Polygon(null); |
||||||
|
} |
||||||
|
var start = coordinates[0]; |
||||||
|
var end = coordinates[1]; |
||||||
|
geometry.setCoordinates([ |
||||||
|
[start, [start[0], end[1]], end, [end[0], start[1]], start] |
||||||
|
]); |
||||||
|
return geometry; |
||||||
|
}; |
||||||
|
draw = new ol.interaction.Draw({ |
||||||
|
source: source1, |
||||||
|
type: type, |
||||||
|
maxPoints: maxPoints, |
||||||
|
geometryFunction: geometryFunction |
||||||
|
}) |
||||||
|
} else { |
||||||
|
draw = new ol.interaction.Draw({ |
||||||
|
source: source1, |
||||||
|
type: type, |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
draw.on('drawend', function (event) { |
||||||
|
//清空原来选中的数据
|
||||||
|
clusterSource.getSource().clear(); |
||||||
|
source1.clear(); |
||||||
|
map.removeLayer(clusters); |
||||||
|
var geo = event.feature.getGeometry(); |
||||||
|
var tempAllFeature = new Array() |
||||||
|
for (var j = 0; j < allFeature.length; j++) { |
||||||
|
var a = allFeature[j]; |
||||||
|
var temp = a.getGeometry().getCoordinates(); |
||||||
|
if (geo.intersectsCoordinate(temp)) { |
||||||
|
// a.setStyle(style)
|
||||||
|
tempAllFeature.push(a); |
||||||
|
} |
||||||
|
} |
||||||
|
if (tempAllFeature.length > 0) { |
||||||
|
clusterSource.getSource().addFeatures(tempAllFeature); |
||||||
|
map.getOverlays().clear();//清空之前的overlays
|
||||||
|
//添加所有的可见点之后添加overlays
|
||||||
|
$.each(tempAllFeature, function (i, v) { |
||||||
|
let title = v.get("title"); |
||||||
|
let local = v.get("local"); |
||||||
|
// let ov = createOverF(title, local);
|
||||||
|
// v.set("ov", ov);
|
||||||
|
// map.addOverlay(ov);
|
||||||
|
}) |
||||||
|
map.addLayer(clusters); |
||||||
|
// movePoint();
|
||||||
|
} |
||||||
|
}); |
||||||
|
map.addInteraction(draw); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
function movePoint() { |
||||||
|
if (draw) { |
||||||
|
map.removeInteraction(draw) |
||||||
|
} |
||||||
|
$(action).find(".ol-viewport").css("cursor", "grab") |
||||||
|
} |
||||||
|
|
||||||
|
function cleanAll() { |
||||||
|
//清空source1
|
||||||
|
source1.clear(); |
||||||
|
//清空浮层
|
||||||
|
map.getOverlays().clear(); |
||||||
|
//清空圈选区域
|
||||||
|
source.clear(); |
||||||
|
} |
||||||
|
|
||||||
|
addInteraction("LineString");//默认矩形
|
||||||
|
var qxms = $("<select ><option value='LineString'>矩形 </option><option value='Circle'>圆形 </option><option value='Polygon'>多边形 </option></select>").change(function () { |
||||||
|
addInteraction($(this).val()); |
||||||
|
}) |
||||||
|
var qxmsBtn = $("<button > 圈选模式</button>").click(function () { |
||||||
|
addInteraction(qxms.val()); |
||||||
|
}) |
||||||
|
var cleanBtn = $("<button > 清空选择</button>").click(function () { |
||||||
|
cleanAll(); |
||||||
|
}) |
||||||
|
var movems = $("<button > 移动模式</button>").click(function () { |
||||||
|
movePoint(); |
||||||
|
}) |
||||||
|
var topBtn = $("<div class='maptopare'></div>") |
||||||
|
.append(cleanBtn) |
||||||
|
.append(qxms) |
||||||
|
.append(qxmsBtn) |
||||||
|
.append(movems); |
||||||
|
action.append(topBtn) |
||||||
|
return action |
||||||
|
}, |
||||||
|
uuid: function () { |
||||||
|
var s = []; |
||||||
|
var hexDigits = "0123456789abcdef"; |
||||||
|
for (var i = 0; i < 12; i++) { |
||||||
|
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); |
||||||
|
} |
||||||
|
return 'mp' + s.join(""); |
||||||
|
}, |
||||||
|
//自动刷新方法。开启自动刷新后会根据时间间隔调用此方法
|
||||||
|
_refresh: function (chart, option) { |
||||||
|
debugger |
||||||
|
chart.setOption(option); |
||||||
|
}, |
||||||
|
|
||||||
|
//定义空数据的条件,这里是当options.series.data.length长度为0时,代表空数据,主要原因是判断空数据时,显示默认的空数据背景
|
||||||
|
_emptyData: function (options) { |
||||||
|
debugger |
||||||
|
return options === 0; |
||||||
|
} |
||||||
|
}) |
||||||
|
})(); |
@ -0,0 +1,234 @@ |
|||||||
|
poMapWrapper = ExtendedChart.extend({ |
||||||
|
uuid: function () { |
||||||
|
var s = []; |
||||||
|
var hexDigits = "0123456789abcdef"; |
||||||
|
for (var i = 0; i < 12; i++) { |
||||||
|
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); |
||||||
|
} |
||||||
|
return 'mp' + s.join(""); |
||||||
|
}, |
||||||
|
_initData: function () { |
||||||
|
|
||||||
|
}, |
||||||
|
|
||||||
|
_init: function (dom, option) { |
||||||
|
var that = this; |
||||||
|
var action = $(dom); |
||||||
|
var id = this.uuid(); |
||||||
|
action.attr("id", id); |
||||||
|
var datas = this.options.chartAttr; |
||||||
|
// var lists = [];
|
||||||
|
// for (var i = 0; i < datas.lat.length; i++) {
|
||||||
|
// lists.push(new ol.Feature(new ol.geom.Point([datas.lat[i],
|
||||||
|
// datas.lng[i]])));
|
||||||
|
// }
|
||||||
|
var source = new ol.source.Vector({ |
||||||
|
wrapX: false, |
||||||
|
}); |
||||||
|
var style = new ol.style.Style({ |
||||||
|
image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({ |
||||||
|
anchor: [0.5, 46], |
||||||
|
anchorXUnits: 'fraction', |
||||||
|
anchorYUnits: 'pixels', |
||||||
|
opacity: 0.95, |
||||||
|
src: 'https://openlayers.org/en/v4.6.5/examples/data/icon.png' |
||||||
|
})) |
||||||
|
}); |
||||||
|
var allFeature = []; |
||||||
|
for (var i = 0; i < datas.lat.length; i++) { |
||||||
|
var feature = new ol.Feature(new ol.geom.Point([datas.lng[i], datas.lat[i]])) |
||||||
|
// feature.setStyle(style);
|
||||||
|
allFeature.push(feature); |
||||||
|
source.addFeature(feature); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
//初始化聚合标注数据源
|
||||||
|
var clusterSource = new ol.source.Cluster({ |
||||||
|
//标注元素之间的间距
|
||||||
|
distance: 40, |
||||||
|
//数据源
|
||||||
|
source:source |
||||||
|
}); |
||||||
|
|
||||||
|
//样式缓存
|
||||||
|
var styleCache = {}; |
||||||
|
|
||||||
|
// 聚合
|
||||||
|
var clusters = new ol.layer.Vector({ |
||||||
|
source: clusterSource, |
||||||
|
//样式
|
||||||
|
style: function (feature, resolution) { |
||||||
|
//当前聚合标注数据源的要素大小
|
||||||
|
var size = feature.get('features').length; |
||||||
|
//定义样式
|
||||||
|
var style = styleCache[size]; |
||||||
|
//如果当前样式不存在则创建
|
||||||
|
if (!style) { |
||||||
|
style = [ |
||||||
|
//初始化样式
|
||||||
|
new ol.style.Style({ |
||||||
|
//点样式
|
||||||
|
image: new ol.style.Circle({ |
||||||
|
//点的半径
|
||||||
|
radius: 10, |
||||||
|
//笔触
|
||||||
|
stroke: new ol.style.Stroke({ |
||||||
|
color: '#fff' |
||||||
|
}), |
||||||
|
//填充
|
||||||
|
fill: new ol.style.Fill({ |
||||||
|
color: '#3399cc' |
||||||
|
}) |
||||||
|
}), |
||||||
|
//文本样式
|
||||||
|
text: new ol.style.Text({ |
||||||
|
//文本内容
|
||||||
|
text: size.toString(), |
||||||
|
//填充
|
||||||
|
fill: new ol.style.Fill({ |
||||||
|
color: '#fff' |
||||||
|
}) |
||||||
|
}) |
||||||
|
}) |
||||||
|
]; |
||||||
|
styleCache[size] = style; |
||||||
|
} |
||||||
|
return style; |
||||||
|
} |
||||||
|
}) |
||||||
|
|
||||||
|
var vector = new ol.layer.Vector({ |
||||||
|
source: source, |
||||||
|
style:null, |
||||||
|
// style:function (feature, resolution) {
|
||||||
|
// var size = feature.get('features').length;
|
||||||
|
// if (size === 1) {
|
||||||
|
// return style
|
||||||
|
// }
|
||||||
|
// else {
|
||||||
|
// return new ol.style.Style({
|
||||||
|
// image: new ol.style.Circle({
|
||||||
|
// radius: 30,
|
||||||
|
// stroke: new ol.style.Stroke({
|
||||||
|
// color: 'white'
|
||||||
|
// }),
|
||||||
|
// fill: new ol.style.Fill({
|
||||||
|
// color: 'blue'
|
||||||
|
// })
|
||||||
|
// }),
|
||||||
|
// text: new ol.style.Text({
|
||||||
|
// text: size.toString(),
|
||||||
|
// fill: new ol.style.Fill({
|
||||||
|
// color: 'white'
|
||||||
|
// })
|
||||||
|
// })
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}); |
||||||
|
|
||||||
|
//
|
||||||
|
// function gen1000() {
|
||||||
|
// var s="";
|
||||||
|
// for (var i = 0; i < 1000; i++) {
|
||||||
|
// var x = random(0, map.getSize()[0]);
|
||||||
|
// var y = random(0, map.getSize()[1]);
|
||||||
|
// var tmp= map.getCoordinateFromPixel([x,y]);
|
||||||
|
// s+="INSERT INTO `t_latdata`( `lat`, `lng`, `cont`) VALUES ( '"+tmp.join("','")+"', '标志位"+i+"');"
|
||||||
|
// }
|
||||||
|
// console.info(s)
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// function random(min, max) {
|
||||||
|
// return Math.floor(Math.random() * (max - min + 1)) + min;
|
||||||
|
// }
|
||||||
|
|
||||||
|
var map = window.map = new ol.Map({ |
||||||
|
target: id, |
||||||
|
controls: ol.control.defaults().extend([ |
||||||
|
new ol.control.MousePosition() |
||||||
|
]), |
||||||
|
layers: [ |
||||||
|
new ol.layer.Tile({ |
||||||
|
source: new ol.source.XYZ({ |
||||||
|
url: 'https://{a-c}.tile.thunderforest.com/cycle/{z}/{x}/{y}.png' + |
||||||
|
'?apikey=76aa4d0c90314c6fbfbe574ec63e0b26' |
||||||
|
}) |
||||||
|
}), |
||||||
|
], |
||||||
|
view: new ol.View({ |
||||||
|
center: [11583663.78341984, |
||||||
|
3588508.27616124], |
||||||
|
zoom: 12 |
||||||
|
}) |
||||||
|
}); |
||||||
|
map.addLayer(vector) |
||||||
|
// 监听地图分辨率改变事件
|
||||||
|
// map.getView().on('change:resolution', function (event) {
|
||||||
|
// if (map.getView().getZoom() === map.getView().getMaxZoom()) {
|
||||||
|
// cluster.setDistance(0);
|
||||||
|
// }
|
||||||
|
// else {
|
||||||
|
// cluster.setDistance(100);
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
var draw; // global so we can remove it later
|
||||||
|
function addInteraction() { |
||||||
|
var value = 'Box'; |
||||||
|
var geometryFunction; |
||||||
|
value = 'Circle'; |
||||||
|
geometryFunction = ol.interaction.Draw.createBox(); |
||||||
|
draw = new ol.interaction.Draw({ |
||||||
|
source: source, |
||||||
|
type: value, |
||||||
|
geometryFunction: geometryFunction, |
||||||
|
}); |
||||||
|
draw.on('drawend', function (event) { |
||||||
|
//圈选之后的回调函数
|
||||||
|
//获取聚合标注数据源中的要素
|
||||||
|
// var currentFeatures = clusterSource.getSource().getFeatures();
|
||||||
|
// //如果当前数据源中没有任何要素则添加
|
||||||
|
// if (currentFeatures.length == 0) {
|
||||||
|
// clusterSource.getSource().addFeatures(features);
|
||||||
|
// clusters.setSource(clusterSource);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// var geo = event.feature.getGeometry();
|
||||||
|
// for (var j = 0; j < allFeature.length; j++) {
|
||||||
|
// var a = allFeature[j];
|
||||||
|
// a.setStyle(null)
|
||||||
|
// var temp = a.getGeometry().getCoordinates();
|
||||||
|
// if (geo.intersectsCoordinate(temp)) {
|
||||||
|
// a.setStyle(style)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//清空原来选中的数据
|
||||||
|
debugger |
||||||
|
clusterSource.getSource().clear(); |
||||||
|
//从map中移除聚合标注图层
|
||||||
|
map.removeLayer(clusters); |
||||||
|
|
||||||
|
var geo = event.feature.getGeometry(); |
||||||
|
var tempAllFeature=new Array() |
||||||
|
for (var j = 0; j < allFeature.length; j++) { |
||||||
|
var a = allFeature[j]; |
||||||
|
var temp = a.getGeometry().getCoordinates(); |
||||||
|
if (geo.intersectsCoordinate(temp)) { |
||||||
|
tempAllFeature.push(a); |
||||||
|
} |
||||||
|
} |
||||||
|
debugger |
||||||
|
if (tempAllFeature.length > 0) { |
||||||
|
clusterSource.getSource().addFeatures(tempAllFeature); |
||||||
|
clusters.setSource(clusterSource); |
||||||
|
map.addLayer(clusters); |
||||||
|
} |
||||||
|
}); |
||||||
|
map.addInteraction(draw); |
||||||
|
} |
||||||
|
|
||||||
|
addInteraction(); |
||||||
|
return action |
||||||
|
} |
||||||
|
}); |
@ -0,0 +1,194 @@ |
|||||||
|
poMapWrapper = ExtendedChart.extend({ |
||||||
|
uuid: function () { |
||||||
|
var s = []; |
||||||
|
var hexDigits = "0123456789abcdef"; |
||||||
|
for (var i = 0; i < 12; i++) { |
||||||
|
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); |
||||||
|
} |
||||||
|
return 'mp' + s.join(""); |
||||||
|
}, |
||||||
|
_initData: function () { |
||||||
|
|
||||||
|
}, |
||||||
|
|
||||||
|
_init: function (dom, option) { |
||||||
|
var that = this; |
||||||
|
var action = $(dom); |
||||||
|
var id = this.uuid(); |
||||||
|
action.attr("id", id); |
||||||
|
var datas = this.options.chartAttr; |
||||||
|
// var lists = [];
|
||||||
|
// for (var i = 0; i < datas.lat.length; i++) {
|
||||||
|
// lists.push(new ol.Feature(new ol.geom.Point([datas.lat[i],
|
||||||
|
// datas.lng[i]])));
|
||||||
|
// }
|
||||||
|
|
||||||
|
var style = new ol.style.Style({ |
||||||
|
image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({ |
||||||
|
anchor: [0.5, 46], |
||||||
|
anchorXUnits: 'fraction', |
||||||
|
anchorYUnits: 'pixels', |
||||||
|
opacity: 0.95, |
||||||
|
src: 'https://openlayers.org/en/v4.6.5/examples/data/icon.png' |
||||||
|
})) |
||||||
|
}); |
||||||
|
var allFeature = []; |
||||||
|
|
||||||
|
for (var i = 0; i < datas.lat.length; i++) { |
||||||
|
var feature = new ol.Feature(new ol.geom.Point([parseFloat(datas.lng[i]), parseFloat(datas.lat[i])])) |
||||||
|
feature.setStyle(null); |
||||||
|
allFeature.push(feature); |
||||||
|
// source.addFeature(feature);
|
||||||
|
} |
||||||
|
var source = new ol.source.Vector({ |
||||||
|
features: allFeature |
||||||
|
}); |
||||||
|
|
||||||
|
//初始化聚合标注数据源
|
||||||
|
var clusterSource = new ol.source.Cluster({ |
||||||
|
distance: 20, |
||||||
|
source: source |
||||||
|
}); |
||||||
|
|
||||||
|
//样式缓存
|
||||||
|
var styleCache = {}; |
||||||
|
|
||||||
|
// 聚合
|
||||||
|
var clusters = new ol.layer.Vector({ |
||||||
|
source: clusterSource, |
||||||
|
style: function (feature) { |
||||||
|
var size = feature.get('features').length; |
||||||
|
var style = styleCache[size]; |
||||||
|
if (!style) { |
||||||
|
if (size === 1) { |
||||||
|
style = new ol.style.Style({ |
||||||
|
image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({ |
||||||
|
anchor: [0.5, 46], |
||||||
|
anchorXUnits: 'fraction', |
||||||
|
anchorYUnits: 'pixels', |
||||||
|
opacity: 0.95, |
||||||
|
src: 'https://openlayers.org/en/v4.6.5/examples/data/icon.png' |
||||||
|
})) |
||||||
|
}); |
||||||
|
} else { |
||||||
|
style = new ol.style.Style({ |
||||||
|
image: new ol.style.Circle({ |
||||||
|
radius: 10, |
||||||
|
stroke: new ol.style.Stroke({ |
||||||
|
color: '#fff' |
||||||
|
}), |
||||||
|
fill: new ol.style.Fill({ |
||||||
|
color: '#3399CC' |
||||||
|
}) |
||||||
|
}), |
||||||
|
text: new ol.style.Text({ |
||||||
|
text: size.toString(), |
||||||
|
fill: new ol.style.Fill({ |
||||||
|
color: '#fff' |
||||||
|
}) |
||||||
|
}) |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
styleCache[size] = style; |
||||||
|
} |
||||||
|
return style; |
||||||
|
} |
||||||
|
}); |
||||||
|
//用来鼠标绘制内容的层
|
||||||
|
var source1 = new ol.source.Vector(); |
||||||
|
var vector1 = new ol.layer.Vector({ |
||||||
|
source: source1 |
||||||
|
}); |
||||||
|
|
||||||
|
var map = window.map = new ol.Map({ |
||||||
|
target: id, |
||||||
|
controls: ol.control.defaults().extend([ |
||||||
|
new ol.control.MousePosition() |
||||||
|
]), |
||||||
|
layers: [ |
||||||
|
new ol.layer.Tile({ |
||||||
|
source: new ol.source.XYZ({ |
||||||
|
url: 'https://{a-c}.tile.thunderforest.com/cycle/{z}/{x}/{y}.png' + |
||||||
|
'?apikey=76aa4d0c90314c6fbfbe574ec63e0b26' |
||||||
|
}) |
||||||
|
}), |
||||||
|
vector1, |
||||||
|
], |
||||||
|
view: new ol.View({ |
||||||
|
center: [11583663.78341984, |
||||||
|
3588508.27616124], |
||||||
|
zoom: 12 |
||||||
|
}) |
||||||
|
}); |
||||||
|
|
||||||
|
// // 监听地图分辨率改变事件
|
||||||
|
map.getView().on('change:resolution', function (event) { |
||||||
|
if (map.getView().getZoom() >= 13) { |
||||||
|
clusterSource.setDistance(0); |
||||||
|
} else { |
||||||
|
clusterSource.setDistance(40); |
||||||
|
} |
||||||
|
}) |
||||||
|
var draw; // global so we can remove it later
|
||||||
|
function addInteraction() { |
||||||
|
var geometryFunction; |
||||||
|
geometryFunction = ol.interaction.Draw.createBox(); |
||||||
|
draw = new ol.interaction.Draw({ |
||||||
|
source: source1, |
||||||
|
type: 'LineString', |
||||||
|
style: new ol.style.Style({ |
||||||
|
fill: new ol.style.Fill({ |
||||||
|
color: 'rgba(255, 255, 255, 0.2)' |
||||||
|
}), |
||||||
|
stroke: new ol.style.Stroke({ |
||||||
|
color: '#ffcc33', |
||||||
|
width: 6 |
||||||
|
}), |
||||||
|
image: new ol.style.Circle({ |
||||||
|
radius: 7, |
||||||
|
fill: new ol.style.Fill({ |
||||||
|
color: '#ffcc33' |
||||||
|
}) |
||||||
|
}) |
||||||
|
}), |
||||||
|
maxPoints: 2, |
||||||
|
geometryFunction: function (coordinates, geometry) { |
||||||
|
if (!geometry) { |
||||||
|
geometry = new ol.geom.Polygon(null); |
||||||
|
} |
||||||
|
var start = coordinates[0]; |
||||||
|
var end = coordinates[1]; |
||||||
|
geometry.setCoordinates([ |
||||||
|
[start, [start[0], end[1]], end, [end[0], start[1]], start] |
||||||
|
]); |
||||||
|
return geometry; |
||||||
|
} |
||||||
|
}) |
||||||
|
draw.on('drawend', function (event) { |
||||||
|
//清空原来选中的数据
|
||||||
|
clusterSource.getSource().clear(); |
||||||
|
source1.clear(); |
||||||
|
map.removeLayer(clusters); |
||||||
|
var geo = event.feature.getGeometry(); |
||||||
|
var tempAllFeature = new Array() |
||||||
|
for (var j = 0; j < allFeature.length; j++) { |
||||||
|
var a = allFeature[j]; |
||||||
|
var temp = a.getGeometry().getCoordinates(); |
||||||
|
if (geo.intersectsCoordinate(temp)) { |
||||||
|
// a.setStyle(style)
|
||||||
|
tempAllFeature.push(a); |
||||||
|
} |
||||||
|
} |
||||||
|
if (tempAllFeature.length > 0) { |
||||||
|
clusterSource.getSource().addFeatures(tempAllFeature); |
||||||
|
map.addLayer(clusters); |
||||||
|
} |
||||||
|
}); |
||||||
|
map.addInteraction(draw); |
||||||
|
} |
||||||
|
|
||||||
|
addInteraction(); |
||||||
|
return action |
||||||
|
} |
||||||
|
}); |
@ -0,0 +1,296 @@ |
|||||||
|
!(function () { |
||||||
|
|
||||||
|
Van.FRChartBridge.poMapWrapper = Van.FRChartBridge.AbstractChart.extend({ |
||||||
|
//初始化方法,这里使用echarts的初始化方法,并且在echarts图表的点击事件中绑定了超链方法
|
||||||
|
_init: function (dom, option) { |
||||||
|
var that = this; |
||||||
|
var action = $(dom); |
||||||
|
var id = this.uuid(); |
||||||
|
action.attr("id", id); |
||||||
|
var datas = this.options.chartAttr; |
||||||
|
|
||||||
|
|
||||||
|
var style = new ol.style.Style({ |
||||||
|
image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({ |
||||||
|
anchor: [0.5, 46], |
||||||
|
anchorXUnits: 'fraction', |
||||||
|
anchorYUnits: 'pixels', |
||||||
|
opacity: 0.95, |
||||||
|
src: 'https://openlayers.org/en/v4.6.5/examples/data/icon.png' |
||||||
|
})) |
||||||
|
}); |
||||||
|
var allFeature = []; |
||||||
|
for (var i = 0; i < datas.lat.length; i++) { |
||||||
|
var coreLocation = [parseFloat(datas.lat[i]), parseFloat(datas.lng[i])]; |
||||||
|
var pp = new ol.geom.Point(coreLocation) |
||||||
|
pp.set("type", "zzl") |
||||||
|
var feature = new ol.Feature(pp) |
||||||
|
feature.set("type", "zzl") |
||||||
|
feature.setStyle(style); |
||||||
|
allFeature.push(feature); |
||||||
|
// source.addFeature(feature);
|
||||||
|
} |
||||||
|
var source = new ol.source.Vector({ |
||||||
|
features: allFeature |
||||||
|
}); |
||||||
|
|
||||||
|
//初始化聚合标注数据源
|
||||||
|
var clusterSource = new ol.source.Cluster({ |
||||||
|
distance: 20, |
||||||
|
source: source |
||||||
|
}); |
||||||
|
|
||||||
|
//样式缓存
|
||||||
|
var styleCache = {}; |
||||||
|
|
||||||
|
// 聚合
|
||||||
|
var clusters = new ol.layer.Vector({ |
||||||
|
source: clusterSource, |
||||||
|
style: function (feature) { |
||||||
|
var size = feature.get('features').length; |
||||||
|
var style = styleCache[size]; |
||||||
|
if (!style) { |
||||||
|
if (size === 1) { |
||||||
|
style = new ol.style.Style({ |
||||||
|
image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({ |
||||||
|
anchor: [0.5, 46], |
||||||
|
anchorXUnits: 'fraction', |
||||||
|
anchorYUnits: 'pixels', |
||||||
|
opacity: 0.95, |
||||||
|
src: 'https://openlayers.org/en/v4.6.5/examples/data/icon.png' |
||||||
|
})) |
||||||
|
}); |
||||||
|
} else { |
||||||
|
style = new ol.style.Style({ |
||||||
|
image: new ol.style.Circle({ |
||||||
|
radius: 10, |
||||||
|
stroke: new ol.style.Stroke({ |
||||||
|
color: '#fff' |
||||||
|
}), |
||||||
|
fill: new ol.style.Fill({ |
||||||
|
color: '#3399CC' |
||||||
|
}) |
||||||
|
}), |
||||||
|
text: new ol.style.Text({ |
||||||
|
text: size.toString(), |
||||||
|
fill: new ol.style.Fill({ |
||||||
|
color: '#fff' |
||||||
|
}) |
||||||
|
}) |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
styleCache[size] = style; |
||||||
|
} |
||||||
|
return style; |
||||||
|
} |
||||||
|
}); |
||||||
|
//用来鼠标绘制内容的层
|
||||||
|
var source1 = new ol.source.Vector(); |
||||||
|
var vector1 = new ol.layer.Vector({ |
||||||
|
source: source1 |
||||||
|
}); |
||||||
|
|
||||||
|
var map = window.map = new ol.Map({ |
||||||
|
target: id, |
||||||
|
controls: ol.control.defaults().extend([ |
||||||
|
new ol.control.MousePosition() |
||||||
|
]), |
||||||
|
layers: [ |
||||||
|
new ol.layer.Tile({ |
||||||
|
source: new ol.source.XYZ({ |
||||||
|
url: 'https://{a-c}.tile.thunderforest.com/cycle/{z}/{x}/{y}.png' + |
||||||
|
'?apikey=76aa4d0c90314c6fbfbe574ec63e0b26' |
||||||
|
}) |
||||||
|
}), |
||||||
|
vector1, |
||||||
|
], |
||||||
|
view: new ol.View({ |
||||||
|
center: [11583663.78341984, |
||||||
|
3588508.27616124], |
||||||
|
zoom: 12 |
||||||
|
}) |
||||||
|
}); |
||||||
|
|
||||||
|
// // 监听地图分辨率改变事件
|
||||||
|
map.getView().on('change:resolution', function (event) { |
||||||
|
if (map.getView().getZoom() >= 13) { |
||||||
|
clusterSource.setDistance(0); |
||||||
|
} else { |
||||||
|
clusterSource.setDistance(40); |
||||||
|
} |
||||||
|
}) |
||||||
|
|
||||||
|
var draw; // global so we can remove it later
|
||||||
|
var modify; |
||||||
|
|
||||||
|
function addInteraction() { |
||||||
|
if (modify) { |
||||||
|
map.removeInteraction(modify); |
||||||
|
modify = null; |
||||||
|
} |
||||||
|
var geometryFunction; |
||||||
|
geometryFunction = ol.interaction.Draw.createBox(); |
||||||
|
draw = new ol.interaction.Draw({ |
||||||
|
source: source1, |
||||||
|
type: 'LineString', |
||||||
|
style: new ol.style.Style({ |
||||||
|
fill: new ol.style.Fill({ |
||||||
|
color: 'rgba(255, 255, 255, 0.2)' |
||||||
|
}), |
||||||
|
stroke: new ol.style.Stroke({ |
||||||
|
color: '#ffcc33', |
||||||
|
width: 6 |
||||||
|
}), |
||||||
|
image: new ol.style.Circle({ |
||||||
|
radius: 7, |
||||||
|
fill: new ol.style.Fill({ |
||||||
|
color: '#ffcc33' |
||||||
|
}) |
||||||
|
}) |
||||||
|
}), |
||||||
|
maxPoints: 2, |
||||||
|
geometryFunction: function (coordinates, geometry) { |
||||||
|
if (!geometry) { |
||||||
|
geometry = new ol.geom.Polygon(null); |
||||||
|
} |
||||||
|
var start = coordinates[0]; |
||||||
|
var end = coordinates[1]; |
||||||
|
geometry.setCoordinates([ |
||||||
|
[start, [start[0], end[1]], end, [end[0], start[1]], start] |
||||||
|
]); |
||||||
|
return geometry; |
||||||
|
} |
||||||
|
}) |
||||||
|
draw.on('drawend', function (event) { |
||||||
|
//清空原来选中的数据
|
||||||
|
clusterSource.getSource().clear(); |
||||||
|
// source1.clear();
|
||||||
|
map.removeLayer(clusters); |
||||||
|
var geo = event.feature.getGeometry(); |
||||||
|
var tempAllFeature = new Array() |
||||||
|
for (var j = 0; j < allFeature.length; j++) { |
||||||
|
var a = allFeature[j]; |
||||||
|
var temp = a.getGeometry().getCoordinates(); |
||||||
|
if (geo.intersectsCoordinate(temp)) { |
||||||
|
// a.setStyle(style)
|
||||||
|
tempAllFeature.push(a); |
||||||
|
} |
||||||
|
} |
||||||
|
if (tempAllFeature.length > 0) { |
||||||
|
$.each(tempAllFeature,function (i,v){ |
||||||
|
console.info(v.get("type")) |
||||||
|
}) |
||||||
|
clusterSource.getSource().addFeatures(tempAllFeature); |
||||||
|
map.addLayer(clusters); |
||||||
|
movePoint(); |
||||||
|
} |
||||||
|
}); |
||||||
|
map.addInteraction(draw); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
function movePoint() { |
||||||
|
modify = new ol.interaction.Modify({ |
||||||
|
source: clusterSource.getSource() |
||||||
|
}); |
||||||
|
if (draw) { |
||||||
|
map.removeInteraction(draw); |
||||||
|
draw = null; |
||||||
|
} |
||||||
|
var startPoint; |
||||||
|
modify.on("modifystart", function (e) { |
||||||
|
startPoint = e.mapBrowserEvent.coordinate; |
||||||
|
var test= source.getClosestFeatureToCoordinate(startPoint) |
||||||
|
debugger |
||||||
|
var features = map.forEachFeatureAtPixel(e.mapBrowserEvent.pixel, function (feature, layer) { |
||||||
|
console.info("4444",feature.get("type")) |
||||||
|
|
||||||
|
if (feature.get("local")) { |
||||||
|
console.info("111", feature) |
||||||
|
} else { |
||||||
|
var fpoint = new ol.Feature({ |
||||||
|
geometry: new ol.geom.Point(startPoint) |
||||||
|
}); |
||||||
|
console.info("2222", feature) |
||||||
|
source1.addFeature(fpoint); |
||||||
|
feature.set("local", startPoint) |
||||||
|
} |
||||||
|
return feature; |
||||||
|
}); |
||||||
|
debugger |
||||||
|
// if (features) {
|
||||||
|
// features.getProperties()
|
||||||
|
// //只有当没有存储过初始点的时候才存
|
||||||
|
// if (!!!features.get("local")) {
|
||||||
|
// debugger
|
||||||
|
// var feature = new ol.Feature({
|
||||||
|
// geometry: new ol.geom.Point(startPoint)
|
||||||
|
// });
|
||||||
|
// source1.addFeature(feature);
|
||||||
|
// features.set("local", e.mapBrowserEvent.coordinate);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}); |
||||||
|
modify.on("modifyend", function (e) { |
||||||
|
var features = map.forEachFeatureAtPixel(e.mapBrowserEvent.pixel, function (fineFe, layer) { |
||||||
|
var lines = fineFe.get("lines"); |
||||||
|
if (lines) { |
||||||
|
source1.removeFeature(lines) |
||||||
|
} |
||||||
|
var local = fineFe.get("local"); |
||||||
|
if (local) { |
||||||
|
var fline = new ol.Feature({ |
||||||
|
geometry: new ol.geom.LineString([local, e.mapBrowserEvent.coordinate]) |
||||||
|
}); |
||||||
|
source1.addFeature(fline); |
||||||
|
fineFe.set("lines", fline); |
||||||
|
} |
||||||
|
}); |
||||||
|
// if (features) {
|
||||||
|
// //第一步找出这个fe之前创建的连线先删除掉
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
// debugger
|
||||||
|
// if (startPoint) {
|
||||||
|
// var feature = new ol.Feature({
|
||||||
|
// geometry: new ol.geom.LineString([startPoint, e.mapBrowserEvent.coordinate])
|
||||||
|
// });
|
||||||
|
// source1.addFeature(feature);
|
||||||
|
// }
|
||||||
|
}); |
||||||
|
map.addInteraction(modify); |
||||||
|
} |
||||||
|
|
||||||
|
addInteraction(); |
||||||
|
var qxms = $("<button > 圈选模式</button>").click(function () { |
||||||
|
addInteraction(); |
||||||
|
}) |
||||||
|
var movems = $("<button > 移动模式</button>").click(function () { |
||||||
|
movePoint(); |
||||||
|
}) |
||||||
|
var topBtn = $("<div class='maptopare'></div>").append(qxms).append(movems); |
||||||
|
action.append(topBtn) |
||||||
|
return action |
||||||
|
}, |
||||||
|
uuid: function () { |
||||||
|
var s = []; |
||||||
|
var hexDigits = "0123456789abcdef"; |
||||||
|
for (var i = 0; i < 12; i++) { |
||||||
|
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); |
||||||
|
} |
||||||
|
return 'mp' + s.join(""); |
||||||
|
}, |
||||||
|
//自动刷新方法。开启自动刷新后会根据时间间隔调用此方法
|
||||||
|
_refresh: function (chart, option) { |
||||||
|
debugger |
||||||
|
chart.setOption(option); |
||||||
|
}, |
||||||
|
|
||||||
|
//定义空数据的条件,这里是当options.series.data.length长度为0时,代表空数据,主要原因是判断空数据时,显示默认的空数据背景
|
||||||
|
_emptyData: function (options) { |
||||||
|
debugger |
||||||
|
return options === 0; |
||||||
|
} |
||||||
|
}) |
||||||
|
})(); |
@ -0,0 +1 @@ |
|||||||
|
.ol-box{box-sizing:border-box;border-radius:2px;border:2px solid #00f}.ol-mouse-position{top:8px;right:8px;position:absolute}.ol-scale-line{background:rgba(0,60,136,.3);border-radius:4px;bottom:8px;left:8px;padding:2px;position:absolute}.ol-scale-line-inner{border:1px solid #eee;border-top:none;color:#eee;font-size:10px;text-align:center;margin:1px;will-change:contents,width}.ol-overlay-container{will-change:left,right,top,bottom}.ol-unsupported{display:none}.ol-unselectable,.ol-viewport{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.ol-selectable{-webkit-touch-callout:default;-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}.ol-grabbing{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.ol-grab{cursor:move;cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}.ol-control{position:absolute;background-color:rgba(255,255,255,.4);border-radius:4px;padding:2px}.ol-control:hover{background-color:rgba(255,255,255,.6)}.ol-zoom{top:.5em;left:.5em}.ol-rotate{top:.5em;right:.5em;transition:opacity .25s linear,visibility 0s linear}.ol-rotate.ol-hidden{opacity:0;visibility:hidden;transition:opacity .25s linear,visibility 0s linear .25s}.ol-zoom-extent{top:4.643em;left:.5em}.ol-full-screen{right:.5em;top:.5em}@media print{.ol-control{display:none}}.ol-control button{display:block;margin:1px;padding:0;color:#fff;font-size:1.14em;font-weight:700;text-decoration:none;text-align:center;height:1.375em;width:1.375em;line-height:.4em;background-color:rgba(0,60,136,.5);border:none;border-radius:2px}.ol-control button::-moz-focus-inner{border:none;padding:0}.ol-zoom-extent button{line-height:1.4em}.ol-compass{display:block;font-weight:400;font-size:1.2em;will-change:transform}.ol-touch .ol-control button{font-size:1.5em}.ol-touch .ol-zoom-extent{top:5.5em}.ol-control button:focus,.ol-control button:hover{text-decoration:none;background-color:rgba(0,60,136,.7)}.ol-zoom .ol-zoom-in{border-radius:2px 2px 0 0}.ol-zoom .ol-zoom-out{border-radius:0 0 2px 2px}.ol-attribution{text-align:right;bottom:.5em;right:.5em;max-width:calc(100% - 1.3em)}.ol-attribution ul{margin:0;padding:0 .5em;font-size:.7rem;line-height:1.375em;color:#000;text-shadow:0 0 2px #fff}.ol-attribution li{display:inline;list-style:none;line-height:inherit}.ol-attribution li:not(:last-child):after{content:" "}.ol-attribution img{max-height:2em;max-width:inherit;vertical-align:middle}.ol-attribution button,.ol-attribution ul{display:inline-block}.ol-attribution.ol-collapsed ul{display:none}.ol-attribution.ol-logo-only ul{display:block}.ol-attribution:not(.ol-collapsed){background:rgba(255,255,255,.8)}.ol-attribution.ol-uncollapsible{bottom:0;right:0;border-radius:4px 0 0;height:1.1em;line-height:1em}.ol-attribution.ol-logo-only{background:0 0;bottom:.4em;height:1.1em;line-height:1em}.ol-attribution.ol-uncollapsible img{margin-top:-.2em;max-height:1.6em}.ol-attribution.ol-logo-only button,.ol-attribution.ol-uncollapsible button{display:none}.ol-zoomslider{top:4.5em;left:.5em;height:200px}.ol-zoomslider button{position:relative;height:10px}.ol-touch .ol-zoomslider{top:5.5em}.ol-overviewmap{left:.5em;bottom:.5em}.ol-overviewmap.ol-uncollapsible{bottom:0;left:0;border-radius:0 4px 0 0}.ol-overviewmap .ol-overviewmap-map,.ol-overviewmap button{display:inline-block}.ol-overviewmap .ol-overviewmap-map{border:1px solid #7b98bc;height:150px;margin:2px;width:150px}.ol-overviewmap:not(.ol-collapsed) button{bottom:1px;left:2px;position:absolute}.ol-overviewmap.ol-collapsed .ol-overviewmap-map,.ol-overviewmap.ol-uncollapsible button{display:none}.ol-overviewmap:not(.ol-collapsed){background:rgba(255,255,255,.8)}.ol-overviewmap-box{border:2px dotted rgba(0,60,136,.7)}.ol-overviewmap .ol-overviewmap-box:hover{cursor:move} |
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue