Я использовал neo4j-пространственный с Mapbox.js для визуализации геометрии на карте.
Для моего случая использования я индексироваться Конгресса США окружные геометрий в Neo4j-пространственном затем запросить пространственный индекс, основанный на том, где пользователь щелкает на карте, возвращая ближайший район, включая строку WKT и результаты запрос Cypher. Чтобы отобразить многоугольник WKT на карте, я написал простую функцию javascript для синтаксического анализа этого массива точек для добавления аннотации к карте.
Вот некоторые важные фрагменты кода:
Создать карту и определить обработчик щелчка на карте:
L.mapbox.accessToken = MB_API_TOKEN;
var map = L.mapbox.map('map', 'mapbox.streets')
.setView([39.8282, -98.5795], 5);
map.on('click', function(e) {
clearMap(map);
getClosestDistrict(e);
});
Ручка мыши
/**
* Find the District for a given latlng.
* Find the representative, commitees and subjects for that rep.
*/
function infoDistrictWithinDistance(latlng, distance) {
var districtParams = {
"layer": "geom",
"pointX": latlng.lng,
"pointY": latlng.lat,
"distanceInKm": distance
};
var districtURL = baseURI + findGeometriesPath;
makePOSTRequest(districtURL, districtParams, function (error, data) {
if (error) {
console.log("Error");
} else {
console.log(data);
var params = {
"state": data[0]["data"]["state"],
"district": data[0]["data"]["district"]
};
var points = parseWKTPolygon(data[0]["data"]["wkt"]);
makeCypherRequest([{"statement": subjectsQuery, "parameters": params}], function (error, data) {
if (error) {
console.log("Error");
} else {
console.log(data);
var districtInfo = data["results"][0]["data"][0]["row"][0];
districtInfo["points"] = points;
districtInfo["state"] = params["state"];
districtInfo["district"] = params["district"];
console.log(districtInfo);
addDistrictToMap(districtInfo, latlng);
}
});
}
});
Анализировать WKT в массив точек
/**
* Converts Polygon WKT string to an array of [x,y] points
*/
function parseWKTPolygon(wkt) {
var pointArr = [];
var points = wkt.slice(10, -3).split(",");
$.each(points, function(i,v) {
var point = $.trim(v).split(" ");
var xy = [Number(point[1]), Number(point[0])];
pointArr.push(xy)
});
return pointArr;
}
Код в this repo. Вы можете увидеть простую демонстрацию карты here (просто нажмите в любом месте в США, чтобы начать). Существует также недавняя запись в блоге об этом примере here.
Спасибо! Это то, что я искал. Я вижу, что вы добавляете данные в Neo4j аналогичным образом. Ваш импорт/добавление узлов в скрипт слоя работает очень медленно или это только я? –