Мое решение состоит в том, чтобы выдать серию запросов, по одному для каждой строки, и связать их вместе с UNION. Стек mysql взорвется в конце концов, поэтому вам нужно делать их в блоках, но при нормальной установке 1000 в порядке.
Вы должны заключить в скобки запросы, так как они включают порядок. Некоторые точки могут потерпеть неудачу, поэтому я помечаю их все буквальной последовательностью line_no, чтобы вы могли редактировать и фильтровать оригиналы. Вам также нужно ограничить запрос с помощью
WHERE Contains(<polygon>,point)
, иначе он попытается отсортировать всю таблицу, где многоугольник - это ограничивающий прямоугольник, который вы должны создать с помощью GEOMFROMTEXT () и POLYGON (). И, конечно, вам нужен специальный пространственный индекс для столбца! Вот код
var SMALL=0.001
var=query=points
.map(function(point){
var bottom=point.lat+SMALL
var top=point.lat-SMALL
var left=point.lon-SMALL
var right=point.lon+SMALL
var polygon=[
[bottom,left],
[top,left],
[top,right],
[bottom,right],
[bottom,left]
]
polygon="POLYGON(("+polygon.map(function(point){
return point.join(' ')
})
.join(",")+"))"
point.line_no=line_no++
return "(SELECT "+point.line_no+" as line_no,id, ST_Distance(POINT("+
point.lat+","+point.lon+
"),geo_point) as distance"+
" from Points "+
" WHERE Contains(GeomFromText('"+polygon+"'),geo_point) "+
" order by distance limit 1) "
})
.join(" UNION ")+" order by line_no"
return sequelize.query(query)