Я нарисовал многоугольник на карте Google
new google.maps.Polygon({
paths: [
{ lat: 52.474617867242515, lng: -1.8111903062499923 },
{ lat: 51.527748727453975, lng: -2.7340418687499923 },
{ lat: 51.41825758811742, lng: -0.40494030624999233 },
],
fillColor: '#FFC107',
}).setMap(map);
Я также могу щелкнуть, чтобы разместить новые маркеры на карте, передавая координаты на сервер и затем отображая цветной маркер: зеленый, если внутри полигон, красный, если снаружи.
google.maps.event.addListener(drawingManager, 'overlaycomplete', (e) => {
axios.post('/home/testmarker', e.overlay.getPosition()).then((response) => {
e.overlay.setIcon('http://maps.google.com/mapfiles/ms/icons/' + response.data + '-dot.png');
});
});
На моем сервере я проверяю, попадает ли новый маркер в мой полигон. В конечном итоге будет много проверенных многоугольников, сейчас я жестко закодировал копию многоугольника внутри хранимой процедуры
CREATE PROCEDURE [dbo].[TestMarker]
@lat varchar(20),
@lng varchar(20)
AS
DECLARE @g geography;
DECLARE @h geography;
SET @g = geography::STGeomFromText('POLYGON((-1.8111903062499923 52.474617867242515, -2.7340418687499923 51.527748727453975, -0.40494030624999233 51.41825758811742, -1.8111903062499923 52.474617867242515))', 4326);
SET @h = geography::STGeomFromText('POINT(' + @lng + ' ' + @lat + ')', 4326);
SELECT @g.STContains(@h);
По углам мои маркеры точно определены как находящиеся внутри или снаружи многоугольника.
![Corner Markers](https://i.stack.imgur.com/sOYQo.png)
Однако стороны - это другая история. Выбор точки на полпути вдоль каждой стороны и маркеры больше не будут точно идентифицироваться как внутри или снаружи многоугольника.
![Sides using Geography](https://i.stack.imgur.com/3xYp3.png)
Я также пытался использовать тип данных геометрии, поэтому мой SP выглядит как
...
DECLARE @g geometry;
DECLARE @h geometry;
SET @g = geometry::STGeomFromText('POLYGON((-1.8111903062499923 52.474617867242515, -2.7340418687499923 51.527748727453975, -0.40494030624999233 51.41825758811742, -1.8111903062499923 52.474617867242515))', 0);
SET @h = geometry::STGeomFromText('POINT(' + @lng + ' ' + @lat + ')', 0);
...
Обратите внимание, я изменил SRID на 0
Углы остаются такими же точными, как и раньше, но точность по сторонам изменилось, значительно по нижнему краю
![Sides using Geometry](https://i.stack.imgur.com/xHZpP.png)
На первом и третьем изображениях верхний ряд маркеров предыдущие, идентифицированные с использованием «географии», нижние строки - это новые, рассчитанные с использованием «геометрии».
Кто-нибудь знает, что нужно сделать, чтобы это исправить?
У меня есть подозрение, это как-то связано с SRID с географией, и метод Google Maps используют. В моем первом примере я использовал 4326, который, кажется, широко рекомендуется. Я обнаружил, что Google также должен использовать это , хотя они также используют что-то под названием 3857, у меня, похоже, нет этого в SQL Server - по крайней мере, по умолчанию. У меня нет ранее сохраненных данных, поэтому я могу легко изменить способ хранения и сравнения данных, если это необходимо.