Другой подход заключается в создании HTML-файла на лету.Это поддерживает произвольно большое количество маркеров (максимум от 256 до ~ 5000 +, в зависимости от памяти и ограничений API).
Разделите файл HTML
на две части, верхнюю и нижнюю (см. Код ниже), где данные должны быть вставлены между.
Загрузите"top part" из файла в переменную Output
и добавьте центр карты с тегом данных закрытия карт } );
.
Затем выполните цикл по каждому маркеру, добавивновая маркерная переменная JavaScript marker0
, marker1
... для каждого определенного маркера.Затем этот код добавляется к переменной Output
.
«Нижняя часть» добавляется к переменной Output
и сохраняется в выходной файл.Этот «конечный» файл закрывает открытие function initMap(){
с помощью }
и тег сценария и включает в себя сценарий загрузки для карты Google с обратным вызовом.
Затем этот сохраненный файл открываетсябраузер (передача данных не требуется).
Поместите верхнюю часть html-файла в новый файл проекта с именем topTemplate.html
(задайте для свойств: параметры компиляции значение none и скопируйте в выходной файлкаталог: копировать, если новее):
<script>
function initMap() {
let map = new google.maps.Map(document.getElementById('map'), {
zoom: 4,
center:
Примечание: я удалил let myLatLng = {lat: -25.363, lng: 131.044};
из кода, я "жестко запрограммировал" (будет определено в C #) его, чтобы упростить разделение сегментов (2vs 3).
И последняя часть в bottomTemplate.html
(те же настройки свойств, что и в предыдущем файле):
}
</script>
<script async defer
src="https://maps.googleapis.com/maps/api/js?key=<myKey>&callback=initMap">
</script>
Затем в приложении WPF:
ВЧтобы упростить задачу, я определяю struct
для хранения маркеров с помощью вспомогательной функции для построения строки вывода.
public struct Marker
{
public float Lat;
public float Lng;
public string Title;
public Marker(float lat,float lng, string title)
{
Lat = lat;
Lng = lng;
Title = title;
}
public string BuildHTML(int nameAppend)
{
return String.Format("\n let marker{0} = new google.maps.Marker({{ position: {{lat: {1:###0.0####}, lng: {2:###0.0####}}}, map: map, title: '{3}'}}); \n", nameAppend, Lat, Lng, Title);
}
}
{{
и }}
- это буквальная форма {}
.###0.0###
возвращает действительное число с четырьмя десятичными знаками.Без этого кода число с плавающей точкой может быть представлено в виде значения научной нотации или локализовано в разделителе «,», любое из которых может быть несовместимо с API.Символы «#» могут быть расширены вправо от десятичной точки, чтобы увеличить точность при необходимости.
Следующий код размещается в основном в методе, открывающем файл, см. Комментарии:
// at top of file add:
using System.IO;
// rest of namespace, class definition and method opening
// Assumes all of the markers are stored in: List<Markers> markers = new List<Markers>();
// and the center of the map is stored in float lat; and float lng;
string Output = File.ReadAllText("topTemplate.html");
// Since the topTemplate ended with "center: " we must fill in the values and close the request.
Output += String.Format("{{lat: {1:###0.0####}, lng: {2:###0.0####}}} }} );\n",lat, lng);
int index = 0;
foreach(var item in markers)
{
Output += item.BuildHTML(index++); //adds 1+ to the marker0 to form another variable marker1 ... for each marker variable name.
}
Output += "\n"; //add a vertical space to the Output. Before adding the end:
Output += File.ReadAllText("bottomTemplate.html");
// we will assume pathToHtmlFile contains a valid filename and is in a writable directory. If not, move the path to %ProgramData% or %temp%.
File.WriteAllText(pathToHtmlFile, Output); // will overwrite the file if it exists.
// start the browser.
System.Diagnostics.Process.Start(pathToHtmlFile);
// The remainder of the file(method remainder and close, class remainder and close...)
Запуск браузера может не запускаться на клиентских компьютерах, поскольку «Этот элемент (Process.Start) не может использоваться частично доверенным кодом».Это примечание к фактическому ответу.Обязательно используйте установщик.
В сгенерированном файле отступ будет неправильным, поскольку Javascript не зависит от пробелов (все пробелы (переводы строк, табуляции и несколько пробелов сокращаются до одного пробела)), это непроблема.
Список маркеров должен быть объявлен (List markers = new List ();) как переменная уровня класса или в верхней части метода.
Использовать markers.Add(new Marker(Latitude, Longitude, Title));
где «Широта, Долгота и Название» заменены их соответствующими значениями (или переменными, содержащими их), чтобы добавить каждый из маркеров;До вызова «метода» выше.