首先我尝试:
public static boolean isInPolygon(java.awt.geom.Point2D point) {
// ...
// ... build prepared statement
ResultSet rs = statement.executeQuery();
STRUCT geoStruct = (STRUCT) rs.getObject("SDO_GEOMETRY_COLUMN");
JGeometry geo = JGeometry.load(geoStruct);
Shape shape = geo.createShape();
return shape.contains(point);
}
这不起作用,因为JGeometry.createShape()
返回一个java.awt.geom.GeneralPath
对象,它没有双精度,因此shape.contains(...)
返回了多边形边缘周围的错误结果。
然后我尝试使用<code>JGeometry。createDoubleShape(),返回一个<code>oracle.spatial.util。SDODoubleGeneralPath对象:
// ...
JGeometry geo = JGeometry.load(geoStruct);
Shape shape = geo.createDoubleShape();
return shape.contains(point);
当调用contains
方法时,我得到以下错误:
Exception in thread "main" java.lang.NoSuchMethodError: sun.awt.geom.Curve.crossingsForPath(Ljava/awt/geom/PathIterator;DD)I
at oracle.spatial.util.SDODoubleGeneralPath.contains(SDODoubleGeneralPath.java:498)
at igea_html.test.Test.handleGeo(Test.java:258)
at igea_html.test.Test.jgeometryTest(Test.java:204)
at igea_html.test.Main.main(Main.java:74)
显然,如果<code>的<code>包含<code>方法抛出这样的错误,则<code>SDODoubleGeneralPath</code>存在一些实现问题。
有替代方案吗?
我想避免自己实现一个算法来确定一个点是否在多边形内,我宁愿相信已经从一个有信誉的来源实现的东西。由于许可证限制,我也无法在数据库中直接使用Oracle Spatial函数。
Obs。:我的< code>isInPolygon方法使用Point2D作为参数,但如果我必须使用< code>JGeometry对象形式的点,以备解决方案需要时使用,这也是可以的。
根据要求提供更多详细信息:< br> Oracle版本为11g,我正在开发一个web应用程序,该程序旨在验证数据库中的几何数据。特别是,其中一个验证包括检查某些点和多边形是否在其他多边形内。我引用的文档是这样的:https://docs . Oracle . com/CD/e 18283 _ 01/app dev . 112/e 11829/TOC . htm < br >这些功能的架构仍在开发中,因此是否应该由web应用程序本身或数据库内部或其他方法来做出决定仍未确定。由于许可证限制,第二个选项被搁置了,所需的功能,即< code>SDO_RELATE,是Oracle 11中的Oracle Spatial独有的,这显然与Oracle 12形成了鲜明的对比,在Oracle 12中,它们仅在Oracle Locator中可用。< br >编辑:这是不正确的,如下文@Albert Godfrind所示。Oracle Locator 11支持< code>SDO_RELATE和其他空间运算符,如第1版和第2版中的Oracle文档所示:< br > https://docs . Oracle . com/CD/b 28359 _ 01/app dev . 111/b 28400/SDO _ Locator . htm # CFACCEEG < br > https://docs . Oracle . com/CD/e 11882 _ 01/app dev . 112/e 11830/SDO _ Locator。
此外,Oracle 11的Java API的< code>JGeometry类不像Oracle 12中那样包含诸如< code>isInside()或< code>anyInteract()之类的方法。Oracle 12 Java API docs:https://docs . Oracle . com/en/database/Oracle/Oracle-database/12.2/spajv/index . html?Oracle/spatial/geometry/jgeometry . html
你说
由于许可证限制,我也不能直接在数据库中使用Oracle空间函数。
这是不对的。2D的所有矢量处理功能均随数据库许可证免费提供。它被称为Oracle定位器。有关定位器覆盖范围的详细信息,请参见《用户指南》附录B(https://docs.oracle.com/en/database/oracle/oracle-database/18/spatl/oracle-locator.html#GUID-EC6DEA23-8FD7-4109-A0C1-93C0CE3D6FF2)。请注意,这适用于12.2。旧版本的限制更大,但所有版本都具有进行所需几何过滤的基本功能。
甲骨文空间
除此之外,您可以自由使用JAVA API(它随Oracle Locator一起提供)。但是请注意,它只适用于JGeometry
对象。特别是方法isIn()
会告诉您一个JGeometry对象(您的点)是否完全包含在另一个JGeometry对象(您的多边形)中。如果您希望也返回落在多边形边界上的点,请改用anyInteract()
方法。
但是,如果您的主要处理在数据库中,则只需使用带有SDO_INSIDE
(或SDO_ANYINTERACT
谓词的纯SQL即可找到多边形内的所有点。
您能详细说说您的实际用例吗?
编辑
下面是一个使用SQL API的例子。这适用于从11gR1开始的所有数据库版本,并且包含在Oracle Locator中(即不需要任何空间许可)。
在此示例中,我使用以下两个表:
包含美国主要城市位置的表格:
Name Null? Type
---------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER
CITY VARCHAR2(42 CHAR)
POP90 NUMBER
RANK90 NUMBER
LOCATION MDSYS.SDO_GEOMETRY
包含美国各州形状的表格:
Name Null? Type
---------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER
STATE VARCHAR2(26 CHAR)
STATE_ABRV VARCHAR2(2 CHAR)
FIPSST VARCHAR2(2 CHAR)
LANDSQMI NUMBER
POPPSQMI NUMBER
GEOM MDSYS.SDO_GEOMETRY
以下查询返回纽约州的所有城市:
select c.city, c.pop90
from us_cities c, us_states s
where s.state = 'New York'
and sdo_inside (c.location, s.geom) = 'TRUE';
返回:
CITY POP90
------------------------------ ----------
New York 7322564
Buffalo 328123
Rochester 231636
Yonkers 188082
Syracuse 163860
Albany 101082
6 rows selected.
您只需通过JDBC提交此语句并获取结果。如果还希望返回点的位置(在地图上高亮显示),则还应包括位置
列。这可以通过SpatialJavaAPI在Java代码中进行解释。或者,您也可以从点提取坐标:
select c.city, c.pop90, c.location.sdo_point.x longitude, c.location.sdo_point.y latitude
from us_cities c, us_states s
where s.state = 'New York'
and sdo_inside (c.location, s.geom) = 'TRUE';
CITY POP90 LONGITUDE LATITUDE
------------------------------ ---------- ---------- ----------
New York 7322564 -73.943849 40.6698
Buffalo 328123 -78.859684 42.8898
Rochester 231636 -77.615838 43.168651
Yonkers 188082 -73.867514 40.947033
Syracuse 163860 -76.144067 43.041059
Albany 101082 -73.799017 42.66575
6 rows selected.
问题内容: 我正在尝试在多边形算法中创建一个快速的 2D点,以用于点击测试(例如)。对于有效技术的建议将不胜感激。 问题答案: 对于图形,我宁愿不要整数。许多系统使用整数进行UI绘制(像素毕竟是ints),但是macOS例如对所有内容都使用float。macOS仅知道点,并且一个点可以转换为一个像素,但是根据显示器分辨率,它可能转换为其他像素。在视网膜屏幕上,半点(0.5 / 0.5)是像素。不过
我在传单地图上有一组无组织的点,在我的实现中,这些点表示Minecraftarium.com/map上Minecraftarium.com/map上地图上的领土节点。目前,我的实现只获取点,并使用传单在点周围画一个圆来大致指示控制区域。 然而,这有点难看,也不代表期望的最终结果,即从给定一组数据的边缘点绘制多边形区域。然而,由于这些点的无组织性质,我没有简单的方法来宣布这些点上的“边缘点”,因为它
我正在寻找一种方法来创建一组多边形(rechtangles),沿着一条线在多个多边形中创建一组多边形(rechtangles),并将其水平隔开,如图所示。 我尝试生成点并将其用作多边形的中点,但问题是,通过创建等间距的点光栅,除了180度之外,不可能以任何其他方向旋转。 例子 给出了一个多多边形形状的对象和由宽度和高度以及每个多边形之间的垂直和水平间距定义的多边形。多边形应仅放置在多多边形内,且不
我有一个geopandas数据框,其中包含一个形状良好的点几何体列表。还有一列包含ID列表,用于指定每个点所属的唯一多边形。简化输入代码为: 我想按多边形ID分组,以便将几何体从点转换为多边形。该输出基本上如下所示: 我想这很简单,但我很难让它工作。我发现下面的代码允许我将其转换为开放式多段线,但无法计算出多边形。有人能建议如何适应这种情况吗? 简单地用多边形替换LineString会导致Type
给定三个整数a、b和c,如果a、b和c可以是直角三角形边的长度,则返回true。否则返回false。回想一下,在直角三角形中,每条边都必须有一个正长度,腿长的平方和必须等于斜边长度的平方。 isRightTriangle(3、4、5)→ 真isRightTriangle(4、3、5)→ 真isRightTriangle(5、4、3)→ 真的
给定两个2D多边形,如何计算将第一个带入第二个的最短平移? 假设有一个解决方案(即第一个确实适合第二个) 比起解决方案的完整性,更喜欢简单的算法。例如,如果通过假设形状有一定数量的边、是凹形等来简化算法,那么就做出这些假设 我可以想象一个蛮力解决方案,我首先计算哪些是位于初始多边形之外的违规顶点。然后迭代这些外部顶点,找到最接近每个顶点的边。那我就卡住了。从外部顶点到边缘的每个距离都会产生一个约束