- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 3 条线,定义为 A 线、B 线和 C 线,我想计算 B 线和 C 线与 A 的交点。JTS 中有一个函数 LineIntersector这应该有助于实现这一目标。我需要帮助将此功能应用于线条以找到交点,即。像 computeIntersection(A 行,B 行)之类的东西。谢谢!
import com.vividsolutions.jts.geom.*;
import com.vividsolutions.jts.algorithm.*;
public class PointTest {
public static void main(String[] args){
// We have to have an even number of arguments - to have coordinate pairs for points.
if (args.length % 2 == 1) {
System.out.println("Wrong input. You did not enter a list of coordinage pairs. Try again.");
}
else {
int i=0;
String[] coordA = {"12", "2", "12", "13", "12", "19"};
String[] coordB = {"2", "10", "10", "10", "21", "11"};
String[] coordC = {"1","1", "9","9", "20", "20"};
// Create a new empty array of coordinates.
//Coordinate[] coordinates = new Coordinate[args.length/2];
Coordinate[] coordinatesA = new Coordinate[coordA.length/2];
Coordinate[] coordinatesB = new Coordinate[coordB.length/2];
Coordinate[] coordinatesC = new Coordinate[coordC.length/2];
// Go through the args and add each point as a Coordinate object to the coordinates array.
//Geometry g1 = new GeometryFactory().createLineString(coordinatesA);
//System.out.println(g1);
while (i < coordA.length) {
// transform string arguments into double values
double x = Double.parseDouble(coordA[i]);
double y = Double.parseDouble(coordA[i+1]);
double xx = Double.parseDouble(coordB[i]);
double yy = Double.parseDouble(coordB[i+1]);
double xxx = Double.parseDouble(coordC[i]);
double yyy = Double.parseDouble(coordC[i+1]);
// create a new Coordinate object and add it to the coordinates array
Coordinate newCoord = new Coordinate(x,y);
coordinatesA[i/2] = newCoord;
Coordinate newCoordB = new Coordinate(xx,yy);
coordinatesB[i/2] = newCoordB;
Coordinate newCoordC = new Coordinate(xxx,yyy);
coordinatesC[i/2] = newCoordC;
//System.out.println(newCoordB.toString());
i=i+2;
} // while
// Create a new Geometry from the array of coordinates.
LineString lineA = new GeometryFactory().createLineString(coordinatesA);
LineString lineB = new GeometryFactory().createLineString(coordinatesB);
LineString lineC = new GeometryFactory().createLineString(coordinatesC);
System.out.println("Line A is "+ lineA);
System.out.println("Line B is "+ lineB);
System.out.println("Line C is "+ lineC);
// Read the start and end point of the line and write them on the screen.
Point startPointA = lineA.getStartPoint();
Point endPointA = lineA.getEndPoint();
//System.out.println("The start point of the line is: " + startPointA.toString());
//System.out.println("The end point of the line is: " + endPointA.toString());
} // else
} //main
}
最佳答案
在使用此 API 方面,我可能比新手高出一个档次,但您的问题与我一直在处理的问题很接近,我可以分享到目前为止我发现的问题。我的问题是给定两个 LineString
,找到它们相交的点。我已经使用 LineIntersector
解决了我的问题——它也可以解决你的问题——但最好了解 LineIntersector
帮助解决的更一般的问题。
您要做出的第一个区别是两个 LineString
是交叉还是交叉。交叉时,没有共享的 Coordinate
,但连接至少两对 Coordinate
的线相互跨越。如果两个 LineString
相交,则其中一个 LineString
上会有一个点落在“公差”范围内。我使用 buffer()
方法来指定匹配的容差:
if (lineStringA.buffer(0.0001).intersects(lineStringB)) { ... }
同样用于测试(限制较少的)交叉:
if (lineStringA.buffer(0.0001).crosses(lineStringB)) { ... }
如果两个 LineString
相交,我发现可以直接遍历每个坐标,直到找到位于第二个 LineString
上的第一个坐标.那个公共(public)点就是交点。
如果两个 LineString
交叉但不相交,我会拿出 LineIntersector.computeIntersection()
方法来帮忙,但是这个方法的接口(interface)需要对 LineString
进行一些准备,以找到要使用的合适的 Coordinate
。
这是我用来遍历第一个 LineString
以找到与第二个 LineString
交叉的两个点的方法:
private LineString findCrossingPair(LineString workingLineString,
LineString fixedLineString) {
// Pick up our factory instance
GeometryFactory factory = fixedLineString.getFactory();
Coordinate[] coordinates = workingLineString.getCoordinates();
int length = coordinates.length;
int indexOfCrossing = 0;
// Walk the workingLineString for as long as it crosses the fixedLineString
for (int i = 1; workingLineString.crosses(fixedLineString)
&& i < (length - 1); i++) {
workingLineString = factory.createLineString(
Arrays.copyOfRange(coordinates, i, length));
indexOfCrossing = i;
}
Coordinate[] crossingPair = Arrays.copyOfRange(coordinates,
indexOfCrossing - 1, indexOfCrossing + 1);
LineString crossingPiece = factory.createLineString(crossingPair);
return crossingPiece;
}
我调用它一次以找到第一对 Coordinates
(以 LineString
形式返回),然后将其转过来针对第二个 LineString 运行它
。下面是调用 findCrossingPair()
方法两次以获取两对坐标的示例:
LineString firstPiece = findCrossingPair(LineStringA,
LineStringB);
LineString secondPiece = findCrossingPair(LineStringB,
firstPiece);
// Now we have two 2-point LineStrings which we can pass to the
// LineIntersector
LineIntersector lineIntersector = new RobustLineIntersector();
lineIntersector.computeIntersection(
firstPiece.getStartPoint().getCoordinate(),
firstPiece.getEndPoint().getCoordinate(),
secondPiece.getStartPoint().getCoordinate(),
secondPiece.getEndPoint().getCoordinate()
);
Coordinate intersect = lineIntersector.getIntersection(0);
System.out.println("Intersection at " + intersect);
请注意,在一般情况下,LineIntersector
可以找到 0、1 或 2 个相交点。这就是 LineIntersector
接口(interface)有一个索引被传递给 getIntersection()
方法的原因。交叉与相交的测试限制了此过程可以找到的交叉点的数量。
关于java - 使用 JTS 从多个 LineStrings 计算交点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31520536/
SQL 和一般开发的新手,我有一个表(COUNTRIES),其中包含字段(INDEX、NAME、POPULATION、AREA) 通常我添加一个客户端(Delphi)计算字段(DENSITY)和 On
我想使用 calc(100%-100px),但在我的 demo 中不起作用由于高度只接受像素,因此如何将此百分比值转换为像素。 最佳答案 以下将为您提供高度: $(window).height();
我正在尝试在 MySQL 中添加列并动态填充其他列。 例如我有一张表“数字”并具有第 1 列、第 2 列、第 3 列,这些总数应填充在第 4 列中 最佳答案 除非我误解了你的问题,否则你不只是在寻找:
我想返回简单计算的结果,但我不确定如何执行此操作。我的表格如下: SELECT COUNT(fb.engineer_id) AS `total_feedback`, SUM(fb.ra
我一直在尝试做这个程序,但我被卡住了,我仍然是一个初学者,任何帮助将不胜感激。我需要程序来做 打印一个 10 X 10 的表格,其中表格中的每个条目都是行号和列号的总和 包含一个累加器,用于计算所有表
这个计算背后一定有一些逻辑。但我无法得到它。普通数学不会导致这种行为。谁能帮我解释一下原因 printf ("float %f\n", 2/7 * 100.0); 结果打印 1.000000 为什么会
我想计算从 0 到 (n)^{1/2} - 1 的数字的 AND每个数字从 0 到 (n)^{1/2} - 1 .我想在 O(n) 中执行此操作时间,不能使用 XOR、OR、AND 运算。 具体来说,
如何在 Excel 中将公式放入自定义数字格式?例如(出于说明目的随机示例), 假设我有以下数据: 输入 输出 在不编辑单元格中的实际数据的情况下,我想显示单元格中的值除以 2,并保留两位小数: 有没
每次我在 Flutter 应用程序中调用计算()时,我都会看到内存泄漏,据我所知,这基本上只是一种生成隔离的便捷方法。我的应用程序内存占用增加并且在 GC 之后永远不会减少。 我已将我的代码简化为仅调
我有数字特征观察 V1通过 V12用于目标变量 Wavelength .我想计算 Vx 之间的 RMSE列。数据格式如下。 每个变量“Vx”以 5 分钟的间隔进行测量。我想计算所有 Vx 变量的观测值
我正在寻找一种使用 C 语言计算文件中未知字符数的简单方法。谢谢你的帮助 最佳答案 POSIX 方式(可能是您想要的方式): off_t get_file_length( FILE *file ) {
我正在使用 Postgres,并且我正试图围绕如何在连续日期跨度中得出第一个开始日期的问题进行思考。例如 :- ID | Start Date | End Date =================
我有一个订单表格,我在其中使用 jQuery 计算插件来汇总总数。 此求和工作正常,但生成的“总和”存在问题。总之,我希望用逗号替换任何点。 代码的基础是; function ($this) {
我在使用 double 变量计算简单算术方程时遇到问题。 我有一个具有 double 属性 Value 的组件,我将此属性设置为 100。 然后我做一个简单的减法来检查这个值是否真的是 100: va
我在这里看到了一些关于 CRC 32 计算的其他问题。但没有一个让我满意,因此是这样。 openssl 库是否有任何用于计算 CRC32 的 api 支持?我已经在为 SHA1 使用 openssl,
当我在PHP日期计算中遇到问题时,我感到惊讶。 $add = '- 30 days'; echo date('Y-m-01', strtotime($add)); // result is 2017-
我正在使用 javascript 进行练习,我编写了这个脚本来计算 2 个变量的总和,然后在第三个方程中使用这个总和!关于如何完成这项工作的任何想法都将非常有用! First Number:
我有一个来自EAC的提示单和一个包含完整专辑的FLAC文件。 我正在尝试制作一些python脚本来播放文件,因为我需要能够设置在flac文件中开始的位置。 如何从CueSheet格式MM:SS:FF转
这个问题已经有答案了: Adding two numbers concatenates them instead of calculating the sum (24 个回答) 已关闭去年。 我有一个
4000 我需要上面字段 name="quantity" 和 id="price" 中的值,并使用 javascript 函数进行计算,并将其显示在字段 id= 中仅当我单击计算按钮时才显示“总
我是一名优秀的程序员,十分优秀!