На самом деле немного более оптимальным, чем при первом написании. Теперь мы можем просто $redact
, а не $project
булевым и $match
позже:
db.collection.aggregate([
// Match documents "near" the queried point
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [ 23.027573, 72.50675800000001 ],
},
"distanceField": "distance"
}},
// Calculate if distance is within radius and remove if not
{ "$redact": {
"$cond": {
"if": { "$lte": [ "$distance", "$radius" ] },
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
Вы точно сохранили информацию, как вы должны, но есть другой подход к получению результатов, чем вы думаете.
То, что вы хотите использовать, - это $geoNear
и, в частности, структуру агрегации этого оператора. Вот что вы делаете:
db.collection.aggregate([
// Match documents "near" the queried point
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [ 23.027573, 72.50675800000001 ],
},
"distanceField": "distance"
}},
// Calculate if distance is within radius
{ "$project": {
"location": 1,
"radius": 1,
"distance": 1,
"within": { "$lte": [ "$distance", "$radius" ] }
}},
// Match only documents within the radius
{ "$match": { "within": true } }
])
Таким образом, эта форма позволяет «спроецировать» расстояние от запрошенной точки в результатах, в то время как запрос будет также возвращать только ближайшие документы.
Затем вы используете логическое сравнение, чтобы увидеть, меньше ли значение «расстояние», чем «радиус», поэтому в пределах круга.
Наконец, вы должны отфильтровывать только те результаты, в которых это «внутри» утверждение [true].
Вы можете добавить другие опции в $geoNear
, как показано в документации. Я также настоятельно рекомендую, чтобы ваше хранилище также использовало формат GeoJSON, поскольку он, вероятно, будет более совместим с другими библиотеками, которые вы могли бы использовать для работы с полученными результатами.
bf = Entry(Geom, width=5, justify= RIGHT, font="Arial 12")
bf.grid(column=1, row=0)
Причина NoneType произошла из-за типа сетки (столбец = 1, строка = 0) в вашем коде.
Разделить следующую строку на 2:
bf = Entry(Geom, width=5, justify= RIGHT, font="Arial 12").grid(column=1, row=0)
вот так
bf = Entry(Geom, width=5, justify= RIGHT, font="Arial 12")
bf.grid(column=1, row=0)
На данный момент bf
не является виджетом Entry, но None
возвращено из grid()
Также обратите внимание, что обычно вы используете переменную, например IntVar, то есть привязка к виджету входа