Вставьте ГИС геометрию, используя подготовленные заявления - PullRequest
2 голосов
/ 07 декабря 2011

Есть ли способ вставить данные ГИС в базу данных MySQL (используя PHP / PDO), используя подготовленные операторы?

Это не удалось:

$stmt = $sql->prepare("INSERT INTO geo SET location= :loc");
$sql->execute($stmt,array('loc'=>"PointFromText('POINT(43.5499152 7.0232372)')"));

Где столбец geo.location имеет тип POINT.

Ответы [ 3 ]

3 голосов
/ 07 декабря 2011

43.5499152 - это широта, а 7.0232372 - долгота? Если это так, учитывая, что формат WKT для POINT равен POINT (X Y), где X - долгота, а Y - широта, допустимое представление будет:

POINT(7.0232372 43.5499152)

Имея это в виду, вы можете попробовать что-то вроде:

$stmt = $sql->prepare("INSERT INTO geo SET location = PointFromText('POINT(:lng :lat)')");
$stmt->execute(array('lat' => 43.5499152, 'lng' => 7.0232372));

А если у вас нет широты и долготы, просто установите для местоположения значение null:

$stmt = $sql->prepare("INSERT INTO geo SET location = null");
$stmt->execute();

Кроме того, вы можете установить SRID, который в вашем случае равен 4326:

$stmt = $sql->prepare("INSERT INTO geo SET location = PointFromText('POINT(:lng :lat)', 4326)");
$stmt->execute(array('lat' => 43.5499152, 'lng' => 7.0232372));
0 голосов
/ 12 августа 2017

Я использую MySQL POINT и не могу понять, как сделать INSERT of POINT; Однако решено ОБНОВЛЕНИЕ. Поэтому я вставил новую строку, а затем обновил столбец POINT:

String insertQry = ("INSERT INTO at_group " +
              "(grp_country, grp_state, grp_region, grp_district, " +
              "grp_name, grp_section, grp_sub_section, grp_archived, " +
              "grp_nas) " +
              "VALUES (?,?,?,?,?,?,?,?,?);");

    String updateQry = ("UPDATE at_group " +
              "SET grp_hall_geoPoint=PointFromText(CONCAT('POINT(', ?, ' ', ?, ')')) " +
              "WHERE grp_id=?;");

    try {
        // Get Connection and Statement from DataSource
        c = ds.getConnection();
        ps = c.prepareStatement(insertQry,Statement.RETURN_GENERATED_KEYS);

        try {
            // Create a statement and execute the query on it

            ps.setString(1, country);
            ps.setString(2, state);
            ps.setString(3, region);
            ps.setString(4, district);
            ps.setString(5, group);
            ps.setString(6, section);
            ps.setString(7, subSection);
            ps.setString(8, archiveDate);
            ps.setString(9, nas);

            ps.executeUpdate();

            ps2 = c.prepareStatement(updateQry);
            //Get foreign key for key to update the correct row
            ResultSet rs = ps.getGeneratedKeys();

            if (rs.next()) {
                grp_id = rs.getInt(1);

                ps2.setString(1, latitude);
                ps2.setString(2, longditude);
                ps2.setInt(3, grp_id);

                ps2.executeUpdate();
            };

            // Clean up
            ps.close();
            ps2.close();
            c.close();

        } catch (SQLException se) {
            System.out.println("SQLException in addGroup: " + se.toString());
        } catch (Exception e) {
            System.out.println("Errors occurred in addGroup: " + e.toString());
        }

    } catch (SQLException e1) {
        System.out.println("SQLException in addGroup: " + e1.toString());
        e1.printStackTrace();

    }
0 голосов
/ 11 августа 2017

@ Глин: смотри, что сработало для меня

insertquery = <do as required>
Your insert query should have the following:
"geometry::STGeomFromText(?,4326))" 


PreparedStatement insert = conn.prepareStatemen(insertquery);

#Point has two points, X and Y. You need to pass those values.
String shape = "POINT ("+x+" "+y+")";
insert.setString(25, shape);

База данных, которую вы используете, например, сервер MS SQL, тогда ваш столбец точек должен иметь правильный тип данных, который является "Геометрия".

Пожалуйста, задайте мне еще один вопрос, который у вас может возникнуть.

Рад помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...