我先说明一下定定义,拉运地:地图中的一个点,也是“起点”,运往地:地图中的一个点,也是“终点”。我的数据库里存放着很多拉运地和运往地的坐标点。现在,我想要一个java语言编写的代码,我可以传入拉运地的偏差范围和运往地的偏差范围,然后从数据库中给我返回符合条件的坐标信息
时间: 2023-09-03 08:28:22 浏览: 59
### 回答1:
你可以使用以下代码实现:
```java
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class MapSearch {
private static final String DB_URL = "jdbc:mysql://localhost:3306/map";
private static final String DB_USER = "root";
private static final String DB_PASSWORD = "password";
public static List<Point> search(double fromLat, double fromLng, double fromRange, double toLat, double toLng, double toRange) {
List<Point> result = new ArrayList<>();
try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) {
String sql = "SELECT * FROM points WHERE " +
"lat BETWEEN ? AND ? AND " +
"lng BETWEEN ? AND ? AND " +
"distance(lat, lng, ?, ?) <= ? AND " +
"distance(lat, lng, ?, ?) <= ?";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setDouble(1, fromLat - fromRange);
stmt.setDouble(2, fromLat + fromRange);
stmt.setDouble(3, fromLng - fromRange);
stmt.setDouble(4, fromLng + fromRange);
stmt.setDouble(5, fromLat);
stmt.setDouble(6, fromLng);
stmt.setDouble(7, fromRange);
stmt.setDouble(8, toLat);
stmt.setDouble(9, toLng);
stmt.setDouble(10, toRange);
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
double lat = rs.getDouble("lat");
double lng = rs.getDouble("lng");
Point point = new Point(lat, lng);
result.add(point);
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
public static void main(String[] args) {
List<Point> points = search(39.9, 116.3, .1, 39.8, 116.4, .2);
for (Point point : points) {
System.out.println(point);
}
}
}
class Point {
private double lat;
private double lng;
public Point(double lat, double lng) {
this.lat = lat;
this.lng = lng;
}
public double getLat() {
return lat;
}
public double getLng() {
return lng;
}
@Override
public String toString() {
return "Point{" +
"lat=" + lat +
", lng=" + lng +
'}';
}
}
```
这个代码使用了 MySQL 数据库,需要先安装 MySQL 并创建一个名为 map 的数据库,然后在数据库中创建一个名为 points 的表,表结构如下:
```sql
CREATE TABLE points (
id INT PRIMARY KEY AUTO_INCREMENT,
lat DOUBLE NOT NULL,
lng DOUBLE NOT NULL
);
```
这个表中存放了很多拉运地和运往地的坐标点,每个点有一个唯一的 id,以及对应的纬度和经度。在代码中,我们使用了一个名为 distance 的 MySQL 函数来计算两个点之间的距离,这个函数的定义如下:
```sql
CREATE FUNCTION distance(lat1 DOUBLE, lng1 DOUBLE, lat2 DOUBLE, lng2 DOUBLE)
RETURNS DOUBLE
BEGIN
DECLARE radLat1 DOUBLE;
DECLARE radLng1 DOUBLE;
DECLARE radLat2 DOUBLE;
DECLARE radLng2 DOUBLE;
DECLARE a DOUBLE;
DECLARE b DOUBLE;
DECLARE s DOUBLE;
SET radLat1 = RADIANS(lat1);
SET radLng1 = RADIANS(lng1);
SET radLat2 = RADIANS(lat2);
SET radLng2 = RADIANS(lng2);
SET a = SIN((radLat1 - radLat2) / 2) * SIN((radLat1 - radLat2) / 2) + COS(radLat1) * COS(radLat2) * SIN((radLng1 - radLng2) / 2) * SIN((radLng1 - radLng2) / 2);
SET b = 2 * ASIN(LEAST(1, SQRT(a)));
SET s = b * 6371;
RETURN s;
END;
```
这个函数接受四个参数,分别是两个点的纬度和经度,返回值是这两个点之间的距离(单位是千米)。在代码中,我们使用了这个函数来计算拉运地和运往地与数据库中的点之间的距离,从而筛选出符合条件的点。
### 回答2:
你可以使用以下的Java代码来实现你的需求:
```java
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class CoordinateInfo {
public List<String> getCoordinates(double departureRange, double destinationRange) {
List<String> coordinates = new ArrayList<>();
// 建立数据库连接
Connection connection = null;
try {
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/your_database", "username", "password");
} catch (SQLException e) {
e.printStackTrace();
}
// 查询数据库中符合条件的坐标信息
if (connection != null) {
try {
// 构建SQL查询语句
String query = "SELECT * FROM coordinate_table WHERE departure >= ? - ? AND departure <= ? + ? AND destination >= ? - ? AND destination <= ? + ?";
PreparedStatement statement = connection.prepareStatement(query);
// 设置查询参数
statement.setDouble(1, departureRange);
statement.setDouble(2, departureRange);
statement.setDouble(3, departureRange);
statement.setDouble(4, departureRange);
statement.setDouble(5, destinationRange);
statement.setDouble(6, destinationRange);
statement.setDouble(7, destinationRange);
statement.setDouble(8, destinationRange);
// 执行查询
ResultSet resultSet = statement.executeQuery();
// 处理查询结果
while (resultSet.next()) {
String coordinate = resultSet.getString("coordinate");
coordinates.add(coordinate);
}
// 关闭连接和查询结果
resultSet.close();
statement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return coordinates;
}
public static void main(String[] args) {
CoordinateInfo coordinateInfo = new CoordinateInfo();
List<String> coordinates = coordinateInfo.getCoordinates(0.1, 0.2);
// 打印符合条件的坐标信息
for (String coordinate : coordinates) {
System.out.println(coordinate);
}
}
}
```
请根据你的实际情况修改数据库连接URL、用户名和密码,以及数据库中的表名和列名。在`getCoordinates`方法中,我使用了`departure`和`destination`作为数据库中存放拉运地和运往地的列名,你可以根据你的实际情况修改这些列名,也可以根据需求增加其他查询条件。
在`main`方法中,我传入了拉运地和运往地的偏差范围并打印了符合条件的坐标信息。你可以根据你的实际需求对获取的坐标信息进行进一步处理。
### 回答3:
首先,您需要一个Java程序来连接数据库并执行SQL查询语句。您可以使用JDBC(Java Database Connectivity)库来实现这个功能。以下是一个简单的示例代码,演示如何连接到数据库并查询符合条件的坐标信息:
```java
import java.sql.*;
public class CoordinateQuery {
// JDBC驱动和数据库连接信息
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost/your-database-name";
static final String USER = "your-username";
static final String PASS = "your-password";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
// 注册JDBC驱动
Class.forName(JDBC_DRIVER);
// 建立数据库连接
conn = DriverManager.getConnection(DB_URL, USER, PASS);
// 创建SQL查询语句
String query = "SELECT * FROM coordinate_table WHERE " +
"latitude BETWEEN ? AND ? AND " +
"longitude BETWEEN ? AND ?";
// 使用预编译的语句
PreparedStatement pstmt = conn.prepareStatement(query);
// 设置参数
pstmt.setDouble(1, minLatitude);
pstmt.setDouble(2, maxLatitude);
pstmt.setDouble(3, minLongitude);
pstmt.setDouble(4, maxLongitude);
// 执行查询
ResultSet rs = pstmt.executeQuery();
// 处理查询结果
while (rs.next()) {
double latitude = rs.getDouble("latitude");
double longitude = rs.getDouble("longitude");
System.out.println("Coordinate: " + latitude + ", " + longitude);
}
// 关闭资源
rs.close();
pstmt.close();
conn.close();
} catch (SQLException se) {
se.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭资源
try {
if (stmt != null)
stmt.close();
} catch (SQLException se2) {
}
try {
if (conn != null)
conn.close();
} catch (SQLException se) {
se.printStackTrace();
}
}
}
}
```
请注意,您需要将上述代码中的数据库连接信息(DB_URL, USER, PASS)替换为实际的值,并根据您的数据库模式和表结构修改SQL查询语句。另外,您需要定义`minLatitude`,`maxLatitude`,`minLongitude`和`maxLongitude`变量,表示拉运地和运往地的偏差范围。
以上代码是一个简单的示例,您可以根据自己的需求进行进一步修改和优化。