"Mongo 오류:객체에서 지리적 키를 추출할 수 없음"(유형: 점)
데이터베이스 필드에서 지오코딩을 준비하려고 합니다.
MyCollection._ensureIndex({'data.address.located':'2dsphere'});
하지만 다음과 같은 오류가 발생합니다.
MongoError: Can't extract geo keys from object, malformed geometry?:
{ type: "Point", coordinates: [ 32.4586858, -110.8571443 ] }
이 필드에 무슨 문제가 있는지 알 수 없습니다.감 잡히는 게 없어요?
이를 확인하면 다음과 같이 표시됩니다.
The following example stores a GeoJSON Point:
{ loc: { type: "Point", coordinates: [ 40, 5 ] } }
문제는
[ 32.4586858, -110.8571443 ]
올바른 좌표가 아닙니다.순서는 경도 다음에 위도가 와야 하지만 좌표는 역으로 나타납니다(유효한 위도 범위가 -90 ~ 90이고 -110.8571443은 그 밖에 있다는 사실로 판단).
당신 말은 다음과 같습니다.
{ type: "Point", coordinates: [ -110.8571443, 32.4586858 ] }
또는 다른 입력 오류가 있습니다.
@go-olleg가 언급했듯이, 문제는 좌표의 범위가 다음과 같다는 것입니다.
- 경도: (+) 180°
- 위도: (+) 90°
및 인덱스는 좌표가 해당 범위에 있을 것으로 예상합니다.
그러나 이미 가져온 데이터에 인덱스를 적용하려고 할 때 좌표가 스왑된다는 것을 알게 되면 전체 컬렉션을 다시 가져오기보다는 인덱스를 다시 스왑하는 것이 좋습니다.이 목적을 위해 다음을 사용할 수 있습니다.mongoshell
대본.
당신이 이미 잘 형성되었다고 가정할 때
GeoJSON
유형의Point
.
db.coll.find().forEach(function (e) {
// assuming that `geoJson` is our field containing `coordinates`
e.geoJson.coordinates = [ // Swapping Lat/Lon
e.geoJson.coordinates[1], // Longitude goes first
e.geoJson.coordinates[0] // Latitude goes last
];
db.coll.save(e);
// Some `print(e.name)` can go here just to understand the progress
});
경도, 위도 순서가 맞는 동안에도 같은 문제가 있었습니다.내 실수는 내가 편지를 쓴 것입니다.coordiantes
대신에coordinates
몽고는 나에게 이것을 주었습니다.
pymongo.errors.WriteError: Can't extract geo keys: {data} Point must be an array or object
그래서 아마도 당신은 올바른 순서를 가지고 있지만 당신의 키 이름에 문제가 있을 것입니다.
문제가 해결되었더라도 GeoJSON 개체 유형을 생략하면 이 버그도 나타날 수 있음을 강조해야 합니다.
나의 경우, 그것은 수정되었고, 추가되었습니다.type: 'Point'
모델의 가치에 부합합니다.
같은 오류가 발생했지만 문제는 제게 문제가 있었습니다.LineString
두 개의 동일한 좌표를 사용합니다.
"geometry" : {
"type" : "LineString",
"coordinates" : [
[
143.345763,
-33.840952
],
[
143.345763,
-33.840952
]
]
}
난 이걸 만들어야만 했어요.Point
그것이 유효하기 위해서는.
"geometry" : {
"type" : "Point",
"coordinates" : [
143.345763,
-33.840952
]
}
첫 번째 단계는 첫 번째 개체 형식이어야 하는 데이터를 삽입하는 것입니다. 그렇지 않으면 이 오류가 발생합니다.
schema :
location:{
type: { type: String },
coordinates:[mongoose.Schema.Types.Mixed]
},
그런 다음 DB에 데이터를 삽입합니다.
db.userDetails.createIndex({location: "2dsphere"})
위치에 개체가 포함된 경우에만 인덱스가 생성됩니다.
그 쓰기 쿼리 이후에, 만약 당신이 거리를 찾고 싶다면.
db.userDetails.aggregate( [
$geoNear: {
near: { type: "Point", coordinates: [data.lat1,data.lon1]},
spherical: true,
"distanceMultiplier" : 0.001,
distanceField: "calcDistance",
$maxDistance: distance,
}
] )
그리고 인용 문자열 없이 데이터를 전달해야 하는 것이 하나 더 있습니다.
"lat":18.7323
"lon":73.1232
이것처럼.
제 문제는 좌표가 정수/플로트가 아닌 문자열이라는 것이었습니다.
그래서 변했어요.
{ type: "Point", coordinates: [ "8.73167870769231", "49.3182756076923" ] } }
로.
{ type: "Point", coordinates: [ 8.73167870769231, 49.3182756076923 ] } }
포함:
const lat = Number(old_lat)
언급URL : https://stackoverflow.com/questions/25150590/mongoerror-cant-extract-geo-keys-from-object-with-type-point
'programing' 카테고리의 다른 글
팬더에서 특정 조건이 충족되는 행 값 업데이트 (0) | 2023.06.28 |
---|---|
'Basic' 특성 유형은 지속성 엔티티가 아니어야 합니다. (0) | 2023.06.28 |
내가 하는 일은 커밋을 지우는 것뿐인데 git-rebase에서 병합 충돌이 발생하는 이유는 무엇입니까? (0) | 2023.06.28 |
Oracle SQL 피벗 쿼리 (0) | 2023.06.28 |
Android 6.0(Mashmallow)에서 특정 앱에 대한 권한 화면을 프로그래밍 방식으로 열려면 어떻게 해야 합니까? (0) | 2023.06.28 |